{"id":97,"date":"2025-04-11T11:13:34","date_gmt":"2025-04-11T11:13:34","guid":{"rendered":"https:\/\/elbrinner.com\/?p=97"},"modified":"2025-04-11T11:13:34","modified_gmt":"2025-04-11T11:13:34","slug":"bot-framework-composer-como-asignar-variables-desde-un-middleware","status":"publish","type":"post","link":"https:\/\/elbrinner.com\/index.php\/2025\/04\/11\/bot-framework-composer-como-asignar-variables-desde-un-middleware\/","title":{"rendered":"Bot Framework Composer como asignar variables desde un Middleware"},"content":{"rendered":"<p>Este art\u00edculo es una extensi\u00f3n de <a href=\"https:\/\/elbrinner.com\/index.php\/2025\/01\/30\/integracion-de-azure-openai-con-stream-en-composer-frameworks-para-respuestas-mas-rapidas\/\">este<\/a>, donde exploramos la integraci\u00f3n de Azure OpenAI con Stream en bot Composer Frameworks para respuestas m\u00e1s r\u00e1pidas.<\/p>\n<p>En esta ocasi\u00f3n, nos alejamos de la parte Low Code del producto para abordar una necesidad espec\u00edfica: enviar un valor desde el Middleware hacia la parte Low Code del producto. Este valor debe ser recuperado y utilizado dentro del contexto de la conversaci\u00f3n. Adem\u00e1s, como queremos que este dato persista durante las interacciones del usuario y est\u00e9 disponible en diferentes flujos, hemos decidido almacenarlo en el estado de usuario (<code>UserState<\/code>).<\/p>\n<h3>Constructor de la clase<\/h3>\n<p>El constructor inicializa el estado del usuario (<code>UserState<\/code>) y crea un acceso a propiedades espec\u00edficas utilizando una clave, en este caso, <code>\"context\"<\/code>:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\">public class ComposerMiddleware : IMiddleware\r\n{\r\n    private readonly UserState _userState;\r\n    private readonly IStatePropertyAccessor&lt;string&gt; _userContextAccessor;\r\n\r\n    public ComposerMiddleware(UserState userState)\r\n    {\r\n        _userState = userState;\r\n        _userContextAccessor = _userState.CreateProperty&lt;string&gt;(\"context\");\r\n    }\r\n}\r\n<\/pre>\n<p>&nbsp;<\/p>\n<h3>Estableciendo el valor de una propiedad<\/h3>\n<p>Para asignar valores dentro del contexto del usuario, se utiliza el m\u00e9todo <code>SetAsync<\/code>:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\">var variable = \"mi valor de variable\";\r\nawait _userContextAccessor.SetAsync(turnContext, variable, cancellationToken);\r\n<\/pre>\n<h3><\/h3>\n<h3>Guardando los cambios en el estado<\/h3>\n<p>Finalmente, los cambios realizados en el estado de usuario se persisten usando <code>SaveChangesAsync<\/code>, asegurando que los datos sean almacenados correctamente:<\/p>\n<p>&nbsp;<\/p>\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"csharp\">await _userState.SaveChangesAsync(turnContext, false, cancellationToken);\r\n<\/pre>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-large wp-image-98\" src=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/04\/composer_variable-1024x569.png\" alt=\"\" width=\"1024\" height=\"569\" srcset=\"https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/04\/composer_variable-1024x569.png 1024w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/04\/composer_variable-300x167.png 300w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/04\/composer_variable-768x427.png 768w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/04\/composer_variable-1536x854.png 1536w, https:\/\/elbrinner.com\/wp-content\/uploads\/2025\/04\/composer_variable-2048x1139.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/p>\n<p>Con esto es todo, muchas gracias por llegar hasta aqu\u00ed.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Este art\u00edculo es una extensi\u00f3n de este, donde exploramos la integraci\u00f3n de Azure OpenAI con Stream en bot Composer Frameworks para respuestas m\u00e1s r\u00e1pidas. En esta ocasi\u00f3n, nos alejamos de la parte Low Code del producto para abordar una necesidad espec\u00edfica: enviar un valor desde el Middleware hacia la parte Low Code del producto. Este &#8230; <a title=\"Bot Framework Composer como asignar variables desde un Middleware\" class=\"read-more\" href=\"https:\/\/elbrinner.com\/index.php\/2025\/04\/11\/bot-framework-composer-como-asignar-variables-desde-un-middleware\/\" aria-label=\"Leer m\u00e1s sobre Bot Framework Composer como asignar variables desde un Middleware\">Leer m\u00e1s<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[10,11],"tags":[15,57,13],"class_list":["post-97","post","type-post","status-publish","format-standard","hentry","category-net","category-bot-framework-composer","tag-net","tag-code","tag-composer"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/97","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/comments?post=97"}],"version-history":[{"count":1,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/97\/revisions"}],"predecessor-version":[{"id":99,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/posts\/97\/revisions\/99"}],"wp:attachment":[{"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/media?parent=97"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/categories?post=97"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/elbrinner.com\/index.php\/wp-json\/wp\/v2\/tags?post=97"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}