[{"data":1,"prerenderedAt":2731},["ShallowReactive",2],{"navigation":3,"\u002Fes\u002Farticles\u002F2026\u002Fjuly\u002Ffrom-idea-to-ms-teams-agent":177},[4,62],{"title":5,"path":6,"stem":7,"children":8},"About","\u002Fen","en\u002F1.index",[9,10,56],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13,"children":14},"Blog","\u002Fen\u002Farticles","en\u002F2.articles",[15],{"title":16,"path":17,"stem":18,"children":19,"page":33},"2026","\u002Fen\u002Farticles\u002F2026","en\u002Farticles\u002F2026",[20,34,47],{"title":21,"path":22,"stem":23,"children":24,"page":33},"April","\u002Fen\u002Farticles\u002F2026\u002Fapril","en\u002Farticles\u002F2026\u002Fapril",[25,29],{"title":26,"path":27,"stem":28},"Improving My App's Vibes with DESIGN.md","\u002Fen\u002Farticles\u002F2026\u002Fapril\u002Fexploring-llm-ui","en\u002Farticles\u002F2026\u002Fapril\u002Fexploring-llm-ui",{"title":30,"path":31,"stem":32},"How I Made My Fork Bilingual and Published It Right","\u002Fen\u002Farticles\u002F2026\u002Fapril\u002Fhow-i-made-my-fork-bilingual-and-published-it-right","en\u002Farticles\u002F2026\u002Fapril\u002Fhow-i-made-my-fork-bilingual-and-published-it-right",false,{"title":35,"path":36,"stem":37,"children":38,"page":33},"July","\u002Fen\u002Farticles\u002F2026\u002Fjuly","en\u002Farticles\u002F2026\u002Fjuly",[39,43],{"title":40,"path":41,"stem":42},"From Idea to MS Teams: Deploying an Agent","\u002Fen\u002Farticles\u002F2026\u002Fjuly\u002Ffrom-idea-to-ms-teams-agent","en\u002Farticles\u002F2026\u002Fjuly\u002Ffrom-idea-to-ms-teams-agent",{"title":44,"path":45,"stem":46},"Legally Spying on Your Competition is Possible","\u002Fen\u002Farticles\u002F2026\u002Fjuly\u002Fspying-on-your-rivals","en\u002Farticles\u002F2026\u002Fjuly\u002Fspying-on-your-rivals",{"title":48,"path":49,"stem":50,"children":51,"page":33},"May","\u002Fen\u002Farticles\u002F2026\u002Fmay","en\u002Farticles\u002F2026\u002Fmay",[52],{"title":53,"path":54,"stem":55},"Building an Agent's Personality Around the Customer Journey","\u002Fen\u002Farticles\u002F2026\u002Fmay\u002Fbuilding-agents-with-personality","en\u002Farticles\u002F2026\u002Fmay\u002Fbuilding-agents-with-personality",{"title":57,"path":58,"stem":59,"children":60},"Index","\u002Fen\u002Farticles_index","en\u002F4.articles_index",[61],{"title":57,"path":58,"stem":59},{"title":63,"path":64,"stem":65,"children":66},"Acerca De","\u002Fes","es\u002F1.index",[67,68,153,171],{"title":63,"path":64,"stem":65},{"title":11,"path":69,"stem":70,"children":71},"\u002Fes\u002Farticles","es\u002F2.articles",[72,95,117],{"title":73,"path":74,"stem":75,"children":76,"page":33},"2024","\u002Fes\u002Farticles\u002F2024","es\u002Farticles\u002F2024",[77,86],{"title":78,"path":79,"stem":80,"children":81,"page":33},"Diciembre","\u002Fes\u002Farticles\u002F2024\u002Fdiciembre","es\u002Farticles\u002F2024\u002Fdiciembre",[82],{"title":83,"path":84,"stem":85},"Diciembre es un mes más","\u002Fes\u002Farticles\u002F2024\u002Fdiciembre\u002Fhaikus","es\u002Farticles\u002F2024\u002Fdiciembre\u002Fhaikus",{"title":87,"path":88,"stem":89,"children":90,"page":33},"Octubre","\u002Fes\u002Farticles\u002F2024\u002Foctubre","es\u002Farticles\u002F2024\u002Foctubre",[91],{"title":92,"path":93,"stem":94},"Viaje de regreso","\u002Fes\u002Farticles\u002F2024\u002Foctubre\u002Fhaikus","es\u002Farticles\u002F2024\u002Foctubre\u002Fhaikus",{"title":96,"path":97,"stem":98,"children":99,"page":33},"2025","\u002Fes\u002Farticles\u002F2025","es\u002Farticles\u002F2025",[100,109],{"title":101,"path":102,"stem":103,"children":104,"page":33},"Agosto","\u002Fes\u002Farticles\u002F2025\u002Fagosto","es\u002Farticles\u002F2025\u002Fagosto",[105],{"title":106,"path":107,"stem":108},"Hola Mundo","\u002Fes\u002Farticles\u002F2025\u002Fagosto\u002Fholamundo","es\u002Farticles\u002F2025\u002Fagosto\u002Fholamundo",{"title":87,"path":110,"stem":111,"children":112,"page":33},"\u002Fes\u002Farticles\u002F2025\u002Foctubre","es\u002Farticles\u002F2025\u002Foctubre",[113],{"title":114,"path":115,"stem":116},"El Antipatrón de la Red Veloz","\u002Fes\u002Farticles\u002F2025\u002Foctubre\u002Flatencia","es\u002Farticles\u002F2025\u002Foctubre\u002Flatencia",{"title":16,"path":118,"stem":119,"children":120,"page":33},"\u002Fes\u002Farticles\u002F2026","es\u002Farticles\u002F2026",[121,133,145],{"title":21,"path":122,"stem":123,"children":124,"page":33},"\u002Fes\u002Farticles\u002F2026\u002Fapril","es\u002Farticles\u002F2026\u002Fapril",[125,129],{"title":126,"path":127,"stem":128},"Mejorando las VIBES de mi aplicación con DESIGN.md","\u002Fes\u002Farticles\u002F2026\u002Fapril\u002Fexploring-llm-ui","es\u002Farticles\u002F2026\u002Fapril\u002Fexploring-llm-ui",{"title":130,"path":131,"stem":132},"Cómo volví mi fork multilenguaje y lo publiqué bien","\u002Fes\u002Farticles\u002F2026\u002Fapril\u002Fhow-i-made-my-fork-bilingual-and-published-it-right","es\u002Farticles\u002F2026\u002Fapril\u002Fhow-i-made-my-fork-bilingual-and-published-it-right",{"title":35,"path":134,"stem":135,"children":136,"page":33},"\u002Fes\u002Farticles\u002F2026\u002Fjuly","es\u002Farticles\u002F2026\u002Fjuly",[137,141],{"title":138,"path":139,"stem":140},"De Idea a Ms Teams: Desplegando un Agente","\u002Fes\u002Farticles\u002F2026\u002Fjuly\u002Ffrom-idea-to-ms-teams-agent","es\u002Farticles\u002F2026\u002Fjuly\u002Ffrom-idea-to-ms-teams-agent",{"title":142,"path":143,"stem":144},"Espiar a Tu Competencia de Manera Legal es Posible","\u002Fes\u002Farticles\u002F2026\u002Fjuly\u002Fspying-on-your-rivals","es\u002Farticles\u002F2026\u002Fjuly\u002Fspying-on-your-rivals",{"title":48,"path":146,"stem":147,"children":148,"page":33},"\u002Fes\u002Farticles\u002F2026\u002Fmay","es\u002Farticles\u002F2026\u002Fmay",[149],{"title":150,"path":151,"stem":152},"Construyendo la personalidad de un agente en base a la travesía del cliente","\u002Fes\u002Farticles\u002F2026\u002Fmay\u002Fbuilding-agents-with-personality","es\u002Farticles\u002F2026\u002Fmay\u002Fbuilding-agents-with-personality",{"title":154,"path":155,"stem":156,"children":157},"Galería","\u002Fes\u002Fgallery","es\u002F3.gallery",[158],{"title":96,"path":159,"stem":160,"children":161,"page":33},"\u002Fes\u002Fgallery\u002F2025","es\u002Fgallery\u002F2025",[162],{"title":163,"path":164,"stem":165,"children":166,"page":33},"Septiembre","\u002Fes\u002Fgallery\u002F2025\u002Fseptiembre","es\u002Fgallery\u002F2025\u002Fseptiembre",[167],{"title":168,"path":169,"stem":170},"Cielo de Oyón","\u002Fes\u002Fgallery\u002F2025\u002Fseptiembre\u002Fholamundo","es\u002Fgallery\u002F2025\u002Fseptiembre\u002Fholamundo",{"title":172,"path":173,"stem":174,"children":175},"Lista","\u002Fes\u002Farticles_index","es\u002F4.articles_index",[176],{"title":172,"path":173,"stem":174},{"id":178,"title":138,"author":179,"badges":182,"body":183,"canonical":182,"cover":2718,"date":2719,"description":2720,"extension":2721,"layout":2722,"meta":2723,"navigation":390,"path":139,"seo":2729,"stem":140,"__hash__":2730},"content\u002Fes\u002Farticles\u002F2026\u002Fjuly\u002Ffrom-idea-to-ms-teams-agent.md",{"name":180,"url":181},"Ever Burga","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Feverburga\u002F",null,{"type":184,"value":185,"toc":2699},"minimark",[186,190,207,210,213,218,224,234,238,241,258,261,265,268,271,280,290,300,303,307,310,319,322,325,329,335,1690,1698,1703,1748,1751,1756,1759,1767,1771,1775,1778,1787,1791,1794,1810,1813,1816,1820,1824,1832,1836,1890,1893,1897,1900,2653,2657,2695],[187,188,138],"h1",{"id":189},"de-idea-a-ms-teams-desplegando-un-agente",[191,192,193,198],"p",{},[194,195],"img",{"alt":196,"src":197,"title":196},"Flujo de desarrollo del Agents Toolkit","\u002Farticles\u002F2026\u002Fjuly\u002Fagent-toolkit-dev-flow.png",[199,200,201,202],"em",{},"Tomado de ",[203,204,206],"a",{"href":205},"#ref-1","[1]",[191,208,209],{},"A la fecha existe una creciente cantidad de servicios y vías de entrada para desplegar un agente en Ms Teams. Puede ser a través de Copilot, Microsoft 365 o con los servicios de AI Foundry.\nEn el fondo todos ellos usan las APIs de Azure Bot Services.",[191,211,212],{},"Si quieres máxima personalización, este tutorial te va a gustar.",[214,215,217],"h2",{"id":216},"prerrequisitos","Prerrequisitos.",[191,219,220,221,223],{},"Si tienes problemas con que tu administrador de Azure te otorgue permisos documentados en un artículo de un don nadie, este blog de Microsoft realiza pasos similares a los de estos artículos ",[203,222,206],{"href":205},".",[225,226,227,231],"ul",{},[228,229,230],"li",{},"Rol de Application Developer en la suscripción de Azure donde estará asignado tu proyecto.",[228,232,233],{},"Licencia de MS Teams Corporativa. Como alternativa existe un programa de prueba de Microsoft 365 Dev que puedes probar, pero son 90 días y de todas maneras necesitas usar una suscripción activa de Azure.\nResulta redundante hacer todo el trabajo allí en lugar de aislar un grupo de usuarios en la consola de admin de 365 de tu organización.",[214,235,237],{"id":236},"contenido","Contenido",[191,239,240],{},"Lo que este tutorial cubre:",[225,242,243,246,249,252,255],{},[228,244,245],{},"Creación de la App en Azure Entra ID. Aquí se gestionan los permisos y es la cara visible de tu Agente para todo Microsoft en el mismo tenant.",[228,247,248],{},"Configuración de Azure Bot services. Esta es la API de integración para la suite de MS 365.",[228,250,251],{},"Integración con tu Agente propio, LangGraph self-hosted o lo que sea que hayas desarrollado. Aquí vemos cómo lo conectas con Azure Bot Services.",[228,253,254],{},"Publicación en Teams: Reglas de exclusión de usuarios, íconos, logos y versionamiento.",[228,256,257],{},"Detallitos de CX, D:",[191,259,260],{},"No vamos a ver la lógica del agente. Lo que te interesa, como a mí en su momento, es saber cómo lo despliego en mi suite corporativa.",[214,262,264],{"id":263},"entra-id","Entra ID",[191,266,267],{},"Azure a veces es una pesadilla. Veamos paso a paso.",[191,269,270],{},"Primero, crea una app con un nombre y un sufijo 'dev' o 'prd'. Necesitarás hacer esta distinción para poder segregar los usuarios más adelante.",[191,272,273,278],{},[194,274],{"alt":275,"src":276,"title":277},"Ingresa al servicio de Entra ID","\u002Farticles\u002F2026\u002Fjuly\u002Fentra-id-tuto.png","Ingresa al servicio",[199,279,277],{},[191,281,282,287],{},[194,283],{"alt":284,"src":285,"title":286},"Registro de una nueva app","\u002Farticles\u002F2026\u002Fjuly\u002Fapp-registration-add-new.png","Dale a crear",[199,288,289],{},"Dale a crear. Single tenant es suficiente para la mayoría de casos de uso.",[191,291,292,297],{},[194,293],{"alt":294,"src":295,"title":296},"Panel de registro de la app","\u002Farticles\u002F2026\u002Fjuly\u002Fapp-registration-panel.png","Apunta la App Id",[199,298,299],{},"Apunta la App Id.",[191,301,302],{},"Si necesitas que tu agente interactúe con servicios de Microsoft, la sección de API Permissions será tu amiga. En caso tu Agente no se encuentre en el ecosistema de Azure, una solución rápida es crear un certificado en la sección de Certificates y Secrets. En ese caso te apuntas el Secret que generes.",[214,304,306],{"id":305},"azure-bot-services","Azure Bot Services",[191,308,309],{},"Crea un Bot con la misma App Id que usaste para Entra Id. No estoy seguro de la razón de esto, pero cuando usaba la Id automática hubo problemas con la aparición del bot en la consola de Admin Microsoft 365.",[191,311,312,316],{},[194,313],{"alt":314,"src":315,"title":314},"Panel de configuración de Azure Bot Services","\u002Farticles\u002F2026\u002Fjuly\u002Fazure-bot-services-config-panel.png",[199,317,318],{},"Aquí los dos elementos más importantes tienen flechas.",[191,320,321],{},"El campo de URL endpoint es el endpoint del middleware que construirás a continuación.",[191,323,324],{},"La sección de 'prueba web' te permite probar que tu agente y tu middleware de integración efectivamente funcionan y responden correctamente.",[214,326,328],{"id":327},"integración","Integración",[330,331,332],"ol",{},[228,333,334],{},"Esto es una versión simplificada de un adaptador que me funciona.",[336,337,342],"pre",{"className":338,"code":339,"language":340,"meta":341,"style":341},"language-python shiki shiki-themes github-light github-dark","import os\nfrom dotenv import load_dotenv, find_dotenv\nload_dotenv(find_dotenv(\".prd.env\"))\n\nfrom botbuilder.integration.aiohttp import CloudAdapter, ConfigurationBotFrameworkAuthentication\n\nfrom src.ext.teams_incoming_adapter import BotInconmingEventsHandler\nfrom src.app.bot_service.service import BotService\nfrom src.ext.session_adapter import SessionStoreAdapter\nfrom src.app.session_watcher_service.service import SessionWatcher\n\nimport logging\n\n# Configure logging\nlogging.basicConfig(\n    level=logging.DEBUG,  # Set to DEBUG, INFO, WARNING, ERROR, or CRITICAL\n    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'\n)\n\nlogger = logging.getLogger(__name__)\n\nPORT = int(os.environ.get(\"SVC_LISTEN_PORT\", \"3978\"))\nAPP_ID = os.environ.get(\"MICROSOFT_APP_ID\", \"\")\nAPP_PASSWORD = os.environ.get(\"MICROSOFT_APP_PASSWORD\", \"\")\nAPP_TYPE = os.environ.get(\"MICROSOFT_APP_TYPE\", \"\")\nAPP_TENANTID = os.environ.get(\"MICROSOFT_APP_TENANT_ID\", \"\")\nMAX_IDLE_TIME = int(os.environ.get(\"SESSION_IDLE_LIMIT_SECS\"))  # secs\nALERT_TIME = int(os.environ.get(\"SESSION_IDLE_WARN_SECS\"))\n\nprint(f\"Configuration loaded. App ID: {APP_ID}, Port: {PORT}\")\nlogger.info(f\"✓ App ID: {APP_ID}\")\nlogger.info(f\"✓ App Type: {APP_TYPE}\")\nlogger.info(f\"✓ Tenant ID: {APP_TENANTID}\")\nlogger.info(f\"✓ Password length: {len(APP_PASSWORD) if APP_PASSWORD else 0}\")\n\nif not APP_PASSWORD:\n    logger.error(\"❌ MICROSOFT_APP_PASSWORD is EMPTY!\")\nif not APP_ID:\n    logger.error(\"❌ MICROSOFT_APP_ID is EMPTY!\")\n\nclass BotConfig:\n    PORT = PORT\n    APP_TYPE = APP_TYPE\n    APP_ID = APP_ID\n    APP_PASSWORD = APP_PASSWORD\n    APP_TENANTID = APP_TENANTID\n\nconfig = BotConfig()\n# Cloud Adapter is a bot\nBOT_CLOUD_ADAPTER = CloudAdapter(ConfigurationBotFrameworkAuthentication(config, logger=logger))\n\n\nreturn_last_message_only = os.environ.get(\"BOT_BACKEND_LAST_MSG_ONLY\", \"true\").strip().lower() in (\"1\", \"true\", \"yes\", \"on\")\nquery_url = os.environ.get(\"BOT_BACKEND_ENDPOINT\")\nif not query_url:\n    raise ValueError(\"BOT_BACKEND_ENDPOINT is required\")\n\nchatbot_adapter = AgentEngineADKAdapter(\n    query_url=query_url,\n    timeout_seconds=float(os.environ.get(\"BOT_BACKEND_TIMEOUT_SECS\", \"60\")),\n    return_last_message_only=return_last_message_only,\n    class_method=os.environ.get(\"BOT_BACKEND_CLASS_METHOD\", \"async_stream_query\"),\n)\nlogger.info(\"Agent Engine REST adapter initialized as primary chatbot adapter\")\n\n# Plug in whatever session store you use (a database, cache, etc.)\ndata_store = SessionStoreAdapter(\n    connection_string=os.environ.get(\"DATASTORE_DSN\"),\n)\nlogger.info(\"Session store adapter initialized\")\n\n# Plug in whatever feedback storage you use\nfeedback_repository = FeedbackRepository(\n    connection_string=os.environ.get(\"FEEDBACK_DSN\"),\n)\n\nfeedback_handler = DefaultFeedbackHandler(feedback_repository)\n\nbot_service = BotService(\n    chatbot_adapter=chatbot_adapter,\n    data_store=data_store,\n    fallback_adapter=None,\n    bot_adapter=BOT_CLOUD_ADAPTER,\n    app_id=APP_ID,\n    feedback_handler=feedback_handler,\n    alert_idle_seconds=ALERT_TIME,\n    close_idle_seconds=MAX_IDLE_TIME,\n)\n\nincoming_events_handler = BotInconmingEventsHandler(APP_ID, APP_PASSWORD, bot_service)\n\nhttp_adapter = HTTPAdapter(BOT_CLOUD_ADAPTER, incoming_events_handler)\napp = http_adapter.get_app()\n\n# Start session watcher if data store is available\nif data_store is not None:\n    try:\n        watcher = SessionWatcher(data_store, bot_service, alert_idle_seconds=ALERT_TIME,\n                                 close_idle_seconds=MAX_IDLE_TIME)\n        watcher.start()\n    except Exception as e:\n        print(f\"Warning: could not start session watcher: {e}\")\n\nif __name__ == \"__main__\":\n    from aiohttp import web\n    try:\n        web.run_app(app, host=\"0.0.0.0\", port=PORT)\n    except Exception as error:\n        raise error\n","python","",[343,344,345,358,372,385,392,405,410,423,436,449,462,467,475,480,487,493,516,549,555,560,576,581,607,628,647,666,685,706,723,728,757,774,791,808,844,849,862,873,885,895,900,912,923,934,945,956,967,972,983,989,1008,1013,1018,1064,1079,1089,1105,1110,1121,1132,1156,1167,1189,1194,1204,1209,1215,1226,1241,1246,1256,1261,1267,1278,1292,1297,1302,1313,1318,1329,1340,1351,1365,1377,1389,1400,1412,1424,1429,1434,1454,1459,1475,1486,1491,1497,1515,1523,1543,1555,1561,1576,1602,1607,1623,1637,1644,1669,1681],"code",{"__ignoreMap":341},[346,347,350,354],"span",{"class":348,"line":349},"line",1,[346,351,353],{"class":352},"szBVR","import",[346,355,357],{"class":356},"sVt8B"," os\n",[346,359,361,364,367,369],{"class":348,"line":360},2,[346,362,363],{"class":352},"from",[346,365,366],{"class":356}," dotenv ",[346,368,353],{"class":352},[346,370,371],{"class":356}," load_dotenv, find_dotenv\n",[346,373,375,378,382],{"class":348,"line":374},3,[346,376,377],{"class":356},"load_dotenv(find_dotenv(",[346,379,381],{"class":380},"sZZnC","\".prd.env\"",[346,383,384],{"class":356},"))\n",[346,386,388],{"class":348,"line":387},4,[346,389,391],{"emptyLinePlaceholder":390},true,"\n",[346,393,395,397,400,402],{"class":348,"line":394},5,[346,396,363],{"class":352},[346,398,399],{"class":356}," botbuilder.integration.aiohttp ",[346,401,353],{"class":352},[346,403,404],{"class":356}," CloudAdapter, ConfigurationBotFrameworkAuthentication\n",[346,406,408],{"class":348,"line":407},6,[346,409,391],{"emptyLinePlaceholder":390},[346,411,413,415,418,420],{"class":348,"line":412},7,[346,414,363],{"class":352},[346,416,417],{"class":356}," src.ext.teams_incoming_adapter ",[346,419,353],{"class":352},[346,421,422],{"class":356}," BotInconmingEventsHandler\n",[346,424,426,428,431,433],{"class":348,"line":425},8,[346,427,363],{"class":352},[346,429,430],{"class":356}," src.app.bot_service.service ",[346,432,353],{"class":352},[346,434,435],{"class":356}," BotService\n",[346,437,439,441,444,446],{"class":348,"line":438},9,[346,440,363],{"class":352},[346,442,443],{"class":356}," src.ext.session_adapter ",[346,445,353],{"class":352},[346,447,448],{"class":356}," SessionStoreAdapter\n",[346,450,452,454,457,459],{"class":348,"line":451},10,[346,453,363],{"class":352},[346,455,456],{"class":356}," src.app.session_watcher_service.service ",[346,458,353],{"class":352},[346,460,461],{"class":356}," SessionWatcher\n",[346,463,465],{"class":348,"line":464},11,[346,466,391],{"emptyLinePlaceholder":390},[346,468,470,472],{"class":348,"line":469},12,[346,471,353],{"class":352},[346,473,474],{"class":356}," logging\n",[346,476,478],{"class":348,"line":477},13,[346,479,391],{"emptyLinePlaceholder":390},[346,481,483],{"class":348,"line":482},14,[346,484,486],{"class":485},"sJ8bj","# Configure logging\n",[346,488,490],{"class":348,"line":489},15,[346,491,492],{"class":356},"logging.basicConfig(\n",[346,494,496,500,503,506,510,513],{"class":348,"line":495},16,[346,497,499],{"class":498},"s4XuR","    level",[346,501,502],{"class":352},"=",[346,504,505],{"class":356},"logging.",[346,507,509],{"class":508},"sj4cs","DEBUG",[346,511,512],{"class":356},",  ",[346,514,515],{"class":485},"# Set to DEBUG, INFO, WARNING, ERROR, or CRITICAL\n",[346,517,519,522,524,527,530,533,536,538,541,543,546],{"class":348,"line":518},17,[346,520,521],{"class":498},"    format",[346,523,502],{"class":352},[346,525,526],{"class":380},"'",[346,528,529],{"class":508},"%(asctime)s",[346,531,532],{"class":380}," - ",[346,534,535],{"class":508},"%(name)s",[346,537,532],{"class":380},[346,539,540],{"class":508},"%(levelname)s",[346,542,532],{"class":380},[346,544,545],{"class":508},"%(message)s",[346,547,548],{"class":380},"'\n",[346,550,552],{"class":348,"line":551},18,[346,553,554],{"class":356},")\n",[346,556,558],{"class":348,"line":557},19,[346,559,391],{"emptyLinePlaceholder":390},[346,561,563,566,568,571,574],{"class":348,"line":562},20,[346,564,565],{"class":356},"logger ",[346,567,502],{"class":352},[346,569,570],{"class":356}," logging.getLogger(",[346,572,573],{"class":508},"__name__",[346,575,554],{"class":356},[346,577,579],{"class":348,"line":578},21,[346,580,391],{"emptyLinePlaceholder":390},[346,582,584,587,590,593,596,599,602,605],{"class":348,"line":583},22,[346,585,586],{"class":508},"PORT",[346,588,589],{"class":352}," =",[346,591,592],{"class":508}," int",[346,594,595],{"class":356},"(os.environ.get(",[346,597,598],{"class":380},"\"SVC_LISTEN_PORT\"",[346,600,601],{"class":356},", ",[346,603,604],{"class":380},"\"3978\"",[346,606,384],{"class":356},[346,608,610,613,615,618,621,623,626],{"class":348,"line":609},23,[346,611,612],{"class":508},"APP_ID",[346,614,589],{"class":352},[346,616,617],{"class":356}," os.environ.get(",[346,619,620],{"class":380},"\"MICROSOFT_APP_ID\"",[346,622,601],{"class":356},[346,624,625],{"class":380},"\"\"",[346,627,554],{"class":356},[346,629,631,634,636,638,641,643,645],{"class":348,"line":630},24,[346,632,633],{"class":508},"APP_PASSWORD",[346,635,589],{"class":352},[346,637,617],{"class":356},[346,639,640],{"class":380},"\"MICROSOFT_APP_PASSWORD\"",[346,642,601],{"class":356},[346,644,625],{"class":380},[346,646,554],{"class":356},[346,648,650,653,655,657,660,662,664],{"class":348,"line":649},25,[346,651,652],{"class":508},"APP_TYPE",[346,654,589],{"class":352},[346,656,617],{"class":356},[346,658,659],{"class":380},"\"MICROSOFT_APP_TYPE\"",[346,661,601],{"class":356},[346,663,625],{"class":380},[346,665,554],{"class":356},[346,667,669,672,674,676,679,681,683],{"class":348,"line":668},26,[346,670,671],{"class":508},"APP_TENANTID",[346,673,589],{"class":352},[346,675,617],{"class":356},[346,677,678],{"class":380},"\"MICROSOFT_APP_TENANT_ID\"",[346,680,601],{"class":356},[346,682,625],{"class":380},[346,684,554],{"class":356},[346,686,688,691,693,695,697,700,703],{"class":348,"line":687},27,[346,689,690],{"class":508},"MAX_IDLE_TIME",[346,692,589],{"class":352},[346,694,592],{"class":508},[346,696,595],{"class":356},[346,698,699],{"class":380},"\"SESSION_IDLE_LIMIT_SECS\"",[346,701,702],{"class":356},"))  ",[346,704,705],{"class":485},"# secs\n",[346,707,709,712,714,716,718,721],{"class":348,"line":708},28,[346,710,711],{"class":508},"ALERT_TIME",[346,713,589],{"class":352},[346,715,592],{"class":508},[346,717,595],{"class":356},[346,719,720],{"class":380},"\"SESSION_IDLE_WARN_SECS\"",[346,722,384],{"class":356},[346,724,726],{"class":348,"line":725},29,[346,727,391],{"emptyLinePlaceholder":390},[346,729,731,734,737,740,743,746,749,752,755],{"class":348,"line":730},30,[346,732,733],{"class":508},"print",[346,735,736],{"class":356},"(",[346,738,739],{"class":352},"f",[346,741,742],{"class":380},"\"Configuration loaded. App ID: ",[346,744,745],{"class":508},"{APP_ID}",[346,747,748],{"class":380},", Port: ",[346,750,751],{"class":508},"{PORT}",[346,753,754],{"class":380},"\"",[346,756,554],{"class":356},[346,758,760,763,765,768,770,772],{"class":348,"line":759},31,[346,761,762],{"class":356},"logger.info(",[346,764,739],{"class":352},[346,766,767],{"class":380},"\"✓ App ID: ",[346,769,745],{"class":508},[346,771,754],{"class":380},[346,773,554],{"class":356},[346,775,777,779,781,784,787,789],{"class":348,"line":776},32,[346,778,762],{"class":356},[346,780,739],{"class":352},[346,782,783],{"class":380},"\"✓ App Type: ",[346,785,786],{"class":508},"{APP_TYPE}",[346,788,754],{"class":380},[346,790,554],{"class":356},[346,792,794,796,798,801,804,806],{"class":348,"line":793},33,[346,795,762],{"class":356},[346,797,739],{"class":352},[346,799,800],{"class":380},"\"✓ Tenant ID: ",[346,802,803],{"class":508},"{APP_TENANTID}",[346,805,754],{"class":380},[346,807,554],{"class":356},[346,809,811,813,815,818,821,823,825,828,831,834,837,840,842],{"class":348,"line":810},34,[346,812,762],{"class":356},[346,814,739],{"class":352},[346,816,817],{"class":380},"\"✓ Password length: ",[346,819,820],{"class":508},"{len",[346,822,736],{"class":356},[346,824,633],{"class":508},[346,826,827],{"class":356},") ",[346,829,830],{"class":352},"if",[346,832,833],{"class":508}," APP_PASSWORD",[346,835,836],{"class":352}," else",[346,838,839],{"class":508}," 0}",[346,841,754],{"class":380},[346,843,554],{"class":356},[346,845,847],{"class":348,"line":846},35,[346,848,391],{"emptyLinePlaceholder":390},[346,850,852,854,857,859],{"class":348,"line":851},36,[346,853,830],{"class":352},[346,855,856],{"class":352}," not",[346,858,833],{"class":508},[346,860,861],{"class":356},":\n",[346,863,865,868,871],{"class":348,"line":864},37,[346,866,867],{"class":356},"    logger.error(",[346,869,870],{"class":380},"\"❌ MICROSOFT_APP_PASSWORD is EMPTY!\"",[346,872,554],{"class":356},[346,874,876,878,880,883],{"class":348,"line":875},38,[346,877,830],{"class":352},[346,879,856],{"class":352},[346,881,882],{"class":508}," APP_ID",[346,884,861],{"class":356},[346,886,888,890,893],{"class":348,"line":887},39,[346,889,867],{"class":356},[346,891,892],{"class":380},"\"❌ MICROSOFT_APP_ID is EMPTY!\"",[346,894,554],{"class":356},[346,896,898],{"class":348,"line":897},40,[346,899,391],{"emptyLinePlaceholder":390},[346,901,903,906,910],{"class":348,"line":902},41,[346,904,905],{"class":352},"class",[346,907,909],{"class":908},"sScJk"," BotConfig",[346,911,861],{"class":356},[346,913,915,918,920],{"class":348,"line":914},42,[346,916,917],{"class":508},"    PORT",[346,919,589],{"class":352},[346,921,922],{"class":508}," PORT\n",[346,924,926,929,931],{"class":348,"line":925},43,[346,927,928],{"class":508},"    APP_TYPE",[346,930,589],{"class":352},[346,932,933],{"class":508}," APP_TYPE\n",[346,935,937,940,942],{"class":348,"line":936},44,[346,938,939],{"class":508},"    APP_ID",[346,941,589],{"class":352},[346,943,944],{"class":508}," APP_ID\n",[346,946,948,951,953],{"class":348,"line":947},45,[346,949,950],{"class":508},"    APP_PASSWORD",[346,952,589],{"class":352},[346,954,955],{"class":508}," APP_PASSWORD\n",[346,957,959,962,964],{"class":348,"line":958},46,[346,960,961],{"class":508},"    APP_TENANTID",[346,963,589],{"class":352},[346,965,966],{"class":508}," APP_TENANTID\n",[346,968,970],{"class":348,"line":969},47,[346,971,391],{"emptyLinePlaceholder":390},[346,973,975,978,980],{"class":348,"line":974},48,[346,976,977],{"class":356},"config ",[346,979,502],{"class":352},[346,981,982],{"class":356}," BotConfig()\n",[346,984,986],{"class":348,"line":985},49,[346,987,988],{"class":485},"# Cloud Adapter is a bot\n",[346,990,992,995,997,1000,1003,1005],{"class":348,"line":991},50,[346,993,994],{"class":508},"BOT_CLOUD_ADAPTER",[346,996,589],{"class":352},[346,998,999],{"class":356}," CloudAdapter(ConfigurationBotFrameworkAuthentication(config, ",[346,1001,1002],{"class":498},"logger",[346,1004,502],{"class":352},[346,1006,1007],{"class":356},"logger))\n",[346,1009,1011],{"class":348,"line":1010},51,[346,1012,391],{"emptyLinePlaceholder":390},[346,1014,1016],{"class":348,"line":1015},52,[346,1017,391],{"emptyLinePlaceholder":390},[346,1019,1021,1024,1026,1028,1031,1033,1036,1039,1042,1045,1048,1050,1052,1054,1057,1059,1062],{"class":348,"line":1020},53,[346,1022,1023],{"class":356},"return_last_message_only ",[346,1025,502],{"class":352},[346,1027,617],{"class":356},[346,1029,1030],{"class":380},"\"BOT_BACKEND_LAST_MSG_ONLY\"",[346,1032,601],{"class":356},[346,1034,1035],{"class":380},"\"true\"",[346,1037,1038],{"class":356},").strip().lower() ",[346,1040,1041],{"class":352},"in",[346,1043,1044],{"class":356}," (",[346,1046,1047],{"class":380},"\"1\"",[346,1049,601],{"class":356},[346,1051,1035],{"class":380},[346,1053,601],{"class":356},[346,1055,1056],{"class":380},"\"yes\"",[346,1058,601],{"class":356},[346,1060,1061],{"class":380},"\"on\"",[346,1063,554],{"class":356},[346,1065,1067,1070,1072,1074,1077],{"class":348,"line":1066},54,[346,1068,1069],{"class":356},"query_url ",[346,1071,502],{"class":352},[346,1073,617],{"class":356},[346,1075,1076],{"class":380},"\"BOT_BACKEND_ENDPOINT\"",[346,1078,554],{"class":356},[346,1080,1082,1084,1086],{"class":348,"line":1081},55,[346,1083,830],{"class":352},[346,1085,856],{"class":352},[346,1087,1088],{"class":356}," query_url:\n",[346,1090,1092,1095,1098,1100,1103],{"class":348,"line":1091},56,[346,1093,1094],{"class":352},"    raise",[346,1096,1097],{"class":508}," ValueError",[346,1099,736],{"class":356},[346,1101,1102],{"class":380},"\"BOT_BACKEND_ENDPOINT is required\"",[346,1104,554],{"class":356},[346,1106,1108],{"class":348,"line":1107},57,[346,1109,391],{"emptyLinePlaceholder":390},[346,1111,1113,1116,1118],{"class":348,"line":1112},58,[346,1114,1115],{"class":356},"chatbot_adapter ",[346,1117,502],{"class":352},[346,1119,1120],{"class":356}," AgentEngineADKAdapter(\n",[346,1122,1124,1127,1129],{"class":348,"line":1123},59,[346,1125,1126],{"class":498},"    query_url",[346,1128,502],{"class":352},[346,1130,1131],{"class":356},"query_url,\n",[346,1133,1135,1138,1140,1143,1145,1148,1150,1153],{"class":348,"line":1134},60,[346,1136,1137],{"class":498},"    timeout_seconds",[346,1139,502],{"class":352},[346,1141,1142],{"class":508},"float",[346,1144,595],{"class":356},[346,1146,1147],{"class":380},"\"BOT_BACKEND_TIMEOUT_SECS\"",[346,1149,601],{"class":356},[346,1151,1152],{"class":380},"\"60\"",[346,1154,1155],{"class":356},")),\n",[346,1157,1159,1162,1164],{"class":348,"line":1158},61,[346,1160,1161],{"class":498},"    return_last_message_only",[346,1163,502],{"class":352},[346,1165,1166],{"class":356},"return_last_message_only,\n",[346,1168,1170,1173,1175,1178,1181,1183,1186],{"class":348,"line":1169},62,[346,1171,1172],{"class":498},"    class_method",[346,1174,502],{"class":352},[346,1176,1177],{"class":356},"os.environ.get(",[346,1179,1180],{"class":380},"\"BOT_BACKEND_CLASS_METHOD\"",[346,1182,601],{"class":356},[346,1184,1185],{"class":380},"\"async_stream_query\"",[346,1187,1188],{"class":356},"),\n",[346,1190,1192],{"class":348,"line":1191},63,[346,1193,554],{"class":356},[346,1195,1197,1199,1202],{"class":348,"line":1196},64,[346,1198,762],{"class":356},[346,1200,1201],{"class":380},"\"Agent Engine REST adapter initialized as primary chatbot adapter\"",[346,1203,554],{"class":356},[346,1205,1207],{"class":348,"line":1206},65,[346,1208,391],{"emptyLinePlaceholder":390},[346,1210,1212],{"class":348,"line":1211},66,[346,1213,1214],{"class":485},"# Plug in whatever session store you use (a database, cache, etc.)\n",[346,1216,1218,1221,1223],{"class":348,"line":1217},67,[346,1219,1220],{"class":356},"data_store ",[346,1222,502],{"class":352},[346,1224,1225],{"class":356}," SessionStoreAdapter(\n",[346,1227,1229,1232,1234,1236,1239],{"class":348,"line":1228},68,[346,1230,1231],{"class":498},"    connection_string",[346,1233,502],{"class":352},[346,1235,1177],{"class":356},[346,1237,1238],{"class":380},"\"DATASTORE_DSN\"",[346,1240,1188],{"class":356},[346,1242,1244],{"class":348,"line":1243},69,[346,1245,554],{"class":356},[346,1247,1249,1251,1254],{"class":348,"line":1248},70,[346,1250,762],{"class":356},[346,1252,1253],{"class":380},"\"Session store adapter initialized\"",[346,1255,554],{"class":356},[346,1257,1259],{"class":348,"line":1258},71,[346,1260,391],{"emptyLinePlaceholder":390},[346,1262,1264],{"class":348,"line":1263},72,[346,1265,1266],{"class":485},"# Plug in whatever feedback storage you use\n",[346,1268,1270,1273,1275],{"class":348,"line":1269},73,[346,1271,1272],{"class":356},"feedback_repository ",[346,1274,502],{"class":352},[346,1276,1277],{"class":356}," FeedbackRepository(\n",[346,1279,1281,1283,1285,1287,1290],{"class":348,"line":1280},74,[346,1282,1231],{"class":498},[346,1284,502],{"class":352},[346,1286,1177],{"class":356},[346,1288,1289],{"class":380},"\"FEEDBACK_DSN\"",[346,1291,1188],{"class":356},[346,1293,1295],{"class":348,"line":1294},75,[346,1296,554],{"class":356},[346,1298,1300],{"class":348,"line":1299},76,[346,1301,391],{"emptyLinePlaceholder":390},[346,1303,1305,1308,1310],{"class":348,"line":1304},77,[346,1306,1307],{"class":356},"feedback_handler ",[346,1309,502],{"class":352},[346,1311,1312],{"class":356}," DefaultFeedbackHandler(feedback_repository)\n",[346,1314,1316],{"class":348,"line":1315},78,[346,1317,391],{"emptyLinePlaceholder":390},[346,1319,1321,1324,1326],{"class":348,"line":1320},79,[346,1322,1323],{"class":356},"bot_service ",[346,1325,502],{"class":352},[346,1327,1328],{"class":356}," BotService(\n",[346,1330,1332,1335,1337],{"class":348,"line":1331},80,[346,1333,1334],{"class":498},"    chatbot_adapter",[346,1336,502],{"class":352},[346,1338,1339],{"class":356},"chatbot_adapter,\n",[346,1341,1343,1346,1348],{"class":348,"line":1342},81,[346,1344,1345],{"class":498},"    data_store",[346,1347,502],{"class":352},[346,1349,1350],{"class":356},"data_store,\n",[346,1352,1354,1357,1359,1362],{"class":348,"line":1353},82,[346,1355,1356],{"class":498},"    fallback_adapter",[346,1358,502],{"class":352},[346,1360,1361],{"class":508},"None",[346,1363,1364],{"class":356},",\n",[346,1366,1368,1371,1373,1375],{"class":348,"line":1367},83,[346,1369,1370],{"class":498},"    bot_adapter",[346,1372,502],{"class":352},[346,1374,994],{"class":508},[346,1376,1364],{"class":356},[346,1378,1380,1383,1385,1387],{"class":348,"line":1379},84,[346,1381,1382],{"class":498},"    app_id",[346,1384,502],{"class":352},[346,1386,612],{"class":508},[346,1388,1364],{"class":356},[346,1390,1392,1395,1397],{"class":348,"line":1391},85,[346,1393,1394],{"class":498},"    feedback_handler",[346,1396,502],{"class":352},[346,1398,1399],{"class":356},"feedback_handler,\n",[346,1401,1403,1406,1408,1410],{"class":348,"line":1402},86,[346,1404,1405],{"class":498},"    alert_idle_seconds",[346,1407,502],{"class":352},[346,1409,711],{"class":508},[346,1411,1364],{"class":356},[346,1413,1415,1418,1420,1422],{"class":348,"line":1414},87,[346,1416,1417],{"class":498},"    close_idle_seconds",[346,1419,502],{"class":352},[346,1421,690],{"class":508},[346,1423,1364],{"class":356},[346,1425,1427],{"class":348,"line":1426},88,[346,1428,554],{"class":356},[346,1430,1432],{"class":348,"line":1431},89,[346,1433,391],{"emptyLinePlaceholder":390},[346,1435,1437,1440,1442,1445,1447,1449,1451],{"class":348,"line":1436},90,[346,1438,1439],{"class":356},"incoming_events_handler ",[346,1441,502],{"class":352},[346,1443,1444],{"class":356}," BotInconmingEventsHandler(",[346,1446,612],{"class":508},[346,1448,601],{"class":356},[346,1450,633],{"class":508},[346,1452,1453],{"class":356},", bot_service)\n",[346,1455,1457],{"class":348,"line":1456},91,[346,1458,391],{"emptyLinePlaceholder":390},[346,1460,1462,1465,1467,1470,1472],{"class":348,"line":1461},92,[346,1463,1464],{"class":356},"http_adapter ",[346,1466,502],{"class":352},[346,1468,1469],{"class":356}," HTTPAdapter(",[346,1471,994],{"class":508},[346,1473,1474],{"class":356},", incoming_events_handler)\n",[346,1476,1478,1481,1483],{"class":348,"line":1477},93,[346,1479,1480],{"class":356},"app ",[346,1482,502],{"class":352},[346,1484,1485],{"class":356}," http_adapter.get_app()\n",[346,1487,1489],{"class":348,"line":1488},94,[346,1490,391],{"emptyLinePlaceholder":390},[346,1492,1494],{"class":348,"line":1493},95,[346,1495,1496],{"class":485},"# Start session watcher if data store is available\n",[346,1498,1500,1502,1505,1508,1510,1513],{"class":348,"line":1499},96,[346,1501,830],{"class":352},[346,1503,1504],{"class":356}," data_store ",[346,1506,1507],{"class":352},"is",[346,1509,856],{"class":352},[346,1511,1512],{"class":508}," None",[346,1514,861],{"class":356},[346,1516,1518,1521],{"class":348,"line":1517},97,[346,1519,1520],{"class":352},"    try",[346,1522,861],{"class":356},[346,1524,1526,1529,1531,1534,1537,1539,1541],{"class":348,"line":1525},98,[346,1527,1528],{"class":356},"        watcher ",[346,1530,502],{"class":352},[346,1532,1533],{"class":356}," SessionWatcher(data_store, bot_service, ",[346,1535,1536],{"class":498},"alert_idle_seconds",[346,1538,502],{"class":352},[346,1540,711],{"class":508},[346,1542,1364],{"class":356},[346,1544,1546,1549,1551,1553],{"class":348,"line":1545},99,[346,1547,1548],{"class":498},"                                 close_idle_seconds",[346,1550,502],{"class":352},[346,1552,690],{"class":508},[346,1554,554],{"class":356},[346,1556,1558],{"class":348,"line":1557},100,[346,1559,1560],{"class":356},"        watcher.start()\n",[346,1562,1564,1567,1570,1573],{"class":348,"line":1563},101,[346,1565,1566],{"class":352},"    except",[346,1568,1569],{"class":508}," Exception",[346,1571,1572],{"class":352}," as",[346,1574,1575],{"class":356}," e:\n",[346,1577,1579,1582,1584,1586,1589,1592,1595,1598,1600],{"class":348,"line":1578},102,[346,1580,1581],{"class":508},"        print",[346,1583,736],{"class":356},[346,1585,739],{"class":352},[346,1587,1588],{"class":380},"\"Warning: could not start session watcher: ",[346,1590,1591],{"class":508},"{",[346,1593,1594],{"class":356},"e",[346,1596,1597],{"class":508},"}",[346,1599,754],{"class":380},[346,1601,554],{"class":356},[346,1603,1605],{"class":348,"line":1604},103,[346,1606,391],{"emptyLinePlaceholder":390},[346,1608,1610,1612,1615,1618,1621],{"class":348,"line":1609},104,[346,1611,830],{"class":352},[346,1613,1614],{"class":508}," __name__",[346,1616,1617],{"class":352}," ==",[346,1619,1620],{"class":380}," \"__main__\"",[346,1622,861],{"class":356},[346,1624,1626,1629,1632,1634],{"class":348,"line":1625},105,[346,1627,1628],{"class":352},"    from",[346,1630,1631],{"class":356}," aiohttp ",[346,1633,353],{"class":352},[346,1635,1636],{"class":356}," web\n",[346,1638,1640,1642],{"class":348,"line":1639},106,[346,1641,1520],{"class":352},[346,1643,861],{"class":356},[346,1645,1647,1650,1653,1655,1658,1660,1663,1665,1667],{"class":348,"line":1646},107,[346,1648,1649],{"class":356},"        web.run_app(app, ",[346,1651,1652],{"class":498},"host",[346,1654,502],{"class":352},[346,1656,1657],{"class":380},"\"0.0.0.0\"",[346,1659,601],{"class":356},[346,1661,1662],{"class":498},"port",[346,1664,502],{"class":352},[346,1666,586],{"class":508},[346,1668,554],{"class":356},[346,1670,1672,1674,1676,1678],{"class":348,"line":1671},108,[346,1673,1566],{"class":352},[346,1675,1569],{"class":508},[346,1677,1572],{"class":352},[346,1679,1680],{"class":356}," error:\n",[346,1682,1684,1687],{"class":348,"line":1683},109,[346,1685,1686],{"class":352},"        raise",[346,1688,1689],{"class":356}," error\n",[191,1691,1692,1693,1697],{},"Puedes revisar más implementaciones en el Quickstart de Microsoft ",[203,1694,1696],{"href":1695},"#ref-2","[2]",".\nEn mi opinión la página está abandonada, así que no asumas que funcionará tal cual.",[330,1699,1700],{"start":360},[228,1701,1702],{},"Antes de dar por terminada tu integración no olvides recopilar estas variables correctamente. Son necesarias para desencriptar la comunicación de Azure en el entorno productivo.",[336,1704,1708],{"className":1705,"code":1706,"language":1707,"meta":341,"style":341},"language-bash shiki shiki-themes github-light github-dark","MicrosoftAppType= SingleTenant\nMicrosoftAppId= # client id you just used for entra id and bot services\nMicrosoftAppPassword= # client secret\nMicrosoftAppTenantId=\n","bash",[343,1709,1710,1720,1730,1740],{"__ignoreMap":341},[346,1711,1712,1715,1717],{"class":348,"line":349},[346,1713,1714],{"class":356},"MicrosoftAppType",[346,1716,502],{"class":352},[346,1718,1719],{"class":908}," SingleTenant\n",[346,1721,1722,1725,1727],{"class":348,"line":360},[346,1723,1724],{"class":356},"MicrosoftAppId",[346,1726,502],{"class":352},[346,1728,1729],{"class":485}," # client id you just used for entra id and bot services\n",[346,1731,1732,1735,1737],{"class":348,"line":374},[346,1733,1734],{"class":356},"MicrosoftAppPassword",[346,1736,502],{"class":352},[346,1738,1739],{"class":485}," # client secret\n",[346,1741,1742,1745],{"class":348,"line":387},[346,1743,1744],{"class":356},"MicrosoftAppTenantId",[346,1746,1747],{"class":352},"=\n",[191,1749,1750],{},"El client secret solo es necesario para integraciones fuera del ecosistema de Azure. Es preferible usar OAuth2 o un método libre de secretos.",[1752,1753,1755],"h3",{"id":1754},"y-también-tienes-un-bonito-playground-para-que-pruebes-tu-agente-incluso-antes-de-tenerlo-en-microsoft-365","Y también tienes un bonito playground para que pruebes tu agente incluso antes de tenerlo en Microsoft 365",[191,1757,1758],{},"Para que no falle debes dejar vacías las variables que vimos en el paso #2.\nSi no lo haces el playground no podrá desencriptar las comunicaciones. Y en mi experiencia ha sido complicado debuggear cuando falla.",[191,1760,1761,1765],{},[194,1762],{"alt":1763,"src":1764,"title":1763},"Playground de Microsoft 365","\u002Farticles\u002F2026\u002Fjuly\u002Fmicrosoft-365-playground.png",[199,1766,1763],{},[214,1768,1770],{"id":1769},"publicación-en-teams","Publicación en Teams",[1752,1772,1774],{"id":1773},"carga-el-archivo-exportado-de-365-toolkit","Carga el Archivo Exportado de 365 Toolkit",[191,1776,1777],{},"El proyecto que has configurado previamente genera un bundle. Lo puedes personalizar con el logo que quieres que se muestre.\nUna versión a color y otra simplificada para las sidebars e íconos pequeños.",[191,1779,1780,1784],{},[194,1781],{"alt":1782,"src":1783,"title":1782},"Solicitud de carga de la app a Teams","\u002Farticles\u002F2026\u002Fjuly\u002Fupload-app-to-teams-request.png",[199,1785,1786],{},"Carga del bundle exportado desde el Toolkit",[1752,1788,1790],{"id":1789},"contacta-con-tu-administrador-de-ms-365","Contacta con Tu Administrador de MS 365",[191,1792,1793],{},"Dirígelo a estos enlaces:",[225,1795,1796,1803],{},[228,1797,1798,1799],{},"Centro de administración de Microsoft Teams ",[203,1800,1802],{"href":1801},"#ref-4","[4]",[228,1804,1805,1806],{},"Centro de administración de Microsoft 365 ",[203,1807,1809],{"href":1808},"#ref-5","[5]",[191,1811,1812],{},"No he podido cargarte pantallas de cómo se ve la consola de administrador y exactamente qué pasos debe tomar tu administrador.\nPero hazle saber que puede crear listas de acceso para la aplicación.",[191,1814,1815],{},"En específico debería tener una lista de acceso para la aplicación dev, que solo está abierta para unos pocos usuarios testers y desarrolladores.\nY para la aplicación productiva se puede ir planteando una estrategia distinta.",[214,1817,1819],{"id":1818},"cx","CX!",[1752,1821,1823],{"id":1822},"te-interesa-usar-formularios-con-tu-agente","¿Te interesa usar formularios con tu agente?",[191,1825,1826,1827,1831],{},"Las tarjetas adaptativas de toda la vida de Microsoft ",[203,1828,1830],{"href":1829},"#ref-3","[3]",". Las puedes usar en tu middleware.\n¿Personalización extra? Es el mismo estándar que Power Automate, con el que podrías estar más familiarizado.",[1752,1833,1835],{"id":1834},"quieres-que-el-bot-escriba","¿Quieres que ... el ... bot ... escriba? ...",[336,1837,1839],{"className":338,"code":1838,"language":340,"meta":341,"style":341},"# Typying activity: ...\nawait turn_context.send_activity(Activity(type=ActivityTypes.typing))\n# Delegate to application service\nresponse = await self.bot_service.handle_message(text, turn_context)\nawait turn_context.send_activity(response)\n",[343,1840,1841,1846,1862,1867,1883],{"__ignoreMap":341},[346,1842,1843],{"class":348,"line":349},[346,1844,1845],{"class":485},"# Typying activity: ...\n",[346,1847,1848,1851,1854,1857,1859],{"class":348,"line":360},[346,1849,1850],{"class":352},"await",[346,1852,1853],{"class":356}," turn_context.send_activity(Activity(",[346,1855,1856],{"class":498},"type",[346,1858,502],{"class":352},[346,1860,1861],{"class":356},"ActivityTypes.typing))\n",[346,1863,1864],{"class":348,"line":374},[346,1865,1866],{"class":485},"# Delegate to application service\n",[346,1868,1869,1872,1874,1877,1880],{"class":348,"line":387},[346,1870,1871],{"class":356},"response ",[346,1873,502],{"class":352},[346,1875,1876],{"class":352}," await",[346,1878,1879],{"class":508}," self",[346,1881,1882],{"class":356},".bot_service.handle_message(text, turn_context)\n",[346,1884,1885,1887],{"class":348,"line":394},[346,1886,1850],{"class":352},[346,1888,1889],{"class":356}," turn_context.send_activity(response)\n",[191,1891,1892],{},"Con enviar esa actividad es suficiente en lo que tu motor del agente responde.",[214,1894,1896],{"id":1895},"extra","Extra!",[191,1898,1899],{},"Esto es lo que pude recopilar de las comunicación que envían los servidores de Azure Bot Services. Te podría ser útil si quieres entender qué tanto puedes obtener de información útil a través del middleware.",[336,1901,1905],{"className":1902,"code":1903,"language":1904,"meta":341,"style":341},"language-http shiki shiki-themes github-light github-dark","POST \u002Fapi\u002Fmessages HTTP\u002F1.1\nHost: localhost:3978\nUser-Agent: BF-DirectLine (Microsoft-BotFramework\u002F3.2 +https:\u002F\u002Fbotframework.com\u002Fua)\nContent-Length: 719\nAccept: *\u002F*\nAuthorization: Bearer \u003CREDACTED_JWT>\nChannelid: webchat\nContent-Type: application\u002Fjson; charset=utf-8\nRequest-Id: |\u003CREDACTED_REQUEST_ID>.\u003CREDACTED_SPAN_ID>.\nTraceparent: 00-\u003CREDACTED_TRACE_ID>-\u003CREDACTED_SPAN_ID>-00\nX-Forwarded-For: xxx.xxx.xxx.xxx\nX-Forwarded-Host: xxxx-xxx-xxx-xx.ngrok-free.app\nX-Forwarded-Proto: https\nX-Ms-Conversation-Id: \u003CREDACTED_CONVERSATION_ID>\nAccept-Encoding: gzip\n\n{\"type\":\"typing\",\"id\":\"\u003CREDACTED_CONVERSATION_ID>|\u003CREDACTED_ACTIVITY_ID>\",\"timestamp\":\"2026-03-02T17:44:41.6782359Z\",\"localTimestamp\":\"2026-03-02T12:44:41.391-05:00\",\"localTimezone\":\"America\u002FLima\",\"serviceUrl\":\"https:\u002F\u002Fwebchat.botframework.com\u002F\",\"channelId\":\"webchat\",\"from\":{\"id\":\"00000000-0000-0000-0000-000000000000\",\"name\":\"\"},\"conversation\":{\"id\":\"\u003CREDACTED_CONVERSATION_ID>\"},\"recipient\":{\"id\":\"agente-msteams@\u003CREDACTED_TOKEN>\",\"name\":\"agente-msteams\"},\"locale\":\"en-US\",\"entities\":[{\"type\":\"ClientCapabilities\",\"requiresBotState\":true,\"supportsListening\":true,\"supportsTts\":true}],\"channelData\":{\"clientActivityID\":\"\u003CREDACTED_CLIENT_ACTIVITY_ID>\"}}\n\n\n\n\nPOST \u002Fapi\u002Fmessages HTTP\u002F1.1\nHost: localhost:3978\nUser-Agent: BF-DirectLine (Microsoft-BotFramework\u002F3.2 +https:\u002F\u002Fbotframework.com\u002Fua)\nContent-Length: 662\nAccept: *\u002F*\nAuthorization: Bearer \u003CREDACTED_JWT>\nChannelid: webchat\nContent-Type: application\u002Fjson; charset=utf-8\nRequest-Id: |\u003CREDACTED_REQUEST_ID>.\u003CREDACTED_SPAN_ID>.\nTraceparent: 00-\u003CREDACTED_TRACE_ID>-\u003CREDACTED_SPAN_ID>-00\nX-Forwarded-For: xxx.xxx.xxx.xxx\nX-Forwarded-Host: xxxx-xxx-xxx-xx.ngrok-free.app\nX-Forwarded-Proto: https\nX-Ms-Conversation-Id: \u003CREDACTED_CONVERSATION_ID>\nAccept-Encoding: gzip\n\n{\"type\":\"conversationUpdate\",\"id\":\"\u003CREDACTED_ACTIVITY_ID>\",\"timestamp\":\"2026-03-02T17:44:41.0353977Z\",\"serviceUrl\":\"https:\u002F\u002Fwebchat.botframework.com\u002F\",\"channelId\":\"webchat\",\"from\":{\"id\":\"00000000-0000-0000-0000-000000000000\"},\"conversation\":{\"id\":\"\u003CREDACTED_CONVERSATION_ID>\"},\"recipient\":{\"id\":\"agente-msteams@\u003CREDACTED_TOKEN>\",\"name\":\"agente-msteams\"},\"membersAdded\":[{\"id\":\"agente-msteams@\u003CREDACTED_TOKEN>\",\"name\":\"agente-msteams\"},{\"id\":\"00000000-0000-0000-0000-000000000000\"}]}\n\nPOST \u002Fapi\u002Fmessages HTTP\u002F1.1\nHost: localhost:3978\nUser-Agent: BF-DirectLine (Microsoft-BotFramework\u002F3.2 +https:\u002F\u002Fbotframework.com\u002Fua)\nContent-Length: 679\nAccept: *\u002F*\nAuthorization: Bearer \u003CREDACTED_JWT>\nChannelid: webchat\nContent-Type: application\u002Fjson; charset=utf-8\nRequest-Id: |\u003CREDACTED_REQUEST_ID>.\u003CREDACTED_SPAN_ID>.\nTraceparent: 00-\u003CREDACTED_TRACE_ID>-\u003CREDACTED_SPAN_ID>-00\nX-Forwarded-For: xxx.xxx.xxx.xxx\nX-Forwarded-Host: xxxx-xxx-xxx-xx.ngrok-free.app\nX-Forwarded-Proto: https\nX-Ms-Conversation-Id: \u003CREDACTED_CONVERSATION_ID>\nAccept-Encoding: gzip\n\n{\"type\":\"message\",\"id\":\"\u003CREDACTED_CONVERSATION_ID>|\u003CREDACTED_ACTIVITY_ID>\",\"timestamp\":\"2026-03-02T17:44:42.8691754Z\",\"localTimestamp\":\"2026-03-02T12:44:42.728-05:00\",\"localTimezone\":\"America\u002FLima\",\"serviceUrl\":\"https:\u002F\u002Fwebchat.botframework.com\u002F\",\"channelId\":\"webchat\",\"from\":{\"id\":\"00000000-0000-0000-0000-000000000000\",\"name\":\"\"},\"conversation\":{\"id\":\"\u003CREDACTED_CONVERSATION_ID>\"},\"recipient\":{\"id\":\"agente-msteams@\u003CREDACTED_TOKEN>\",\"name\":\"agente-msteams\"},\"textFormat\":\"plain\",\"locale\":\"en-US\",\"text\":\"Hola\",\"attachments\":[],\"channelData\":{\"attachmentSizes\":[],\"clientActivityID\":\"\u003CREDACTED_CLIENT_ACTIVITY_ID>\"}}\n","http",[343,1906,1907,1924,1936,1946,1956,1966,1976,1986,1996,2006,2016,2026,2036,2046,2056,2066,2070,2277,2281,2285,2289,2293,2300,2308,2322,2330,2338,2343,2348,2353,2358,2363,2368,2373,2378,2383,2388,2392,2397,2401,2406,2411,2416,2421,2429,2433,2437,2445,2449,2463,2467,2471,2475,2479,2483,2487],{"__ignoreMap":341},[346,1908,1909,1912,1915,1918,1921],{"class":348,"line":349},[346,1910,1911],{"class":352},"POST",[346,1913,1914],{"class":356}," \u002Fapi\u002Fmessages ",[346,1916,1917],{"class":352},"HTTP",[346,1919,1920],{"class":356},"\u002F",[346,1922,1923],{"class":508},"1.1\n",[346,1925,1926,1930,1933],{"class":348,"line":360},[346,1927,1929],{"class":1928},"s9eBZ","Host",[346,1931,1932],{"class":352},":",[346,1934,1935],{"class":380}," localhost:3978\n",[346,1937,1938,1941,1943],{"class":348,"line":374},[346,1939,1940],{"class":1928},"User-Agent",[346,1942,1932],{"class":352},[346,1944,1945],{"class":380}," BF-DirectLine (Microsoft-BotFramework\u002F3.2 +https:\u002F\u002Fbotframework.com\u002Fua)\n",[346,1947,1948,1951,1953],{"class":348,"line":387},[346,1949,1950],{"class":1928},"Content-Length",[346,1952,1932],{"class":352},[346,1954,1955],{"class":380}," 719\n",[346,1957,1958,1961,1963],{"class":348,"line":394},[346,1959,1960],{"class":1928},"Accept",[346,1962,1932],{"class":352},[346,1964,1965],{"class":380}," *\u002F*\n",[346,1967,1968,1971,1973],{"class":348,"line":407},[346,1969,1970],{"class":1928},"Authorization",[346,1972,1932],{"class":352},[346,1974,1975],{"class":380}," Bearer \u003CREDACTED_JWT>\n",[346,1977,1978,1981,1983],{"class":348,"line":412},[346,1979,1980],{"class":1928},"Channelid",[346,1982,1932],{"class":352},[346,1984,1985],{"class":380}," webchat\n",[346,1987,1988,1991,1993],{"class":348,"line":425},[346,1989,1990],{"class":1928},"Content-Type",[346,1992,1932],{"class":352},[346,1994,1995],{"class":380}," application\u002Fjson; charset=utf-8\n",[346,1997,1998,2001,2003],{"class":348,"line":438},[346,1999,2000],{"class":1928},"Request-Id",[346,2002,1932],{"class":352},[346,2004,2005],{"class":380}," |\u003CREDACTED_REQUEST_ID>.\u003CREDACTED_SPAN_ID>.\n",[346,2007,2008,2011,2013],{"class":348,"line":451},[346,2009,2010],{"class":1928},"Traceparent",[346,2012,1932],{"class":352},[346,2014,2015],{"class":380}," 00-\u003CREDACTED_TRACE_ID>-\u003CREDACTED_SPAN_ID>-00\n",[346,2017,2018,2021,2023],{"class":348,"line":464},[346,2019,2020],{"class":1928},"X-Forwarded-For",[346,2022,1932],{"class":352},[346,2024,2025],{"class":380}," xxx.xxx.xxx.xxx\n",[346,2027,2028,2031,2033],{"class":348,"line":469},[346,2029,2030],{"class":1928},"X-Forwarded-Host",[346,2032,1932],{"class":352},[346,2034,2035],{"class":380}," xxxx-xxx-xxx-xx.ngrok-free.app\n",[346,2037,2038,2041,2043],{"class":348,"line":477},[346,2039,2040],{"class":1928},"X-Forwarded-Proto",[346,2042,1932],{"class":352},[346,2044,2045],{"class":380}," https\n",[346,2047,2048,2051,2053],{"class":348,"line":482},[346,2049,2050],{"class":1928},"X-Ms-Conversation-Id",[346,2052,1932],{"class":352},[346,2054,2055],{"class":380}," \u003CREDACTED_CONVERSATION_ID>\n",[346,2057,2058,2061,2063],{"class":348,"line":489},[346,2059,2060],{"class":1928},"Accept-Encoding",[346,2062,1932],{"class":352},[346,2064,2065],{"class":380}," gzip\n",[346,2067,2068],{"class":348,"line":495},[346,2069,391],{"emptyLinePlaceholder":390},[346,2071,2072,2074,2077,2079,2082,2085,2088,2090,2093,2095,2098,2100,2103,2105,2108,2110,2113,2115,2118,2120,2123,2125,2128,2130,2133,2135,2138,2140,2143,2145,2148,2151,2153,2155,2158,2160,2163,2165,2167,2170,2173,2175,2177,2179,2182,2184,2187,2189,2191,2193,2196,2198,2200,2202,2205,2207,2210,2212,2215,2217,2220,2223,2225,2227,2230,2232,2235,2237,2240,2242,2245,2247,2249,2251,2254,2256,2258,2261,2264,2266,2269,2271,2274],{"class":348,"line":518},[346,2073,1591],{"class":356},[346,2075,2076],{"class":508},"\"type\"",[346,2078,1932],{"class":356},[346,2080,2081],{"class":380},"\"typing\"",[346,2083,2084],{"class":356},",",[346,2086,2087],{"class":508},"\"id\"",[346,2089,1932],{"class":356},[346,2091,2092],{"class":380},"\"\u003CREDACTED_CONVERSATION_ID>|\u003CREDACTED_ACTIVITY_ID>\"",[346,2094,2084],{"class":356},[346,2096,2097],{"class":508},"\"timestamp\"",[346,2099,1932],{"class":356},[346,2101,2102],{"class":380},"\"2026-03-02T17:44:41.6782359Z\"",[346,2104,2084],{"class":356},[346,2106,2107],{"class":508},"\"localTimestamp\"",[346,2109,1932],{"class":356},[346,2111,2112],{"class":380},"\"2026-03-02T12:44:41.391-05:00\"",[346,2114,2084],{"class":356},[346,2116,2117],{"class":508},"\"localTimezone\"",[346,2119,1932],{"class":356},[346,2121,2122],{"class":380},"\"America\u002FLima\"",[346,2124,2084],{"class":356},[346,2126,2127],{"class":508},"\"serviceUrl\"",[346,2129,1932],{"class":356},[346,2131,2132],{"class":380},"\"https:\u002F\u002Fwebchat.botframework.com\u002F\"",[346,2134,2084],{"class":356},[346,2136,2137],{"class":508},"\"channelId\"",[346,2139,1932],{"class":356},[346,2141,2142],{"class":380},"\"webchat\"",[346,2144,2084],{"class":356},[346,2146,2147],{"class":508},"\"from\"",[346,2149,2150],{"class":356},":{",[346,2152,2087],{"class":508},[346,2154,1932],{"class":356},[346,2156,2157],{"class":380},"\"00000000-0000-0000-0000-000000000000\"",[346,2159,2084],{"class":356},[346,2161,2162],{"class":508},"\"name\"",[346,2164,1932],{"class":356},[346,2166,625],{"class":380},[346,2168,2169],{"class":356},"},",[346,2171,2172],{"class":508},"\"conversation\"",[346,2174,2150],{"class":356},[346,2176,2087],{"class":508},[346,2178,1932],{"class":356},[346,2180,2181],{"class":380},"\"\u003CREDACTED_CONVERSATION_ID>\"",[346,2183,2169],{"class":356},[346,2185,2186],{"class":508},"\"recipient\"",[346,2188,2150],{"class":356},[346,2190,2087],{"class":508},[346,2192,1932],{"class":356},[346,2194,2195],{"class":380},"\"agente-msteams@\u003CREDACTED_TOKEN>\"",[346,2197,2084],{"class":356},[346,2199,2162],{"class":508},[346,2201,1932],{"class":356},[346,2203,2204],{"class":380},"\"agente-msteams\"",[346,2206,2169],{"class":356},[346,2208,2209],{"class":508},"\"locale\"",[346,2211,1932],{"class":356},[346,2213,2214],{"class":380},"\"en-US\"",[346,2216,2084],{"class":356},[346,2218,2219],{"class":508},"\"entities\"",[346,2221,2222],{"class":356},":[{",[346,2224,2076],{"class":508},[346,2226,1932],{"class":356},[346,2228,2229],{"class":380},"\"ClientCapabilities\"",[346,2231,2084],{"class":356},[346,2233,2234],{"class":508},"\"requiresBotState\"",[346,2236,1932],{"class":356},[346,2238,2239],{"class":508},"true",[346,2241,2084],{"class":356},[346,2243,2244],{"class":508},"\"supportsListening\"",[346,2246,1932],{"class":356},[346,2248,2239],{"class":508},[346,2250,2084],{"class":356},[346,2252,2253],{"class":508},"\"supportsTts\"",[346,2255,1932],{"class":356},[346,2257,2239],{"class":508},[346,2259,2260],{"class":356},"}],",[346,2262,2263],{"class":508},"\"channelData\"",[346,2265,2150],{"class":356},[346,2267,2268],{"class":508},"\"clientActivityID\"",[346,2270,1932],{"class":356},[346,2272,2273],{"class":380},"\"\u003CREDACTED_CLIENT_ACTIVITY_ID>\"",[346,2275,2276],{"class":356},"}}\n",[346,2278,2279],{"class":348,"line":551},[346,2280,391],{"emptyLinePlaceholder":390},[346,2282,2283],{"class":348,"line":557},[346,2284,391],{"emptyLinePlaceholder":390},[346,2286,2287],{"class":348,"line":562},[346,2288,391],{"emptyLinePlaceholder":390},[346,2290,2291],{"class":348,"line":578},[346,2292,391],{"emptyLinePlaceholder":390},[346,2294,2295,2298],{"class":348,"line":583},[346,2296,2297],{"class":356},"POST \u002Fapi\u002Fmessages HTTP\u002F",[346,2299,1923],{"class":508},[346,2301,2302,2305],{"class":348,"line":609},[346,2303,2304],{"class":356},"Host: localhost:",[346,2306,2307],{"class":508},"3978\n",[346,2309,2310,2313,2316,2319],{"class":348,"line":630},[346,2311,2312],{"class":356},"User-Agent: BF-DirectLine (Microsoft-BotFramework\u002F",[346,2314,2315],{"class":508},"3.2",[346,2317,2318],{"class":356}," +https:",[346,2320,2321],{"class":485},"\u002F\u002Fbotframework.com\u002Fua)\n",[346,2323,2324,2327],{"class":348,"line":649},[346,2325,2326],{"class":356},"Content-Length: ",[346,2328,2329],{"class":508},"662\n",[346,2331,2332,2335],{"class":348,"line":668},[346,2333,2334],{"class":356},"Accept: *",[346,2336,2337],{"class":485},"\u002F*\n",[346,2339,2340],{"class":348,"line":687},[346,2341,2342],{"class":485},"Authorization: Bearer \u003CREDACTED_JWT>\n",[346,2344,2345],{"class":348,"line":708},[346,2346,2347],{"class":485},"Channelid: webchat\n",[346,2349,2350],{"class":348,"line":725},[346,2351,2352],{"class":485},"Content-Type: application\u002Fjson; charset=utf-8\n",[346,2354,2355],{"class":348,"line":730},[346,2356,2357],{"class":485},"Request-Id: |\u003CREDACTED_REQUEST_ID>.\u003CREDACTED_SPAN_ID>.\n",[346,2359,2360],{"class":348,"line":759},[346,2361,2362],{"class":485},"Traceparent: 00-\u003CREDACTED_TRACE_ID>-\u003CREDACTED_SPAN_ID>-00\n",[346,2364,2365],{"class":348,"line":776},[346,2366,2367],{"class":485},"X-Forwarded-For: xxx.xxx.xxx.xxx\n",[346,2369,2370],{"class":348,"line":793},[346,2371,2372],{"class":485},"X-Forwarded-Host: xxxx-xxx-xxx-xx.ngrok-free.app\n",[346,2374,2375],{"class":348,"line":810},[346,2376,2377],{"class":485},"X-Forwarded-Proto: https\n",[346,2379,2380],{"class":348,"line":846},[346,2381,2382],{"class":485},"X-Ms-Conversation-Id: \u003CREDACTED_CONVERSATION_ID>\n",[346,2384,2385],{"class":348,"line":851},[346,2386,2387],{"class":485},"Accept-Encoding: gzip\n",[346,2389,2390],{"class":348,"line":864},[346,2391,391],{"emptyLinePlaceholder":390},[346,2393,2394],{"class":348,"line":875},[346,2395,2396],{"class":485},"{\"type\":\"conversationUpdate\",\"id\":\"\u003CREDACTED_ACTIVITY_ID>\",\"timestamp\":\"2026-03-02T17:44:41.0353977Z\",\"serviceUrl\":\"https:\u002F\u002Fwebchat.botframework.com\u002F\",\"channelId\":\"webchat\",\"from\":{\"id\":\"00000000-0000-0000-0000-000000000000\"},\"conversation\":{\"id\":\"\u003CREDACTED_CONVERSATION_ID>\"},\"recipient\":{\"id\":\"agente-msteams@\u003CREDACTED_TOKEN>\",\"name\":\"agente-msteams\"},\"membersAdded\":[{\"id\":\"agente-msteams@\u003CREDACTED_TOKEN>\",\"name\":\"agente-msteams\"},{\"id\":\"00000000-0000-0000-0000-000000000000\"}]}\n",[346,2398,2399],{"class":348,"line":887},[346,2400,391],{"emptyLinePlaceholder":390},[346,2402,2403],{"class":348,"line":897},[346,2404,2405],{"class":485},"POST \u002Fapi\u002Fmessages HTTP\u002F1.1\n",[346,2407,2408],{"class":348,"line":902},[346,2409,2410],{"class":485},"Host: localhost:3978\n",[346,2412,2413],{"class":348,"line":914},[346,2414,2415],{"class":485},"User-Agent: BF-DirectLine (Microsoft-BotFramework\u002F3.2 +https:\u002F\u002Fbotframework.com\u002Fua)\n",[346,2417,2418],{"class":348,"line":925},[346,2419,2420],{"class":485},"Content-Length: 679\n",[346,2422,2423,2426],{"class":348,"line":936},[346,2424,2425],{"class":485},"Accept: *\u002F",[346,2427,2428],{"class":356},"*\n",[346,2430,2431],{"class":348,"line":947},[346,2432,2342],{"class":356},[346,2434,2435],{"class":348,"line":958},[346,2436,2347],{"class":356},[346,2438,2439,2442],{"class":348,"line":969},[346,2440,2441],{"class":356},"Content-Type: application\u002Fjson; charset=utf",[346,2443,2444],{"class":508},"-8\n",[346,2446,2447],{"class":348,"line":974},[346,2448,2357],{"class":356},[346,2450,2451,2454,2457,2460],{"class":348,"line":985},[346,2452,2453],{"class":356},"Traceparent: ",[346,2455,2456],{"class":508},"00",[346,2458,2459],{"class":356},"-\u003CREDACTED_TRACE_ID>-\u003CREDACTED_SPAN_ID>",[346,2461,2462],{"class":508},"-00\n",[346,2464,2465],{"class":348,"line":991},[346,2466,2367],{"class":356},[346,2468,2469],{"class":348,"line":1010},[346,2470,2372],{"class":356},[346,2472,2473],{"class":348,"line":1015},[346,2474,2377],{"class":356},[346,2476,2477],{"class":348,"line":1020},[346,2478,2382],{"class":356},[346,2480,2481],{"class":348,"line":1066},[346,2482,2387],{"class":356},[346,2484,2485],{"class":348,"line":1081},[346,2486,391],{"emptyLinePlaceholder":390},[346,2488,2489,2491,2493,2495,2498,2500,2502,2504,2506,2508,2510,2512,2515,2517,2519,2521,2524,2526,2528,2530,2532,2534,2536,2538,2540,2542,2544,2546,2548,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574,2576,2578,2580,2582,2584,2586,2588,2590,2592,2594,2596,2598,2600,2602,2605,2607,2610,2612,2614,2616,2618,2620,2623,2625,2628,2630,2633,2636,2638,2640,2643,2645,2647,2649,2651],{"class":348,"line":1091},[346,2490,1591],{"class":356},[346,2492,2076],{"class":508},[346,2494,1932],{"class":356},[346,2496,2497],{"class":380},"\"message\"",[346,2499,2084],{"class":356},[346,2501,2087],{"class":508},[346,2503,1932],{"class":356},[346,2505,2092],{"class":380},[346,2507,2084],{"class":356},[346,2509,2097],{"class":508},[346,2511,1932],{"class":356},[346,2513,2514],{"class":380},"\"2026-03-02T17:44:42.8691754Z\"",[346,2516,2084],{"class":356},[346,2518,2107],{"class":508},[346,2520,1932],{"class":356},[346,2522,2523],{"class":380},"\"2026-03-02T12:44:42.728-05:00\"",[346,2525,2084],{"class":356},[346,2527,2117],{"class":508},[346,2529,1932],{"class":356},[346,2531,2122],{"class":380},[346,2533,2084],{"class":356},[346,2535,2127],{"class":508},[346,2537,1932],{"class":356},[346,2539,2132],{"class":380},[346,2541,2084],{"class":356},[346,2543,2137],{"class":508},[346,2545,1932],{"class":356},[346,2547,2142],{"class":380},[346,2549,2084],{"class":356},[346,2551,2147],{"class":508},[346,2553,2150],{"class":356},[346,2555,2087],{"class":508},[346,2557,1932],{"class":356},[346,2559,2157],{"class":380},[346,2561,2084],{"class":356},[346,2563,2162],{"class":508},[346,2565,1932],{"class":356},[346,2567,625],{"class":380},[346,2569,2169],{"class":356},[346,2571,2172],{"class":508},[346,2573,2150],{"class":356},[346,2575,2087],{"class":508},[346,2577,1932],{"class":356},[346,2579,2181],{"class":380},[346,2581,2169],{"class":356},[346,2583,2186],{"class":508},[346,2585,2150],{"class":356},[346,2587,2087],{"class":508},[346,2589,1932],{"class":356},[346,2591,2195],{"class":380},[346,2593,2084],{"class":356},[346,2595,2162],{"class":508},[346,2597,1932],{"class":356},[346,2599,2204],{"class":380},[346,2601,2169],{"class":356},[346,2603,2604],{"class":508},"\"textFormat\"",[346,2606,1932],{"class":356},[346,2608,2609],{"class":380},"\"plain\"",[346,2611,2084],{"class":356},[346,2613,2209],{"class":508},[346,2615,1932],{"class":356},[346,2617,2214],{"class":380},[346,2619,2084],{"class":356},[346,2621,2622],{"class":508},"\"text\"",[346,2624,1932],{"class":356},[346,2626,2627],{"class":380},"\"Hola\"",[346,2629,2084],{"class":356},[346,2631,2632],{"class":508},"\"attachments\"",[346,2634,2635],{"class":356},":[],",[346,2637,2263],{"class":508},[346,2639,2150],{"class":356},[346,2641,2642],{"class":508},"\"attachmentSizes\"",[346,2644,2635],{"class":356},[346,2646,2268],{"class":508},[346,2648,1932],{"class":356},[346,2650,2273],{"class":380},[346,2652,2276],{"class":356},[214,2654,2656],{"id":2655},"referencias","Referencias",[330,2658,2659,2667,2674,2681,2688],{},[228,2660,2661,2662],{},"[]Microsoft. Agents Toolkit fundamentals. Available: ",[203,2663,2664],{"href":2664,"rel":2665},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fmicrosoftteams\u002Fplatform\u002Ftoolkit\u002Fagents-toolkit-fundamentals",[2666],"nofollow",[228,2668,2669,2670],{},"[]Microsoft. Microsoft 365 Agents SDK Quickstart (Python). Available: ",[203,2671,2672],{"href":2672,"rel":2673},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fmicrosoft-365\u002Fagents-sdk\u002Fquickstart?pivots=python",[2666],[228,2675,2676,2677],{},"[]Microsoft. Adaptive Cards. Available: ",[203,2678,2679],{"href":2679,"rel":2680},"https:\u002F\u002Fadaptivecards.microsoft.com\u002F",[2666],[228,2682,2683,2684],{},"[]Microsoft. Centro de administración de Microsoft Teams. Available: ",[203,2685,2686],{"href":2686,"rel":2687},"https:\u002F\u002Fadmin.teams.microsoft.com",[2666],[228,2689,2690,2691],{},"[]Microsoft. Centro de administración de Microsoft 365. Available: ",[203,2692,2693],{"href":2693,"rel":2694},"https:\u002F\u002Fadmin.microsoft.com",[2666],[2696,2697,2698],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":341,"searchDepth":360,"depth":360,"links":2700},[2701,2702,2703,2704,2705,2708,2712,2716,2717],{"id":216,"depth":360,"text":217},{"id":236,"depth":360,"text":237},{"id":263,"depth":360,"text":264},{"id":305,"depth":360,"text":306},{"id":327,"depth":360,"text":328,"children":2706},[2707],{"id":1754,"depth":374,"text":1755},{"id":1769,"depth":360,"text":1770,"children":2709},[2710,2711],{"id":1773,"depth":374,"text":1774},{"id":1789,"depth":374,"text":1790},{"id":1818,"depth":360,"text":1819,"children":2713},[2714,2715],{"id":1822,"depth":374,"text":1823},{"id":1834,"depth":374,"text":1835},{"id":1895,"depth":360,"text":1896},{"id":2655,"depth":360,"text":2656},"\u002Farticles\u002F2026\u002Fjuly\u002Fms-teams-agent-architecture.jpg","2026-07-07T10:00:00.000Z","Un agente que muestra una animación de pensamiento, carga de imágenes y más! ...","md","article",{"head":2724},{"meta":2725},[2726],{"name":2727,"content":2728},"keywords","agentes, microsoft teams, m365 agents toolkit, azure bot service, sharepoint, rag engine, máquina de estados, chatbots, mesa de ayuda",{"title":138,"description":2720},"2efcOrnip38x33OHR2I-mLPyR55MMCzJx8tNUSrs-qE",1785483354946]