[{"data":1,"prerenderedAt":2731},["ShallowReactive",2],{"navigation":3,"\u002Fen\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":40,"author":179,"badges":182,"body":183,"canonical":182,"cover":2718,"date":2719,"description":2720,"extension":2721,"layout":2722,"meta":2723,"navigation":390,"path":41,"seo":2729,"stem":42,"__hash__":2730},"content\u002Fen\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,40],"h1",{"id":189},"from-idea-to-ms-teams-deploying-an-agent",[191,192,193,198],"p",{},[194,195],"img",{"alt":196,"src":197,"title":196},"Agents Toolkit development flow","\u002Farticles\u002F2026\u002Fjuly\u002Fagent-toolkit-dev-flow.png",[199,200,201,202],"em",{},"Taken from ",[203,204,206],"a",{"href":205},"#ref-1","[1]",[191,208,209],{},"There is a growing number of services and entry points to deploy an agent in MS Teams these days. It can be through Copilot, Microsoft 365, or the AI Foundry services.\nUnder the hood, all of them use the Azure Bot Services APIs.",[191,211,212],{},"If you want maximum customization, you will like this tutorial.",[214,215,217],"h2",{"id":216},"prerequisites","Prerequisites",[191,219,220,221,223],{},"If you struggle to get your Azure admin to grant permissions documented in some random blog article, this Microsoft post follows steps similar to this one ",[203,222,206],{"href":205},".",[225,226,227,231],"ul",{},[228,229,230],"li",{},"Application Developer role in the Azure subscription where your project will be assigned.",[228,232,233],{},"A corporate MS Teams license. As an alternative, there is a Microsoft 365 Dev trial program you can try, but it only lasts 90 days and you still need an active Azure subscription anyway.\nIt ends up redundant to do all the work there instead of isolating a group of users in your organization's 365 admin console.",[214,235,237],{"id":236},"contents","Contents",[191,239,240],{},"What this tutorial covers:",[225,242,243,246,249,252,255],{},[228,244,245],{},"Creating the App in Azure Entra ID. This is where permissions are managed, and it is the visible face of your Agent for everyone in the same Microsoft tenant.",[228,247,248],{},"Configuring Azure Bot Services. This is the integration API for the MS 365 suite.",[228,250,251],{},"Integration with your own Agent, a self-hosted LangGraph or whatever you built. Here we see how you connect it to Azure Bot Services.",[228,253,254],{},"Publishing to Teams: user exclusion rules, icons, logos and versioning.",[228,256,257],{},"A few CX details, D:",[191,259,260],{},"We are not going to look at the agent's own logic. What you care about, like I did back then, is how to deploy it into your corporate suite.",[214,262,264],{"id":263},"entra-id","Entra ID",[191,266,267],{},"Azure can be a nightmare sometimes. Let's go step by step.",[191,269,270],{},"First, create an app with a name and a 'dev' or 'prd' suffix. You will need this distinction later to segregate users.",[191,272,273,278],{},[194,274],{"alt":275,"src":276,"title":277},"Open the Entra ID service","\u002Farticles\u002F2026\u002Fjuly\u002Fentra-id-tuto.png","Open the service",[199,279,277],{},[191,281,282,287],{},[194,283],{"alt":284,"src":285,"title":286},"Registering a new app","\u002Farticles\u002F2026\u002Fjuly\u002Fapp-registration-add-new.png","Click create",[199,288,289],{},"Click create. Single tenant is enough for most use cases.",[191,291,292,297],{},[194,293],{"alt":294,"src":295,"title":296},"App registration panel","\u002Farticles\u002F2026\u002Fjuly\u002Fapp-registration-panel.png","Note down the App Id",[199,298,299],{},"Note down the App Id.",[191,301,302],{},"If you need your agent to interact with Microsoft services, the API Permissions section will be your friend. In case your Agent is not part of the Azure ecosystem, a quick fix is to create a certificate in the Certificates and Secrets section. In that case, note down the Secret you generate.",[214,304,306],{"id":305},"azure-bot-services","Azure Bot Services",[191,308,309],{},"Create a Bot with the same App Id you used for Entra ID. I am not sure of the reason behind this, but when I used the automatically generated Id there were issues with the bot showing up in the Microsoft 365 Admin console.",[191,311,312,316],{},[194,313],{"alt":314,"src":315,"title":314},"Azure Bot Services configuration panel","\u002Farticles\u002F2026\u002Fjuly\u002Fazure-bot-services-config-panel.png",[199,317,318],{},"Here the two most important fields have arrows.",[191,320,321],{},"The URL endpoint field is the endpoint of the middleware you are going to build next.",[191,323,324],{},"The 'test in webchat' section lets you check that your agent and integration middleware actually work and respond correctly.",[214,326,328],{"id":327},"integration","Integration",[330,331,332],"ol",{},[228,333,334],{},"This is a simplified version of an adapter that works for me.",[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],{},"You can check more implementations in Microsoft's Quickstart ",[203,1694,1696],{"href":1695},"#ref-2","[2]",".\nIn my opinion the page is a bit abandoned, so don't assume it will work as-is.",[330,1699,1700],{"start":360},[228,1701,1702],{},"Before wrapping up your integration, do not forget to collect these variables correctly. They are required to decrypt Azure's communication in the production environment.",[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],{},"The client secret is only needed for integrations outside the Azure ecosystem. It is preferable to use OAuth2 or a secret-free method.",[1752,1753,1755],"h3",{"id":1754},"and-you-also-get-a-nice-playground-to-test-your-agent-even-before-it-lands-in-microsoft-365","And you also get a nice playground to test your agent even before it lands in Microsoft 365",[191,1757,1758],{},"For it not to fail, you need to leave the variables from step #2 empty.\nIf you don't, the playground won't be able to decrypt the communication. And in my experience, that has been a painful thing to debug when it fails.",[191,1760,1761,1765],{},[194,1762],{"alt":1763,"src":1764,"title":1763},"Microsoft 365 Playground","\u002Farticles\u002F2026\u002Fjuly\u002Fmicrosoft-365-playground.png",[199,1766,1763],{},[214,1768,1770],{"id":1769},"publishing-to-teams","Publishing to Teams",[1752,1772,1774],{"id":1773},"upload-the-file-exported-from-the-365-toolkit","Upload the File Exported from the 365 Toolkit",[191,1776,1777],{},"The project you configured previously generates a bundle. You can customize it with the logo you want displayed.\nA colored version and a simplified one for sidebars and small icons.",[191,1779,1780,1784],{},[194,1781],{"alt":1782,"src":1783,"title":1782},"Uploading the app to Teams request","\u002Farticles\u002F2026\u002Fjuly\u002Fupload-app-to-teams-request.png",[199,1785,1786],{},"Uploading the bundle exported from the Toolkit",[1752,1788,1790],{"id":1789},"contact-your-ms-365-administrator","Contact Your MS 365 Administrator",[191,1792,1793],{},"Point them to these links:",[225,1795,1796,1803],{},[228,1797,1798,1799],{},"Microsoft Teams admin center ",[203,1800,1802],{"href":1801},"#ref-4","[4]",[228,1804,1805,1806],{},"Microsoft 365 admin center ",[203,1807,1809],{"href":1808},"#ref-5","[5]",[191,1811,1812],{},"I have not been able to share screenshots of what the admin console looks like and the exact steps your admin should follow.\nBut let them know they can create access lists for the application.",[191,1814,1815],{},"Specifically, they should have an access list for the dev application, open only to a handful of tester and developer users.\nAnd for the production application, a different strategy can be worked out.",[214,1817,1819],{"id":1818},"cx","CX!",[1752,1821,1823],{"id":1822},"interested-in-using-forms-with-your-agent","Interested in using forms with your agent?",[191,1825,1826,1827,1831],{},"Microsoft's good old Adaptive Cards ",[203,1828,1830],{"href":1829},"#ref-3","[3]",". You can use them in your middleware.\nExtra customization? It's the same standard used by Power Automate, which you might be more familiar with.",[1752,1833,1835],{"id":1834},"do-you-want-the-bot-to-type","Do you want the ... bot ... to type? ...",[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],{},"Sending that activity is enough while your agent's engine is working on the response.",[214,1894,1896],{"id":1895},"extra","Extra!",[191,1898,1899],{},"This is what I could gather from the communications sent by the Azure Bot Services servers. It might be useful if you want to understand how much useful information you can get through the 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},"references","References",[330,2658,2659,2667,2674,2681,2688],{},[228,2660,2661,2662],{},"[]{#ref-1}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],{},"[]{#ref-2}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],{},"[]{#ref-3}Microsoft. Adaptive Cards. Available: ",[203,2678,2679],{"href":2679,"rel":2680},"https:\u002F\u002Fadaptivecards.microsoft.com\u002F",[2666],[228,2682,2683,2684],{},"[]{#ref-4}Microsoft. Microsoft Teams admin center. Available: ",[203,2685,2686],{"href":2686,"rel":2687},"https:\u002F\u002Fadmin.teams.microsoft.com",[2666],[228,2689,2690,2691],{},"[]{#ref-5}Microsoft. Microsoft 365 admin center. 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","An agent that shows a thinking animation, image uploads and more! ...","md","article",{"head":2724},{"meta":2725},[2726],{"name":2727,"content":2728},"keywords","agents, microsoft teams, m365 agents toolkit, azure bot service, sharepoint, rag engine, state machine, chatbots, help desk",{"title":40,"description":2720},"qc4xu0B0Mm-GUB0Ne-NsfYyGCQEykVJZ7QtWTvNsqR4",1785483354919]