{"authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"description":"Stephan Bisser's blog on Microsoft 365 Copilot, AI agents, Conversational AI, and the Microsoft AI ecosystem","feed_url":"https://bisser.io/feed.json","home_page_url":"https://bisser.io/","icon":"https://bisser.io/images/bisser_io_red.png","items":[{"_markdown_url":"https://bisser.io/your-agent-is-only-as-reliable-as-its-harness/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003e\u003cem\u003eThe model gets the attention. The harness decides whether the agent does its job.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eMany people do not know what an agent harness is, and you can hear it in how they describe agents. A typical sentence: \u0026ldquo;The LLM then executes the action\u0026rdquo;, or \u0026ldquo;the LLM makes the tool call.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThat sounds harmless, but it is wrong, and it matters. The model executes nothing. It produces text that says \u0026ldquo;call this tool with these inputs\u0026rdquo;. The harness takes that text, runs the tool and hands the result back to the model.\u003c/p\u003e\n\u003cp\u003eSo there are three things, and they get mixed up all the time. The model is the brain. The harness is everything around it. The agent is the two together. If you do not know who does what, you do not know where to look when something goes wrong.\u003c/p\u003e\n\u003ch2 id=\"what-a-harness-is\"\u003eWhat a harness is\u003ca class=\"heading-anchor\" href=\"#what-a-harness-is\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe short version: the model is the brain, the harness is everything else that turns it into an agent that works reliably.\u003c/p\u003e\n\u003cp\u003eA model on its own only produces text. It can suggest what to do, but it cannot open a file, send a message or remember yesterday. The harness gives it hands, rules and a memory, and keeps a hand on the wheel.\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"content-figure\"\u003e\u003cimg src=\"/images/090-harness-layers.webp\" alt=\"An agent is the model plus the harness: the model on the left, the harness on the right with eight parts, four in blue that give the agent ability (instructions, tools, memory, loop) and three in red that keep it in bounds (permissions, approvals, stop rules), plus a log in gray\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\u003c/p\u003e\n\u003cp\u003eIn practice, the harness consists of:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eInstructions and context:\u003c/strong\u003e what the agent is told and what it gets to see.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eTools:\u003c/strong\u003e what it can actually do, such as searching, reading files or calling an API.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eMemory:\u003c/strong\u003e what it keeps from one step, or one session, to the next.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePermissions:\u003c/strong\u003e which of those tools and data it may use.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eThe loop:\u003c/strong\u003e plan, act, check the result, repeat.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eApprovals:\u003c/strong\u003e the points where a human has to say yes.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eA log:\u003c/strong\u003e a record of what happened and why.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eStop rules:\u003c/strong\u003e when the agent must finish, give up or hand over.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAnthropic describes the harness in more technical terms as \u003ca href=\"https://anthropic.com/engineering/managed-agents\" rel=\"noopener\"\u003e\u0026ldquo;the loop that calls Claude and routes Claude\u0026rsquo;s tool calls to the relevant infrastructure\u0026rdquo;\u003c/a\u003e\n. Microsoft puts it this way: \u003ca href=\"https://blogs.microsoft.com/blog/2026/10/28/introducing-the-microsoft-copilot-harness-unlocking-the-potential-of-truly-multi-model-agentic-work/\" rel=\"noopener\"\u003e\u0026ldquo;If the model supplies the intelligence, the harness is everything around the model.\u0026rdquo;\u003c/a\u003e\n Different words, same idea.\u003c/p\u003e\n\u003ch2 id=\"the-loop-at-the-center\"\u003eThe loop at the center\u003ca class=\"heading-anchor\" href=\"#the-loop-at-the-center\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAn agent does not answer once. It works in rounds, and the harness runs every round. The model suggests the next step. The harness decides what happens with it: it checks whether the call is allowed, asks a human where that is required, runs the tool and passes the result back.\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"content-figure\"\u003e\u003cimg src=\"/images/090-who-does-what.webp\" alt=\"Who does what in one round: the model suggests a tool call, the harness runs it against the tools, and the result goes back through the harness to the model\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\u003c/p\u003e\n\u003cp\u003eTake away a piece and you see what breaks. No check, and the agent never notices its own mistakes. No approval, and it acts on things it should have asked about. No stop rule, and it loops until the budget is gone.\u003c/p\u003e\n\u003ch2 id=\"three-comparisons-and-where-each-one-breaks\"\u003eThree comparisons, and where each one breaks\u003ca class=\"heading-anchor\" href=\"#three-comparisons-and-where-each-one-breaks\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eNo single comparison covers it, so here are three, each with its limit. The one I use is engine and car.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEngine and car.\u003c/strong\u003e The model is the engine, the harness is the rest of the car: steering, brakes, fuel line, dashboard. Nobody would call an engine on a workbench a vehicle. The comparison breaks because a car\u0026rsquo;s engine rarely changes, while a model can be swapped in an afternoon. It also hides that the harness is not passive: it decides when the model is called and what it gets to see.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHorse and harness.\u003c/strong\u003e A horse is strong and has a will of its own. The harness does not make it stronger; it makes the strength steerable and usable. But a horse harness is passive leather, whereas an agent harness runs the loop itself, controls what the model sees and can stop it. A horse also knows the road. A model without context does not.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eOperating system and application.\u003c/strong\u003e An operating system gives programs files, permissions, processes and a way to shut them down. A harness does the same for a model. The limit is predictability: an operating system is deterministic, a model is not. A harness cannot guarantee the outcome, it can only bound it.\u003c/p\u003e\n\u003ch2 id=\"where-you-can-see-harnesses-today\"\u003eWhere you can see harnesses today\u003ca class=\"heading-anchor\" href=\"#where-you-can-see-harnesses-today\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003ch3 id=\"coding-agents-in-the-terminal\"\u003eCoding agents in the terminal\u003ca class=\"heading-anchor\" href=\"#coding-agents-in-the-terminal\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eCoding agents show the harness most openly. In Claude Code\u0026rsquo;s default manual mode, reading files is allowed, but running shell commands and editing files require approval, according to the \u003ca href=\"https://code.claude.com/docs/en/permissions\" rel=\"noopener\"\u003eClaude Code permissions documentation\u003c/a\u003e\n. Permissions and approvals are a visible product feature here, not a hidden setting.\u003c/p\u003e\n\u003cp\u003eFor long tasks, the harness has to do more. In \u003ca href=\"https://www.anthropic.com/engineering/effective-harnesses-for-long-running-agents\" rel=\"noopener\"\u003ean engineering post from 26 November 2025\u003c/a\u003e\n, Anthropic describes that agents struggle to make steady progress across several context windows, because each new session starts without memory of earlier work. Their answer was a harness answer: an initializer sets up the environment, each session leaves a progress file, and descriptive git commits let later sessions recover a working state. Same model, but with a memory made of files.\u003c/p\u003e\n\u003ch3 id=\"agent-platforms-from-vendors\"\u003eAgent platforms from vendors\u003ca class=\"heading-anchor\" href=\"#agent-platforms-from-vendors\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe big vendors now name the harness as a product layer. Microsoft is one example: its \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-copilot-studio/harnesses-overview\" rel=\"noopener\"\u003edocumentation\u003c/a\u003e\n describes it as \u0026ldquo;a runtime\u0026rdquo; between your agent design and the model that decides when to call the model, what to send it, and which tools to call. On 28 October 2026, Microsoft \u003ca href=\"https://blogs.microsoft.com/blog/2026/10/28/introducing-the-microsoft-copilot-harness-unlocking-the-potential-of-truly-multi-model-agentic-work/\" rel=\"noopener\"\u003eintroduced the same technology as the Microsoft Copilot harness\u003c/a\u003e\n across several of its products.\u003c/p\u003e\n\u003cp\u003eThe direction matters more than the brand: agents that run on triggers instead of prompts and that get their own accounts. \u003ca href=\"https://www.microsoft.com/en-us/copilot/blog/copilot-studio/delegate-shared-business-processes-to-agents-that-are-more-persistent-and-proactive-with-microsoft-copilot-studio/\" rel=\"noopener\"\u003eMicrosoft\u0026rsquo;s October post\u003c/a\u003e\n says these features roll out through its Frontier program and that further access and cost controls are \u0026ldquo;planned for in the coming months\u0026rdquo;. The more independently an agent works, the more the harness has to carry.\u003c/p\u003e\n\u003ch3 id=\"a-personal-assistant-with-approval-before-every-action\"\u003eA personal assistant with approval before every action\u003ca class=\"heading-anchor\" href=\"#a-personal-assistant-with-approval-before-every-action\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eI use a personal assistant myself, and its harness follows one rule. It may read and prepare on its own. Sending, committing to something and deleting happen only with my explicit yes.\u003c/p\u003e\n\u003cp\u003eIt is the same idea as the manual mode of a coding agent, just applied to everyday work: the agent gets room to prepare, and the harness holds the line where something leaves my hands.\u003c/p\u003e\n\u003ch2 id=\"what-makes-a-good-harness\"\u003eWhat makes a good harness\u003ca class=\"heading-anchor\" href=\"#what-makes-a-good-harness\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eSix things to check, in roughly this order:\u003c/p\u003e\n\u003ch3 id=\"1-context\"\u003e1. Context\u003ca class=\"heading-anchor\" href=\"#1-context\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe agent should get what it needs for this task, not everything you have. Too little context makes it guess. Too much makes it slow, expensive and inconsistent.\u003c/p\u003e\n\u003ch3 id=\"2-tools\"\u003e2. Tools\u003ca class=\"heading-anchor\" href=\"#2-tools\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eFew tools, clearly described, each with a narrow purpose. A tool the agent can misuse will eventually be misused.\u003c/p\u003e\n\u003ch3 id=\"3-limits\"\u003e3. Limits\u003ca class=\"heading-anchor\" href=\"#3-limits\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003ePermissions follow the task, not the convenience of the builder. Read access is the default, write access is earned.\u003c/p\u003e\n\u003ch3 id=\"4-approvals\"\u003e4. Approvals\u003ca class=\"heading-anchor\" href=\"#4-approvals\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eDecide up front which actions need a human yes. Irreversible and external actions, such as sending, deleting or paying, belong on that list.\u003c/p\u003e\n\u003ch3 id=\"5-traceability\"\u003e5. Traceability\u003ca class=\"heading-anchor\" href=\"#5-traceability\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eYou should be able to reconstruct what the agent did and why. If you cannot, you cannot improve it, audit it or trust it.\u003c/p\u003e\n\u003ch3 id=\"6-error-handling\"\u003e6. Error handling\u003ca class=\"heading-anchor\" href=\"#6-error-handling\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eDefine what happens when a tool fails, an answer is wrong or the loop goes in circles: retry, escalate, stop. An agent without stop rules is a cost risk.\u003c/p\u003e\n\u003cp\u003eIf I plan an agent, I build the first four first: context, tools, limits and approvals. The one teams underestimate most often is the last: error handling.\u003c/p\u003e\n\u003ch2 id=\"how-you-recognize-that-the-harness-is-the-problem-not-the-model\"\u003eHow you recognize that the harness is the problem, not the model\u003ca class=\"heading-anchor\" href=\"#how-you-recognize-that-the-harness-is-the-problem-not-the-model\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eA simple test: keep the task, swap the model. If the same mistake survives, look at the harness.\u003c/p\u003e\n\u003cp\u003e\u003cfigure class=\"content-figure\"\u003e\u003cimg src=\"/images/090-model-or-harness.webp\" alt=\"Decision flow: swap in a stronger model on the same task; if the mistake is gone, the model was the limit; if it stays, check the harness\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\u003c/p\u003e\n\u003cp\u003eA few more symptoms point away from the model:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eThe agent forgets.\u003c/strong\u003e It repeats work or contradicts itself between steps or sessions.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIt declares victory too early.\u003c/strong\u003e Anthropic observed exactly this in long-running coding tasks.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIt invents what it could look up.\u003c/strong\u003e A missing tool or missing context often looks like a hallucination.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eYou cannot explain what happened.\u003c/strong\u003e Without a log, every failure looks like bad luck.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThen keep the model and change the setup: better context, fewer tools, a clear stop rule. If the results improve, you had a harness problem.\u003c/p\u003e\n\u003cp\u003eOne more point. Anthropic notes that harnesses \u003ca href=\"https://anthropic.com/engineering/managed-agents\" rel=\"noopener\"\u003e\u0026ldquo;encode assumptions about what Claude can\u0026rsquo;t do on its own\u0026rdquo;\u003c/a\u003e\n. As models improve, some of those assumptions become dead weight. A harness is not something you build once; you revisit it.\u003c/p\u003e\n\u003ch2 id=\"three-questions-before-you-build\"\u003eThree questions before you build\u003ca class=\"heading-anchor\" href=\"#three-questions-before-you-build\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eWhat may the agent do without asking, and who is asked for everything else?\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eHow will you find out what it did and why?\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWhat stops it when it fails or loops?\u003c/strong\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eIf you cannot answer these, a better model will not save the project. Picking the model is the easy, reversible part. The harness is where your decisions live, so make them on purpose.\u003c/p\u003e\n","date_modified":"2026-10-29T19:25:32+01:00","date_published":"2026-10-29T19:25:32+01:00","id":"https://bisser.io/your-agent-is-only-as-reliable-as-its-harness/","image":"https://bisser.io/images/090-cover.webp","summary":"The model is the brain, the harness is everything else: instructions, tools, memory, permissions, approvals, logs and stop rules. Why the harness, not the model, runs the tool calls and decides whether an agent works.","tags":["AI","Agents","Agent Harness","Agent Architecture","Governance"],"title":"Your Agent Is Only as Reliable as Its Harness","url":"https://bisser.io/your-agent-is-only-as-reliable-as-its-harness/"},{"_markdown_url":"https://bisser.io/building-a-second-brain-that-actually-works-with-copilot-cowork-as-the-librarian/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eEvery knowledge worker I know has the same problem: too much information, not enough structure. Meeting notes live in one tool, research in another, ideas scribbled on Post-its, articles bookmarked but never read again. The stuff you need in six months is exactly the stuff you can\u0026rsquo;t find.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve tried note-taking apps, wikis, bullet journals. They all fail the same way — the \u003cem\u003ecapture\u003c/em\u003e is easy, the \u003cem\u003eretrieval\u003c/em\u003e is the problem, and the \u003cem\u003emaintenance\u003c/em\u003e is what kills it.\u003c/p\u003e\n\u003cp\u003eThis post is about how I solved it for myself: a personal Second Brain in OneDrive, structured around PARA, and driven by Copilot Cowork that knows where things belong. It took me a few weekends to set up. It\u0026rsquo;s been paying off every day since.\u003c/p\u003e\n\u003cp\u003eIf you\u0026rsquo;re thinking about building something similar — for yourself, not for a team — this is the blueprint.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"the-core-idea\"\u003eThe Core Idea\u003ca class=\"heading-anchor\" href=\"#the-core-idea\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eA Second Brain is a persistent, external memory for the things your wetware can\u0026rsquo;t be trusted with: decisions, context, half-formed ideas, research, conversations. Tiago Forte popularized the term and the PARA methodology (Projects, Areas, Resources, Archive). I use that as the backbone, but I extended it in two ways:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eA dedicated space for AI-generated artifacts\u003c/strong\u003e — briefings, research outputs, meeting debriefs, weekly reviews. This stuff piles up fast once you start working with Copilot Cowork, and it needs its own home.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eA skill-based routing layer\u003c/strong\u003e — instead of me deciding where each note goes, I describe the intent in natural language (\u0026ldquo;debrief this meeting\u0026rdquo;, \u0026ldquo;capture this thought\u0026rdquo;, \u0026ldquo;save this article to read\u0026rdquo;) and Copilot Cowork figures out the right folder.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThe key insight: \u003cstrong\u003ethe hard part of a Second Brain isn\u0026rsquo;t storage, it\u0026rsquo;s routing.\u003c/strong\u003e If every new note forces you to stop and think \u0026ldquo;where does this belong?\u0026rdquo;, you\u0026rsquo;ll stop capturing. Automate that decision and the system runs itself.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"the-folder-structure\"\u003eThe Folder Structure\u003ca class=\"heading-anchor\" href=\"#the-folder-structure\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eHere\u0026rsquo;s the tree that sits in my OneDrive:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e/Second Brain\n  /01_Inbox              ← Unsorted captures, landing zone\n  /02_Projects           ← Time-bounded work with defined outcomes\n  /03_Areas              ← Ongoing responsibilities (leadership, team, domains)\n  /04_Resources          ← Evergreen reference material (by topic)\n  /05_Archive            ← Completed projects, retired material\n  /06_AI                 ← Session logs, research, briefings, reviews, meeting debriefs\n  /07_Templates          ← Reusable note templates\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eA few opinions baked into this structure:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e01_Inbox\u003c/code\u003e is sacred.\u003c/strong\u003e It\u0026rsquo;s the default destination whenever the routing logic isn\u0026rsquo;t confident. Better to park something in the Inbox than force a bad classification. I empty it weekly.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e03_Areas\u003c/code\u003e is where most of my time goes.\u003c/strong\u003e Projects end; areas (people I lead, domains I own, ongoing initiatives) don\u0026rsquo;t. Most knowledge workers underweight this folder.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e06_AI\u003c/code\u003e is my addition to PARA.\u003c/strong\u003e Once you have Copilot Cowork producing real artifacts — morning briefings, meeting debriefs, research — you need somewhere to keep them that isn\u0026rsquo;t \u003ccode\u003eProjects\u003c/code\u003e (too narrow) or \u003ccode\u003eResources\u003c/code\u003e (too generic).\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e\u003ccode\u003e07_Templates\u003c/code\u003e reduces friction.\u003c/strong\u003e Every recurring note type (meeting debrief, 1-on-1, project brief, decision log, weekly review, person profile, reading list) has a template. I don\u0026rsquo;t start notes from a blank page.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eInside \u003ccode\u003e02_Projects\u003c/code\u003e and \u003ccode\u003e03_Areas\u003c/code\u003e I create sub-folders per project or area. Each gets an \u003ccode\u003eOverview.md\u003c/code\u003e at the top — a single page explaining what this area is, who\u0026rsquo;s involved, what\u0026rsquo;s active. Think of it as the README for that slice of your life.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"the-ai-routing-layer\"\u003eThe AI Routing Layer\u003ca class=\"heading-anchor\" href=\"#the-ai-routing-layer\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eHere\u0026rsquo;s where it gets interesting. I use Copilot Cowork (running inside my M365 environment) with a set of custom skills — small instruction files that teach Copilot Cowork how to handle specific workflows.\u003c/p\u003e\n\u003cp\u003eEach skill is just a Markdown file with a name, a description of when to trigger, and a playbook. My skills roughly map to intents:\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eSkill\u003c/th\u003e\n          \u003cth\u003eWhat it does\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003equick-capture\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eGrab a thought, classify it by type, route to the right folder\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003emeeting-debrief\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003ePull meeting context, extract decisions and action items, save to the right project or area\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003edaily-brief\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eCompose a morning overview from calendar, email, and chat\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003eweekly-review\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eFriday ritual — empty the Inbox, reflect on progress, set next week\u0026rsquo;s priorities\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003ccode\u003esave-to-vault\u003c/code\u003e\u003c/td\u003e\n          \u003ctd\u003eThe persistence layer — copies session output to the right OneDrive folder via Graph API\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThe routing logic inside each skill is boring and explicit. For example, quick-capture has a table that says: \u003cem\u003eproject update → \u003ccode\u003e02_Projects/\u0026lt;project\u0026gt;\u003c/code\u003e\u003c/em\u003e, \u003cem\u003eleadership observation → \u003ccode\u003e03_Areas/People Lead\u003c/code\u003e\u003c/em\u003e, \u003cem\u003ereadable article → append to the Reading List\u003c/em\u003e, \u003cem\u003eunclear → \u003ccode\u003e01_Inbox\u003c/code\u003e with a tag\u003c/em\u003e. No magic, just heuristics I worked out by watching what kinds of things I actually capture.\u003c/p\u003e\n\u003cp\u003eCopilot Cowork doesn\u0026rsquo;t write anywhere it wants. Every save goes through one skill (\u003ccode\u003esave-to-vault\u003c/code\u003e) that knows the folder IDs, handles the Graph API copy, and verifies the file landed. Centralizing that logic means when something breaks — a renamed folder, a new sub-structure — I fix it in one place.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"templates-not-blank-pages\"\u003eTemplates, Not Blank Pages\u003ca class=\"heading-anchor\" href=\"#templates-not-blank-pages\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eEvery recurring note type has a template. The ones I use weekly:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eMeeting debrief\u003c/strong\u003e — goal, decisions, action items (with owner and deadline), observations, open questions, follow-up\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e1-on-1\u003c/strong\u003e — topics discussed, what the person said (verbatim where possible), concerns, development areas, next time\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eProject brief\u003c/strong\u003e — goal, stakeholders, timeline, key decisions log, current status\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDecision log\u003c/strong\u003e — context, options considered, decision, rationale, revisit date\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eWeekly review\u003c/strong\u003e — what happened, what I learned, what\u0026rsquo;s blocking, priorities for next week\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003ePerson profile\u003c/strong\u003e — role, communication preferences, shared history, open threads\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eReading list\u003c/strong\u003e — queue, currently reading, finished (with takeaway), archive\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTemplates do two things: they make capture fast (no thinking about structure), and they make retrieval useful (consistent frontmatter means I can filter by type, tag, or date later).\u003c/p\u003e\n\u003cp\u003eEvery template starts with YAML frontmatter:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-yaml\" data-lang=\"yaml\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"nt\"\u003etype\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"l\"\u003emeeting-debrief\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"nt\"\u003edate\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"ld\"\u003e2026-04-23\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"nt\"\u003eproject\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003eproject-slug]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"nt\"\u003eattendees\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"l\"\u003enames]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"nt\"\u003etags\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\u003cspan class=\"w\"\u003e \u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"c\"\u003e#debrief]\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"w\"\u003e\u003c/span\u003e\u003cspan class=\"nn\"\u003e---\u003c/span\u003e\u003cspan class=\"w\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eSix months from now, when I\u0026rsquo;m looking for \u0026ldquo;all the decisions I made about X in Q2\u0026rdquo;, the frontmatter is what makes that search tractable.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"a-day-in-the-system\"\u003eA Day in the System\u003ca class=\"heading-anchor\" href=\"#a-day-in-the-system\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eHere\u0026rsquo;s what actual usage looks like:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMorning (2 minutes)\u003c/strong\u003e — I ask for a daily brief. Copilot Cowork pulls today\u0026rsquo;s calendar, unread emails flagged as important, and recent chat activity. It writes a short overview and archives a copy to \u003ccode\u003e06_AI/Briefings\u003c/code\u003e. I skim, adjust priorities, start the day.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDuring meetings\u003c/strong\u003e — I don\u0026rsquo;t take notes in the moment. After each meeting I say \u0026ldquo;debrief this\u0026rdquo; and Copilot Cowork pulls the transcript (if Teams recorded it), extracts decisions and action items, classifies the meeting type (1-on-1, team, client), and saves the debrief to the right folder. Two minutes per meeting.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eBetween tasks\u003c/strong\u003e — any thought, article, observation goes through quick-capture. \u0026ldquo;Capture this: we should rework the onboarding flow, the handoff is losing people.\u0026rdquo; One sentence, Copilot Cowork parses the type, routes to the right folder, confirms with a link.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFriday afternoon\u003c/strong\u003e — weekly review. Copilot Cowork goes through the Inbox, helps me classify each item, summarizes what happened across projects and areas, surfaces stuck items, and writes the review note to \u003ccode\u003e06_AI/Weekly Reviews\u003c/code\u003e. About 20 minutes, and my Inbox starts Monday at zero.\u003c/p\u003e\n\u003cp\u003eThe rhythm only works because the friction is close to zero. If capture took more than 15 seconds, I\u0026rsquo;d skip it. If retrieval took more than a minute, I\u0026rsquo;d stop trusting the system.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"what-i-learned-the-hard-way\"\u003eWhat I Learned the Hard Way\u003ca class=\"heading-anchor\" href=\"#what-i-learned-the-hard-way\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eA few non-obvious lessons from the build:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e1. Start with too-few folders, not too many.\u003c/strong\u003e My first version had deeply nested structure. I never used most of it. Now I default to flat — if a folder doesn\u0026rsquo;t have 5+ items after a month, it probably doesn\u0026rsquo;t need to exist.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e2. The Inbox is a feature, not a bug.\u003c/strong\u003e I used to feel guilty about unclassified items. Now I treat the Inbox as a legitimate parking lot. Some things genuinely don\u0026rsquo;t know what they are yet. Force-fitting them into a category makes the system worse.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e3. Preserve wording, don\u0026rsquo;t paraphrase.\u003c/strong\u003e When capturing decisions, observations, or things people said, keep the exact phrasing. \u0026ldquo;We\u0026rsquo;ll revisit this in Q3\u0026rdquo; is different from \u0026ldquo;we decided to wait.\u0026rdquo; Your future self needs the literal words.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e4. Templates beat discipline.\u003c/strong\u003e I used to try to remember what sections a meeting debrief should have. I\u0026rsquo;d forget one every time. Now the template has the slots, I fill them in. Consistency is a property of the system, not of me.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e5. Persist everything outside the tool.\u003c/strong\u003e Whatever AI assistant you use — I use Copilot Cowork — assume you\u0026rsquo;ll switch tools eventually. My notes live as plain Markdown in OneDrive. No proprietary formats, no vendor lock-in. If the AI layer disappears tomorrow, the Second Brain is still there.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e6. Build the routing logic gradually.\u003c/strong\u003e Don\u0026rsquo;t try to design the perfect taxonomy up front. Start with 3–4 obvious categories, watch what you actually capture over a few weeks, add categories as patterns emerge. My current routing table took about a month to stabilize.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e7. One skill per intent, not per tool.\u003c/strong\u003e I was tempted to build a \u0026ldquo;Teams skill\u0026rdquo;, an \u0026ldquo;Outlook skill\u0026rdquo;, a \u0026ldquo;OneDrive skill\u0026rdquo;. Bad idea. Intents (\u0026ldquo;summarize this meeting\u0026rdquo;, \u0026ldquo;capture this thought\u0026rdquo;) cross tools. Build skills around what you want to do, not around where the data lives.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"how-to-start-your-own\"\u003eHow to Start Your Own\u003ca class=\"heading-anchor\" href=\"#how-to-start-your-own\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIf you want to build something similar, here\u0026rsquo;s the minimal path:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePick a storage layer that isn\u0026rsquo;t a note app.\u003c/strong\u003e OneDrive, Dropbox, Google Drive, a plain folder — anything that syncs and lets you write Markdown files. Not Notion, not Obsidian (yet), not Evernote. Start with files.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eSet up the PARA folders.\u003c/strong\u003e Projects, Areas, Resources, Archive. Add \u003ccode\u003eInbox\u003c/code\u003e for captures and (optionally) an \u003ccode\u003eAI\u003c/code\u003e folder if you work with Copilot Cowork or a similar assistant.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eCreate 3–4 templates.\u003c/strong\u003e Whatever note types you produce weekly. Meeting notes, weekly review, and a decision log is a decent starter set.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eWrite one \u003ccode\u003eOverview.md\u003c/code\u003e per active project and area.\u003c/strong\u003e Two paragraphs each: what this is, who\u0026rsquo;s involved, what\u0026rsquo;s active.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003ePick one capture flow.\u003c/strong\u003e The single highest-leverage habit is capturing thoughts into the Inbox with a one-sentence intent. Everything else is polish.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eIf you have an AI assistant with custom instructions\u003c/strong\u003e — like Copilot Cowork, Claude, or ChatGPT with Custom GPTs — teach it the folder structure and the routing rules. Even without automation, explicit rules written down make the system more robust.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003eRun a weekly review.\u003c/strong\u003e Non-negotiable. 20 minutes every Friday: empty the Inbox, scan projects and areas, plan the coming week. Without this ritual, the system decays.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eThat\u0026rsquo;s it. Everything else is optimization.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"the-real-value\"\u003eThe Real Value\u003ca class=\"heading-anchor\" href=\"#the-real-value\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWhat a Second Brain actually gives you isn\u0026rsquo;t organization. It\u0026rsquo;s \u003cstrong\u003ecognitive leverage\u003c/strong\u003e. You stop using your working memory for storage and start using it for thinking. You stop rediscovering the same conclusions and start building on them. You stop losing context between meetings and start entering each one already prepared.\u003c/p\u003e\n\u003cp\u003eThe honest test, six months in, is this: can I answer \u0026ldquo;what did I decide about X in Q1, and why?\u0026rdquo; in under a minute? If yes, the system is earning its keep. If no, something in the routing or retrieval is broken and needs fixing.\u003c/p\u003e\n\u003cp\u003eI think mine passes the test. Yours will too, if you keep the system small, the capture frictionless, and the review weekly.\u003c/p\u003e\n\u003cp\u003eThe hardest part isn\u0026rsquo;t the setup. It\u0026rsquo;s trusting the system enough to stop keeping a parallel one in your head.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eIf you want to discuss your own setup or see specific examples of the templates and skill definitions I use, feel free to reach out.\u003c/em\u003e\u003c/p\u003e\n","date_modified":"2026-04-22T19:00:00+01:00","date_published":"2026-04-22T19:00:00+01:00","id":"https://bisser.io/building-a-second-brain-that-actually-works-with-copilot-cowork-as-the-librarian/","image":"https://bisser.io/images/089-cover.webp","summary":"How I built a personal Second Brain in OneDrive with PARA and Copilot Cowork that handles the hardest part: routing every note to the right place automatically.","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot","Microsoft Foundry","Copilot Studio"],"title":"Building a Second Brain That Actually Works with Copilot Cowork as the Librarian","url":"https://bisser.io/building-a-second-brain-that-actually-works-with-copilot-cowork-as-the-librarian/"},{"_markdown_url":"https://bisser.io/why-most-copilot-agent-projects-fail-before-they-ship/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003e\u003cem\u003eThe problem is rarely the technology. It is almost always the preparation.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eI have seen a lot of agent projects over the past year. Some shipped successfully, many didn\u0026rsquo;t. And here is the pattern I keep noticing: the ones that fail almost never fail because of a technical limitation. They fail because of things that should have been sorted out before anyone started building.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s frustrating, because most of these failures are entirely preventable.\u003c/p\u003e\n\u003ch2 id=\"the-demo-trap\"\u003eThe Demo Trap\u003ca class=\"heading-anchor\" href=\"#the-demo-trap\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eLet me start with the most common failure driver: \u003cstrong\u003eunrealistic expectations\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eWe have all seen the keynote demos. Someone describes what they want in natural language, an agent gets built in minutes, it connects to enterprise data, and it delivers perfect results. The audience applauds. The executives get excited. And then someone in the organization says: \u0026ldquo;Let\u0026rsquo;s build that.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThe problem is that the demo showed the happy path of a carefully prepared scenario. It didn\u0026rsquo;t show the weeks of data preparation. It didn\u0026rsquo;t show the prompt engineering iterations. It didn\u0026rsquo;t show the edge cases that break the agent. And it certainly didn\u0026rsquo;t show the governance review that needs to happen before anything goes to production.\u003c/p\u003e\n\u003cp\u003eWhen teams start an agent project with demo-level expectations, they are setting themselves up for disappointment. Not because the technology is bad — it is genuinely impressive — but because the gap between a demo and a production-ready agent is much larger than most people think.\u003c/p\u003e\n\u003ch2 id=\"the-three-reasons-agent-projects-stall\"\u003eThe Three Reasons Agent Projects Stall\u003ca class=\"heading-anchor\" href=\"#the-three-reasons-agent-projects-stall\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIn my experience, agent projects that fail before shipping almost always hit one of these three walls:\u003c/p\u003e\n\u003ch3 id=\"1-the-platform-was-not-ready\"\u003e1. The Platform Was Not Ready\u003ca class=\"heading-anchor\" href=\"#1-the-platform-was-not-ready\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThis one is painful because it is often outside your control. You start building an agent on a platform, and halfway through you realize that a critical feature is missing, still in preview, or doesn\u0026rsquo;t work the way the documentation suggests.\u003c/p\u003e\n\u003cp\u003eThis happened a lot in the early days of Copilot Studio\u0026rsquo;s agent capabilities, and it still happens today when teams try to use cutting-edge features that are not yet generally available. The platform is evolving fast, which is great — but it also means that what worked in a demo environment last month might not be production-ready this month.\u003c/p\u003e\n\u003ch3 id=\"2-the-data-was-not-there\"\u003e2. The Data Was Not There\u003ca class=\"heading-anchor\" href=\"#2-the-data-was-not-there\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThis is the one that frustrates me the most, because it is the most preventable. An agent is only as good as the data it can access. If your knowledge sources are outdated, poorly structured, incomplete, or scattered across systems without proper indexing, your agent will deliver poor results — no matter how good your instructions are.\u003c/p\u003e\n\u003cp\u003eI have seen teams spend weeks crafting perfect agent instructions, only to realize that the SharePoint library the agent is grounded on hasn\u0026rsquo;t been maintained in two years. The agent works technically. It just returns useless information.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eData quality is not an agent problem. It is a prerequisite.\u003c/strong\u003e And it needs to be reviewed before you start building, not after.\u003c/p\u003e\n\u003ch3 id=\"3-the-wrong-platform-was-chosen\"\u003e3. The Wrong Platform Was Chosen\u003ca class=\"heading-anchor\" href=\"#3-the-wrong-platform-was-chosen\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe Microsoft ecosystem offers multiple ways to build agents — Agent Builder, Copilot Studio, Microsoft Foundry, the Agents SDK, and more. Each targets a different audience and a different level of complexity. Choosing the wrong platform for your use case is a recipe for frustration.\u003c/p\u003e\n\u003cp\u003eI have seen citizen developers struggle in Copilot Studio with scenarios that really needed Microsoft Foundry. And I have seen pro developers over-engineer solutions in code when a declarative agent in Copilot Studio would have been done in an afternoon.\u003c/p\u003e\n\u003cp\u003eThe platform decision should be one of the first things you make — and it should be based on the complexity of your use case, not on which tool your team happens to be familiar with.\u003c/p\u003e\n\u003ch2 id=\"three-things-to-do-before-you-build-anything\"\u003eThree Things to Do Before You Build Anything\u003ca class=\"heading-anchor\" href=\"#three-things-to-do-before-you-build-anything\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIf I could give every team starting an agent project just three pieces of advice, it would be these:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDefine a clear goal and concept first.\u003c/strong\u003e What exactly should this agent do? What is the specific use case? Who is the user? What does success look like? If you can\u0026rsquo;t answer these questions in one paragraph, you are not ready to build. Too many projects start with \u0026ldquo;let\u0026rsquo;s build an agent for HR\u0026rdquo; instead of \u0026ldquo;let\u0026rsquo;s build an agent that helps new hires find answers about onboarding policies in their first week.\u0026rdquo; Specificity matters.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eChoose the right platform deliberately.\u003c/strong\u003e Don\u0026rsquo;t default to the tool you know. Evaluate your use case against the capabilities of each platform. Does it need real-time API integrations? Does it need complex orchestration? Can it be solved with a simple declarative agent? Match the platform to the problem, not the other way around.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eReview your data quality before you start.\u003c/strong\u003e Go look at the actual data sources your agent will use. Are they current? Are they well-structured? Are there duplicates or contradictions? Is access properly configured? This review takes a day or two at most, but it can save you weeks of debugging an agent that \u0026ldquo;doesn\u0026rsquo;t work\u0026rdquo; when the real problem is the data underneath.\u003c/p\u003e\n\u003ch2 id=\"when-failure-is-actually-fine\"\u003eWhen Failure Is Actually Fine\u003ca class=\"heading-anchor\" href=\"#when-failure-is-actually-fine\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eI want to be clear: not all failure is bad. If you are experimenting with cutting-edge technology — trying something that hasn\u0026rsquo;t been done before, pushing the boundaries of what the platform can do — then failure is part of the process. That is how we learn, and that is how the ecosystem moves forward.\u003c/p\u003e\n\u003cp\u003eThe failure that bothers me is the preventable kind. Teams that skip the basics, get burned, and then conclude that \u0026ldquo;agents don\u0026rsquo;t work\u0026rdquo; — when the agents were never given a fair chance in the first place.\u003c/p\u003e\n\u003ch2 id=\"it-will-get-better\"\u003eIt Will Get Better\u003ca class=\"heading-anchor\" href=\"#it-will-get-better\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe good news is that the failure rate for agent projects will come down over time. The platforms are maturing rapidly. The community is building up knowledge. Organizations are learning from their early experiments. Every failed project teaches someone what not to do next time.\u003c/p\u003e\n\u003cp\u003eBut we can accelerate this by being honest about why projects fail. It is not because the technology is not ready. In most cases, it is because we were not ready — we didn\u0026rsquo;t define the goal clearly enough, we picked the wrong platform, or we didn\u0026rsquo;t check the data. Those are human problems, not technology problems. And human problems have human solutions.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat was the biggest lesson you learned from an agent project that didn\u0026rsquo;t go as planned?\u003c/strong\u003e\u003c/p\u003e\n","date_modified":"2026-03-16T12:00:00+01:00","date_published":"2026-03-16T12:00:00+01:00","id":"https://bisser.io/why-most-copilot-agent-projects-fail-before-they-ship/","image":"https://bisser.io/images/088-cover.webp","summary":"Most agent projects don't fail because of the tech. They fail because of unrealistic expectations, bad data, and wrong platform choices.","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot","Microsoft Foundry","Copilot Studio"],"title":"Why Most Copilot Agent Projects Fail Before They Ship","url":"https://bisser.io/why-most-copilot-agent-projects-fail-before-they-ship/"},{"_markdown_url":"https://bisser.io/agent-governance-is-the-next-big-bottleneck/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003e\u003cem\u003eEveryone is building agents. But who decides what they are allowed to do?\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s an irony I keep seeing: organizations that don\u0026rsquo;t have agent governance in place don\u0026rsquo;t end up with chaos. They end up with nothing. Because when there are no clear rules about what people can and cannot do with agents, IT does the only rational thing — they block everything.\u003c/p\u003e\n\u003cp\u003eAnd I get it. If you\u0026rsquo;re responsible for security and compliance, and suddenly business users start building agents that connect to your ERP, your CRM, and your internal databases without any oversight, your instinct is to shut it down. The problem is that blocking everything is just as damaging as allowing everything. You\u0026rsquo;re just trading one risk for another.\u003c/p\u003e\n\u003ch2 id=\"the-real-problem-is-not-tooling\"\u003eThe Real Problem Is Not Tooling\u003ca class=\"heading-anchor\" href=\"#the-real-problem-is-not-tooling\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWhen people talk about agent governance, the conversation usually jumps to platform features — admin centers, policies, DLP rules. And yes, those matter. But in my experience, the real bottleneck is much more fundamental: \u003cstrong\u003emost IT departments don\u0026rsquo;t have the knowledge to think about agent governance holistically\u003c/strong\u003e, and most organizations don\u0026rsquo;t have a dedicated person who owns this topic.\u003c/p\u003e\n\u003cp\u003eThink about it. Agent governance sits at the intersection of IT security, data governance, application lifecycle management, and business process design. That\u0026rsquo;s a lot of domains to cover. And right now, in most organizations, nobody owns this intersection. Security owns their piece. IT ops owns their piece. The business owns their piece. But nobody is looking at the full picture.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s how you end up with either total lockdown or total chaos. There\u0026rsquo;s no middle ground without someone actively designing it.\u003c/p\u003e\n\u003ch2 id=\"the-six-pillars-of-agent-governance\"\u003eThe Six Pillars of Agent Governance\u003ca class=\"heading-anchor\" href=\"#the-six-pillars-of-agent-governance\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIf I had to help an organization build an agent governance framework from scratch, these are the six areas I\u0026rsquo;d focus on:\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003ePillar\u003c/th\u003e\n          \u003cth\u003eKey Question\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eRoles \u0026amp; Permissions\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eWho is allowed to build, test, and deploy agents? What can citizen developers do vs. pro developers?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eScope \u0026amp; Data Access\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eWhich data sources can an agent access? Which systems can it interact with? Which actions can it perform?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eLifecycle Management\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eHow does an agent go from idea to production? What are the gates for testing, review, and approval?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eIncident Management\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eWhat happens when an agent behaves unexpectedly? Who is responsible? Is there an audit trail?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eQuality Standards\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eWhat are the minimum requirements for agent instructions, grounding, and testing before deployment?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eAgent Inventory\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eDo you have a catalog of all active agents? Can you spot duplicates and shadow agents?\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eNone of these are revolutionary ideas individually. But most organizations I talk to haven\u0026rsquo;t thought through even half of them. And without all six in place, you\u0026rsquo;re flying blind.\u003c/p\u003e\n\u003ch2 id=\"shadow-agents-are-the-new-shadow-it\"\u003eShadow Agents Are the New Shadow IT\u003ca class=\"heading-anchor\" href=\"#shadow-agents-are-the-new-shadow-it\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eRemember when business users started spinning up their own cloud services without IT knowing about it? We called it Shadow IT, and it took years to get under control. The same thing is happening with agents right now — I\u0026rsquo;d call it \u003cstrong\u003eShadow Agents\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eWithout governance, two things happen consistently:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTeams build duplicate agents.\u003c/strong\u003e The marketing team builds an agent for content creation. The communications team builds a different agent for the same thing. Nobody knows the other exists. You end up with redundant work, inconsistent outputs, and wasted effort.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAgents access unauthorized systems.\u003c/strong\u003e Someone builds an agent that connects to a data source or system that IT hasn\u0026rsquo;t approved. Not maliciously — they just didn\u0026rsquo;t know they needed to ask. But now you have an agent pulling data from a system without proper access controls, and nobody in security is aware.\u003c/p\u003e\n\u003cp\u003eThis is exactly the pattern we saw with Shadow IT, just on a new level. And the solution is the same: you don\u0026rsquo;t fix it by blocking everything. You fix it by creating a clear framework that makes it easy to do the right thing.\u003c/p\u003e\n\u003ch2 id=\"you-need-a-dedicated-ai-lead\"\u003eYou Need a Dedicated AI Lead\u003ca class=\"heading-anchor\" href=\"#you-need-a-dedicated-ai-lead\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe single most impactful thing an organization can do for agent governance is to create a dedicated role — someone who owns agent governance end to end. And this person needs to be a \u003cstrong\u003ebridge between IT and business\u003c/strong\u003e.\u003c/p\u003e\n\u003cp\u003eNot a pure IT role. Not a pure business role. Someone who understands the technical possibilities of agent platforms, but also deeply understands the business processes and use cases. Someone who can translate between the security team saying \u0026ldquo;we need to control data access\u0026rdquo; and the business team saying \u0026ldquo;we need agents that actually do useful work.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eWhere this person sits in the org chart matters less than the mandate they have. They need the authority to define policies, the technical depth to evaluate agent implementations, and the business acumen to prioritize the right use cases. It\u0026rsquo;s a rare combination, but it\u0026rsquo;s the role that makes everything else possible.\u003c/p\u003e\n\u003ch2 id=\"microsoft-is-building-the-control-plane\"\u003eMicrosoft Is Building the Control Plane\u003ca class=\"heading-anchor\" href=\"#microsoft-is-building-the-control-plane\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eTo be fair, Microsoft isn\u0026rsquo;t ignoring this. With Agents 365, they\u0026rsquo;re building a control plane for agents where governance topics are increasingly being addressed. Centralized management, visibility into what agents exist and what they do, policy enforcement — these capabilities are coming.\u003c/p\u003e\n\u003cp\u003eBut here\u0026rsquo;s what I keep saying: \u003cstrong\u003egovernance is primarily an organizational challenge, not a technology challenge.\u003c/strong\u003e The best admin center in the world doesn\u0026rsquo;t help if nobody has defined the policies it should enforce. Microsoft can build the tools, but organizations need to do the thinking.\u003c/p\u003e\n\u003cp\u003eThe platforms will keep getting better. Agents 365 will mature. Copilot Studio will add more governance features. But the organizational work — defining roles, establishing processes, building the knowledge in your IT team — that\u0026rsquo;s on you. And the sooner you start, the less painful it will be.\u003c/p\u003e\n\u003ch2 id=\"the-bottom-line\"\u003eThe Bottom Line\u003ca class=\"heading-anchor\" href=\"#the-bottom-line\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAgent governance is going to be the defining factor that separates organizations that successfully adopt agents from those that don\u0026rsquo;t. Not because governance is exciting — it\u0026rsquo;s not. But because without it, you either get paralysis (IT blocks everything) or chaos (shadow agents everywhere). Neither gets you to the agentic organization.\u003c/p\u003e\n\u003cp\u003eThe good news: you don\u0026rsquo;t need to have everything figured out on day one. Start with the basics — a role model, an approval process, an agent inventory. Then iterate. But start now, because every week without governance is a week where the gap between what\u0026rsquo;s being built and what\u0026rsquo;s being managed grows wider.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDoes your organization have a dedicated person or team responsible for agent governance — or is it still everyone\u0026rsquo;s and nobody\u0026rsquo;s job?\u003c/strong\u003e\u003c/p\u003e\n","date_modified":"2026-03-13T10:00:00+01:00","date_published":"2026-03-13T10:00:00+01:00","id":"https://bisser.io/agent-governance-is-the-next-big-bottleneck/","image":"https://bisser.io/images/087-cover.webp","summary":"No governance doesn't mean chaos — it means IT blocks everything. My framework for the six pillars of agent governance.","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot","Governance","Agent Governance","Agents 365"],"title":"Agent Governance Is the Next Big Bottleneck","url":"https://bisser.io/agent-governance-is-the-next-big-bottleneck/"},{"_markdown_url":"https://bisser.io/testing-ai-agents-is-a-problem-nobody-wants-to-talk-about/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003e\u003cem\u003eEveryone is building agents. Almost nobody is testing them properly.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eHere\u0026rsquo;s something that\u0026rsquo;s been bugging me for a while: in classical software development, testing is non-negotiable. Nobody would ship a production application without at least some level of automated testing, code reviews, and quality gates. It\u0026rsquo;s fundamental. And yet, when it comes to AI agents, testing is often completely neglected. It\u0026rsquo;s like we collectively decided that the rules don\u0026rsquo;t apply anymore.\u003c/p\u003e\n\u003cp\u003eI think it\u0026rsquo;s time we talk about this.\u003c/p\u003e\n\u003ch2 id=\"why-agent-testing-falls-through-the-cracks\"\u003eWhy Agent Testing Falls Through the Cracks\u003ca class=\"heading-anchor\" href=\"#why-agent-testing-falls-through-the-cracks\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe main reason is actually straightforward: the people building agents today aren\u0026rsquo;t necessarily developers. Microsoft has done an incredible job democratizing agent development — from Agent Builder to Copilot Studio, anyone can build an agent without writing a single line of code. And that\u0026rsquo;s genuinely great for innovation.\u003c/p\u003e\n\u003cp\u003eBut here\u0026rsquo;s the flip side: many of these builders have never been exposed to the discipline of software testing. They don\u0026rsquo;t know what a test plan looks like. They\u0026rsquo;ve never written a test case. Not because they\u0026rsquo;re not smart — they absolutely are — but because testing was never part of their world. When a business analyst builds an agent in Copilot Studio, their definition of \u0026ldquo;done\u0026rdquo; is usually \u0026ldquo;it works when I try it.\u0026rdquo; And that\u0026rsquo;s not the same as \u0026ldquo;it\u0026rsquo;s been properly tested.\u0026rdquo;\u003c/p\u003e\n\u003ch2 id=\"deterministic-testing-doesnt-work-here\"\u003eDeterministic Testing Doesn\u0026rsquo;t Work Here\u003ca class=\"heading-anchor\" href=\"#deterministic-testing-doesnt-work-here\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eEven if you do come from a development background, you\u0026rsquo;ll quickly realize that classical testing approaches don\u0026rsquo;t translate well to AI agents. In traditional software, you test deterministically: given input X, you expect output Y. If the output matches, the test passes. Simple.\u003c/p\u003e\n\u003cp\u003eWith AI agents, that model breaks down completely. Ask the same agent the same question twice, and you might get two different answers — both of which could be perfectly correct. The underlying language model is non-deterministic by nature. So if you try to apply unit test thinking to agent testing, you\u0026rsquo;ll either go crazy or give up. Neither is helpful.\u003c/p\u003e\n\u003cp\u003eWhat we need is a fundamentally new testing mindset.\u003c/p\u003e\n\u003ch2 id=\"new-categories-for-a-new-paradigm\"\u003eNew Categories for a New Paradigm\u003ca class=\"heading-anchor\" href=\"#new-categories-for-a-new-paradigm\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eInstead of testing for exact outputs, I think we need to focus on qualitative evaluation categories that actually matter for agents:\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eCategory\u003c/th\u003e\n          \u003cth\u003eWhat It Tests\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eGroundedness\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eAre the agent\u0026rsquo;s answers based on the provided knowledge sources, or is it hallucinating?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eTool Usage\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eDoes the agent call the right tools and APIs for a given request?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eSemantic Similarity\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eIs the answer semantically correct, even if the wording differs from the expected response?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eRelevance\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eDoes the agent actually answer the question that was asked?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eCoherence\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eIs the response logically structured and consistent?\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eSafety\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eDoes the agent resist adversarial prompts and stay within its defined boundaries?\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eThese categories shift the focus from \u0026ldquo;is the output identical?\u0026rdquo; to \u0026ldquo;is the output good?\u0026rdquo; — and that\u0026rsquo;s exactly the shift we need.\u003c/p\u003e\n\u003ch2 id=\"what-state-of-the-art-looks-like-today\"\u003eWhat State-of-the-Art Looks Like Today\u003ca class=\"heading-anchor\" href=\"#what-state-of-the-art-looks-like-today\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe good news is that tooling is catching up. Here\u0026rsquo;s what I see as the current state-of-the-art for agent testing:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eEvaluation frameworks\u003c/strong\u003e like Azure AI Evaluation SDK or DeepEval can automatically score agent responses on metrics like groundedness, relevance, and coherence. Essentially, you use one LLM to evaluate the output of another. It\u0026rsquo;s not perfect, but it scales.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eGolden datasets\u003c/strong\u003e — curated sets of question-answer pairs that serve as benchmarks. The key difference to classical test data: you don\u0026rsquo;t check for exact matches but for semantic similarity. The agent doesn\u0026rsquo;t need to produce the same words, just the same meaning.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTool call assertions\u003c/strong\u003e — verifying that the agent invokes the correct tools for a given input, regardless of the textual response. If someone asks \u0026ldquo;What\u0026rsquo;s my leave balance?\u0026rdquo;, the agent should call the HR API, not the finance API. This is actually quite testable.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRed teaming\u003c/strong\u003e — deliberately trying to break the agent. Can you make it hallucinate? Can you trick it into revealing information it shouldn\u0026rsquo;t? Can you push it off-topic? This adversarial approach catches issues that happy-path testing never will.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHuman-in-the-loop evaluation\u003c/strong\u003e — running example conversations and having humans manually assess the quality. This is labor-intensive but catches nuances that automated metrics miss.\u003c/p\u003e\n\u003ch2 id=\"the-platform-gap\"\u003eThe Platform Gap\u003ca class=\"heading-anchor\" href=\"#the-platform-gap\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eHere\u0026rsquo;s something worth noting: not all Microsoft platforms are equal when it comes to testing support. Microsoft Foundry already offers a solid evaluation toolkit — you can run evaluations against datasets, measure quality metrics, and integrate this into your development workflow.\u003c/p\u003e\n\u003cp\u003eCopilot Studio and Agent Builder? Not so much. If you\u0026rsquo;re building agents in these platforms, you\u0026rsquo;re largely on your own when it comes to structured testing. I hope this gap closes soon, because these are exactly the platforms where citizen developers build agents — the same people who need testing guidance the most.\u003c/p\u003e\n\u003ch2 id=\"make-testing-non-optional\"\u003eMake Testing Non-Optional\u003ca class=\"heading-anchor\" href=\"#make-testing-non-optional\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIf there\u0026rsquo;s one practical takeaway from this post, it\u0026rsquo;s this: \u003cstrong\u003edon\u0026rsquo;t make agent testing a recommendation — make it a requirement.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eOrganizations need to establish an ALM (Application Lifecycle Management) process for agents that explicitly includes testing as a mandatory step. Not a \u0026ldquo;nice to have.\u0026rdquo; Not a \u0026ldquo;we\u0026rsquo;ll add testing later.\u0026rdquo; A hard gate that every agent must pass before it reaches production.\u003c/p\u003e\n\u003cp\u003eThis means:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eDefine minimum testing criteria\u003c/strong\u003e for every agent before it gets deployed\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eProvide testing templates\u003c/strong\u003e — example conversations, evaluation rubrics, tool call checklists — so that citizen developers have a starting point\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuild testing into the approval workflow\u003c/strong\u003e — no test results, no deployment\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eYes, this adds friction. But it\u0026rsquo;s the same kind of friction that prevents broken software from reaching production in every other part of your technology stack.\u003c/p\u003e\n\u003ch2 id=\"the-bottom-line\"\u003eThe Bottom Line\u003ca class=\"heading-anchor\" href=\"#the-bottom-line\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAgent testing is where software testing was 20 years ago — everyone knows they should do it, but many organizations are still figuring out how. The difference is that we\u0026rsquo;re building agents at a pace that\u0026rsquo;s far faster than we ever built traditional applications, which means the gap between what\u0026rsquo;s being shipped and what\u0026rsquo;s been properly tested is growing quickly.\u003c/p\u003e\n\u003cp\u003eI believe agent testing will eventually become as natural as unit testing is today. The tools will improve, the platforms will integrate better evaluation capabilities, and organizations will develop testing muscle through experience. But we can\u0026rsquo;t just wait for that to happen. We need to start now — with the tools we have, with the frameworks that exist, and with the mindset that agents deserve the same quality standards as any other piece of software we put in front of our users.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eHow does your organization handle agent testing today — and do you have a process in place, or is it still the wild west?\u003c/strong\u003e\u003c/p\u003e\n","date_modified":"2026-03-11T10:00:00+01:00","date_published":"2026-03-11T10:00:00+01:00","id":"https://bisser.io/testing-ai-agents-is-a-problem-nobody-wants-to-talk-about/","image":"https://bisser.io/images/086-cover.webp","summary":"Everyone is building agents, but almost nobody is testing them properly. My take on new testing categories, tooling, and why ALM for agents is overdue.","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot","Testing","Agent Testing","ALM"],"title":"Testing AI Agents Is a Problem Nobody Wants to Talk About","url":"https://bisser.io/testing-ai-agents-is-a-problem-nobody-wants-to-talk-about/"},{"_markdown_url":"https://bisser.io/the-agentic-organization-when-agents-become-part-of-the-team/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003e\u003cem\u003eWe\u0026rsquo;ve been talking about agents. It\u0026rsquo;s time to talk about what happens when they join the org chart.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThe word \u0026ldquo;agentic\u0026rdquo; is everywhere right now. Every platform, every keynote, every product update — everything is suddenly \u0026ldquo;agentic.\u0026rdquo; But here\u0026rsquo;s what I\u0026rsquo;ve noticed: everyone uses the term, and everyone means something slightly different by it. So before we talk about the agentic organization, I think we need to take a step back and create some clarity.\u003c/p\u003e\n\u003ch2 id=\"where-we-are-today\"\u003eWhere We Are Today\u003ca class=\"heading-anchor\" href=\"#where-we-are-today\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eRight now, most interactions with AI agents follow a simple pattern: one person, one agent, one task. You ask your Copilot agent a question, it gives you an answer. You trigger a workflow, the agent executes it. It\u0026rsquo;s a 1:1 relationship — useful, productive, but fundamentally still a tool interaction.\u003c/p\u003e\n\u003cp\u003eAnd that\u0026rsquo;s fine. That\u0026rsquo;s the current state for most organizations, and there\u0026rsquo;s a lot of value in getting this right. But I don\u0026rsquo;t think this is the end state. I think the next logical step on our agentic AI journey is something bigger: organizations where people and agents work together in teams. Not as tool and user, but as teammates with different roles and responsibilities.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s what I mean when I talk about the agentic organization.\u003c/p\u003e\n\u003ch2 id=\"the-agentic-maturity-model\"\u003eThe Agentic Maturity Model\u003ca class=\"heading-anchor\" href=\"#the-agentic-maturity-model\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eTo make this more tangible, here\u0026rsquo;s how I see the journey from \u0026ldquo;we just got Copilot\u0026rdquo; to a fully agentic organization. Most companies will recognize themselves somewhere on this scale:\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eStage\u003c/th\u003e\n          \u003cth\u003eDescription\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eStage 1: Copilot Rollout\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eYou\u0026rsquo;re deploying Microsoft 365 Copilot, figuring out adoption, licensing, and governance basics\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eStage 2: Agent Ideation\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eYou\u0026rsquo;re thinking about agent use cases, exploring Copilot extensibility, and piloting your first agents\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eStage 3: Targeted Deployment\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eYou\u0026rsquo;re running agents in selected teams or specific process steps — real work, limited scope\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eStage 4: Governance \u0026amp; Process Readiness\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eYou have agent governance under control and you\u0026rsquo;re actively redesigning processes to be agent-ready\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eStage 5: Agentic Organization\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003ePeople and agents collaborate in interdisciplinary teams, working together on value-creating processes\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eMost organizations I talk to are somewhere between Stage 1 and Stage 2. A few ambitious ones are approaching Stage 3. And that\u0026rsquo;s perfectly fine — but it helps to know where you\u0026rsquo;re heading.\u003c/p\u003e\n\u003ch2 id=\"what-stage-5-actually-looks-like\"\u003eWhat Stage 5 Actually Looks Like\u003ca class=\"heading-anchor\" href=\"#what-stage-5-actually-looks-like\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eLet me make this concrete, because \u0026ldquo;people and agents working together\u0026rdquo; can sound abstract.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFinance \u0026amp; Controlling.\u003c/strong\u003e Imagine agents handling the data analysis — pulling numbers, identifying anomalies, running comparisons across periods. The humans on the team don\u0026rsquo;t spend their time building spreadsheets anymore. Instead, they review the agent\u0026rsquo;s findings, add context that only they have (\u0026ldquo;this spike is because we acquired a company last quarter\u0026rdquo;), and make the decisions. The agent does the heavy lifting. The human does the thinking.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eMarketing.\u003c/strong\u003e Agents manage the channel execution — scheduling posts, adapting content for different platforms, monitoring engagement metrics. They report back to the team with performance data and recommendations. The humans focus on strategy, creative direction, and the decisions that require judgment and brand understanding.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eValue-creating processes in general.\u003c/strong\u003e The pattern is the same across domains: agents execute, humans supervise and decide. It\u0026rsquo;s a fundamental shift from \u0026ldquo;the human does the work and the agent helps\u0026rdquo; to \u0026ldquo;the agent does the work and the human steers.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s the real transformation. Not just using agents as better tools, but integrating them as team members with defined responsibilities.\u003c/p\u003e\n\u003ch2 id=\"the-trust-question\"\u003eThe Trust Question\u003ca class=\"heading-anchor\" href=\"#the-trust-question\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eI know what some of you are thinking: \u0026ldquo;Can we really trust agents to do the work while we just supervise?\u0026rdquo; And yes, there are enough skeptics out there — and healthy skepticism isn\u0026rsquo;t a bad thing.\u003c/p\u003e\n\u003cp\u003eBut I think we should approach this positively rather than letting fear block progress. The key is finding the right balance. You don\u0026rsquo;t hand over your entire financial reporting to an agent on day one. You start small, build trust through experience, and gradually expand the agent\u0026rsquo;s responsibilities as you learn what works and what doesn\u0026rsquo;t.\u003c/p\u003e\n\u003cp\u003eThis is no different from onboarding a new team member, honestly. You wouldn\u0026rsquo;t give a new hire full autonomy on their first day either. You\u0026rsquo;d start with defined tasks, review their output, and expand their scope over time. The same principle applies to agents.\u003c/p\u003e\n\u003ch2 id=\"start-now--even-on-stage-1\"\u003eStart Now — Even on Stage 1\u003ca class=\"heading-anchor\" href=\"#start-now--even-on-stage-1\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eHere\u0026rsquo;s the thing: you don\u0026rsquo;t need to be on Stage 4 to start thinking about Stage 5. In fact, the organizations that will get to the agentic organization fastest are the ones that start building the foundation now.\u003c/p\u003e\n\u003cp\u003eWhat does that mean practically?\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eFoster curiosity.\u003c/strong\u003e Give your people the space and permission to experiment with agents today. Not in a formal \u0026ldquo;innovation lab\u0026rdquo; that nobody takes seriously, but in their actual daily work. Let them try things, let them fail, let them learn. That\u0026rsquo;s how organizational capability is built.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThink about your processes.\u003c/strong\u003e Look at your workflows and ask: which of these could be restructured so that agents handle the execution while humans handle the decisions? You don\u0026rsquo;t need to implement this tomorrow, but starting to think this way changes how you approach every process improvement from now on.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eDon\u0026rsquo;t wait for perfection.\u003c/strong\u003e The tools will keep evolving. The governance frameworks will mature. But the organizational learning — understanding how your teams can work with agents, what works in your specific context, what doesn\u0026rsquo;t — that only comes from doing.\u003c/p\u003e\n\u003ch2 id=\"the-bottom-line\"\u003eThe Bottom Line\u003ca class=\"heading-anchor\" href=\"#the-bottom-line\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe agentic organization isn\u0026rsquo;t science fiction. It\u0026rsquo;s the logical next step in a journey that many organizations are already on. We went from \u0026ldquo;AI as a feature\u0026rdquo; to \u0026ldquo;Copilot as an assistant\u0026rdquo; to \u0026ldquo;agents as tools.\u0026rdquo; The next step is \u0026ldquo;agents as teammates.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003eI believe this will affect every organization to some degree. The question isn\u0026rsquo;t whether the agentic organization is coming — it\u0026rsquo;s whether your organization will be ready when it arrives.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhere is your organization on the agentic maturity scale today, and what\u0026rsquo;s your next step to move forward?\u003c/strong\u003e\u003c/p\u003e\n","date_modified":"2026-03-09T10:00:00+01:00","date_published":"2026-03-09T10:00:00+01:00","id":"https://bisser.io/the-agentic-organization-when-agents-become-part-of-the-team/","image":"https://bisser.io/images/085-cover.webp","summary":"The next step isn't better agents — it's agents as teammates. My 5-stage maturity model for the journey to an agentic organization.","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot","Agentic Organization"],"title":"The Agentic Organization — When Agents Become Part of the Team","url":"https://bisser.io/the-agentic-organization-when-agents-become-part-of-the-team/"},{"_markdown_url":"https://bisser.io/the-real-roi-of-microsoft-365-copilot-extensibility/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003e\u003cem\u003eWhen does extending Microsoft 365 Copilot actually pay off? Here are my thoughts.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been consuming a lot of content around Microsoft 365 Copilot extensibility lately. And while the community is doing a great job producing tutorials, samples, and getting-started guides, I noticed something: there\u0026rsquo;s a ton of Hello World-style content out there, but very little about the actual return on investment. So I wanted to share my personal take on when extensibility is worth it — and what the real value looks like.\u003c/p\u003e\n\u003ch2 id=\"are-you-even-ready\"\u003eAre You Even Ready?\u003ca class=\"heading-anchor\" href=\"#are-you-even-ready\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eHere\u0026rsquo;s the thing: many organizations I talk to are still in the middle of rolling out Microsoft 365 Copilot to their users. They\u0026rsquo;re figuring out adoption, licensing, governance — the basics. And that\u0026rsquo;s totally fine. But for these organizations, extensibility shouldn\u0026rsquo;t be the priority yet (even though the conference demos make it look like everyone should be building agents right now).\u003c/p\u003e\n\u003cp\u003eTo me, the \u0026ldquo;extensibility moment\u0026rdquo; comes when you\u0026rsquo;ve reached a certain maturity. You\u0026rsquo;ve got a Copilot rollout going. Your users are actively working with it. You\u0026rsquo;ve identified use cases that work out of the box. And then — this is key — you start noticing the gaps. The moments where users need data or processes from third-party systems, LOB apps, or your ERP that Microsoft 365 Copilot simply can\u0026rsquo;t reach by default.\u003c/p\u003e\n\u003cp\u003eThat\u0026rsquo;s when extensibility becomes relevant. Not because a demo looked cool, but because your users actually need it.\u003c/p\u003e\n\u003ch2 id=\"its-about-personalization-not-just-time-savings\"\u003eIt\u0026rsquo;s About Personalization, Not Just Time Savings\u003ca class=\"heading-anchor\" href=\"#its-about-personalization-not-just-time-savings\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWhen people talk about ROI for extensibility, the conversation usually goes straight to time savings. \u0026ldquo;The agent saves 15 minutes per day.\u0026rdquo; And sure, that\u0026rsquo;s measurable. But to me, that misses the bigger picture.\u003c/p\u003e\n\u003cp\u003eThe real value of Microsoft 365 Copilot extensibility is \u003cstrong\u003epersonalization\u003c/strong\u003e. Out of the box, Microsoft 365 Copilot is a powerful but generic tool. It works the same for every organization. But it doesn\u0026rsquo;t know your ERP system. It doesn\u0026rsquo;t understand your specific business processes. It can\u0026rsquo;t interact with the industry-specific applications your people use every day.\u003c/p\u003e\n\u003cp\u003eExtensibility changes that. It transforms Microsoft 365 Copilot from a general-purpose assistant into something that understands and operates within \u003cem\u003eyour\u003c/em\u003e specific context. And that\u0026rsquo;s where the real productivity and efficiency boost comes from.\u003c/p\u003e\n\u003ch2 id=\"from-information-to-delegation\"\u003eFrom Information to Delegation\u003ca class=\"heading-anchor\" href=\"#from-information-to-delegation\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eLet me make this concrete (because I think this example explains it best):\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWithout extensibility\u003c/strong\u003e, a user asks Microsoft 365 Copilot: \u003cem\u003e\u0026ldquo;How do I submit a purchase order in our ERP system?\u0026rdquo;\u003c/em\u003e — and Copilot tells them which screens to navigate and which fields to fill in. Useful? Yes. Better than a manual? Definitely.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWith extensibility\u003c/strong\u003e, the same user asks: \u003cem\u003e\u0026ldquo;Submit a purchase order for 500 units of component X from supplier Y.\u0026rdquo;\u003c/em\u003e — and an agent connected to the ERP actually does it. Validates the request, triggers the process, confirms completion. The user didn\u0026rsquo;t get information about how to do their job. The agent did the job on their behalf.\u003c/p\u003e\n\u003cp\u003eThat shift — from information to action, from assistance to delegation — is where the ROI becomes obvious. Not in minutes saved, but in entire process steps eliminated.\u003c/p\u003e\n\u003ch2 id=\"start-small-please\"\u003eStart Small, Please\u003ca class=\"heading-anchor\" href=\"#start-small-please\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eOne thing I\u0026rsquo;ve seen way too often: organizations approaching extensibility with too much ambition too early. They want an agent covering 20 processes across five systems on day one. And these projects tend to stall.\u003c/p\u003e\n\u003cp\u003eWhat works better (and I can\u0026rsquo;t stress this enough): start with an MVP. Pick one process. One integration. One use case where the current workflow is painful. Build something simple. Ship it. Learn. Iterate. Then expand.\u003c/p\u003e\n\u003ch2 id=\"measuring-what-actually-matters\"\u003eMeasuring What Actually Matters\u003ca class=\"heading-anchor\" href=\"#measuring-what-actually-matters\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIf you\u0026rsquo;re going to invest in extensibility, you should know whether it\u0026rsquo;s working. And \u0026ldquo;users like it\u0026rdquo; is not a metric. Here\u0026rsquo;s what I think you should be looking at:\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eMetric\u003c/th\u003e\n          \u003cth\u003eWhat it tells you\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eSystem switches per task\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eHow many apps does a user still need to open? Every eliminated switch = less friction and fewer errors\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eUsage frequency\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eNot just \u0026ldquo;who tried it\u0026rdquo; but \u0026ldquo;who keeps coming back\u0026rdquo; — recurring usage signals real value\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eError rate in processes\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eAutomated handoffs should reduce manual mistakes — track before and after\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eTime to competency\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eHow fast can new employees become productive with agent support vs. without?\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eEspecially that last one is often overlooked. When a new hire needs to learn complex ERP processes, an agent that can guide or even execute these processes dramatically shortens the learning curve. That\u0026rsquo;s a powerful ROI argument.\u003c/p\u003e\n\u003ch2 id=\"so-whats-your-extensibility-moment\"\u003eSo, What\u0026rsquo;s Your Extensibility Moment?\u003ca class=\"heading-anchor\" href=\"#so-whats-your-extensibility-moment\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eI\u0026rsquo;m not saying every organization needs Microsoft 365 Copilot extensibility right now. Many don\u0026rsquo;t — yet. But I do think everyone should be actively thinking about it.\u003c/p\u003e\n\u003cp\u003eLook at your users\u0026rsquo; daily workflows. Where do they leave Microsoft 365 to get things done? Where are processes slow or error-prone because the tools aren\u0026rsquo;t connected? Those are your extensibility opportunities.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhich processes in your organization do you think could get a real boost from Microsoft 365 Copilot extensibility?\u003c/strong\u003e\u003c/p\u003e\n","date_modified":"2026-03-02T10:00:00+01:00","date_published":"2026-03-02T10:00:00+01:00","id":"https://bisser.io/the-real-roi-of-microsoft-365-copilot-extensibility/","image":"https://bisser.io/images/084-cover.webp","summary":"When does extending Microsoft 365 Copilot actually pay off? My take on real ROI — beyond time savings and Hello World demos.","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot"],"title":"The Real ROI of Microsoft 365 Copilot Extensibility","url":"https://bisser.io/the-real-roi-of-microsoft-365-copilot-extensibility/"},{"_markdown_url":"https://bisser.io/the-citizen-developer-promise-for-copilot-agents-is-an-illusion/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003e\u003cem\u003eLow-code doesn\u0026rsquo;t mean low-complexity. Here\u0026rsquo;s where the line really is.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eMicrosoft has been telling a beautiful story: business users can describe what they want in natural language, and Agent Builder in Microsoft 365 Copilot will create an agent for them. When they outgrow the basics, they can seamlessly move to Copilot Studio with one click. No code required. Anyone can build an agent.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve been watching this narrative evolve for over a year now, and I think it\u0026rsquo;s time for a reality check. The citizen developer promise for Copilot agents, as it\u0026rsquo;s currently marketed, is an illusion. Not a lie — an illusion. There\u0026rsquo;s an important difference.\u003c/p\u003e\n\u003ch2 id=\"the-happy-path-works-beautifully\"\u003eThe Happy Path Works Beautifully\u003ca class=\"heading-anchor\" href=\"#the-happy-path-works-beautifully\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eLet me be fair first. If you want to build a declarative agent that answers questions based on a curated set of SharePoint documents, Agent Builder does a genuinely impressive job. You describe the agent\u0026rsquo;s purpose, point it at your knowledge sources, maybe adjust the instructions, and you have something functional in minutes. For this specific use case — essentially a scoped Q\u0026amp;A bot over your own content — the citizen developer story absolutely holds up.\u003c/p\u003e\n\u003cp\u003eThe problem starts the moment you need anything beyond that happy path.\u003c/p\u003e\n\u003ch2 id=\"where-things-fall-apart\"\u003eWhere Things Fall Apart\u003ca class=\"heading-anchor\" href=\"#where-things-fall-apart\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e\u003cstrong\u003eThe moment you need real integrations.\u003c/strong\u003e Your HR manager wants an agent that doesn\u0026rsquo;t just answer questions about company policies but actually checks leave balances in Workday and submits time-off requests. That requires MCP server connections, authentication configuration, understanding OAuth flows, and dealing with connector infrastructure. I\u0026rsquo;ve watched technically savvy business analysts — people who are genuinely good with Power Automate and Power Apps — hit a wall when they try to configure MCP authentication with dynamic client registration. These aren\u0026rsquo;t concepts that a weekend workshop prepares you for.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThe moment you need nuanced instructions.\u003c/strong\u003e Agent instructions look simple — you\u0026rsquo;re just writing natural language, right? But crafting instructions that reliably produce the right behavior across edge cases is essentially prompt engineering. It requires understanding how the underlying model interprets ambiguity, how grounding works, what happens when the agent can\u0026rsquo;t find an answer, and how to handle multi-step reasoning. This is a skill that takes practice to develop, and most business users don\u0026rsquo;t have the feedback loops to develop it.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThe moment you need to debug.\u003c/strong\u003e Something isn\u0026rsquo;t working. The agent is returning wrong information, or it\u0026rsquo;s not calling the right MCP tool, or the authentication keeps failing. Where do you even start? Copilot Studio\u0026rsquo;s tracing and analytics have improved significantly, but interpreting activity maps, understanding tool invocation patterns, and diagnosing orchestration failures requires a developer mindset. There\u0026rsquo;s no low-code way to debug a complex agent.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eThe moment you need governance.\u003c/strong\u003e Your citizen-developed agent works great in testing. Now it needs to go through the approval workflow in the admin center. IT needs to review the data sources, security needs to assess the permissions model, and compliance needs to verify the agent doesn\u0026rsquo;t expose sensitive data. The citizen developer built the agent — but they can\u0026rsquo;t shepherd it through enterprise governance alone.\u003c/p\u003e\n\u003ch2 id=\"the-copy-to-copilot-studio-gap\"\u003eThe \u0026ldquo;Copy to Copilot Studio\u0026rdquo; Gap\u003ca class=\"heading-anchor\" href=\"#the-copy-to-copilot-studio-gap\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eMicrosoft\u0026rsquo;s answer to the complexity cliff is the \u0026ldquo;Copy to Copilot Studio\u0026rdquo; feature. Start simple in Agent Builder, then graduate to the full platform when you need more power. It sounds seamless, but it creates a handoff problem that nobody talks about.\u003c/p\u003e\n\u003cp\u003eThe business user who built the prototype in Agent Builder understands the business logic. The developer who takes over in Copilot Studio understands the technology. Neither fully understands the other\u0026rsquo;s domain. The result is usually one of two things: the developer rebuilds from scratch (wasting the prototype work), or the developer tries to extend the existing agent without fully understanding the business intent (leading to subtle bugs that only surface in production).\u003c/p\u003e\n\u003cp\u003eThis isn\u0026rsquo;t a new problem — it\u0026rsquo;s the same gap that has plagued every low-code-to-pro-code transition since the concept was invented. But it\u0026rsquo;s being presented as solved, and it isn\u0026rsquo;t.\u003c/p\u003e\n\u003ch2 id=\"what-would-actually-work\"\u003eWhat Would Actually Work\u003ca class=\"heading-anchor\" href=\"#what-would-actually-work\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eI\u0026rsquo;m not arguing against democratizing agent development. I think it\u0026rsquo;s the right direction. But I think we need a more honest model of what citizen development looks like for agents:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTier 1: Genuine citizen development.\u003c/strong\u003e Q\u0026amp;A agents over curated content. Simple declarative agents with file-based knowledge. This is where business users can truly self-serve, and we should encourage it. But let\u0026rsquo;s be clear that this is the scope.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTier 2: Guided development.\u003c/strong\u003e Agents that need integrations, complex logic, or multi-step workflows. This requires a \u0026ldquo;buddy system\u0026rdquo; — a business user who understands the process working alongside a developer or a power user who understands the platform. Neither can do it alone effectively.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eTier 3: Professional development.\u003c/strong\u003e Agents with custom MCP servers, complex authentication, multi-agent orchestration, or enterprise-scale governance requirements. This is developer territory, full stop. Pretending otherwise sets everyone up for frustration.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eInvest in the middle tier.\u003c/strong\u003e Most organizations focus on either the self-service story (Tier 1) or the pro-dev story (Tier 3) and completely ignore Tier 2. But Tier 2 is where the most valuable agents live — the ones that are specific enough to a business process to be truly useful, but complex enough to need some technical guidance.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eCreate feedback loops.\u003c/strong\u003e The biggest gap in the citizen developer experience isn\u0026rsquo;t tooling — it\u0026rsquo;s learning. When a business user builds an agent that doesn\u0026rsquo;t work well, they rarely know \u003cem\u003ewhy\u003c/em\u003e it doesn\u0026rsquo;t work well. Build internal communities of practice where people share what worked, what didn\u0026rsquo;t, and why. This accelerates learning far more than any tutorial.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eRedefine success.\u003c/strong\u003e If your measure of citizen developer success is \u0026ldquo;business users building production agents independently,\u0026rdquo; you\u0026rsquo;ll be disappointed. If your measure is \u0026ldquo;business users prototyping agent ideas that can be quickly validated and refined with technical support,\u0026rdquo; you\u0026rsquo;ll be much happier — and you\u0026rsquo;ll ship more useful agents.\u003c/p\u003e\n\u003ch2 id=\"the-bottom-line\"\u003eThe Bottom Line\u003ca class=\"heading-anchor\" href=\"#the-bottom-line\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe tools Microsoft is building are genuinely impressive. Agent Builder, Copilot Studio, the MCP ecosystem — these are powerful platforms that lower the barrier to agent development significantly. But \u0026ldquo;lower the barrier\u0026rdquo; is not the same as \u0026ldquo;eliminate the barrier,\u0026rdquo; and the marketing often conflates the two.\u003c/p\u003e\n\u003cp\u003eThe organizations that get the most value from Copilot agents won\u0026rsquo;t be the ones where everyone builds their own agents. They\u0026rsquo;ll be the ones that create the right collaboration model between business expertise and technical capability, with clear expectations about what each tier of development can realistically deliver.\u003c/p\u003e\n\u003cp\u003eLet\u0026rsquo;s stop selling the illusion and start building the support structures that make citizen-involved agent development actually work.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eHave you tried building Copilot agents as a non-developer? Or are you a developer supporting citizen developers? I\u0026rsquo;d love to hear about your experience.\u003c/em\u003e\u003c/p\u003e\n","date_modified":"2026-02-28T09:02:05+02:00","date_published":"2026-02-28T09:02:05+02:00","id":"https://bisser.io/the-citizen-developer-promise-for-copilot-agents-is-an-illusion/","image":"https://bisser.io/images/083-cover.webp","summary":"Microsoft's promise that business users can independently build production-ready Copilot agents through Agent Builder and Copilot Studio breaks down the moment you need real integrations, complex debugging, or enterprise governance. Instead of selling the illusion of fully self-service agent development, organizations should embrace a tiered model where citizen developers prototype ideas that are refined collaboratively with technical support.","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot"],"title":"The Citizen Developer Promise for Copilot Agents is an Illusion","url":"https://bisser.io/the-citizen-developer-promise-for-copilot-agents-is-an-illusion/"},{"_markdown_url":"https://bisser.io/microsoft-365-copilot-extensibility-possibilities-and-pitfalls/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eAs organizations rush to adopt Microsoft 365 Copilot, a critical question emerges: \u003cstrong\u003eHow do we extend Copilot to work with our unique business data and processes?\u003c/strong\u003e The answer lies in understanding the three extensibility pillars—Connectors, Agents, and APIs—and knowing when (and when not) to use each. And that\u0026rsquo;s why I created an infographic for that:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/m365copilotextensibility.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"understanding-the-anatomy-of-microsoft-365-copilot\"\u003eUnderstanding the Anatomy of Microsoft 365 Copilot\u003ca class=\"heading-anchor\" href=\"#understanding-the-anatomy-of-microsoft-365-copilot\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eBefore diving into extensibility, let\u0026rsquo;s understand what we\u0026rsquo;re extending. At its core, Microsoft 365 Copilot consists of:\u003c/p\u003e\n\u003ch3 id=\"the-core-engine\"\u003eThe Core Engine\u003ca class=\"heading-anchor\" href=\"#the-core-engine\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOrchestrator\u003c/strong\u003e: The traffic controller that manages data governance, safety, and responsible AI (RAI) policies\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eFoundation Models\u003c/strong\u003e: The AI backbone powered by GPT-4o, GPT-4.1, and newer models like o1 and o3-mini\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"where-extensibility-plugs-in\"\u003eWhere Extensibility Plugs In\u003ca class=\"heading-anchor\" href=\"#where-extensibility-plugs-in\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eCopilot\u0026rsquo;s architecture exposes three key areas for extension:\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eArea\u003c/th\u003e\n          \u003cth\u003eBuilt-in\u003c/th\u003e\n          \u003cth\u003eExtensible Via\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eKnowledge\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eMemory\u003c/td\u003e\n          \u003ctd\u003eGrounding ← Connectors\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eSkills\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eWorkflows, M365 Apps\u003c/td\u003e\n          \u003ctd\u003eTriggers \u0026amp; Actions ↔ Agents\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eAPIs\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003e—\u003c/td\u003e\n          \u003ctd\u003eYour Apps → Copilot APIs\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch2 id=\"the-three-extensibility-pillars\"\u003eThe Three Extensibility Pillars\u003ca class=\"heading-anchor\" href=\"#the-three-extensibility-pillars\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003ch3 id=\"1-connectors-bringing-external-data-to-copilot\"\u003e1. Connectors: Bringing External Data to Copilot\u003ca class=\"heading-anchor\" href=\"#1-connectors-bringing-external-data-to-copilot\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eDirection: External Data → Copilot\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eGraph Connectors allow you to ingest and index external data into Microsoft Graph, making it available for Copilot to reason over.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eWhat you get:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e100+ prebuilt connectors for popular systems\u003c/li\u003e\n\u003cli\u003eCustom connector development via Graph API\u003c/li\u003e\n\u003cli\u003eSupport for CRM, ERP, databases, and file systems\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eBest for:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMaking enterprise data searchable and available to Copilot\u003c/li\u003e\n\u003cli\u003eConnecting line-of-business applications\u003c/li\u003e\n\u003cli\u003eEnabling Copilot to answer questions about your proprietary data\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003e⚠️ Pitfall:\u003c/strong\u003e Connectors only provide \u003cem\u003eread\u003c/em\u003e access. If you need Copilot to \u003cem\u003etake actions\u003c/em\u003e in external systems, you\u0026rsquo;ll need Agents.\u003c/p\u003e\n\u003chr\u003e\n\u003ch3 id=\"2-agents-ai-assistants-that-do-work\"\u003e2. Agents: AI Assistants That Do Work\u003ca class=\"heading-anchor\" href=\"#2-agents-ai-assistants-that-do-work\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eDirection: AI Assistants ↔ M365 (Bidirectional)\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eAgents are specialized AI assistants that can automate workflows and perform tasks. They\u0026rsquo;re the most powerful—and most complex—extensibility option.\u003c/p\u003e\n\u003ch4 id=\"inside-agents-core-components\"\u003eInside Agents: Core Components\u003ca class=\"heading-anchor\" href=\"#inside-agents-core-components\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003cp\u003eEvery agent consists of three parts:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eKnowledge\u003c/strong\u003e: Data sources like SharePoint, OneDrive, Graph Connectors, and web content\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eInstructions\u003c/strong\u003e: Custom persona, tone, scope limits, and behavioral guardrails\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eActions\u003c/strong\u003e: Real-time API calls that let the agent \u003cem\u003edo\u003c/em\u003e things\u003c/li\u003e\n\u003c/ol\u003e\n\u003cblockquote\u003e\n\u003cp\u003e⚠️ \u003cstrong\u003eCritical Insight:\u003c/strong\u003e Actions ONLY work inside Agents! You cannot add actions to base Copilot—they must be wrapped in an agent.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch4 id=\"two-types-of-agents\"\u003eTwo Types of Agents\u003ca class=\"heading-anchor\" href=\"#two-types-of-agents\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eType\u003c/th\u003e\n          \u003cth\u003eAI Engine\u003c/th\u003e\n          \u003cth\u003eBest For\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eDeclarative Agent\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eUses Copilot\u0026rsquo;s AI\u003c/td\u003e\n          \u003ctd\u003eQuick deployment, Microsoft-managed AI\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eCustom Engine Agent\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eYour own AI\u003c/td\u003e\n          \u003ctd\u003eFull control, custom models, complex scenarios\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch4 id=\"three-ways-to-build-actions\"\u003eThree Ways to Build Actions\u003ca class=\"heading-anchor\" href=\"#three-ways-to-build-actions\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h4\u003e\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eApproach\u003c/th\u003e\n          \u003cth\u003eTechnology\u003c/th\u003e\n          \u003cth\u003eCharacteristics\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eOpenAPI Action\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eREST API + OpenAPI Spec\u003c/td\u003e\n          \u003ctd\u003eExisting APIs, static schema, multiple auth options\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eMCP Server Action\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eModel Context Protocol\u003c/td\u003e\n          \u003ctd\u003eAI-native, dynamic tool discovery, streamable (Preview)\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eCopilot Studio Action\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003ePower Platform Connectors\u003c/td\u003e\n          \u003ctd\u003e1400+ prebuilt connectors, visual designer, citizen-developer friendly\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003chr\u003e\n\u003ch3 id=\"3-copilot-apis-embedding-copilot-in-your-apps\"\u003e3. Copilot APIs: Embedding Copilot in Your Apps\u003ca class=\"heading-anchor\" href=\"#3-copilot-apis-embedding-copilot-in-your-apps\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eDirection: Your Apps → Copilot\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eCopilot APIs let you programmatically access Copilot\u0026rsquo;s capabilities from your own applications.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAvailable APIs:\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eAPI\u003c/th\u003e\n          \u003cth\u003eStatus\u003c/th\u003e\n          \u003cth\u003ePurpose\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eRetrieval API (RAG)\u003c/td\u003e\n          \u003ctd\u003eGA\u003c/td\u003e\n          \u003ctd\u003eQuery Microsoft Graph with AI-enhanced retrieval\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eSearch API\u003c/td\u003e\n          \u003ctd\u003ePreview\u003c/td\u003e\n          \u003ctd\u003eSemantic search across M365 content\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eChat Completions API\u003c/td\u003e\n          \u003ctd\u003ePreview\u003c/td\u003e\n          \u003ctd\u003eConversational AI with M365 context\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMeeting Transcript API\u003c/td\u003e\n          \u003ctd\u003eGA\u003c/td\u003e\n          \u003ctd\u003eAccess meeting transcriptions\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003eMeeting Insights API\u003c/td\u003e\n          \u003ctd\u003ePreview\u003c/td\u003e\n          \u003ctd\u003eExtract insights from meetings\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003e\u003cstrong\u003eBest for:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBuilding custom applications that leverage Copilot\u003c/li\u003e\n\u003cli\u003eIntegrating AI capabilities into existing line-of-business apps\u003c/li\u003e\n\u003cli\u003eCreating specialized user experiences\u003c/li\u003e\n\u003c/ul\u003e\n\u003chr\u003e\n\u003ch2 id=\"common-pitfalls-and-how-to-avoid-them\"\u003eCommon Pitfalls and How to Avoid Them\u003ca class=\"heading-anchor\" href=\"#common-pitfalls-and-how-to-avoid-them\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003ch3 id=\"pitfall-1-using-connectors-when-you-need-actions\"\u003ePitfall #1: Using Connectors When You Need Actions\u003ca class=\"heading-anchor\" href=\"#pitfall-1-using-connectors-when-you-need-actions\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u0026ldquo;I connected my CRM data, but Copilot can\u0026rsquo;t create new records.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e Connectors are read-only. To write data back, create an Agent with Actions that call your CRM\u0026rsquo;s API.\u003c/p\u003e\n\u003ch3 id=\"pitfall-2-building-custom-engines-when-declarative-would-suffice\"\u003ePitfall #2: Building Custom Engines When Declarative Would Suffice\u003ca class=\"heading-anchor\" href=\"#pitfall-2-building-custom-engines-when-declarative-would-suffice\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Spending months building a custom AI engine for a simple Q\u0026amp;A bot.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e Start with Declarative Agents. They deploy faster and Microsoft handles the AI infrastructure. Only go custom when you need specific models or complex orchestration.\u003c/p\u003e\n\u003ch3 id=\"pitfall-3-ignoring-data-governance\"\u003ePitfall #3: Ignoring Data Governance\u003ca class=\"heading-anchor\" href=\"#pitfall-3-ignoring-data-governance\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e Copilot surfaces sensitive data to unauthorized users.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e Connectors and Agents respect Microsoft 365 permissions. Ensure your data sources have proper access controls \u003cem\u003ebefore\u003c/em\u003e connecting them.\u003c/p\u003e\n\u003ch3 id=\"pitfall-4-overlooking-the-actions-in-agents-requirement\"\u003ePitfall #4: Overlooking the Actions-in-Agents Requirement\u003ca class=\"heading-anchor\" href=\"#pitfall-4-overlooking-the-actions-in-agents-requirement\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eSymptom:\u003c/strong\u003e \u0026ldquo;I built an OpenAPI action but can\u0026rsquo;t find it in Copilot.\u0026rdquo;\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eSolution:\u003c/strong\u003e Actions must be deployed within an Agent. Create a Declarative Agent, add your action, and deploy the agent to Teams or M365.\u003c/p\u003e\n\u003chr\u003e\n\u003ch2 id=\"decision-framework-choosing-the-right-approach\"\u003eDecision Framework: Choosing the Right Approach\u003ca class=\"heading-anchor\" href=\"#decision-framework-choosing-the-right-approach\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eDo you need Copilot to access external data?\n├── Yes → Use Graph Connectors\n│   └── Do you also need to write back?\n│       └── Yes → Add an Agent with Actions\n└── No\n    ↓\nDo you need Copilot to perform tasks?\n├── Yes → Build an Agent\n│   ├── Simple tasks, quick deployment → Declarative Agent\n│   └── Complex logic, custom AI → Custom Engine Agent\n└── No\n    ↓\nDo you need AI in your own app?\n├── Yes → Use Copilot APIs\n└── No → You might not need extensibility!\n\u003c/code\u003e\u003c/pre\u003e\u003chr\u003e\n\u003ch2 id=\"getting-started\"\u003eGetting Started\u003ca class=\"heading-anchor\" href=\"#getting-started\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003ch3 id=\"tools-youll-need\"\u003eTools You\u0026rsquo;ll Need\u003ca class=\"heading-anchor\" href=\"#tools-youll-need\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003ctable\u003e\n  \u003cthead\u003e\n      \u003ctr\u003e\n          \u003cth\u003eTool\u003c/th\u003e\n          \u003cth\u003ePurpose\u003c/th\u003e\n          \u003cth\u003eSkill Level\u003c/th\u003e\n      \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eCopilot Studio\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eVisual agent builder\u003c/td\u003e\n          \u003ctd\u003eLow-code\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eM365 Agents Toolkit\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eVS Code extension for agent development\u003c/td\u003e\n          \u003ctd\u003ePro-code\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eKiota CLI\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eOpenAPI client generation\u003c/td\u003e\n          \u003ctd\u003ePro-code\u003c/td\u003e\n      \u003c/tr\u003e\n      \u003ctr\u003e\n          \u003ctd\u003e\u003cstrong\u003eGraph API\u003c/strong\u003e\u003c/td\u003e\n          \u003ctd\u003eCustom connector development\u003c/td\u003e\n          \u003ctd\u003ePro-code\u003c/td\u003e\n      \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003ch3 id=\"recommended-learning-path\"\u003eRecommended Learning Path\u003ca class=\"heading-anchor\" href=\"#recommended-learning-path\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003col\u003e\n\u003cli\u003e\u003cstrong\u003eStart with Copilot Studio\u003c/strong\u003e to understand agent concepts visually\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eBuild a Declarative Agent\u003c/strong\u003e with knowledge sources\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAdd an OpenAPI Action\u003c/strong\u003e to perform a simple task\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExplore MCP\u003c/strong\u003e for more dynamic scenarios\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eGraduate to Custom Engine Agents\u003c/strong\u003e when you hit limitations\u003c/li\u003e\n\u003c/ol\u003e\n\u003chr\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eMicrosoft 365 Copilot extensibility is powerful but requires understanding the architecture. Remember:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eConnectors\u003c/strong\u003e bring data IN (read-only)\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAgents\u003c/strong\u003e enable bidirectional interaction with Actions\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eAPIs\u003c/strong\u003e let you bring Copilot OUT to your apps\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eActions only work inside Agents\u003c/strong\u003e—this is the #1 gotcha\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eStart simple, validate your approach, and scale from there. The extensibility landscape is evolving rapidly, with MCP and new APIs in preview that will expand what\u0026rsquo;s possible.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003e\u003cem\u003eHave questions about Copilot extensibility? The patterns and pitfalls shared here come from real-world implementation experience. Your mileage may vary, but understanding these fundamentals will set you on the right path.\u003c/em\u003e\u003c/p\u003e\n","date_modified":"2025-12-02T19:00:05+02:00","date_published":"2025-12-02T19:00:05+02:00","id":"https://bisser.io/microsoft-365-copilot-extensibility-possibilities-and-pitfalls/","image":"https://bisser.io/images/082-cover.webp","summary":"Microsoft 365 Copilot can be extended through three pillars—Connectors (for bringing external data in), Agents (for performing actions via OpenAPI, MCP, or Copilot Studio), and APIs (for embedding Copilot capabilities in your apps)—but the key gotcha is that Actions only work inside Agents. Start with Declarative Agents for quick wins, use Graph Connectors for read-only data access, and remember that proper data governance must be in place before connecting any data sources","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot"],"title":"Microsoft 365 Copilot Extensibility - Possibilities and Pitfalls","url":"https://bisser.io/microsoft-365-copilot-extensibility-possibilities-and-pitfalls/"},{"_markdown_url":"https://bisser.io/the-future-of-copilot-agents-an-agent-centric-workplace/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eToday we live in an era of constant change. Technology changes, mindset changes and vision changes. It started out with a bunch of Generative AI tools fueled by LLMs. These AI Tools now do not only offer the access to LLMs itself, but also give you the chance of creating and using agents. These agents give you two extra-assets:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eConsistency\u003c/li\u003e\n\u003cli\u003eScope\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eMy friend \u003ca href=\"https://thomy.tech/\" rel=\"noopener\"\u003eThomy\u003c/a\u003e\n wrote about the topic of \u003ca href=\"https://www.linkedin.com/pulse/ai-agents-process-handovers-where-consistency-matters-thomas-g%C3%B6lles-c0wwf/?trackingId=rsfBNBFP7E%2FlwsZHCPbMmQ%3D%3D\" rel=\"noopener\"\u003eAI Agents at Process Handovers: Where Consistency Matters More Than Intelligence\u003c/a\u003e\n, so if you want to know about why consistency matters, please read that first.\u003c/p\u003e\n\u003cp\u003eBut with the introduction of agents, we also started shifting into an \u0026ldquo;Agent-Centric Workplace\u0026rdquo;. And I started to feel this myself rather quick: For every platform, for every service and for every use case, an agent could be built to assist me throughout my workday. To me, using agents goes beyond using Copilot. It\u0026rsquo;s more a concept of delegating work to my digital teammates = agents. And with all the recent announcements and udpates published by Microsoft around topics like autonomous agents, I do not think that this concept is going to vanish in the future. More likely, we will see the transition going from prompt-based assistants to goal/task-oriented, multi-step reasoning systems more and more over the course of the next weeks, months and years.\u003c/p\u003e\n\u003ch2 id=\"ecosystem\"\u003eEcosystem\u003ca class=\"heading-anchor\" href=\"#ecosystem\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe Microsoft platforms offers a sophisticated ecosystem when it comes to building (and yes you may think why is he not writing \u0026ldquo;developing\u0026rdquo; instead of building, but we\u0026rsquo;ll come to that in a second) agents of many kinds. You can build agents in a variety of places with a variety of tools like:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSharePoint\u003c/li\u003e\n\u003cli\u003eCopilot Studio lite\u003c/li\u003e\n\u003cli\u003eCopilot Studio full\u003c/li\u003e\n\u003cli\u003eMicrosoft Fabric\u003c/li\u003e\n\u003cli\u003eM365 Agents Toolkit \u0026amp; SDK\u003c/li\u003e\n\u003cli\u003eAzure AI Foundry\u003c/li\u003e\n\u003cli\u003eAgent Framework\u003c/li\u003e\n\u003cli\u003e\u0026hellip;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAnd all of these platforms and frameworks target a specific agent builder audience, from low-code to pro-code. Eventually I will write another blog post, or even a series, about which platforms should be leveraged by which audience. But the good news here is, that there is at least one tool or platform for everyone, no matter which skills you have when it comes to building or developing an agent. And many of the agents built with these platforms can then be again consumed from one central place: Microsoft 365 Copilot. Therefore, the platform will likely evolve and governance aspects will also be covered more and more as more and more people will not only be using agents, but will also be building agents, either for their personal use, for their team or for the whole organization.\u003c/p\u003e\n\u003ch2 id=\"multi-agent-collaboration\"\u003eMulti-Agent Collaboration\u003ca class=\"heading-anchor\" href=\"#multi-agent-collaboration\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWith the variety of tools and frameworks, the necessacity of introducing a concept called \u0026ldquo;Multi-Agent Collaboration\u0026rdquo; grew. Satya Nadella once said in a keynote of a big conference that \u0026ldquo;Copilot is the UI for AI\u0026rdquo;. Thinking about this message, I thought that this is the beginning of the Multi-Agent Collaboration era, where Microsoft 365 Copilot itself is also an agent, having the skills of orchestrating and collaborating with other agents.\u003c/p\u003e\n\u003cp\u003eBut for me personally, hearing this message was not the first time for me personally to think of multi-agent scenarios. Looking back at my blog post on \u003ca href=\"https://bisser.io/microsoft-build-2019-updates-on-conversational-ai/\"\u003eMicrosoft Build 2019 updates on Conversational AI\u003c/a\u003e\n, the concept of \u003cstrong\u003eSkills\u003c/strong\u003e was introduced. And this to me was the first step towards a multi-agent collaboration era, because skills in the realm of the Microsoft Bot Framework where chatbots itself, which other chatbots would call to solve specific tasks.\u003c/p\u003e\n\u003ch3 id=\"human-agent-collaboration-patterns\"\u003eHuman-Agent Collaboration Patterns\u003ca class=\"heading-anchor\" href=\"#human-agent-collaboration-patterns\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eIn the future, we might see a shift from \u0026ldquo;Copilot in apps\u0026rdquo; to \u0026ldquo;Copilot across work\u0026rdquo; as this may be something that people need more urgent. In my idea, I think an agent like a \u0026ldquo;Project Planning Agent\u0026rdquo; might be more helpful when integrated in all of my work apps, than an agent like the Copilot in Word. Because I want to perfectly do my project planning, which involves multiple platforms and services, so this agent should be accessible and integrated in all of the places where I do my work and is still specifically tailored to one specific goal (here we are again at consistency and scope).\u003c/p\u003e\n\u003cp\u003eThis shit may also require us to rethink productivity rituals, like how do we manage meetings or how do we do reporting or how do we share knowledge when agents are our digital teammates, as they also need to be integrated into these rituals.\u003c/p\u003e\n\u003ch2 id=\"future-look\"\u003eFuture look\u003ca class=\"heading-anchor\" href=\"#future-look\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWith things like MCP, multimodal models and agents and the convergence of local and cloud intelligence, I do think that agents will play an important role in our future workplace. In the future we might not be talking \u0026ldquo;Copilot Adoption\u0026rdquo; but \u0026ldquo;Agent lifecycle management\u0026rdquo;, as I strongly believe that the introduction of \u0026ldquo;goal-oriented agents\u0026rdquo; will be a huge boost in the enterprise, to increas both our productivity as well as the quality we deliver our work with. Therefore I encourage everyone reading this, to experiment with agents and especially with multi-agent scenarios as this will likely hit us sooner or later and furthermore, think about this: \u0026ldquo;What\u0026rsquo;s your vision for the agentic workplace?\u0026rdquo; and let me know what\u0026rsquo;s your opinion!\u003c/p\u003e\n","date_modified":"2025-10-27T12:00:05+02:00","date_published":"2025-10-27T12:00:05+02:00","id":"https://bisser.io/the-future-of-copilot-agents-an-agent-centric-workplace/","image":"https://bisser.io/images/081-cover.webp","summary":"The workplace is evolving from prompt-based assistants to an agent-centric model, where specialized digital teammates pursue goals autonomously. Microsoft’s ecosystem—from SharePoint to Azure AI Foundry—empowers everyone to build agents that seamlessly extend Microsoft 365 Copilot. What began with the Bot Framework’s Skills is now multi-agent collaboration across platforms. The future isn’t Copilot in apps but Copilot across work—agents like a Project Planner that follow you everywhere. As we shift from Copilot adoption to agent lifecycle management, one question remains: What’s your vision for the agentic workplace?","tags":["AI","Copilot","Generative AI","Gen AI","Agents","Microsoft 365 Copilot"],"title":"The Future of Copilot Agents - An Agent-Centric Workplace","url":"https://bisser.io/the-future-of-copilot-agents-an-agent-centric-workplace/"},{"_markdown_url":"https://bisser.io/exploring-autonomous-agent-capabilities-with-microsoft-copilot-studio/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eMicrosoft is pushing the boundaries of how business processes can be automated with its \u003cstrong\u003eCopilot Studio\u003c/strong\u003e—a cloud-based, low-code platform that empowers organizations to build AI agents. In its latest release, Microsoft has introduced autonomous agent capabilities aimed at enabling agents to proactively respond to events, orchestrate tasks, and integrate seamlessly with enterprise data sources. However, while these functionalities open exciting prospects, in my opinion, they currently feel quite basic—likely reflecting their preview status.\u003c/p\u003e\n\u003ch2 id=\"autonomous-agent-capabilities-at-a-glance\"\u003eAutonomous Agent Capabilities at a Glance\u003ca class=\"heading-anchor\" href=\"#autonomous-agent-capabilities-at-a-glance\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWith Copilot Studio, Microsoft now provides tools to build autonomous agents that can:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eMonitor \u0026amp; React:\u003c/strong\u003e Automatically respond to business signals or triggers to initiate tasks.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eExecute Business Processes:\u003c/strong\u003e Leverage AI orchestration to run rule-based workflows and automate repetitive tasks.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eIntegrate with Data Sources:\u003c/strong\u003e Connect to Microsoft Graph, Dataverse, and other connectors to pull in context.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEnhance Productivity:\u003c/strong\u003e Offer a low-code way for teams to extend Microsoft 365 Copilot with personalized AI agents.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"fundamental-architecture-diagram\"\u003eFundamental Architecture Diagram\u003ca class=\"heading-anchor\" href=\"#fundamental-architecture-diagram\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eA core element of understanding autonomous agents in Copilot Studio is their underlying architecture. Below is a diagram which displays a visual representation of the system:\u003c/p\u003e\n\u003cpre class=\"mermaid\"\u003e\ngraph LR;\n    %% Trigger: Automated trigger\n    A[\u0026#34;Trigger\u0026lt;br/\u0026gt;(Recurrence/Power Platform Connector)\u0026#34;]\n    %% Core Components within Copilot Studio\n    subgraph Core[\u0026#34;Copilot Studio Orchestrator\u0026#34;]\n        B1[\u0026#34;Understand trigger\u0026#34;]\n        B2[\u0026#34;Analyze trigger input\u0026#34;]\n        B3[\u0026#34;Build plan\u0026#34;]\n    end\n    A --\u0026gt; Core\n    %% Backend: Data and Knowledge Sources\n    subgraph Data[\u0026#34;Data \u0026amp; Knowledge Sources\u0026#34;]\n        D1[\u0026#34;Add grounding data\u0026#34;]\n        D2[\u0026#34;Execute actions \u0026amp; plan\u0026#34;]\n        D3[\u0026#34;Generate output\u0026#34;]\n    end\n    Core --\u0026gt; Data\n    %% User: User interface\n    subgraph User[\u0026#34;User interface\u0026#34;]\n        U1[\u0026#34;Send output\u0026#34;]\n    end\n    Data --\u0026gt; User\n\u003c/pre\u003e\n\n\u003cfigure\u003e\u003cimg src=\"/images/080-overview-diagram.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003e\u003cem\u003eFigure 1: Fundamental Architecture for Autonomous Agents in Microsoft Copilot Studio\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eThis diagram illustrates how user interactions are processed through Copilot Studio, which utilizes an orchestration engine to understand the trigger and inputs along with building and executing a plan. The agents then access context-rich data from secure sources to generate responses.\u003c/p\u003e\n\u003ch2 id=\"the-preview-nature-opportunities-and-limitations\"\u003eThe Preview Nature: Opportunities and Limitations\u003ca class=\"heading-anchor\" href=\"#the-preview-nature-opportunities-and-limitations\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWhile the preview release is promising, the current autonomous agent capabilities appear somewhat basic:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eLimited Customization:\u003c/strong\u003e The workflow options and decision-making granularity are still evolving.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eEarly-Stage Integrations:\u003c/strong\u003e Integrations with external systems work at a basic level—expect enhancements with additional connectors and refinements.\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eDependence on User Feedback:\u003c/strong\u003e Early adopters find that while the automation framework offers efficiencies, further adjustments and human oversight are needed to handle complex real-world scenarios.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThese observations suggest that the preview is an important first step, setting the stage for further refinements as Microsoft iterates based on customer feedback.\u003c/p\u003e\n\u003ch2 id=\"looking-ahead\"\u003eLooking Ahead\u003ca class=\"heading-anchor\" href=\"#looking-ahead\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eMicrosoft’s vision for transforming business processes with AI is clear. As additional features and deeper integrations are developed, we can expect:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMore advanced decision-making capabilities.\u003c/li\u003e\n\u003cli\u003eEnhanced automation for complex workflows.\u003c/li\u003e\n\u003cli\u003eGreater interoperability across the Microsoft ecosystem.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eEven though the functionality now might seem basic, it represents a foundational step towards a future where AI agents can autonomously handle a wide array of business tasks with minimal human intervention.\u003c/p\u003e\n\u003chr\u003e\n\u003cp\u003eWhat do you think about the current state of autonomous agent capabilities in Copilot Studio? Do you see this basic functionality as laying the groundwork for a more advanced, fully autonomous future?\u003c/p\u003e\n","date_modified":"2025-03-29T20:20:05+02:00","date_published":"2025-03-29T20:20:05+02:00","id":"https://bisser.io/exploring-autonomous-agent-capabilities-with-microsoft-copilot-studio/","image":"https://bisser.io/images/080-cover.webp","summary":"Examining how Microsoft Copilot Studio's preview release of autonomous agent capabilities lays a basic yet promising foundation—highlighting its core architecture, current functionalities, and future potential for automating enterprise workflows.","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Exploring Autonomous Agent Capabilities with Microsoft Copilot Studio","url":"https://bisser.io/exploring-autonomous-agent-capabilities-with-microsoft-copilot-studio/"},{"_markdown_url":"https://bisser.io/add-deep-reasoning-to-an-copilot-studio-agent/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"setup\"\u003eSetup\u003ca class=\"heading-anchor\" href=\"#setup\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eYou obviously need to create or already have an agent in Microsoft Copilot Studio. If you don\u0026rsquo;t have an agent already follow \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-copilot-studio/fundamentals-get-started?context=%2Fmicrosoft-365-copilot%2Fextensibility%2Fcontext\u0026amp;tabs=web\" rel=\"noopener\"\u003ethis tutorial\u003c/a\u003e\n to create a new custom engine agent in Copilot Studio.\u003c/p\u003e\n\u003cp\u003eAfter you have created an agent go to your settings page of the agent and then under \u0026ldquo;Generative AI\u0026rdquo; you can enable the checkmark on \u0026ldquo;Use deep reasoning models\u0026rdquo;:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/079-mcs-enable-deep-reasoning.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eWhen you now send a prompt to your agent you should see that the agent is using deep reasoning to generate the answer:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/079-mcs-deep-reasoning-test.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eWhat\u0026rsquo;s interesting is that you can also see what the agent does take into account when doing the reasoning:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/079-mcs-deep-reasoning-info.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eAs you can now also add your custom engine agents built with Copilot Studio to your Microsoft 365 Copilot you can use this method to add deep reasoning to Microsoft 365 Copilot:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/079-mcs-deep-reasoning-m365.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"considerations\"\u003eConsiderations\u003ca class=\"heading-anchor\" href=\"#considerations\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThis feature is currently in preview so be careful when to enable this (maybe not the best idea to use this for all production agents already). Another requirement is that your agent needs to be created in a US-based Power Platform environment and the agent\u0026rsquo;s language should be English, otherwise you\u0026rsquo;ll see the setting, but the agent will not use deep reasoning unfortunately.\u003c/p\u003e\n","date_modified":"2025-03-26T01:19:19+02:00","date_published":"2025-03-26T01:19:19+02:00","id":"https://bisser.io/add-deep-reasoning-to-an-copilot-studio-agent/","image":"https://bisser.io/images/079-cover.webp","summary":"Enabling deep reasoning on a Microsoft Copilot Studio agent and use it in Microsoft 365 Copilot","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Add deep reasoning to an Copilot Studio agent","url":"https://bisser.io/add-deep-reasoning-to-an-copilot-studio-agent/"},{"_markdown_url":"https://bisser.io/introducing-agent-instructor-a-vs-code-extension-for-managing-agent-instructions/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"agent-instructor\"\u003eAgent Instructor\u003ca class=\"heading-anchor\" href=\"#agent-instructor\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAgent Instructor is a powerful Visual Studio Code extension designed to help developers create, analyze, and refine instructions for declarative AI agents. This tool is essential for ensuring clarity and effectiveness in agent instructions, making it easier to build robust AI solutions.\u003c/p\u003e\n\u003ch3 id=\"key-features\"\u003eKey Features:\u003ca class=\"heading-anchor\" href=\"#key-features\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003e\u003cstrong\u003eAnalyze Instructions:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eClarity Score: Evaluates existing instructions and provides a clarity score (0-100).\u003c/li\u003e\n\u003cli\u003eAmbiguity Detection: Identifies ambiguous phrases and offers specific improvement suggestions.\u003c/li\u003e\n\u003cli\u003eOne-Click Corrections: Allows users to apply suggested improvements with a single click.\u003c/li\u003e\n\u003cli\u003eVisual Analysis: Displays analysis results with intuitive charts.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eGenerate Instructions:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eInteractive Input: Facilitates the creation of comprehensive instructions through interactive agent description input.\u003c/li\u003e\n\u003cli\u003eAI-Powered Generation: Automatically generates well-structured and formatted instructions.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"installation\"\u003eInstallation\u003ca class=\"heading-anchor\" href=\"#installation\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eHead over to the \u003ca href=\"https://marketplace.visualstudio.com/items?itemName=Stephan-Bisser.agent-instructor\" rel=\"noopener\"\u003eVS Code Marketplace\u003c/a\u003e\n to install the extension from there or search for \u0026ldquo;Agent Instructor\u0026rdquo; in the VS Code extension store. Feel free to leave feedback as I\u0026rsquo;m interested in your opinion!\u003c/p\u003e\n","date_modified":"2025-02-20T20:22:05+02:00","date_published":"2025-02-20T20:22:05+02:00","id":"https://bisser.io/introducing-agent-instructor-a-vs-code-extension-for-managing-agent-instructions/","image":"https://bisser.io/images/078-cover.webp","summary":"A powerful VS Code extension designed to help developers create, analyze, and refine instructions for declarative AI agents.","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Introducing Agent Instructor - A VS Code extension for managing agent instructions","url":"https://bisser.io/introducing-agent-instructor-a-vs-code-extension-for-managing-agent-instructions/"},{"_markdown_url":"https://bisser.io/copilot-for-microsoft-365-series-7-copilot-agent-building-options/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs of now, there are a lot of options for building agents for Microsoft 365 Copilot and related services. If you are a heavy SharePoint user you can build agents which are grounded into your SharePoint knowledge with only a few clicks right within the SharePoint UI. If you are a low code maker, you can use either the Copilot Agent Builder or Microsoft Copilot Studio to build declarative agents which can then be surfaced through the Microsoft 365 Copilot Chat UX or Microsoft Teams. And if you are a pro developer you can build either declarative agents using Teams Toolkit for Visual Studio Code or Visual Studio or you can build a custom engine agent using whatever tech stack you like. That may range from integration services such as the Teams AI Library to the Microsoft 365 Agents SDK to Azure AI Foundry or any other API you may want to consume.\u003c/p\u003e\n\u003cp\u003eAs there are many options for building agents, I tried to visualize all of them into one single infographic:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/077_Copilot_Agent_Building_Options.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs the infographic shows, you have a lot of options to choose from when it comes to building agents for Microsoft 365 Copilot.\nFeel free to use it for internal use in your presentations or documents. The only point I ask you to do is to credit me and link this article to your documents where you use it. Please do not sell this as your own 😉\u003c/p\u003e\n","date_modified":"2025-01-21T20:20:05+02:00","date_published":"2025-01-21T20:20:05+02:00","id":"https://bisser.io/copilot-for-microsoft-365-series-7-copilot-agent-building-options/","image":"https://bisser.io/images/077-cover.webp","summary":"A comparison infographic on the various options you have when building Microsoft 365 Copilot Agents, from no-code to low-code to pro-code.","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Copilot for Microsoft 365 Series - 7 - Copilot Agent Building Options","url":"https://bisser.io/copilot-for-microsoft-365-series-7-copilot-agent-building-options/"},{"_markdown_url":"https://bisser.io/copilot-for-microsoft-365-series-6-extensibility-options-wave-2-updates/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIn early 2024 I released the first version of the \u003ca href=\"https://bisser.io/copilot-for-microsoft-365-series-2-extensibility-options/\"\u003eMicrosoft 365 Copilot extensiblilty options guide\u003c/a\u003e\n. Since then a lot has changed, especially the fact that Microsoft announced a at Build the capability of not only building Connectors and Plugins, but also \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/overview-declarative-agent\" rel=\"noopener\"\u003eAgents\u003c/a\u003e\n. This path was further strengthened with the\u003ca href=\"https://www.youtube.com/watch?v=Gz0jPfCuvsM\" rel=\"noopener\"\u003e Microsoft 365 Copilot Wave 2 announcements\u003c/a\u003e\n in September 2024. Despite many other updates and announcements like Copilot Pages and others, the agentic capabilities within Copilot is one of the biggest updates which lets developers not only extend Copilot using plugins or connectors, but now you can build declarative agents which combine plugins and connectors into one single solution which can then be used either seperately or within the Microsoft 365 Copilot experiences.\u003c/p\u003e\n\u003cp\u003eAs there where many updates and changes, I modified the initial version of my decision guide, which can be found in the following infographic:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/076_Copilot_Extensibility_which_option_when_v2.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs the infographic shows, you have a lot of options to choose from when it comes to finding the suitable approach for extending Microsoft 365 Copilot. And when the Agent Builder functionality is rolled out, I will certainly add this to that infographic as well.\u003c/p\u003e\n\u003cp\u003eFeel free to use it for internal use in your presentations or documents. The only point I ask you to do is to credit me and link this article to your documents where you use it. Please do not sell this as your own 😉\u003c/p\u003e\n","date_modified":"2024-10-01T20:18:15+02:00","date_published":"2024-10-01T20:18:15+02:00","id":"https://bisser.io/copilot-for-microsoft-365-series-6-extensibility-options-wave-2-updates/","image":"https://bisser.io/images/076-cover.webp","summary":"Everything you need to know about the different ways of extending Copilot for Microsoft 365 including agents, plugins and connectors which have been announced/updated after the Copilot Wave 2 event.","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Copilot for Microsoft 365 Series - 6 - Extensibility options Wave 2 updates","url":"https://bisser.io/copilot-for-microsoft-365-series-6-extensibility-options-wave-2-updates/"},{"_markdown_url":"https://bisser.io/copilot-for-microsoft-365-series-5-hidden-prerequisites/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIn this post, we will delve into the hidden prerequisites and requirements for using Copilot for Microsoft 365. We aim to provide a comprehensive guide that will help you understand what you need to get started and ensure a smooth operation of Copilot within your Microsoft 365 environment. Let\u0026rsquo;s uncover these hidden prerequisites together.\u003c/p\u003e\n\u003ch2 id=\"copilot-requirements\"\u003eCopilot requirements\u003ca class=\"heading-anchor\" href=\"#copilot-requirements\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe requirements and prerequisites for Copilot for Microsoft 365 are very well documented \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-365-copilot/microsoft-365-copilot-requirements\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n. Of course I asked Copilot to generate a list of requirements, so here it is:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBase License: Users need a prerequisite base license, detailed in the service description guide.\u003c/li\u003e\n\u003cli\u003eMicrosoft 365 Apps: Deployment of Microsoft 365 Apps is necessary.\u003c/li\u003e\n\u003cli\u003eThird-party Cookies: For online versions of Word, Excel, and PowerPoint, third-party cookies must be enabled.\u003c/li\u003e\n\u003cli\u003ePrivacy Settings: Review Microsoft 365 Apps privacy settings as they affect Copilot features.\u003c/li\u003e\n\u003cli\u003eMicrosoft Entra ID: Users require Microsoft Entra ID accounts, which can be added or synced via the admin center.\u003c/li\u003e\n\u003cli\u003eOneDrive Account: Certain features like file restore need users to have a OneDrive account.\u003c/li\u003e\n\u003cli\u003eOutlook: Copilot works with the new Outlook in preview, and settings sync is required for integratio5.\u003c/li\u003e\n\u003cli\u003eTeams: Configuration of Teams settings is essential for Copilot functionality in Teams.\u003c/li\u003e\n\u003cli\u003eTeams Phone: For referencing meeting content, transcription or recording needs to be enabled.\u003c/li\u003e\n\u003cli\u003eMicrosoft Loop \u0026amp; Whiteboard: Enablement of Loop and Whiteboard for tenant use is required.\u003c/li\u003e\n\u003cli\u003eUpdate Channels: Copilot is supported in all update channels, except for Semi-Annual Enterprise Channel.\u003c/li\u003e\n\u003cli\u003eNetwork Connectivity: Aligning with Microsoft 365 network connectivity principles is recommended.\u003c/li\u003e\n\u003cli\u003eWebSocket Connections: Allow WebSocket connections for Copilot experiences that require them.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn terms of licensing, Copilot for Microsoft 365 is available as an add-on plan with one of the following licensing prerequisites:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMicrosoft 365 E5\u003c/li\u003e\n\u003cli\u003eMicrosoft 365 E3\u003c/li\u003e\n\u003cli\u003eOffice 365 E3\u003c/li\u003e\n\u003cli\u003eOffice 365 E5\u003c/li\u003e\n\u003cli\u003eMicrosoft 365 Business Standard\u003c/li\u003e\n\u003cli\u003eMicrosoft 365 Business Premium\u003c/li\u003e\n\u003cli\u003eMicrosoft 365 A5 for faculty\u003c/li\u003e\n\u003cli\u003eMicrosoft 365 A3 for faculty\u003c/li\u003e\n\u003cli\u003eOffice 365 A5 for faculty\nPlease note that these requirements are nearly identical to the requirements for using Microsoft 365 Apps due to the integration of Microsoft Copilot for Microsoft 365 and Microsoft 365 Apps.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cstrong\u003eBut the list of requirements was missing one crucial thing: Enablement of the Office Feature Updates task from the scheduled tasks on the Windows client. If the execution of the following 2 tasks is blocked, then Copilot will not work on the client and in the local versions of the Office apps:\u003c/strong\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003eOffice Feature Updates\u003c/strong\u003e\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003eOffice Feature Updates Logon\u003c/strong\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eMake sure to check out the \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-365-copilot/microsoft-365-copilot-requirements\" rel=\"noopener\"\u003eCopilot requirements\u003c/a\u003e\n from time to time to see if anything has changed. Shout-out to my colleague Gottfried Jocham, for detecting the need for the scheduled task.\u003c/p\u003e\n","date_modified":"2024-03-25T13:19:15+02:00","date_published":"2024-03-25T13:19:15+02:00","id":"https://bisser.io/copilot-for-microsoft-365-series-5-hidden-prerequisites/","image":"https://bisser.io/images/075-cover.webp","summary":"All Copilot for Microsoft 365 requirements at a glance","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Copilot for Microsoft 365 Series - 5 - Hidden prerequisites","url":"https://bisser.io/copilot-for-microsoft-365-series-5-hidden-prerequisites/"},{"_markdown_url":"https://bisser.io/copilot-for-microsoft-365-series-4-dall-e-3-sample-plugin/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eA while ago I created my first plugin for Copilot for Microsoft 365. Therefore, I would like to take the opportunity to share my experience and insights. You can find the working plugin sample in my \u003ca href=\"https://github.com/stephanbisser/Copilot-for-M365-Dall-E-Plugin\" rel=\"noopener\"\u003eGitHub repository\u003c/a\u003e\n.\u003c/p\u003e\n\u003ch2 id=\"the-setup\"\u003eThe setup\u003ca class=\"heading-anchor\" href=\"#the-setup\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eI used the \u003ca href=\"https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/teams-toolkit-fundamentals\" rel=\"noopener\"\u003eTeams Toolkit for Visual Studio Code\u003c/a\u003e\n to develop my plugin. You also need to make sure that you fulfill all the requirements mentioned \u003ca href=\"https://learn.microsoft.com/en-us/copilot-plugins/get-started#prerequisites\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n. Additionally, you need to deploy an Azure Open AI resource in your Azure subscription. Make sure sure to choose an Azure region which offers Dall-E models from the \u003ca href=\"https://learn.microsoft.com/en-us/azure/ai-services/openai/concepts/models#dall-e-models\" rel=\"noopener\"\u003elist of available regions\u003c/a\u003e\n, otherwise you cannot deploy a Dall-E model.\u003c/p\u003e\n\u003ch2 id=\"developing-the-plugin\"\u003eDeveloping the plugin\u003ca class=\"heading-anchor\" href=\"#developing-the-plugin\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWhen cloning my repo, make sure that you create a file called \u003ccode\u003e.localConfigs\u003c/code\u003e in the root of your plugin\u0026rsquo;s folder and add the following content to that file along with the correct values for those parameters:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eBOT_ID=\nBOT_PASSWORD=\nSECRET_AOAI_KEY=\nAOAI_ENDPOINT=\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThe next important part is your manifest. The manifest is crucial as Copilot uses it to determine what your plugin will do and how it can be used as well as when it should be triggered. Therefore, make sure to add meaningful descriptions to your app, your commands, and your parameters:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/074_manifest_sample.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eThen within the searchApp.ts you will need to call your Azure Open AI resource API to generate an image and retreive it:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-ts\" data-lang=\"ts\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kr\"\u003epublic\u003c/span\u003e \u003cspan class=\"kr\"\u003easync\u003c/span\u003e \u003cspan class=\"nx\"\u003ehandleTeamsMessagingExtensionQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003econtext\u003c/span\u003e: \u003cspan class=\"kt\"\u003eTurnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003equery\u003c/span\u003e: \u003cspan class=\"kt\"\u003eMessagingExtensionQuery\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"nx\"\u003ePromise\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"nt\"\u003eMessagingExtensionResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003esearchQuery\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eparameters\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003evalue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eattachments\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e[];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"c1\"\u003e//const apiKey = \u0026#34;\u0026#34;; // Insert your Azure Open AI API Key here\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e\u003c/span\u003e  \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eservice\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eDalleService\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eapiKey\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eendpoint\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003esearchQuery\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003equery\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003ecommandId\u003c/span\u003e \u003cspan class=\"p\"\u003e)\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s1\"\u003e\u0026#39;generateImage\u0026#39;\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Trying to generate image using Dall-E\u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"kd\"\u003elet\u003c/span\u003e \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"nx\"\u003eservice\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003emakeApiCall\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"nx\"\u003eACData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eTemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eimageCard\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003ecard\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003etemplate\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eexpand\u003c/span\u003e\u003cspan class=\"p\"\u003e({\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003e$root\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nx\"\u003eprompt\u003c/span\u003e: \u003cspan class=\"kt\"\u003eresponse.data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003erevised_prompt\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nx\"\u003eimageUrl\u003c/span\u003e: \u003cspan class=\"kt\"\u003eresponse.data\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003epreview\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"nx\"\u003eCardFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eheroCard\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003erevised_prompt\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Revised Prompt: \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003erevised_prompt\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003econsole\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003elog\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s1\"\u003e\u0026#39;Image URL: \u0026#39;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"nx\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003edata\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"mi\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"nx\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"kr\"\u003econst\u003c/span\u003e \u003cspan class=\"nx\"\u003eattachment\u003c/span\u003e \u003cspan class=\"o\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"p\"\u003e...\u003c/span\u003e\u003cspan class=\"nx\"\u003eCardFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003eadaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003ecard\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"nx\"\u003epreview\u003c/span\u003e \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nx\"\u003eattachments\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"nx\"\u003epush\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"nx\"\u003eattachment\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nx\"\u003ecomposeExtension\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"kr\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;result\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nx\"\u003eattachmentLayout\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nx\"\u003eattachments\u003c/span\u003e: \u003cspan class=\"kt\"\u003eattachments\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e};\u003c/span\u003e    \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"k\"\u003ebreak\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nx\"\u003ecomposeExtension\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kr\"\u003etype\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;result\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eattachmentLayout\u003c/span\u003e\u003cspan class=\"o\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;list\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nx\"\u003eattachments\u003c/span\u003e: \u003cspan class=\"kt\"\u003eattachments\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eTo send the image back to the user, simply use an Adaptive Card, which is used to render the image:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;$schema\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://adaptivecards.io/schemas/adaptive-card.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;AdaptiveCard\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.5\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;body\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${prompt}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;size\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Large\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${imageUrl}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;size\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Large\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ActionSet\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;actions\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                  \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Action.OpenUrl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                  \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Open Image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                  \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${imageUrl}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e              \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"nt\"\u003e\u0026#34;previewCard\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;contentType\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;application/vnd.microsoft.card.hero\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"nt\"\u003e\u0026#34;content\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${prompt}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e          \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${prompt}\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e      \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e  \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd tha\u0026rsquo;s it, you\u0026rsquo;ve built your first plugin. In VS Code you can now hit F5 and test it right within Copilot in Teams!\u003c/p\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003ePlugins play a crucial role in enhancing the Copilot ecosystem. They enable the expansion of Copilot’s inherent abilities and facilitate integration with your line-of-business applications or external platforms. Therefore, it’s important to tailor Copilot with plugins that suit your specific requirements and scenarios. However, it’s equally important to provide detailed and accurate descriptions for these plugins to ensure Copilot recognizes and utilizes them effectively.\u003c/p\u003e\n","date_modified":"2024-03-15T21:47:15+02:00","date_published":"2024-03-15T21:47:15+02:00","id":"https://bisser.io/copilot-for-microsoft-365-series-4-dall-e-3-sample-plugin/","image":"https://bisser.io/images/074-cover.webp","summary":"A short guidance on how to create a Copilot for Microsoft 365 plugin including a sample","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Copilot for Microsoft 365 Series - 4 - Dall-E 3 sample plugin","url":"https://bisser.io/copilot-for-microsoft-365-series-4-dall-e-3-sample-plugin/"},{"_markdown_url":"https://bisser.io/copilot-for-microsoft-365-series-3-technical-architecture/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIt\u0026rsquo;s a bit confusing how Copilot for Microsoft 365 actually works as there are a lot of components involved. Therefore, this short post should give you a glimpse on how the inner parts of Copilot work.\u003c/p\u003e\n\u003ch2 id=\"how-copilot-works\"\u003eHow Copilot works\u003ca class=\"heading-anchor\" href=\"#how-copilot-works\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs you can see in the infographic below, the Copilot system consists of multiple components:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCopilot Service\u003c/li\u003e\n\u003cli\u003eMicrosoft Graph\u003c/li\u003e\n\u003cli\u003eSemantic Index\u003c/li\u003e\n\u003cli\u003ePlugin catalog\u003c/li\u003e\n\u003cli\u003ePlugins\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe most important thing to understand, is that currently plugins are not available everywhere. At the moment you can use plugins here:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eCopilot (previously called \u0026ldquo;M365 Chat\u0026rdquo;)\n\u003cul\u003e\n\u003cli\u003eMicrosoft Teams\u003c/li\u003e\n\u003cli\u003eMicrosoft 365 Portal\u003c/li\u003e\n\u003cli\u003eEdge (Although here is only the \u0026ldquo;Web content\u0026rdquo; plugin available)\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn all other applications like Word, Excel, PowerPoint and so on, plugins are not yet available.\u003c/p\u003e\n\u003cp\u003eSo therefore, you can only use plugins where you have a more chat-based interface where Copilot assists you at the moment.\u003c/p\u003e\n\u003cp\u003eThe way Copilot plugins work is as follows:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eUser\u0026rsquo;s prompts in Microsoft 365 Apps are sent to Copilot\u003c/li\u003e\n\u003cli\u003eCopilot determines user’s intent to decide what actions should follow next\u003c/li\u003e\n\u003cli\u003eIf Microsoft 365 data is required, Copilot grounds prompt before forwarding to LLM \u0026amp; after receiving LLM response using Graph \u0026amp; Semantic Index\u003c/li\u003e\n\u003cli\u003eIf non-Microsoft 365 data is required, Copilot fetches available plugins \u0026amp; connectors to decide where to retrieve information from. If user’s intent is to take actions in a 3rd party system with a plugin available, Copilot uses plugin to execute plan\u003c/li\u003e\n\u003c/ol\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/073_copilot_technical_architecture.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eTherefore, it is vital that your plugin description as well as your command \u0026amp; parameter descriptions in your plugin\u0026rsquo;s manifest files are as precise as they can be. Only then Copilot knows which plugins to pick when and how to treat them accordingly so that user\u0026rsquo;s will benefit from your plugins.\u003c/p\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003ePlugins are an essential part of the whole Copilot ecosystem as they allow you to extend the skills Copilot has out of the box and connect it to your LOB apps or 3rd party platforms. So make sure to extend Copilot to fit your needs and use cases, but remember to be precise on plugin descriptions for Copilot to pick it up!\nFeel free to use the infographic for internal use in your presentations or documents. The only point I ask you to do is to credit me and link this article to your documents where you use it. Please do not sell this as your own 😉\u003c/p\u003e\n","date_modified":"2024-03-01T18:11:15+02:00","date_published":"2024-03-01T18:11:15+02:00","id":"https://bisser.io/copilot-for-microsoft-365-series-3-technical-architecture/","image":"https://bisser.io/images/073-cover.webp","summary":"Wondering how Copilot for Microsoft 365 is working technically? This post describes the technical architecure briefly","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Copilot for Microsoft 365 Series - 3 - Technical architecture","url":"https://bisser.io/copilot-for-microsoft-365-series-3-technical-architecture/"},{"_markdown_url":"https://bisser.io/copilot-for-microsoft-365-series-2-extensibility-options/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs I now used Copilot for Microsoft 365 quite some time and also worked in various Copilot introduction projects with customers, I found out, that the out-of-the-box experience, for me, wasn\u0026rsquo;t enough. Therefore I did a deep dive into the \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility\" rel=\"noopener\"\u003edocumentation\u003c/a\u003e\n on how to extend Copilot for Microsoft 365. In the docs, there is a \u003ca href=\"https://learn.microsoft.com/en-us/microsoft-365-copilot/extensibility/decision-guide\" rel=\"noopener\"\u003edecision guide\u003c/a\u003e\n which visualizes the ways of extending Copilot for Microsoft 365 and in general you have 2 options:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExtending the data source Copilot has access to\n\u003cul\u003e\n\u003cli\u003eThis basically is just about giving Copilot access to more than \u0026ldquo;just\u0026rdquo; Microsoft 365 data sources like SharePoint, OneDrive, Exchange, and so on but also including 3rd party data stores like other SaaS platforms, on premises data sources like file shares or data stored in Azure. But choosing this option does not mean, that Copilot can bidirectional communicate with those other data stores. This option is a one-way option which only allows data to flow into the Microsoft 365 index but not the other way around.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eExtending the Copilot functionality\n\u003cul\u003e\n\u003cli\u003eThis option lets you extend the features Copilot offers in various situations and it also allows you to integrate Copilot with other services (3rd party platforms, custom LOB apps and so on) in a way that it can retreive data from but also writes data into those services, in other words a bidirectional communication flow. So when choosing this option, you can allow users to communicate with other services outside of the Microsoft 365 ecosystem for instance through Copilot to retreive and ingest data.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eAnd for those two options you basically have muliple ways of implementing that kind of extensibility options. But in the decision guide, there was one thing missing which is essential when talking about Copilot extensibility: Copilot Studio. Therefore, I created a modified version of the decision guide,  which can be found in the following infographic:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/072_Copilot_Extensibility_which_option_when.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs the infographic shows, you have a lot of options to choose from when it comes to finding the suitable approach for extending Copilot for Microsoft. In the next blog post(s) we\u0026rsquo;ll take a look on how to deal with all those options in greater detail!\u003c/p\u003e\n\u003cp\u003eFeel free to use it for internal use in your presentations or documents. The only point I ask you to do is to credit me and link this article to your documents where you use it. Please do not sell this as your own 😉\u003c/p\u003e\n","date_modified":"2024-02-27T18:11:15+02:00","date_published":"2024-02-27T18:11:15+02:00","id":"https://bisser.io/copilot-for-microsoft-365-series-2-extensibility-options/","image":"https://bisser.io/images/072-cover.webp","summary":"Everything you need to know about the different ways of extending Copilot for Microsoft 365 including plugins and connectors.","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Copilot for Microsoft 365 Series - 2 - Extensibility options","url":"https://bisser.io/copilot-for-microsoft-365-series-2-extensibility-options/"},{"_markdown_url":"https://bisser.io/copilot-for-microsoft-365-series-1-the-different-flavours-of-copilot/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIt has been a while since I wrote my last blog post (more than half a year - time flies). I had a lot of things to do while I \u0026ldquo;paused\u0026rdquo; my blogging game, but now I wanted to start sharing some insights again. And this time about a topic which is everywhere and everything: Copilot. I\u0026rsquo;m using various Copilots for quite some time now and wanted to share my learnings I had while using it.\u003c/p\u003e\n\u003ch2 id=\"outline\"\u003eOutline\u003ca class=\"heading-anchor\" href=\"#outline\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eTo be precise: What I will share is my experience with Copilot. You might now think, which Copilot, right? I know there are a ton of Copilots out there. However, I will focus on Copilot, Copilot and Copilot 😉 But to make you understand better which Copilots, the following Infographic should help you understand which Copilots I\u0026rsquo;m using and for which Copilots you can expect to gain information throughout this blog series.\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/071_copilot_offering.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eLet me explain you the differences of those 3 briefly.\u003c/p\u003e\n\u003ch2 id=\"copilot\"\u003eCopilot\u003ca class=\"heading-anchor\" href=\"#copilot\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003e\u003ca href=\"https://bing.com/chat\" rel=\"noopener\"\u003eCopilot\u003c/a\u003e\n (or formerly know as \u0026ldquo;Bing Chat Enterprise\u0026rdquo;) is the equivalent to ChatGPT but baked into Bing and moreover, into Microsoft\u0026rsquo;s Edge browser. I use it quite some time now as it\u0026rsquo;s a great companion while browsing through websites and reading information as it provides concise summaries of websites within a few seconds. On top of that I used it as tool to brainstorm and generate ideas, but I replaced that use case now with something different (scroll down to see what I\u0026rsquo;m using now).\u003c/p\u003e\n\u003ch2 id=\"custom-copilot\"\u003eCustom Copilot\u003ca class=\"heading-anchor\" href=\"#custom-copilot\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWell, what a ride. For those of you who don\u0026rsquo;t know, to me Custom Copilot has quite some history. As I see it as a successor to not only Power Virtual Agents, but to all other related tech in Microsoft\u0026rsquo;s Conversational AI space, like Bot Framework SDK, Bot Framework Composer, Azure Bot Service and many more. Copilot studio nowadays lets you do two main things:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eExtend 1st party Copilots (like the \u003cem\u003e\u003ca href=\"https://adoption.microsoft.com/en-us/copilot/\" rel=\"noopener\"\u003eCopilot for Microsoft 365\u003c/a\u003e\n\u003c/em\u003e)\u003c/li\u003e\n\u003cli\u003eBuild custom Copilots (like a company HR copilot)\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eBut I personally am using custom copilots for years now and I have started building our very first internal copilot (or chatbot as it was called back in the days) in January 2020 using the Microsoft Bot Framework SDK and Azure Bot Service in addition to LUIS and QnA Maker. And this technology stack has evolved over time to include \u003ca href=\"https://aka.ms/bfcomposer\" rel=\"noopener\"\u003eBot Framework Composer\u003c/a\u003e\n, Power Virtual Agents as well as Azure Open AI.\u003c/p\u003e\n\u003cp\u003eI will definetely spend at least one blog post in this series going into greater detail when it comes to Copilot Studio.\u003c/p\u003e\n\u003ch2 id=\"copilot-for-microsoft-365\"\u003eCopilot for Microsoft 365\u003ca class=\"heading-anchor\" href=\"#copilot-for-microsoft-365\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eMicrosofot 365 Copilot or Copilot for Microsoft 365 which is the new name for it is now my personal copilot for quite some time actually as I had the chance to get it before GA on November 1st. So I played around with it and use it now an a daily basis. The use cases where Copilot comes in handy are different. But here is a list of use cases I personally think Copilot is a great tool:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eSupport me during the complete Meeting lifecycle\n\u003cul\u003e\n\u003cli\u003eHelp me draft notes, agenda, discussion points before a meeting\u003c/li\u003e\n\u003cli\u003eStay on track what has been discussed and agreed on during a meeting\u003c/li\u003e\n\u003cli\u003eWork on my action items and tasks after a meeting\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eSummarize long email conversations in Outlook\n\u003cul\u003e\n\u003cli\u003eEspecially when there is a lot of noise in my Outlook inbox, Copilot helps me stay up to date what the main points within an endless email back-and-forth are\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eBe creative\n\u003cul\u003e\n\u003cli\u003eThis is probably the most relevant part for me personally, as I now have a virtual assistant who joins me being creative whenever I need to. No matter if I need to create a new slide or a whole slide deck for a customer pitch or conference session or if I need to come up with something new in my work tasks - Copilot helps me make my creativity process more efficient and moreover, less time consuming. And if I don\u0026rsquo;t know if and how Copilot can support me work on a specific task, I just \u003cdel\u003eask\u003c/del\u003eprompt.\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs you can see I\u0026rsquo;ve got one or the other story and opinion to share so stay tuned to learn more about my journey with Copilot(s)! And as usual if you have questions or topics you want me to cover, just \u003cdel\u003eping\u003c/del\u003eprompt me.\u003c/p\u003e\n","date_modified":"2023-11-21T21:24:56+02:00","date_published":"2023-11-21T21:24:56+02:00","id":"https://bisser.io/copilot-for-microsoft-365-series-1-the-different-flavours-of-copilot/","image":"https://bisser.io/images/071-cover.webp","summary":"A fresh start of something new. I would like to take you on a journey about things I learnt while using Copilot for Microsoft 365","tags":["AI","Copilot","Generative AI","Gen AI"],"title":"Copilot for Microsoft 365 Series - 1 - The different flavours of Copilot","url":"https://bisser.io/copilot-for-microsoft-365-series-1-the-different-flavours-of-copilot/"},{"_markdown_url":"https://bisser.io/bot-framework-composer-series-5-proactive-messages/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIn this post I will show you how to extend Bot Framework Composer to support proactive messages. I will also show you how to use the extension to send proactive messages from a web application. The goal here is to use the feature of \u003ca href=\"https://learn.microsoft.com/en-us/azure/bot-service/bot-builder-howto-proactive-message?view=azure-bot-service-4.0\u0026amp;tabs=csharp\" rel=\"noopener\"\u003eproactive messages\u003c/a\u003e\n to send notifications to users in Microsoft Teams from a web application or API.\u003c/p\u003e\n\u003ch2 id=\"the-implementation\"\u003eThe implementation\u003ca class=\"heading-anchor\" href=\"#the-implementation\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWhat we need is basically any chatbot build with Bot Framework Composer. So you can either go ahead and create a new one (it doesn\u0026rsquo;t matter which template you choose) or you can use a bot which you already built using Composer. I will use the bot I created in the previous post in this series. You can find the code for the bot \u003ca href=\"https://bisser.io/bot-framework-composer-series-4-send-a-user-profile-card/\"\u003ehere\u003c/a\u003e\n.\u003c/p\u003e\n\u003cp\u003eThere are basically 3 things we need to do to extend Composer to support proactive messages:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eWe need to add an additional controller to the bot called NotifyController which will be used to manage and send the proactive messages\u003c/li\u003e\n\u003cli\u003eWe need at least one Adaptive Card to be used within the proactive message towards the user\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"notifycontroller\"\u003eNotifyController\u003ca class=\"heading-anchor\" href=\"#notifycontroller\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe NotifyController is the controller which will be used to send the proactive messages. It will be called from a web application or API to send the message. The controller will be added to the bot project and will be called from the web application or API. The controller will be called with a JSON payload which will contain the following information:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;botId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;28:botid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;userId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;29:userid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;conversationId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;19:conversationid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;cardName\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;oppCard.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe controller will then use the information from the JSON payload to send the message to the user. Therefore the controller to be added into the \u003cem\u003eControllers\u003c/em\u003e folder of the bot project will look like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Threading.Tasks\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.AspNetCore.Mvc\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Bot.Builder\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Bot.Builder.Integration.AspNet.Core\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Bot.Schema\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Extensions.Configuration\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Collections.Concurrent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Collections.Generic\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.IO\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Linq\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Net\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Text\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Threading\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Web\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Bot.Builder.Teams\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Bot.Connector\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Bot.Connector.Authentication\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Bot.Schema.Teams\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Extensions.Logging\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eNewtonsoft.Json\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eNewtonsoft.Json.Linq\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"nn\"\u003eErdwinDemo.Controllers\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003e    [Route(\u0026#34;api/notify\u0026#34;)]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003e    [ApiController]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eNotifyController\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eControllerBase\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"k\"\u003ereadonly\u003c/span\u003e \u003cspan class=\"n\"\u003eIBotFrameworkHttpAdapter\u003c/span\u003e \u003cspan class=\"n\"\u003e_adapter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"k\"\u003ereadonly\u003c/span\u003e \u003cspan class=\"n\"\u003eIBot\u003c/span\u003e \u003cspan class=\"n\"\u003e_bot\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003e_appId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003e_appSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003e_serviceUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003e_conversationId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003eNotifyController\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIBotFrameworkHttpAdapter\u003c/span\u003e \u003cspan class=\"n\"\u003eadapter\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIBot\u003c/span\u003e \u003cspan class=\"n\"\u003ebot\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIConfiguration\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e_adapter\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eadapter\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e_bot\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebot\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e_appId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;MicrosoftAppId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e \u003cspan class=\"c1\"\u003e// The Microsoft App Id of your Bot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e_appSecret\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;MicrosoftAppPassword\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e \u003cspan class=\"c1\"\u003e// The Microsoft App Password of your Bot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e_serviceUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;https://smba.trafficmanager.net/emea/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"na\"\u003e        [HttpPost]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eIActionResult\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003ePost\u003c/span\u003e\u003cspan class=\"p\"\u003e([\u003c/span\u003e\u003cspan class=\"n\"\u003eFromBody\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eMicrosoftAppCredentials\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTrustServiceUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_serviceUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eUri\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_serviceUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMicrosoftAppCredentials\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003e_appId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_appSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003edynamic\u003c/span\u003e \u003cspan class=\"n\"\u003ejson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eJsonConvert\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDeserializeObject\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ebot\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;botId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003euser\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;userId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e_conversationId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;conversationId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecardName\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejson\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;cardName\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eSendCardAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_conversationId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003euser\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebot\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecardName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eContentResult\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Notification received and send out: \u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003econtent\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e(),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;text/html\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eStatusCode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eHttpStatusCode\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOK\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e \u003cspan class=\"n\"\u003eCreateAdaptiveCardAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ecardName\u003c/span\u003e\u003cspan class=\"p\"\u003e){\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecardResourcePath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCombine\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Resources\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecardName\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCardJson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIO\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFile\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReadAllText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecardResourcePath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUTF8\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCardAttachment\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;application/vnd.microsoft.card.adaptive\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eJsonConvert\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDeserializeObject\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eadaptiveCardJson\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCardAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e \u003cspan class=\"n\"\u003eSendCardAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eConnectorClient\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003econversationId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003erecipientId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003efromId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ecardName\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eActivity\u003c/span\u003e \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eActivityTypes\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eattachments\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eActivity\u003c/span\u003e \u003cspan class=\"n\"\u003ereply\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAttachments\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eattachments\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAttachments\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eCreateAdaptiveCardAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecardName\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eChannels\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMsteams\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eServiceUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;https://smba.trafficmanager.net/emea/\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConversation\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConversationAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econversationId\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRecipient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003erecipientId\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efromId\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConversations\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSendToConversationAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003emessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"adaptive-cards\"\u003eAdaptive Cards\u003ca class=\"heading-anchor\" href=\"#adaptive-cards\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eAs you can see in the json payload we are handing over a property called \u003cem\u003ecardName\u003c/em\u003e, so we need to make sure to add this card to the bot project. The card will be added to the \u003cem\u003eResources\u003c/em\u003e folder of the bot project. The card will be called \u003cem\u003eoppCard.json\u003c/em\u003e and will look like this:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;AdaptiveCard\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;$schema\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://adaptivecards.io/schemas/adaptive-card.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.5\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;body\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;attention\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;bleed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;REMINDER!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;heading\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;weight\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Bolder\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;bleed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;spacing\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;None\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;https://someImage.png\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;spacing\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;None\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;horizontalAlignment\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Center\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Contoso Chatbot Project is soon due!\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;size\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Large\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;weight\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Bolder\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Status: Open\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;weight\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Bolder\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Est. Close Date: 2021-12-31\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;style\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;emphasis\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;spacing\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;None\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;bleed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;actions\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Action.Submit\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Show me all Contoso opps\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;data\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nt\"\u003e\u0026#34;msteams\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;messageBack\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;displayText\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Show me all Contoso opps\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Show me all Contoso opps\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf everything is in place you can use Postman or Curl to send the notification to the bot. The notification will look like this (remember to insert the correct values for botId, userId and conversationId):\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;botId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;28:botid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;userId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;29:userid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;conversationId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;19:conversationid\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;cardName\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;oppCard.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eIf everything is ok, then your bot should send out a new proactive message to the user which you set in the userId property. The message should look like this:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/070_message_demo.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIn this blog post we have seen how to create a proactive bot in Microsoft Teams. We have also seen how to create an Adaptive Card and how to send it out to the user. If you have any questions or comments, please let me know in the comments below.\u003c/p\u003e\n","date_modified":"2023-03-15T19:14:56+02:00","date_published":"2023-03-15T19:14:56+02:00","id":"https://bisser.io/bot-framework-composer-series-5-proactive-messages/","image":"https://bisser.io/images/070-cover.webp","summary":"The 5th post in this series covers how to extend Bot Framework Composer to support proactive messages","tags":["AI","Bot Framework","Teams Development"],"title":"Bot Framework Composer Series - 5 - Proactive Messages","url":"https://bisser.io/bot-framework-composer-series-5-proactive-messages/"},{"_markdown_url":"https://bisser.io/test-chatgpt-for-tutorial-writing/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eAs ChatGPT is currently everywhere, I wanted to test it out and see how it works. I also wanted to see if it can be used to write tutorials. So I decided to write this tutorial using ChatGPT. I will explain how I did it and what I think about it.\u003c/p\u003e\n\u003cp\u003eSo what I basically wanted to see is if it can write me a tutorial which lists all the steps I need to do to create a Teams bot. I also wanted to see if it can write the code for me. So I decided to use \u003ca href=\"https://github.com/pnp/generator-teams\" rel=\"noopener\"\u003eYo Teams\u003c/a\u003e\n as a starting point. Yo Teams is a Yeoman generator for creating Microsoft Teams apps. It can be used to create a new Teams app project with all the necessary files and configurations. It can also be used to create a new bot project with all the necessary files and configurations. So I thought it would be a good starting point for my tutorial.\u003c/p\u003e\n\u003ch2 id=\"the-input\"\u003eThe input\u003ca class=\"heading-anchor\" href=\"#the-input\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe instruction I gave to ChatGPT was the following: \u003cem\u003ewrite a step by step tutorial on building a chatbot using yo teams\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eAnd this was the outcome:\u003c/p\u003e\n\u003ch2 id=\"the-result\"\u003eThe result\u003ca class=\"heading-anchor\" href=\"#the-result\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eInstall Node.js and npm on your computer if you don\u0026rsquo;t have them already. Yo Teams is built on top of Yeoman, a scaffolding tool for web development projects that runs on Node.js.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eInstall Yo Teams globally by running the following command in your terminal:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm install -g yo @microsoft/generator-teams\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis will install Yo Teams and its dependencies on your system.\u003c/p\u003e\n\u003col start=\"3\"\u003e\n\u003cli\u003e\n\u003cp\u003eCreate a new directory for your project and navigate to it in your terminal.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eRun the Yo Teams generator by typing the following command:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eyo teams\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis will launch the Yo Teams wizard, which will guide you through the process of creating a new Teams project.\u003c/p\u003e\n\u003col start=\"5\"\u003e\n\u003cli\u003e\n\u003cp\u003eSelect the \u0026ldquo;Bot\u0026rdquo; option from the wizard menu. This will create a new bot project template with all the necessary files and configurations.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eFollow the prompts to enter your bot\u0026rsquo;s display name, description, and other details.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChoose the language you want to use for your bot. Yo Teams supports several popular programming languages, including TypeScript, JavaScript, and C#.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChoose the messaging extension option if you want to create a bot that can be used as a messaging extension within Teams. This allows users to interact with your bot in the context of a chat conversation.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eChoose the authentication option that best suits your needs. Yo Teams supports several authentication providers, including Azure Active Directory and Bot Framework Authentication.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOnce you have completed the prompts, Yo Teams will generate a new bot project for you with all the necessary files and configurations.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eOpen the project in your preferred code editor and navigate to the \u0026ldquo;bot.ts\u0026rdquo; file. This is where you will write the code for your bot.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eWrite your bot\u0026rsquo;s logic using the Bot Framework SDK. The Bot Framework SDK provides a set of libraries and tools for building bots that can interact with users through text messages, voice commands, and other channels.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eTest your bot locally by running the following command in your terminal:\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm start\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis will start your bot on your local machine, allowing you to test its functionality in a Teams conversation.\u003c/p\u003e\n\u003col start=\"14\"\u003e\n\u003cli\u003eOnce you are satisfied with your bot\u0026rsquo;s functionality, deploy it to the Teams platform using the following command:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enpm run build\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eThis will build your bot project and create a package that can be uploaded to the Teams App Store.\u003c/p\u003e\n\u003col start=\"15\"\u003e\n\u003cli\u003eUpload your bot package to the Teams App Store and make it available to your users.\nThat\u0026rsquo;s it! With these steps, you should now have a fully functional chatbot that can interact with users in Teams.\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"the-conclusion\"\u003eThe conclusion\u003ca class=\"heading-anchor\" href=\"#the-conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs you can see it got me a pretty solid tutorial even on the first attempt for a tool which is not that famous as others might be. The only real error I could detect was line number 8 where it should speak about the bot part as we are building a bot and not a messaging extension. But I think it is a pretty good result for a first attempt. I think it can be used to write tutorials and it can be used to write code. I think it is a good tool to have in your toolbox. I will definitely use it in the future.\u003c/p\u003e\n","date_modified":"2023-03-14T17:41:56+02:00","date_published":"2023-03-14T17:41:56+02:00","id":"https://bisser.io/test-chatgpt-for-tutorial-writing/","image":"https://bisser.io/images/069-cover.webp","summary":"Read this post to see how to use ChatGPT for supporting you in writing tech tutorials","tags":["AI","Bot Framework","Teams Development"],"title":"Test ChatGPT for tutorial writing","url":"https://bisser.io/test-chatgpt-for-tutorial-writing/"},{"_markdown_url":"https://bisser.io/bot-framework-power-virtual-agents-comparison/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eIn recent years, there has been a growing interest in chatbots and virtual agents as businesses seek to improve their customer service and automate their workflows. Microsoft, one of the leading tech companies in the world, offers two popular options for building chatbots and virtual agents: the Microsoft Bot Framework and Power Virtual Agents. In this article, we\u0026rsquo;ll compare and contrast the two options to help you decide which one is right for your needs.\u003c/p\u003e\n\u003ch2 id=\"overview-of-the-microsoft-bot-framework-and-power-virtual-agents\"\u003eOverview of the Microsoft Bot Framework and Power Virtual Agents\u003ca class=\"heading-anchor\" href=\"#overview-of-the-microsoft-bot-framework-and-power-virtual-agents\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe Microsoft Bot Framework is a platform that allows developers to create intelligent bots for a wide range of platforms, including web, mobile, and even voice assistants like Amazon Alexa and Google Assistant. The Bot Framework provides developers with a set of tools and SDKs that enable them to create bots that can understand natural language and carry out complex conversations with users.\u003c/p\u003e\n\u003cp\u003ePower Virtual Agents, on the other hand, is a no-code platform that allows business users to build chatbots and virtual agents without any programming knowledge. Power Virtual Agents offers a drag-and-drop interface that allows users to create and deploy chatbots quickly and easily.\u003c/p\u003e\n\u003ch2 id=\"ease-of-use\"\u003eEase of Use\u003ca class=\"heading-anchor\" href=\"#ease-of-use\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eOne of the key differences between the Bot Framework and Power Virtual Agents is their ease of use. While the Bot Framework provides developers with a robust set of tools for building chatbots, it requires programming skills and technical knowledge to use effectively. Developers need to have experience with programming languages like C# or JavaScript, as well as knowledge of machine learning and natural language processing.\u003c/p\u003e\n\u003cp\u003eIn contrast, Power Virtual Agents is designed to be used by business users with no coding experience. The platform provides a simple drag-and-drop interface that allows users to create chatbots and virtual agents using pre-built templates and workflows. This makes it much easier for non-technical users to build and deploy chatbots.\u003c/p\u003e\n\u003ch2 id=\"functionality\"\u003eFunctionality\u003ca class=\"heading-anchor\" href=\"#functionality\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWhen it comes to functionality, the Bot Framework offers more flexibility and customization options than Power Virtual Agents. With the Bot Framework, developers can build custom chatbots that can handle complex conversations and integrate with other services and platforms. The Bot Framework also provides access to Azure Cognitive Services, which includes powerful tools for natural language processing, speech recognition, and sentiment analysis.\u003c/p\u003e\n\u003cp\u003ePower Virtual Agents, on the other hand, is designed for simpler use cases and workflows. The platform provides pre-built templates and workflows that cover common use cases like customer service, IT support, and HR inquiries. While Power Virtual Agents can be customized to some extent, it doesn\u0026rsquo;t offer the same level of flexibility as the Bot Framework.\u003c/p\u003e\n\u003ch2 id=\"pricing\"\u003ePricing\u003ca class=\"heading-anchor\" href=\"#pricing\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eBoth the Bot Framework and Power Virtual Agents offer a range of pricing options, depending on your needs. The Bot Framework is available for free, but users need to pay for any Azure services they use, such as Azure Cognitive Services or Azure Bot Service. Pricing for these services can vary depending on usage.\u003c/p\u003e\n\u003cp\u003ePower Virtual Agents is also available for free, but users need to have a Microsoft 365 license to use the platform. This means that users will need to pay for a Microsoft 365 subscription, which can be expensive for larger organizations.\u003c/p\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIn conclusion, both the Microsoft Bot Framework and Power Virtual Agents have their strengths and weaknesses, depending on your needs. If you\u0026rsquo;re a developer with technical skills and need to build complex, customized chatbots, the Bot Framework is the better option. However, if you\u0026rsquo;re a business user without coding skills and need to build simple chatbots quickly, Power Virtual Agents is a great choice. Ultimately, the decision between the two platforms will depend on your specific needs and resources.\u003c/p\u003e\n","date_modified":"2022-09-12T10:34:56+02:00","date_published":"2022-09-12T10:34:56+02:00","id":"https://bisser.io/bot-framework-power-virtual-agents-comparison/","image":"https://bisser.io/images/068-cover.webp","summary":"This post covers the comparison between Bot Framework and Power Virtual Agents","tags":["AI","Bot Framework","Teams Development"],"title":"Bot Framework - Power Virtual Agents comparison","url":"https://bisser.io/bot-framework-power-virtual-agents-comparison/"},{"_markdown_url":"https://bisser.io/bot-framework-composer-series-4-send-a-user-profile-card/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eAs I was building some demo bots quite recently, I was also dealing a lot with including user profile information in a bot using the \u003ca href=\"https://developer.microsoft.com/en-us/graph\" rel=\"noopener\"\u003eMicrosoft Graph\u003c/a\u003e\n and \u003ca href=\"https://docs.microsoft.com/en-us/composer/\" rel=\"noopener\"\u003eBot Framework Composer\u003c/a\u003e\n!\u003c/p\u003e\n\u003ch2 id=\"build-the-dialog\"\u003eBuild the dialog\u003ca class=\"heading-anchor\" href=\"#build-the-dialog\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe first thing \u003cstrong\u003eyou\u003c/strong\u003e need to do after creating a new bot in Composer (doesn\u0026rsquo;t matter which template you choose), is to add a new trigger for the dialog. In this tutorial the dialog is called GetMyUserProfileDialog and will be used to get the necessary information from the Graph and display it using an Adaptive Card:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-dialog1.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eThe first action we need in this dialog is to make sure that the user is authenticated. Therefore, we will begin a new dialog called \u003cstrong\u003eOauthDialog\u003c/strong\u003e which will make sure to authenticate the user if the user is not already logged in:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-dialog2.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eWithin the OauthDialog, we simply use the action \u003cstrong\u003eOAuth login\u003c/strong\u003e which takes the connection name of the OAuth Connection Setting, which you need to configure on your Azure Bot (follow \u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-authentication?view=azure-bot-service-4.0\" rel=\"noopener\"\u003ethis tutorial\u003c/a\u003e\n to configure everything):\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-dialog3.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"install-and-use-the-microsoft-graph-package\"\u003eInstall and use the Microsoft Graph package\u003ca class=\"heading-anchor\" href=\"#install-and-use-the-microsoft-graph-package\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eNow that the authentication flow is set up, we can install a package from the package manager in Composer to ease the use of the Microsoft Graph. Simply install the \u003cstrong\u003eMicrosoft.Bot.Components.Graph\u003c/strong\u003e package as shown below:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-package1.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eThis will then add more actions to your list of available actions in Composer. Now we can use the action \u003cstrong\u003e\u0026ldquo;Microsoft Graph Get Signed-in User\u0026rsquo;s Profile\u0026rdquo;\u003c/strong\u003e which only takes the \u003cem\u003etoken\u003c/em\u003e as a parameter and you do not need to take care of the rest to connect to the Graph:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-package2.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eThe second thing we need for our profile card is the user\u0026rsquo;s profile picture. Again we take advantage of the Microsoft Graph package to retreive that, by using the \u003cstrong\u003e\u0026ldquo;Microsoft Graph - Get Profile Photo\u0026rdquo;\u003c/strong\u003e which takes the \u003cem\u003etoken\u003c/em\u003e and the \u003cem\u003euser ID\u003c/em\u003e as parameters and returns the user profile picture to be used later on:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-package3.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"create-the-adaptive-card-template\"\u003eCreate the Adaptive Card template\u003ca class=\"heading-anchor\" href=\"#create-the-adaptive-card-template\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eNow that we have all information we need, we can go ahead and create the Adaptive Card using the \u003ca href=\"https://adaptivecards.io/designer\" rel=\"noopener\"\u003eAdaptive Card Designer\u003c/a\u003e\n:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;AdaptiveCard\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;$schema\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://adaptivecards.io/schemas/adaptive-card.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.3\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;body\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;${user.profile.displayName}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;size\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Medium\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;weight\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Bolder\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ColumnSet\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;columns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Column\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;auto\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Image\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;url\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;data:image/png;base64,${user.photo}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;size\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Large\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;horizontalAlignment\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Center\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;horizontalAlignment\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Center\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Column\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;stretch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Given name: ${user.profile.givenName}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Surname: ${user.profile.surname}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Mail: ${user.profile.mail}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Jobtitle: ${user.profile.jobTitle}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Office: ${user.profile.officeLocation}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;msteams\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Full\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAfter the card design is ready, we can simply copy the JSON payload into the value of a new property called \u003cem\u003eturn.profileCard\u003c/em\u003e\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIMPORTANT: make sure to select {} object as a type\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-card1.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eNow the last thing we need is to send out the Adaptive Card using the \u003cem\u003eSend a response\u003c/em\u003e action with the card payload attached as an attachment:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-card2.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"test-the-bot\"\u003eTest the bot\u003ca class=\"heading-anchor\" href=\"#test-the-bot\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAfter you have started or deployed your bot (depending if you\u0026rsquo;re running a tunneling software on your machine or not), you should be able to test your bot in Microsoft Teams and after the bot will ask you to authenticate, you should see your profile details in a nice Adaptive Card:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/067-test1.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"summary\"\u003eSummary\u003ca class=\"heading-anchor\" href=\"#summary\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIt is quite easy to leverage the Microsoft Graph using Bot Framework Composer by simply adding the Microsoft Graph package to it. . If you haven\u0026rsquo;t check out the other parts of my Bot Framework Composer series \u003ca href=\"https://bisser.io/bot-framework-composer-series-1-use-adaptive-cards/\"\u003eUse Adaptive Cards \u003c/a\u003e\n, \u003ca href=\"https://bisser.io/bot-framework-composer-series-2-property-management/\"\u003eProperty management\u003c/a\u003e\n \u0026amp; \u003ca href=\"https://www.bisser.io/bot-framework-composer-series-3-teams-task-modules/\" rel=\"noopener\"\u003eTeams Task Modules\u003c/a\u003e\n\u003c/p\u003e\n","date_modified":"2022-03-25T10:34:56+02:00","date_published":"2022-03-25T10:34:56+02:00","id":"https://bisser.io/bot-framework-composer-series-4-send-a-user-profile-card/","image":"https://bisser.io/images/067-cover.webp","summary":"This post covers how to create a user profile card using Adaptive Cards and Bot Framwork Composer","tags":["AI","Bot Framework","Teams Development"],"title":"Bot Framework Composer Series - 4 - Send a user profile card","url":"https://bisser.io/bot-framework-composer-series-4-send-a-user-profile-card/"},{"_markdown_url":"https://bisser.io/bot-framework-composer-series-3-teams-task-modules/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eWhile there is the option to create a \u003ca href=\"https://docs.microsoft.com/en-us/microsoftteams/platform/task-modules-and-cards/what-are-task-modules\" rel=\"noopener\"\u003eMicrosoft Teams Task Module\u003c/a\u003e\n using code a already a while ago, you would exactly need to know how to properly use the various methods and actions in your bot project. Therefore, it\u0026rsquo;s now possible to build a task module using \u003ca href=\"https://docs.microsoft.com/en-us/composer/\" rel=\"noopener\"\u003eBot Framework Composer\u003c/a\u003e\n without writing (almost) any code!\u003c/p\u003e\n\u003cp\u003eAs I also had the opportunity to demo the things covered in this post on the PnP call earlier this year, you can also follow along by watching the tutorial here:\u003c/p\u003e\n\u003cdiv style=\"position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;\"\u003e\n      \u003ciframe allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen\" loading=\"eager\" referrerpolicy=\"strict-origin-when-cross-origin\" src=\"https://www.youtube-nocookie.com/embed/mgoCHlY0AX8?autoplay=0\u0026amp;controls=1\u0026amp;end=0\u0026amp;loop=0\u0026amp;mute=0\u0026amp;start=0\" style=\"position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;\" title=\"YouTube video\"\u003e\u003c/iframe\u003e\n    \u003c/div\u003e\n\n\u003ch2 id=\"installing-the-teams-package-in-composer\"\u003eInstalling the Teams package in Composer\u003ca class=\"heading-anchor\" href=\"#installing-the-teams-package-in-composer\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe first thing you need to do after creating a new bot in Composer (doesn\u0026rsquo;t matter which template you choose), is to add the Microsoft.Bot.Components.Teams package using the package manager:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/066-package-manager.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eNow that we have this package installed, you can see that another entry on the \u0026ldquo;Add action\u0026rdquo; menu appears called \u0026ldquo;Microsof Teams\u0026rdquo; which offers a variety of options to either work with messaging extensions, messages or task modules:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/066-teams-actions.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"trigger-the-task-module-with-a-card-button\"\u003eTrigger the task module with a card button\u003ca class=\"heading-anchor\" href=\"#trigger-the-task-module-with-a-card-button\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe next bit we need is something which should trigger our task module. In this case we\u0026rsquo;ll use a simple hero card which contains a button to trigger the task module. The hero card for this example looks like this and is part of the bot\u0026rsquo;s greeting trigger:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-md\" data-lang=\"md\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e[HeroCard\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    subTitle = If you want to order a pizza just click here:\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    buttons = ${[orderTaskModuleFetchButton()]}     \n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAs you might notice, this hero card refers to another function called \u003ccode\u003eorderTaskModuleFetchButton\u003c/code\u003e which we will need to define in the bot respones before we can continue. Therefore, we will need to add the following snippet to the bot responses common section:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-md\" data-lang=\"md\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# cardActionTemplate(title, text, type, value)\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e\u003c/span\u003e[CardAction\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Type = ${type}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Title = ${title}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Text = ${text}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    Value = ${value}\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e]\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e# orderTaskModuleFetchButton()\n\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"gh\"\u003e\u003c/span\u003e\u003cspan class=\"k\"\u003e-\u003c/span\u003e ${cardActionTemplate(\u0026#39;Order Pizza\u0026#39;, \u0026#39;OrderFetch\u0026#39;, \u0026#39;invoke\u0026#39;, json({type: \u0026#34;task/fetch\u0026#34;, buttonId: \u0026#34;OrderFetch\u0026#34;}))}\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"creating-a-new-teams-specific-trigger\"\u003eCreating a new Teams-specific trigger\u003ca class=\"heading-anchor\" href=\"#creating-a-new-teams-specific-trigger\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eSo when a user clicks that button in the hero card, the bot should execute the onTaskModuleFetch action to present the user with a task module. This can be achieved by adding a new trigger to the dialog of type Microsoft Teams and with the event \u0026ldquo;On task module fetch\u0026rdquo;:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/066-add-trigger.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eTo make sure that this trigger is only triggered when a user clicks the button defined in the hero card above, we need to add a condition to this trigger to check if the id of the button clicked is the id defined in our hero card:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-md\" data-lang=\"md\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e=turn.activity.value.data.buttonId == \u0026#34;OrderFetch\u0026#34;\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe in the trigger \u0026ldquo;On task module fetch\u0026rdquo; we need to add a new action of type \u0026ldquo;Send task module card response\u0026rdquo; to actually send a new Adaptive Card within a task module after clicking the button. Add a new attachment of type Adaptive Card with the following content to that action:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-json\" data-lang=\"json\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;$schema\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://adaptivecards.io/schemas/adaptive-card.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;AdaptiveCard\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.3\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;body\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Container\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;ColumnSet\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;columns\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Column\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;width\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;stretch\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;bleed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"nt\"\u003e\u0026#34;items\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                            \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Just select the type of pizza to order:\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                            \u003cspan class=\"nt\"\u003e\u0026#34;weight\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Bolder\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                            \u003cspan class=\"nt\"\u003e\u0026#34;size\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Medium\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                            \u003cspan class=\"nt\"\u003e\u0026#34;wrap\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"nt\"\u003e\u0026#34;bleed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;bleed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;bleed\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Input.ChoiceSet\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;choices\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Diavolo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Diavolo\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hawaii\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Hawaii\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Prosciutto\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Prosciutto\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Margherita\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Margherita\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Funghi\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Funghi\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Al tonno\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;value\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Al tonno\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;placeholder\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Select your favorite pizza\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;id\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;pizzaType\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;actions\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Action.Submit\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Order\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e]\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAnd don\u0026rsquo;t forget to give your action a title and set height and width as needed. Now when running the bot and starting a conversation in Teams, you should get the hero card as part of the greeting and when you click on the button, the bot should already send a new task module (remember starting NGROK beforehand):\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/066-task-module.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"handle-the-task-module-submit-action\"\u003eHandle the task module submit action\u003ca class=\"heading-anchor\" href=\"#handle-the-task-module-submit-action\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThe last missing piece is to handle the onTaskModuleSubmit action which gets executed whenever a user finishes the task module process (e.g.: in our demo it is ordering a pizza). Therefore we need to add another trigger of type \u0026ldquo;On task module submit\u0026rdquo; which can be found in the Microsoft Teams triggers:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/066-submit-trigger.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eWithin that trigger we add a new action \u0026ldquo;Send task module message respose\u0026rdquo; which will allow us to add a message to the already open task module. Within this message we can also refer to the data or information entered by the user in the task module using \u003ccode\u003e${turn.activity.value.data.yourProperty}\u003c/code\u003e like in this case we can refer to the pizza type chosen by the user in the task module:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/066-submit-response.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eAfter restarting the bot and switching back to Teams, you can now again trigger the execution of the task module and pick a pizza for ordering. When you click on order after selecting a pizza, you should see the message \u0026ldquo;Thank you for ordering a pizza [type]\u0026rdquo; as expected:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/066-demo.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"summary\"\u003eSummary\u003ca class=\"heading-anchor\" href=\"#summary\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs you can see, it is quite easy to build task modules for Teams using Bot Framework Composer. There is no real need to do this using code anymore, as you can do pretty much everything right from Composer. If you haven\u0026rsquo;t check out the other parts of my Bot Framework Composer series \u003ca href=\"https://bisser.io/bot-framework-composer-series-1-use-adaptive-cards/\"\u003eUse Adaptive Cards \u003c/a\u003e\n \u0026amp; \u003ca href=\"https://bisser.io/bot-framework-composer-series-2-property-management/\"\u003eProperty management\u003c/a\u003e\n\u003c/p\u003e\n","date_modified":"2021-07-15T10:34:56+02:00","date_published":"2021-07-15T10:34:56+02:00","id":"https://bisser.io/bot-framework-composer-series-3-teams-task-modules/","image":"https://bisser.io/images/066-cover.webp","summary":"This post covers how to create a Microsoft Teams Task Module using Bot Framework Composer","tags":["AI","Bot Framework"],"title":"Bot Framework Composer Series - 3 - Teams Task Modules","url":"https://bisser.io/bot-framework-composer-series-3-teams-task-modules/"},{"_markdown_url":"https://bisser.io/conversational-ai-updates-from-msbuild-2021/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"microsoft-bot-framework\"\u003eMicrosoft Bot Framework\u003ca class=\"heading-anchor\" href=\"#microsoft-bot-framework\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIn this section you\u0026rsquo;ll find the list of all updates related to the Microsoft Bot Framework (check out the official blog post on all the updates from \u003ca href=\"https://aka.ms/ConvAIBuild2021\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n):\u003c/p\u003e\n\u003ch3 id=\"bot-framework-composer\"\u003eBot Framework Composer\u003ca class=\"heading-anchor\" href=\"#bot-framework-composer\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cfigure\u003e\u003cimg src=\"/images/065-composer-intro.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cul\u003e\n\u003cli\u003eBot Framework Composer 2.0 is GA\n\u003cul\u003e\n\u003cli\u003eRemember, in \u003ca href=\"https://bisser.io/conversational-ai-updates-from-msbuild-2020/\"\u003emy blog post about Microsoft Build updates last year\u003c/a\u003e\n I reported, that Composer has been gone GA  . Now 1 year forward, we now get the next major version of Composer with lots of great feautures and updates\u003c/li\u003e\n\u003cli\u003eYou can either download the desktop app from \u003ca href=\"https://aka.ms/bf-composer-download-win\" rel=\"noopener\"\u003ehere for Windows\u003c/a\u003e\n, \u003ca href=\"https://aka.ms/bf-composer-download-mac\" rel=\"noopener\"\u003ehere for MacOS\u003c/a\u003e\n or \u003ca href=\"https://aka.ms/bf-composer-download-linux\" rel=\"noopener\"\u003ehere for Linux\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eBot Framework Composer 2.0 introduces new templates (both in C# \u0026amp; Node (Preview)):\n\u003cul\u003e\n\u003cli\u003eEmpty Bot\u003c/li\u003e\n\u003cli\u003eCore Bot with Language\u003c/li\u003e\n\u003cli\u003eCore Bot with QnA Maker\u003c/li\u003e\n\u003cli\u003eCore Assistant Bot\u003c/li\u003e\n\u003cli\u003eEnterprise Assistant Bot\u003c/li\u003e\n\u003cli\u003eEnterprise Calendar Bot\u003c/li\u003e\n\u003cli\u003eEnterprise People Bot\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/composer/how-to-manage-package\" rel=\"noopener\"\u003eBot Framework Components\u003c/a\u003e\n are now available as a package management solution in Composer:\n\u003cul\u003e\n\u003cli\u003eYou can now install reusable components built by \u003ca href=\"https://github.com/microsoft/botframework-components\" rel=\"noopener\"\u003eMicrosoft\u003c/a\u003e\n or the \u003ca href=\"https://github.com/BotBuilderCommunity\" rel=\"noopener\"\u003eBot Framework Community\u003c/a\u003e\n or you can even \u003ca href=\"https://docs.microsoft.com/en-us/composer/how-to-create-packages\" rel=\"noopener\"\u003ebuild your own reusable packages\u003c/a\u003e\n for your Bot Framework Composer based bots\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003ePublishing to Azure has been made easier\n\u003cul\u003e\n\u003cli\u003eThe \u003ca href=\"https://docs.microsoft.com/en-us/composer/how-to-provision-azure-resources\" rel=\"noopener\"\u003epublishing process\u003c/a\u003e\n of your Composer built bots is getting a lot easier with the release of the integrated resource provisioning and publishing:\u003c/li\u003e\n\u003cli\u003e\u003cfigure\u003e\u003cimg src=\"/images/065-composer-azure-publishing.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eNew interaction types like speech and cards available in Composer to ease the authoring of text \u0026amp; voice bots by having a rich authoring experience including \u003ca href=\"https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/speech-synthesis-markup?tabs=csharp\" rel=\"noopener\"\u003eSSML\u003c/a\u003e\n:\n\u003cul\u003e\n\u003cli\u003e\u003cfigure\u003e\u003cimg src=\"/images/065-composer-interaction-types.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eNew Adaptive Runtime for all Bot Framework bots (Composer \u0026amp; SDK) which encapsulates many capabilities like multilingual support or access to Cognitive Services available\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://powervirtualagents.microsoft.com/en-us/blog/power-virtual-agents-integration-with-bot-framework-composer-is-now-generally-available-2/\" rel=\"noopener\"\u003ePower Virtual Agent integration in Bot Framework Composer\u003c/a\u003e\n is now GA\u003c/li\u003e\n\u003cli\u003eConsuming and developing skills in Composer has been improved and simplified\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"conversational-ai-platform\"\u003eConversational AI Platform\u003ca class=\"heading-anchor\" href=\"#conversational-ai-platform\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/composer/concept-orchestrator\" rel=\"noopener\"\u003eOrchestrator\u003c/a\u003e\n deplaces Bot Framework Dispatch as a dispatching solution\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/composer/design/conversational-user-experience-design\" rel=\"noopener\"\u003eConversational User Experience Guide\u003c/a\u003e\n has been released with lots of useful information on how to build a good CUX\n\u003cul\u003e\n\u003cli\u003e\u003cfigure\u003e\u003cimg src=\"/images/065-cux.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"azure-bot-service\"\u003eAzure Bot Service\u003ca class=\"heading-anchor\" href=\"#azure-bot-service\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003eAzure Bot Service \u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-service-channel-connect-telephony?view=azure-bot-service-4.0\" rel=\"noopener\"\u003eTelephony Channel\u003c/a\u003e\n in preview\u003c/li\u003e\n\u003cli\u003eAzure Monitor support in Azure Bot Service\u003c/li\u003e\n\u003cli\u003eCustomer Managed Encryption Keys available in Azure Bot Service\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"azure-cognitive-services\"\u003eAzure Cognitive Services\u003ca class=\"heading-anchor\" href=\"#azure-cognitive-services\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003ch3 id=\"translation\"\u003eTranslation\u003ca class=\"heading-anchor\" href=\"#translation\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://techcommunity.microsoft.com/t5/azure-ai/translator-announces-general-availability-of-document/ba-p/2382171\" rel=\"noopener\"\u003eTranslator announces general availability of Document Translation\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"conversational-ai-sessions-from-build\"\u003eConversational AI sessions from Build\u003ca class=\"heading-anchor\" href=\"#conversational-ai-sessions-from-build\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://mybuild.microsoft.com/sessions/2ba55238-d398-46f9-9ff2-eafcd9d69df3?source=sessions\" rel=\"noopener\"\u003eBuild intelligent applications infused with world-class AI\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mybuild.microsoft.com/sessions/edc5aef9-dec8-40d4-b704-028117f6350b?source=sessions\" rel=\"noopener\"\u003eAsk the Experts: Build intelligent applications infused with world-class AI\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mybuild.microsoft.com/sessions/13222b6b-0429-4cfd-ba76-4ed06e8a9f05?source=sessions\" rel=\"noopener\"\u003eExtend your Power Virtual Agents with Bot Framework Composer\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n","date_modified":"2021-05-26T10:34:56+02:00","date_published":"2021-05-26T10:34:56+02:00","id":"https://bisser.io/conversational-ai-updates-from-msbuild-2021/","image":"https://bisser.io/images/065-cover.webp","summary":"This post covers all the great announcements from this years Microsoft Build conference 2021","tags":["AI","Bot Framework"],"title":"Conversational AI updates from MSBuild 2021","url":"https://bisser.io/conversational-ai-updates-from-msbuild-2021/"},{"_markdown_url":"https://bisser.io/bot-framework-composer-series-2-property-management/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003cp\u003eThis is the second part of my Bot Framework Composer blog series. If you want to know more about Adaptive Cards in Composer, take a look at the \u003ca href=\"https://bisser.io/bot-framework-composer-series-1-use-adaptive-cards/\"\u003efirst part\u003c/a\u003e\n\u003c/p\u003e\n\u003ch2 id=\"introduction\"\u003eIntroduction\u003ca class=\"heading-anchor\" href=\"#introduction\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWhile building chatbots using \u003ca href=\"https://github.com/microsoft/BotFramework-Composer\" rel=\"noopener\"\u003eBot Framework Composer\u003c/a\u003e\n I often encoutered the problem that I needed to store properties and use them within my dialogs for different purposes. Within the Bot Framework SDK, I would most probably use the \u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-state?view=azure-bot-service-4.0\" rel=\"noopener\"\u003estate\u003c/a\u003e\n to store information which is not only valuable within a single dialog or turn, but for the whole conversation. The equivalent of the state in Composer is called \u0026ldquo;memory\u0026rdquo; which can be described as the bot\u0026rsquo;s mind or brain.\u003c/p\u003e\n\u003cp\u003eBut unlike within the SDK, the concept of storing properties is a bit different from the state approach, where you basically have user and conversation state. Therefore, this post will give you an overview on how to manage your properties accordingly within your Composer based chatbot.\u003c/p\u003e\n\u003ch2 id=\"property-scopes\"\u003eProperty scopes\u003ca class=\"heading-anchor\" href=\"#property-scopes\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eWithin Composer there are four different property scopes:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003euser\u003c/li\u003e\n\u003cli\u003econversation\u003c/li\u003e\n\u003cli\u003edialog\u003c/li\u003e\n\u003cli\u003eturn\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIn Composer, property names are always in the format \u0026ldquo;scope.name\u0026rdquo; (e.g.: user.firstName). Therefore, the scope of the property is actually part of the property\u0026rsquo;s name. When setting a new property you\u0026rsquo;ll need to make sure that you choose the correct scope, otherwise you might end up using a property which can\u0026rsquo;t be used in the current context. This can happen if you create a property \u0026ldquo;turn.choiceResult\u0026rdquo; in one dialog which you want to access in another dialog. As the scope of this property is turn, the value can\u0026rsquo;t be accessed outside of this particular turn. Therefore you would need to use another scope for your property to fulfill your use case. All of these scopes have a different property lifetime, which are described below\u0026hellip;\u003c/p\u003e\n\u003ch3 id=\"user\"\u003euser\u003ca class=\"heading-anchor\" href=\"#user\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe user scope is tied to the user. This is why properties in the user scope are stored indefinetly for a specific user. Use this scope if you want to store user information such as the following within your bot:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGeneral information such as name, birthday, age, \u0026hellip;\u003c/li\u003e\n\u003cli\u003eLocation information such as address, street, postal code, country, \u0026hellip;\u003c/li\u003e\n\u003cli\u003eContact informaiton  such as email address, telephone number, \u0026hellip;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eTo create a new property using the \u003cstrong\u003euser scope\u003c/strong\u003e, simply name your property \u003ccode\u003euser.propertyName\u003c/code\u003e (e.g.: user.name or user.age).\u003c/p\u003e\n\u003ch3 id=\"conversation\"\u003econversation\u003ca class=\"heading-anchor\" href=\"#conversation\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eIn contrast to the user scope, the conversation scope is tied to one specific conversation (identified through the conversationID). Like the user scope, the properties in the conversation scope are kept forever, however they could be accessed by multiple users within the same conversation. Examples use cases for using the conversation scope may be:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eGeneral information about the conversation (e.g.: conversation language)\u003c/li\u003e\n\u003cli\u003eCurrent topic of the conversation\u003c/li\u003e\n\u003cli\u003eWether the bot already asked a specific question within the conversation\u003c/li\u003e\n\u003cli\u003ePoll responses given by users within a specific conversation\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eIf you want to create a new conversation-scoped property just use \u003ccode\u003econversation.propertyName\u003c/code\u003e as the property\u0026rsquo;s name (e.g.: conversation.topic).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNOTE:\u003c/strong\u003e The conversation scope is not always only bound to one specific user only. For instance, when your bot is used in a Microsoft Teams team or group conversation, multiple users are part of the same conversation and therefore share the same conversationID. So please use this scope accordingly.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch3 id=\"dialog\"\u003edialog\u003ca class=\"heading-anchor\" href=\"#dialog\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe dialog scope, as the name already suggests, is bound to the active dialog and all parent or child dialogs of the active one. Therefore, the properties in that scope are accessible until the last active dialog in that dialog stack ends (look at \u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-concept-dialog?view=azure-bot-service-4.0\" rel=\"noopener\"\u003ethis doc\u003c/a\u003e\n for more information on how dialogs work). The following examples make perfect sense, when used in the dialog scope:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAnswers to prompts within a given dialog which are used in further turns\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"turn\"\u003eturn\u003ca class=\"heading-anchor\" href=\"#turn\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe turn scope is bound to one specific turn within the conversation. A turn is basically described as handling one specific message from the user, therefore this scope is the one with the lowest lifetime as these kind properties are only retained until the bot has successfully handled the user\u0026rsquo;s message. Thus, turn-scoped properties are often used to cache certain values before persisting them into other scopes, like dialog or user. Three out of the box property within \u003cstrong\u003eturn scope\u003c/strong\u003e, however, are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eturn.activity.text holds the user message within the current turn\u003c/li\u003e\n\u003cli\u003eturn.activity.type holds the activity type of the current turn (e.g.: message, conversationUpdate, typing, endOfConversation, messageReaction, \u0026hellip;)\u003c/li\u003e\n\u003cli\u003eturn.activity.locale holds the locale of the locale of the turn.activity.text property (e.g.: en-us, de-de, \u0026hellip;)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"summary\"\u003eSummary\u003ca class=\"heading-anchor\" href=\"#summary\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eProperties are an essential part within Bot Framework Composer. They are an easy way to share information across the whole conversation and therefore minimize the effort to implement a bot. However, you should always pick the scope accordingly to prevent, that properties are shared between users if they shouldn\u0026rsquo;t or even worse, properties are in a scope which do not provide the needed property lifetime (e.g. turn scope) 🤖\u003c/p\u003e\n","date_modified":"2020-08-23T19:52:51+02:00","date_published":"2020-08-23T19:52:51+02:00","id":"https://bisser.io/bot-framework-composer-series-2-property-management/","image":"https://bisser.io/images/064_cover.png","summary":"While building chatbots using Bot Framework Composer I often encoutered the problem that I needed to store properties and use them within my dialogs for different purposes. Within the Bot Framework SDK, I would most probably use the state to store information which is not only valuable within a single dialog or turn, but for the whole conversation. The equivalent of the state in Composer is called \"memory\" which can be described as the bot's mind or brain.","tags":["AI","Bot Framework"],"title":"Bot Framework Composer Series - 2 - Property management","url":"https://bisser.io/bot-framework-composer-series-2-property-management/"},{"_markdown_url":"https://bisser.io/visual-studio-code-extensions-for-bot-framework-devs/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"motivation\"\u003eMotivation\u003ca class=\"heading-anchor\" href=\"#motivation\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs a Bot Framework enthusiast, I was looking for ways how to speed up routines in my daily tasks. Therefore I decided to publish some nice little helpers together with my friends from the \u003ca href=\"https://github.com/BotBuilderCommunity\" rel=\"noopener\"\u003eBot Framework Community\u003c/a\u003e\n to speed up tasks when working on a bot a bit. And this is what we currently published:\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAll Visual Studio Code snippets can be downloaded from \u003ca href=\"http://bit.ly/bfcvscode\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n.\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003eAll Visual Studio Code commands can be downloaded from \u003ca href=\"http://bit.ly/bfcvscodecommands\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n.\u003c/strong\u003e\u003c/p\u003e\n\u003ch2 id=\"snippets\"\u003eSnippets\u003ca class=\"heading-anchor\" href=\"#snippets\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eCurrently we have snippets available for the following categories:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eBot Framework Web Chat\u003c/li\u003e\n\u003cli\u003eLUIS (.lu) files\u003c/li\u003e\n\u003cli\u003eAdaptive Cards\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"create-a-basic-web-chat-html-file-structure---bf-wc-create-basic-hml\"\u003eCreate a basic Web Chat HTML file structure - bf-wc-create-basic-hml\u003ca class=\"heading-anchor\" href=\"#create-a-basic-web-chat-html-file-structure---bf-wc-create-basic-hml\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe snippet \u003ccode\u003ebf-wc-create-basic-hml\u003c/code\u003e creates a basic plain html/js web chat within an HTML file:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"https://raw.githubusercontent.com/BotBuilderCommunity/botbuilder-community-tools/master/bfc-vscode-snippets/assets/bfc-webchat-basic-snippet-demo.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch3 id=\"create-a-web-chat-html-file-structure-with-advanced-styling---bf-wc-create-style-html\"\u003eCreate a Web Chat HTML file structure with advanced styling - bf-wc-create-style-html\u003ca class=\"heading-anchor\" href=\"#create-a-web-chat-html-file-structure-with-advanced-styling---bf-wc-create-style-html\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe snippet \u003ccode\u003ebf-wc-create-style-html\u003c/code\u003e creates a plain html/js web chat within an HTML file including some styling options already added to the web chat:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"https://raw.githubusercontent.com/BotBuilderCommunity/botbuilder-community-tools/master/bfc-vscode-snippets/assets/bfc-webchat-styling-snippet-demo.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch3 id=\"create-a-sample-language-understanding-lu-file---bfc-lu-create\"\u003eCreate a sample Language Understanding (.lu) file - bfc-lu-create\u003ca class=\"heading-anchor\" href=\"#create-a-sample-language-understanding-lu-file---bfc-lu-create\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe snippet \u003ccode\u003ebfc-lu-create\u003c/code\u003e creates a the required structure within .lu files used for managing LUIS applications:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"https://raw.githubusercontent.com/BotBuilderCommunity/botbuilder-community-tools/master/bfc-vscode-snippets/assets/bfc-lu-snippet-demo.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch3 id=\"create-a-sample-adaptive-card-activity-update---bf-ac-activityupdate\"\u003eCreate a sample Adaptive Card \u0026ldquo;Activity Update\u0026rdquo; - bf-ac-activityUpdate\u003ca class=\"heading-anchor\" href=\"#create-a-sample-adaptive-card-activity-update---bf-ac-activityupdate\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eAdds a \u003ca href=\"https://adaptivecards.io/samples/ActivityUpdate.html\" rel=\"noopener\"\u003eactivity update sample card\u003c/a\u003e\n to your project.\u003c/p\u003e\n\u003ch3 id=\"create-a-sample-adaptive-card-input-form---bf-ac-inputform\"\u003eCreate a sample Adaptive Card \u0026ldquo;Input Form\u0026rdquo; - bf-ac-inputForm\u003ca class=\"heading-anchor\" href=\"#create-a-sample-adaptive-card-input-form---bf-ac-inputform\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eInitializes a new \u003ca href=\"https://adaptivecards.io/samples/InputForm.html\" rel=\"noopener\"\u003einput form sample card\u003c/a\u003e\n to be used to gather input from users.\u003c/p\u003e\n\u003ch3 id=\"create-a-sample-adaptive-card-weather-compact---bf-ac-weathercompact\"\u003eCreate a sample Adaptive Card \u0026ldquo;Weather Compact\u0026rdquo; - bf-ac-weatherCompact\u003ca class=\"heading-anchor\" href=\"#create-a-sample-adaptive-card-weather-compact---bf-ac-weathercompact\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eCreates the \u003ca href=\"https://adaptivecards.io/samples/WeatherCompact.html\" rel=\"noopener\"\u003eweather compact sample card\u003c/a\u003e\n to demo a weather card.\u003c/p\u003e\n\u003ch3 id=\"create-a-sample-adaptive-card-expense-report---bf-ac-expensereport\"\u003eCreate a sample Adaptive Card \u0026ldquo;Expense Report\u0026rdquo; - bf-ac-expenseReport\u003ca class=\"heading-anchor\" href=\"#create-a-sample-adaptive-card-expense-report---bf-ac-expensereport\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eProvides you with the \u003ca href=\"https://adaptivecards.io/samples/ExpenseReport.html\" rel=\"noopener\"\u003eexpense report sample card\u003c/a\u003e\n to include in your bot\u0026rsquo;s project.\u003c/p\u003e\n\u003ch2 id=\"commands\"\u003eCommands\u003ca class=\"heading-anchor\" href=\"#commands\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAt the moment we published one command which lets you import a new LUIS app usign the \u003ca href=\"https://github.com/microsoft/botframework-cli\" rel=\"noopener\"\u003eBot Framework CLI\u003c/a\u003e\n from a .lu file (which you could create with our snippets) to make the LUIS deployment process far easier. It can be done like this:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"https://raw.githubusercontent.com/BotBuilderCommunity/botbuilder-community-tools/master/bfc-vscode-commands/assets/importLuisApp.gif\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eAll you need to do is to create a .lu file and populate it and then right-click it from the explorer view and select \u003cstrong\u003eImport LUIS application\u003c/strong\u003e fill out the details and the command will create a new LUIS application for you!\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eIf you have any ideas or feeback, please feel free to share it \u003ca href=\"https://github.com/BotBuilderCommunity/botbuilder-community-tools\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n or do a PR 😎\u003c/p\u003e\n\u003c/blockquote\u003e\n","date_modified":"2020-07-27T20:34:56+02:00","date_published":"2020-07-27T20:34:56+02:00","id":"https://bisser.io/visual-studio-code-extensions-for-bot-framework-devs/","image":"https://bisser.io/images/063-cover.webp","summary":"As a Bot Framework enthusiast, I was looking for ways how to speed up routines in my daily tasks. Therefore I decided to publish some nice little helpers together with my friends from the Bot Framework Community to speed up tasks when working on a bot a bit while working with VS Code.","tags":["AI","Bot Framework"],"title":"Visual Studio Code extensions for Bot Framework devs","url":"https://bisser.io/visual-studio-code-extensions-for-bot-framework-devs/"},{"_markdown_url":"https://bisser.io/conversational-ai-updates-from-msbuild-2020/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"microsoft-bot-framework\"\u003eMicrosoft Bot Framework\u003ca class=\"heading-anchor\" href=\"#microsoft-bot-framework\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eIn this section you\u0026rsquo;ll find the list of all updates related to the Microsoft Bot Framework (check out the official blog post on all the updates from \u003ca href=\"https://techcommunity.microsoft.com/t5/azure-ai/build-2020-conversational-ai-updates/ba-p/1397685\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n):\u003c/p\u003e\n\u003ch3 id=\"bot-framework-composer\"\u003eBot Framework Composer\u003ca class=\"heading-anchor\" href=\"#bot-framework-composer\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cfigure\u003e\u003cimg src=\"/images/062-composer-intro.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cul\u003e\n\u003cli\u003eBot Framework Composer is GA\n\u003cul\u003e\n\u003cli\u003eYou can either download the desktop app from \u003ca href=\"https://aka.ms/bf-composer-download-win\" rel=\"noopener\"\u003ehere for Windows\u003c/a\u003e\n, \u003ca href=\"https://aka.ms/bf-composer-download-mac\" rel=\"noopener\"\u003ehere for MacOS\u003c/a\u003e\n or \u003ca href=\"https://aka.ms/bf-composer-download-linux\" rel=\"noopener\"\u003ehere for Linux\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eIf you want to run Composer locally as a web-based component, you can download and build Composer from Github following \u003ca href=\"https://github.com/microsoft/BotFramework-Composer\" rel=\"noopener\"\u003ethis link\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eBot Framework Composer Docs are \u003ca href=\"https://aka.ms/bfcomposer\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003eBot Framework Composer allows to build and export \u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/skills-conceptual?view=azure-bot-service-4.0\" rel=\"noopener\"\u003eBot Framework Skills\u003c/a\u003e\n or  you can also export the Bot Framework Composer assets (lg, lu, settings and dialog files) which you can then plug into other bots:\u003c/li\u003e\n\u003c/ul\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/062-composer_export.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch3 id=\"bot-framework-sdk\"\u003eBot Framework SDK\u003ca class=\"heading-anchor\" href=\"#bot-framework-sdk\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003eBot Framework SDK v4.9 released - Release notes can be found \u003ca href=\"https://github.com/microsoft/botframework-sdk/issues/5836\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n with a ton of updates:\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-adaptive-dialog-introduction?view=azure-bot-service-4.0\" rel=\"noopener\"\u003eAdaptive Dialogs\u003c/a\u003e\n are GA\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/skills-conceptual?view=azure-bot-service-4.0\" rel=\"noopener\"\u003eSkills\u003c/a\u003e\n support Adaptive Dialogs and have improved support for SSO and OAuth\u003c/li\u003e\n\u003cli\u003eImprovements around Microsoft Teams specific funtionality including previews for the Java SDK as well as the developer preview of SSO capabilities in Microsoft Teams\u003c/li\u003e\n\u003cli\u003eBot Telemtry improvments including the ability to map dialogs into Azure Application Insights Page View Events\u003c/li\u003e\n\u003cli\u003eHealth Check APIs available to see if a bot is still running\u003c/li\u003e\n\u003cli\u003eCLI tools for Adaptive Dialogs available \u003ca href=\"https://github.com/Microsoft/botframework-cli\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/composer/concept-language-generation\" rel=\"noopener\"\u003eLanguage Generation\u003c/a\u003e\n is now GA in C# and JS SDKs\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://aka.ms/adaptive-expressions\" rel=\"noopener\"\u003eAdaptive Expressions\u003c/a\u003e\n is now GA in C# and JS SDKs\u003c/li\u003e\n\u003cli\u003eAuthentication improvments for bots and skills are now available to be used like support for certificate based authentication\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/microsoft/BotBuilder-Samples/tree/master/experimental/generation\" rel=\"noopener\"\u003eGenerated Dialogs\u003c/a\u003e\n is in early preview stage\u003c/li\u003e\n\u003cli\u003e[Bot Framework Adaptive Tool](Bot Framework Adaptive Tool) is in preview\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"azure-bot-service\"\u003eAzure Bot Service\u003ca class=\"heading-anchor\" href=\"#azure-bot-service\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://aka.ms/bf-directline-ase\" rel=\"noopener\"\u003eDirect Line App Service Extension\u003c/a\u003e\n is now GA\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-service-design-pattern-handoff-human?view=azure-bot-service-4.0\" rel=\"noopener\"\u003eHuman Handoff capabilities\u003c/a\u003e\n have been improved\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/azure/bot-service/bot-service-channel-connect-alexa?view=azure-bot-service-4.0\" rel=\"noopener\"\u003eAlexa channel\u003c/a\u003e\n has been added natively into the Azure Bot Service (Kudos to \u003ca href=\"https://twitter.com/GaryPretty\" rel=\"noopener\"\u003eGary Pretty\u003c/a\u003e\n for doing that👍)\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"virtual-assistant\"\u003eVirtual Assistant\u003ca class=\"heading-anchor\" href=\"#virtual-assistant\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://aka.ms/VirtualAssistant\" rel=\"noopener\"\u003eVirtual Assistant\u003c/a\u003e\n is now GA\u003c/li\u003e\n\u003cli\u003eBot Framework Composer can now be used to build Bot Framework Skills to be used in virtual assistant\u003c/li\u003e\n\u003c/ul\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/062-va.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch2 id=\"azure-cognitive-services\"\u003eAzure Cognitive Services\u003ca class=\"heading-anchor\" href=\"#azure-cognitive-services\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003ch3 id=\"language-understanding\"\u003eLanguage Understanding\u003ca class=\"heading-anchor\" href=\"#language-understanding\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003eNew update to the \u003ca href=\"https://luis.ai\" rel=\"noopener\"\u003eLUIS\u003c/a\u003e\n portal with improvements to the labelling expirience\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://docs.microsoft.com/en-us/azure/cognitive-services/luis/luis-container-howto?tabs=v3\" rel=\"noopener\"\u003eContainer support\u003c/a\u003e\n for LUIS apps\u003c/li\u003e\n\u003cli\u003eUpgraded machine learned entities which are replacing composite and simple entities\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://github.com/Azure-Samples/LUIS-DevOps-Sample\" rel=\"noopener\"\u003eDevOps support\u003c/a\u003e\n for language models\u003c/li\u003e\n\u003cli\u003eBot Framework Orchestrator enters private preview\u003c/li\u003e\n\u003c/ul\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/062-luis.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eRead the full blog of LUIS announcements \u003ca href=\"https://techcommunity.microsoft.com/t5/azure-ai/build-2020-language-understanding-s-new-portal-tools-and/ba-p/1401000\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n.\u003c/p\u003e\n\u003ch3 id=\"qna-maker\"\u003eQnA Maker\u003ca class=\"heading-anchor\" href=\"#qna-maker\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003eNew rich text editor support to streamline KB editing process\u003c/li\u003e\n\u003cli\u003eRBAC support for knowledge bases\u003c/li\u003e\n\u003c/ul\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/062-qnamaker.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch3 id=\"speech-services\"\u003eSpeech Services\u003ca class=\"heading-anchor\" href=\"#speech-services\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cul\u003e\n\u003cli\u003eSpeech Services has now improved the accuracy of Speech to Text and Text to Speech\u003c/li\u003e\n\u003cli\u003eCustom commands and pronunciation assessment features have been added to create advanced speech capabilities\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"conversational-ai-sessions-from-build\"\u003eConversational AI sessions from Build\u003ca class=\"heading-anchor\" href=\"#conversational-ai-sessions-from-build\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://mybuild.microsoft.com/sessions?q=INT139\" rel=\"noopener\"\u003eConversational AI powered Customer and Employee Virtual Assistants\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://mybuild.microsoft.com/sessions?q=INT155\" rel=\"noopener\"\u003eAccelerate bot development in Power Virtual Agents\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch2 id=\"on-demand-content\"\u003eOn demand content\u003ca class=\"heading-anchor\" href=\"#on-demand-content\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/r9WQPSaLnaU\" rel=\"noopener\"\u003eBot Framework Composer: Bot Framework’s new collaborative Conversational AI development environment\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/oJWJA-U4-m8\" rel=\"noopener\"\u003eUse the Efficiency of Low-Code with the Extensibility to Azure to Design World-Class Chatbots\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://youtu.be/Z0IDiekbOp4\" rel=\"noopener\"\u003eConversational AI and human agents working together\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"https://www.youtube.com/watch?v=lB9klrdrqOk\u0026amp;feature=youtu.be\" rel=\"noopener\"\u003eAuthor rich content in QnA Maker knowledge base and enable role based sharing\u003c/a\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n","date_modified":"2020-05-20T10:34:56+02:00","date_published":"2020-05-20T10:34:56+02:00","id":"https://bisser.io/conversational-ai-updates-from-msbuild-2020/","image":"https://bisser.io/images/062-cover.webp","summary":"This post covers all the great announcements from this years Microsoft Build conference 2020","tags":["AI","Bot Framework"],"title":"Conversational AI updates from MSBuild 2020","url":"https://bisser.io/conversational-ai-updates-from-msbuild-2020/"},{"_markdown_url":"https://bisser.io/bot-framework-teams-messaging-extensions-walkthrough/index.md","authors":[{"name":"Stephan Bisser","url":"https://bisser.io/about/"}],"content_html":"\u003ch2 id=\"the-starting-point\"\u003eThe Starting Point\u003ca class=\"heading-anchor\" href=\"#the-starting-point\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eI was previously dealing quite extensively with the topic Bot Framework \u0026amp; Microsoft Teams, as Teams is becoming THE communication tool in the modern workplace. Myself, as well as we (the company I work for) have build quite a lot of bots, which are not targeting Teams exclusively but other channels like Web Chat or others as well. But I did a little project during the homeoffice time due to Covid-19 to finally build our very own bot which should serve me and my co-workers in our daily jobs. As we are quite dependent on Teams and do all of our calls, meetings and project work in Teams, I built a bot which is only targeting Teams at the moment. And this bot in it\u0026rsquo;s first stage has 2 main use cases included:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eQnA\u003c/li\u003e\n\u003cli\u003eTask management\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe QnA part is rather simple as it is utilizing LUIS \u0026amp; QnA Maker to answer questions stored in a knowledge base. But for the task management part, I wanted to do something quite new on the platform: \u003ca href=\"https://docs.microsoft.com/en-us/microsoftteams/platform/messaging-extensions/what-are-messaging-extensions\" rel=\"noopener\"\u003eTeams Messaging Extensions\u003c/a\u003e\n. And those components are pretty useful in many use cases, may it be as a search based extension to grab stock images somewhere, or an action based extension to handle specific actions with it. And myself and many of my co-workers are dependent on a solid task management solution, I decided to \u0026ldquo;modernize\u0026rdquo; how can manage tasks right within a conversation. The awesome thing here is that with the solution shown in this post, we avoid the context-switch, meaning users do not need to go to another tool during a long running Teams conversation to note down a task they need to work on. All that happens now right from the conversation. So the following post describes how to setup your bot in a way to use a messaging extension to fulfill task management based on \u003ca href=\"https://todo.microsoft.com/\" rel=\"noopener\"\u003eMicrosoft To Do\u003c/a\u003e\n and \u003ca href=\"https://www.microsoft.com/en-us/microsoft-365/business/task-management-software\" rel=\"noopener\"\u003ePlanner\u003c/a\u003e\n (but of course you can take the code and exhange the task management tools to your preferred solution).\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe code is published in the Bot Builder Community GitHub repo and can be found \u003ca href=\"https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/tree/develop/samples/Teams%20Graph%20Messaging%20Extensions\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n (feel free to use or contribute)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"create-azure-resources\"\u003eCreate Azure Resources\u003ca class=\"heading-anchor\" href=\"#create-azure-resources\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eThis post will only describe the process of having a local bot running and a Bot Channels Registration which we will use to connect our Teams bot to our local running bot using ngrok (More infos on how to setup ngrok for local bot development can be found \u003ca href=\"https://blog.botframework.com/2017/10/19/debug-channel-locally-using-ngrok/\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n).\u003c/p\u003e\n\u003ch3 id=\"azure-ad-app-registration\"\u003eAzure AD App Registration\u003ca class=\"heading-anchor\" href=\"#azure-ad-app-registration\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe first thing we need is to setup a new Azure AD app registration, as we want to use the \u003ca href=\"https://docs.microsoft.com/en-us/graph/overview\" rel=\"noopener\"\u003eMicrosoft Graph\u003c/a\u003e\n to handle the task management processing. Therefore we need to go over to our Azure portal and create a new Azure AD App registration (like shown \u003ca href=\"https://docs.microsoft.com/en-us/azure/active-directory/develop/howto-create-service-principal-portal#create-an-azure-active-directory-application\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n):\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-01.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eWhile creating your app registration you need to provied the url \u003ccode\u003ehttps://token.botframework.com/.auth/web/redirect\u003c/code\u003e as a redirect URI to establish a conncetion to the Bot Framework for grabbing your authentication token.\u003c/p\u003e\n\u003cp\u003eNext up, we need to add some API permissions to our app to make sure we can use the Graph to perform certain tasks (don\u0026rsquo;t forget to grant admin consent for those permissions after adding them):\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-02.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003ch3 id=\"azure-bot-channels-registration\"\u003eAzure Bot Channels Registration\u003ca class=\"heading-anchor\" href=\"#azure-bot-channels-registration\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eAfter the Azure AD App Registration has been created, we can create a new Bot Channels Registration in the Azure portal:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-03.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eAfter it has been created, we need to add our previously created app registration to the OAuth Connection Settings of our bot:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-04.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eFrom here you need to provide the following details:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-05.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eAfter saving you can validate your service provider connection setting to see if you can connect to your AAD app registration and get a token from there:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-06.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eThe last thing we need to grab is the Microsoft App ID and App secret for the Bot Channels Registration which can be found from the Azure AD App Registration pane as well.\u003c/p\u003e\n\u003ch2 id=\"create-the-bot\"\u003eCreate the Bot\u003ca class=\"heading-anchor\" href=\"#create-the-bot\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eAs I would only like to demo the Teams bits in this post, I will create everything in an echo bot template, but you can of course use it in our existing bots or go with any other BF template. The first thing we need to do after the bot has been created in VS or VS Code is to add our MicrosoftAppId and MicrosoftAppSecret in the appsettings.json of our bot as well as the , tenantId and the serviceUrl we will use from our bot:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-07.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eNext up we need to add some NuGet packages to our bot which are used in this demo:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eMicrosoft.Bot.Builder\u003c/li\u003e\n\u003cli\u003eAdpativeCards\u003c/li\u003e\n\u003cli\u003eMicrosoft.Graph\u003c/li\u003e\n\u003cli\u003eMicrosoft.Graph.Beta\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eSo more or less you\u0026rsquo;ll end up having the following NuGet packages added to your bot:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-08.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eWhat we now need is to tweak our project file a bit, because we are using the Microsoft.Graph and the Microsoft.Graph.Beta NuGet packages, as the To Do implementation is still only available from the beta endpoints. So you would need to add the following lines to our csproj file to make both work at the same time:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-XML\" data-lang=\"XML\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;Target\u003c/span\u003e \u003cspan class=\"na\"\u003eName=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ChangeAliasesOfStrongNameAssemblies\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eBeforeTargets=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;FindReferenceAssembliesForReferences;ResolveReferences\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;ItemGroup\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;ReferencePath\u003c/span\u003e \u003cspan class=\"na\"\u003eCondition=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;\u0026#39;%(FileName)\u0026#39; == \u0026#39;Microsoft.Graph.Beta\u0026#39;\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;Aliases\u0026gt;\u003c/span\u003eBetaLib\u003cspan class=\"nt\"\u003e\u0026lt;/Aliases\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"nt\"\u003e\u0026lt;/ReferencePath\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;/ItemGroup\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/Target\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eand:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-XML\" data-lang=\"XML\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;PackageReference\u003c/span\u003e \u003cspan class=\"na\"\u003eInclude=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Microsoft.Graph.Beta\u0026#34;\u003c/span\u003e \u003cspan class=\"na\"\u003eVersion=\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;0.18.0-preview\u0026#34;\u003c/span\u003e\u003cspan class=\"nt\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;SpecificVersion\u0026gt;\u003c/span\u003eFalse\u003cspan class=\"nt\"\u003e\u0026lt;/SpecificVersion\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;HintPath\u0026gt;\u003c/span\u003eResources\\Microsoft.Graph.Beta.dll\u003cspan class=\"nt\"\u003e\u0026lt;/HintPath\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026lt;Aliases\u0026gt;\u003c/span\u003eBetaLib\u003cspan class=\"nt\"\u003e\u0026lt;/Aliases\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"nt\"\u003e\u0026lt;/PackageReference\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch3 id=\"implement-graph-client\"\u003eImplement Graph Client\u003ca class=\"heading-anchor\" href=\"#implement-graph-client\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eAfter setting up the bot locally, we need to add the Microsoft Graph functionality to it. The easiest way of doing that is to create a new class called \u003cstrong\u003eSimpleGraphClient.cs\u003c/strong\u003e which contains the following code:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eextern\u003c/span\u003e \u003cspan class=\"k\"\u003ealias\u003c/span\u003e \u003cspan class=\"n\"\u003eBetaLib\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Net.Http.Headers\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Threading.Tasks\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eBeta\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eBetaLib\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMicrosoft\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGraph\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eMicrosoft.Graph\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"nn\"\u003eSBI_TeamsBot.Services\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eSimpleGraphClient\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"k\"\u003ereadonly\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003e_token\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003eSimpleGraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsNullOrWhiteSpace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eArgumentNullException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003enameof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e_token\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etoken\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOutlookTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eGetTaskAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGetAuthenticatedClient\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMe\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOutlook\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eGetAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003etasks\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIPlannerUserFavoritePlansCollectionWithReferencesPage\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eGetFavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGetAuthenticatedClient\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMe\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePlanner\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eGetAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIPlannerGroupPlansCollectionPage\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eGetCurrentPlan\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003egroupId\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGetAuthenticatedClient\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGroups\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"n\"\u003egroupId\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003ePlanner\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eGetAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePlannerTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eCreatePlannerTaskAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eplanId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003esubject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003edueDate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003estartTime\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003euserId\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGetAuthenticatedClient\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eassignments\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePlannerAssignments\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eassignments\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAddAssignee\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003euserId\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eplannerTask\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePlannerTask\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eDueDateTime\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDateTimeOffset\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003edueDate\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eStartDateTime\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eDateTimeOffset\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estartTime\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003ePlanId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eplanId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eAssignments\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eassignments\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePlanner\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eAddAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eplannerTask\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eplans\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOutlookTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eCreateTaskAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003esubject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003edueDate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003estartTime\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eItemBody\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eGetAuthenticatedClient\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eoutlookTask\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOutlookTask\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eSubject\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esubject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eStartDateTime\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTimeTimeZone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003estartTime\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eTimeZone\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Eastern Standard Time\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eDueDateTime\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eDateTimeTimeZone\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eDateTime\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003edueDate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eTimeZone\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Eastern Standard Time\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eBody\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMe\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOutlook\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTasks\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRequest\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eHeader\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Prefer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;outlook.timezone=\\\u0026#34;Pacific Standard Time\\\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eAddAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eoutlookTask\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eres\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// Get an Authenticated Microsoft Graph client using the token issued to the user.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGraphServiceClient\u003c/span\u003e \u003cspan class=\"n\"\u003eGetAuthenticatedClient\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGraphServiceClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eDelegateAuthenticationProvider\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003erequestMessage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"c1\"\u003e// Append the access token to the request.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003erequestMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHeaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAuthorization\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAuthenticationHeaderValue\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;bearer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_token\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"c1\"\u003e// Get event times in the current time zone.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003erequestMessage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eHeaders\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Prefer\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;outlook.timezone=\\\u0026#34;\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eTimeZoneInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eLocal\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\\\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCompletedTask\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e}));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"n\"\u003egraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThis class will allow us to use the Microsoft Graph SDK to perform certain operations instead of using HTTP clients to perform those operations.\u003c/p\u003e\n\u003ch3 id=\"implement-adaptive-cards-helper\"\u003eImplement Adaptive Cards Helper\u003ca class=\"heading-anchor\" href=\"#implement-adaptive-cards-helper\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eAs we want to provide a messaging extension which will dynamically fetch data using an Adaptive Card, we need to provide two additional classes to fulill that:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAdaptiveCardData.cs\n\u003cul\u003e\n\u003cli\u003eThis class will act as our Adaptive Card data model\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003eAdaptiveCardHelper.cs\n\u003cul\u003e\n\u003cli\u003eThis class will help us generate the Adaptive Card based on the current context\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eThe AdaptiveCardData.cs will look as follows:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Collections.Generic\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Linq\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Threading.Tasks\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"nn\"\u003eSBI_TeamsBot.Models\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eAdaptiveCardData\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCardData\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eMultiSelect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eSubmitLocation\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eQuestion\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eMultiSelect\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eOption1\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eOption2\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eOption3\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eOption4\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eOption1Value\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eOption2Value\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eOption3Value\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eOption4Value\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"k\"\u003eget\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"k\"\u003eset\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe AdaptiveCardHelper.cs will look as follows:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSystem.Collections.Generic\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eAdaptiveCards\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eSBI_TeamsBot.Models\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003eusing\u003c/span\u003e \u003cspan class=\"nn\"\u003eNewtonsoft.Json.Linq\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"k\"\u003enamespace\u003c/span\u003e \u003cspan class=\"nn\"\u003eSBI_TeamsBot.Services\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eAdaptiveCardHelper\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCardData\u003c/span\u003e \u003cspan class=\"n\"\u003eCreateExampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003euserText\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eadaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBody\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTextBlock\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003echoiceSet\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBody\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e3\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveChoiceSetInput\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCardData\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eQuestion\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003euserText\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eMultiSelect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003echoiceSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsMultiSelect\u003c/span\u003e \u003cspan class=\"p\"\u003e?\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;true\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eOption1\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003echoiceSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eChoices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eOption2\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003echoiceSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eChoices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eOption3\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003echoiceSet\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eChoices\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e \u003cspan class=\"n\"\u003eCreateAdaptiveCardEditor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveCardData\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecardData\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e \u003cspan class=\"p\"\u003e??\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCardData\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eBody\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveElement\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTextBlock\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Task creation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eWeight\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTextWeight\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBolder\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTextBlock\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Which type of task would you like to create?\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTextBlock\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;TitleText\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eText\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTextInput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePlaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsRequired\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveDateInput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;StartDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsRequired\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePlaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Start date\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveDateInput\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;DueDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsRequired\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ePlaceholder\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Due date\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveChoiceSetInput\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveChoiceSetInput\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTypeName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Choices\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eIsMultiSelect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kt\"\u003ebool\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMultiSelect\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Choose a plan\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eChoices\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveChoice\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveChoice\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption1\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption1Value\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveChoice\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption2\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption2Value\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveChoice\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption3\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption3Value\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveChoice\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption4\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption4Value\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveActionSet\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SubmitTodoAction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eActions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveAction\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveSubmitAction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveSubmitAction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTypeName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Create ToDo task\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SubmitTodo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eData\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eJObject\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;todo\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveActionSet\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SubmitPlannerAction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eActions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveAction\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveSubmitAction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveSubmitAction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTypeName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Create Planner task\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SubmitPlanner\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eData\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eJObject\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;planner\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eActions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveAction\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveToggleVisibilityAction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveToggleVisibilityAction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTypeName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Todo Task\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eTargetElements\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;TitleText\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;StartDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;DueDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SubmitTodoAction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Choices\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SubmitPlannerAction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveToggleVisibilityAction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveToggleVisibilityAction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTypeName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Planner Task\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eTargetElements\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;TitleText\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;StartDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;DueDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Choices\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SubmitPlannerAction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveTargetElement\u003c/span\u003e\u003cspan class=\"p\"\u003e(){\u003c/span\u003e\u003cspan class=\"n\"\u003eElementId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;SubmitTodoAction\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eIsVisible\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003efalse\u003c/span\u003e\u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThose two classes will be used in the next step within our EchoBot.cs to generate and visualize the Adaptive Card in our messaging extension.\u003c/p\u003e\n\u003ch3 id=\"implement-teams-functionality\"\u003eImplement Teams Functionality\u003ca class=\"heading-anchor\" href=\"#implement-teams-functionality\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h3\u003e\u003cp\u003eThe last piece of bot logic we need to add deals with the messaging extension functionality. Therefore we need to add the following lines to our EchoBot.cs to make that work:\u003c/p\u003e\n\u003cp\u003eFirst of all we need to change the EchoBot type from an ActivityHandler to a TeamsActivityHandler and create some constants and add the constructor as follows:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"k\"\u003eclass\u003c/span\u003e \u003cspan class=\"nc\"\u003eEchoBot\u003c/span\u003e \u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eTeamsActivityHandler\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereadonly\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003e_connectionName\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eplannerGroupId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ebotClientID\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"kd\"\u003estatic\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ebotClientSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003etenantId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003eserviceUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kd\"\u003epublic\u003c/span\u003e \u003cspan class=\"n\"\u003eEchoBot\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eIConfiguration\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003e_connectionName\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ConnectionNameGraph\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"p\"\u003e??\u003c/span\u003e \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eNullReferenceException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ConnectionNameGraph\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ebotClientID\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;MicrosoftAppId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003ebotClientSecret\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;MicrosoftAppPassword\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003etenantId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;tenantId\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eserviceUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003econfiguration\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;serviceUrl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNext we need to override the OnTeamsSigninVerifyStateAsync method to make sure authentication works in our messaging exentsion:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003eprotected\u003c/span\u003e \u003cspan class=\"kd\"\u003eoverride\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e \u003cspan class=\"n\"\u003eOnTeamsSigninVerifyStateAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eITurnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eIInvokeActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eCancellationToken\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eLogger\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eLogInformation\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Running dialog with signin/verifystate from an Invoke Activity.\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// The OAuth Prompt needs to see the Invoke Activity in order to complete the login process.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// Run the Dialog with the new Invoke Activity.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eDialog\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eRunAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eConversationState\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCreateProperty\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eDialogState\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;(\u003c/span\u003e\u003cspan class=\"n\"\u003enameof\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eDialogState\u003c/span\u003e\u003cspan class=\"p\"\u003e)),\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eWhat we now need is to implement the functionality for what is called \u003ca href=\"https://docs.microsoft.com/en-us/microsoftteams/platform/resources/messaging-extension-v3/create-extensions?tabs=typescript#request-to-install-your-conversational-bot\" rel=\"noopener\"\u003ejustInTimeInstallation\u003c/a\u003e\n to make sure we can use the messaging extension also in a team conversation where the bot is not (yet) installed. Therefore we first of all need an Adaptive Card which we will send to the user trying to open the messaging extension, requesting to install the bot in the team:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-JSON\" data-lang=\"JSON\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;AdaptiveCard\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;body\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;TextBlock\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;text\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Looks like you haven\u0026#39;t installed this app in this team/chat\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;actions\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e[\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Action.Submit\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;Continue\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"nt\"\u003e\u0026#34;data\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"nt\"\u003e\u0026#34;msteams\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"nt\"\u003e\u0026#34;justInTimeInstall\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e],\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;version\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;1.0\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"nt\"\u003e\u0026#34;$schema\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"s2\"\u003e\u0026#34;http://adaptivecards.io/schemas/adaptive-card.json\u0026#34;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eNext we need an override for the OnTeamsMessagingExtensionFetchTaskAsync method which will be called when the user triggers the messaging extension:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e \u003cspan class=\"c1\"\u003e// 1. Will be called when user triggers messaging extension which then calls CreateTaskModuleCommand\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003eprotected\u003c/span\u003e \u003cspan class=\"kd\"\u003eoverride\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMessagingExtensionActionResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eOnTeamsMessagingExtensionFetchTaskAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eITurnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eIInvokeActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionAction\u003c/span\u003e \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eCancellationToken\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// Check if the bot has been installed in the team by getting the team rooster\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003etry\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eteamsMembers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eTeamsInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetMembersAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ecatch\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// if not installed we will send out the card instructing the user to install the bot\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ejitCardPath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCombine\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAppDomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentDomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseDirectory\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Cards\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;jitCard.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ejitCard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFile\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReadAllText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejitCardPath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUTF8\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003ejitCardJson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejitCard\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ejitCardTeams\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFromJson\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ejitCardJson\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFromResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionActionResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eTask\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTaskModuleContinueResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTaskModuleTaskInfo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eCard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejitCardTeams\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCard\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eHeight\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e300\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e600\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Install bot\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003emagicCode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003estate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eNewtonsoft\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eJson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eLinq\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;state\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(!\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsNullOrEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eparsed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTryParse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003eout\u003c/span\u003e \u003cspan class=\"n\"\u003eparsed\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emagicCode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eparsed\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etokenResponse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdapter\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eIUserTokenProvider\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eGetUserTokenAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_connectionName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emagicCode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etokenResponse\u003c/span\u003e \u003cspan class=\"p\"\u003e==\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e \u003cspan class=\"p\"\u003e||\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsNullOrEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etokenResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// There is no token, so the user has not signed in yet.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003esignInLink\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdapter\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eIUserTokenProvider\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eGetOauthSignInLinkAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_connectionName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionActionResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eComposeExtension\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionResult\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;auth\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eSuggestedActions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionSuggestedAction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eActions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCardAction\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eCardAction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eActionTypes\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOpenUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esignInLink\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Sign in Please\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eaccessToken\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etokenResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eaccessToken\u003c/span\u003e \u003cspan class=\"p\"\u003e!=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e \u003cspan class=\"p\"\u003e||\u003c/span\u003e \u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsNullOrEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eaccessToken\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// Create Graph Client\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eSimpleGraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eaccessToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// Get Group details\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003echannel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTeamsGetChannelId\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echannel\u003c/span\u003e \u003cspan class=\"p\"\u003e!=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003emembers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eTeamsChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003econtinuationToken\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003edo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrentPage\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eTeamsInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetPagedMembersAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"m\"\u003e100\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003econtinuationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003econtinuationToken\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContinuationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003emembers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emembers\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConcat\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMembers\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eToList\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ewhile\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econtinuationToken\u003c/span\u003e \u003cspan class=\"p\"\u003e!=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eTeamDetails\u003c/span\u003e \u003cspan class=\"n\"\u003eteamDetails\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eTeamsInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetTeamDetailsAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTeamsGetTeamInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eteamDetails\u003c/span\u003e \u003cspan class=\"p\"\u003e!=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003egroupId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eteamDetails\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAadGroupId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eplannerGroupId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003egroupId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"c1\"\u003e//Get Plans\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrentGroupPlan\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetCurrentPlan\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egroupId\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetFavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"c1\"\u003e// Fill Adaptive Card data\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCardData\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMultiSelect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ecurrentGroupPlan\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCount\u003c/span\u003e \u003cspan class=\"p\"\u003e==\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption1\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption1Value\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e4\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption1\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrentGroupPlan\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption1Value\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecurrentGroupPlan\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption2\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption3\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption4\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption2Value\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption3Value\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption4Value\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"c1\"\u003e// Create and return card\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCardEditor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCardHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCreateAdaptiveCardEditor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFromResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionActionResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eTask\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTaskModuleContinueResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTaskModuleTaskInfo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eCard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMicrosoft\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBot\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCardEditor\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eHeight\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e600\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e600\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Task creation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"c1\"\u003e// Return only favorite plans without current plan as in 1:1 or group chat\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetFavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"c1\"\u003e// Fill Adaptive Card data\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCardData\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMultiSelect\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;false\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption1\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption2\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption3\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption1Value\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption3Value\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e1\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOption4Value\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003efavoritePlans\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentPage\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e2\u003c/span\u003e\u003cspan class=\"p\"\u003e].\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"c1\"\u003e// Create and return card\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCardEditor\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCardHelper\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCreateAdaptiveCardEditor\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eexampleData\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFromResult\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionActionResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eTask\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTaskModuleContinueResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTaskModuleTaskInfo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eCard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMicrosoft\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBot\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSchema\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eadaptiveCardEditor\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eHeight\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e600\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eWidth\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e600\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Task creation\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e});\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eAfter the user has entered the data we need to call the CreateTaskModuleCommand which will fetch the input data and create the tasks using the SimpleGraphClient.cs:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"c1\"\u003e// 2. Will be called after OnTeamsMessagingExtensionFetchTaskAsync when user has entered all data in the Messaging Extension Adaptive Card\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003eprivate\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMessagingExtensionActionResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eCreateTaskModuleCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eITurnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eIInvokeActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionAction\u003c/span\u003e \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eCancellationToken\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003emsg\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eMessagePayload\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBody\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContent\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003edata\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003echannel\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTeamsGetChannelId\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003egroupId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003echannel\u003c/span\u003e \u003cspan class=\"p\"\u003e!=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003eTeamDetails\u003c/span\u003e \u003cspan class=\"n\"\u003eteamDetails\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eTeamsInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eGetTeamDetailsAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTeamsGetTeamInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"n\"\u003egroupId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eteamDetails\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAadGroupId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003esubject\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]?.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003edueDate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;DueDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]?.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003estartDate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;StartDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]?.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Type\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]?.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eurl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"n\"\u003eJObject\u003c/span\u003e \u003cspan class=\"n\"\u003ejsonUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eParse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eurl\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003elink\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ejsonUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;messagePayload\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e][\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;linkToMessage\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e];\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003emagicCode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003estate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eNewtonsoft\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eJson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eLinq\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eValue\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;state\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(!\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsNullOrEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003eint\u003c/span\u003e \u003cspan class=\"n\"\u003eparsed\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"kt\"\u003eint\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTryParse\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003estate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"k\"\u003eout\u003c/span\u003e \u003cspan class=\"n\"\u003eparsed\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003emagicCode\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eparsed\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etokenResponse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdapter\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eIUserTokenProvider\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eGetUserTokenAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_connectionName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003emagicCode\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etokenResponse\u003c/span\u003e \u003cspan class=\"p\"\u003e==\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e \u003cspan class=\"p\"\u003e||\u003c/span\u003e \u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsNullOrEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etokenResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// There is no token, so the user has not signed in yet.\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"c1\"\u003e// Retrieve the OAuth Sign in Link to use in the MessagingExtensionResult Suggested Actions\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003esignInLink\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdapter\u003c/span\u003e \u003cspan class=\"k\"\u003eas\u003c/span\u003e \u003cspan class=\"n\"\u003eIUserTokenProvider\u003c/span\u003e\u003cspan class=\"p\"\u003e).\u003c/span\u003e\u003cspan class=\"n\"\u003eGetOauthSignInLinkAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003e_connectionName\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionActionResponse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eComposeExtension\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionResult\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;auth\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eSuggestedActions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionSuggestedAction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eActions\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eCardAction\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eCardAction\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eActionTypes\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eOpenUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eValue\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003esignInLink\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                                \u003cspan class=\"n\"\u003eTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Bot Service OAuth\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eaccessToken\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etokenResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToken\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eaccessToken\u003c/span\u003e \u003cspan class=\"p\"\u003e!=\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e \u003cspan class=\"p\"\u003e||\u003c/span\u003e \u003cspan class=\"p\"\u003e!\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsNullOrEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eaccessToken\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eSimpleGraphClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eaccessToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e==\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;todo\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eBeta\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eItemBody\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003emsg\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34; - \u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003elink\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etaskResult\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCreateTaskAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003esubject\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003edueDate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003estartDate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebody\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etodoUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;https://to-do.office.com/tasks/id/\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003etaskResult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;/details\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eUri\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eserviceUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMicrosoftAppCredentials\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebotClientID\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebotClientSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003econversationParameters\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConversationParameters\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eChannelData\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTeamsChannelData\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eTenant\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTenantInfo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etenantId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eMembers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConversations\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCreateConversationAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econversationParameters\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003etaskCardPath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCombine\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAppDomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentDomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseDirectory\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Cards\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;todoCardTeams.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFile\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReadAllText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etaskCardPath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUTF8\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;replaceUrl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etodoUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e??\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eculture\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eCultureInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eInvariantCulture\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ReplaceTitel\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etaskResult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSubject\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e??\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eculture\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eCultureInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eInvariantCulture\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFromJson\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e \u003cspan class=\"n\"\u003eattachment\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCard\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"n\"\u003eIMessageActivity\u003c/span\u003e \u003cspan class=\"n\"\u003ecardMsg\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMessageFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eattachment\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConversations\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSendToConversationAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003ecardMsg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etype\u003c/span\u003e \u003cspan class=\"p\"\u003e==\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;planner\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eusername\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAadObjectId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etaskTitle\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Title\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]?.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etaskStartDate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;StartDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]?.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etaskDueDate\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;DueDate\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]?.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etaskSPlanId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"p\"\u003e((\u003c/span\u003e\u003cspan class=\"n\"\u003eJObject\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e)[\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;Choices\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e]?.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eplanResult\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eclient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCreatePlannerTaskAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etaskSPlanId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etaskTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etaskDueDate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etaskStartDate\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eusername\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(!\u003c/span\u003e\u003cspan class=\"kt\"\u003estring\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eIsNullOrEmpty\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003egroupId\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003etaskUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;https://tasks.office.com/solviondemo.net/en-US/Home/Planner/#/plantaskboard?groupId=\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003egroupId\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026amp;planId=\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eplanResult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003ePlanId\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026amp;taskId=\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eplanResult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eUri\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eserviceUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMicrosoftAppCredentials\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebotClientID\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebotClientSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003econversationParameters\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConversationParameters\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eChannelData\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTeamsChannelData\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eTenant\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTenantInfo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etenantId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eMembers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConversations\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCreateConversationAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econversationParameters\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003etaskCardPath\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ePath\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCombine\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eAppDomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCurrentDomain\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eBaseDirectory\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;Cards\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;plannerCardTeams.json\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eFile\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReadAllText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etaskCardPath\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eEncoding\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eUTF8\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003estring\u003c/span\u003e \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003er\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;replaceUrl\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003etaskUrl\u003c/span\u003e \u003cspan class=\"p\"\u003e??\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eculture\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eCultureInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eInvariantCulture\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eReplace\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;ReplaceTitel\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eplanResult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e??\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"kc\"\u003etrue\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eculture\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e \u003cspan class=\"n\"\u003eCultureInfo\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eInvariantCulture\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003ecard\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFromJson\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003etaskCardJson\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e \u003cspan class=\"n\"\u003eattachment\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eContentType\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eAdaptiveCard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eContentType\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eContent\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003ecard\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCard\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eIMessageActivity\u003c/span\u003e \u003cspan class=\"n\"\u003ecardMsg\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMessageFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAttachment\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eattachment\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConversations\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSendToConversationAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\u003cspan class=\"n\"\u003ecardMsg\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;();\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eAdd\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eFrom\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eName\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eUri\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eserviceUrl\u003c/span\u003e\u003cspan class=\"p\"\u003e),\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eMicrosoftAppCredentials\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003ebotClientID\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ebotClientSecret\u003c/span\u003e\u003cspan class=\"p\"\u003e));\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003econversationParameters\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eConversationParameters\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eChannelData\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTeamsChannelData\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"n\"\u003eTenant\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eTenantInfo\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                            \u003cspan class=\"n\"\u003eId\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003etenantId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"p\"\u003e},\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                    \u003cspan class=\"n\"\u003eMembers\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eList\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eChannelAccount\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;()\u003c/span\u003e \u003cspan class=\"p\"\u003e{\u003c/span\u003e \u003cspan class=\"n\"\u003eparticipants\u003c/span\u003e\u003cspan class=\"p\"\u003e[\u003c/span\u003e\u003cspan class=\"m\"\u003e0\u003c/span\u003e\u003cspan class=\"p\"\u003e]\u003c/span\u003e \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"p\"\u003e};\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003eresponse\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConversations\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCreateConversationAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003econversationParameters\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"kt\"\u003evar\u003c/span\u003e \u003cspan class=\"n\"\u003epersonalMessageActivity\u003c/span\u003e \u003cspan class=\"p\"\u003e=\u003c/span\u003e \u003cspan class=\"n\"\u003eMessageFactory\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eText\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e$\u0026#34;I\u0026#39;ve created a new Planner task with the title **\u0026#34;\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"n\"\u003eplanResult\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eTitle\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e()\u003c/span\u003e \u003cspan class=\"p\"\u003e+\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;** in the Plan you have chosen\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003econnectorClient\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eConversations\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eSendToConversationAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eresponse\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eId\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003epersonalMessageActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"kc\"\u003enull\u003c/span\u003e\u003cspan class=\"p\"\u003e;\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003eThe last piece here is an override for the OnTeamsMessagingExtensionSubmitActionAsync method which we will need to call our CreateTaskModuleCommand:\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" class=\"chroma\"\u003e\u003ccode class=\"language-C#\" data-lang=\"C#\"\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"kd\"\u003eprotected\u003c/span\u003e \u003cspan class=\"kd\"\u003eoverride\u003c/span\u003e \u003cspan class=\"kd\"\u003easync\u003c/span\u003e \u003cspan class=\"n\"\u003eTask\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eMessagingExtensionActionResponse\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eOnTeamsMessagingExtensionSubmitActionAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eITurnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026lt;\u003c/span\u003e\u003cspan class=\"n\"\u003eIInvokeActivity\u003c/span\u003e\u003cspan class=\"p\"\u003e\u0026gt;\u003c/span\u003e \u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eMessagingExtensionAction\u003c/span\u003e \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eCancellationToken\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"c1\"\u003e// check if we previousy requested to install the bot - if true we will present the messaging extension\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eif\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eData\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eToString\u003c/span\u003e\u003cspan class=\"p\"\u003e().\u003c/span\u003e\u003cspan class=\"n\"\u003eContains\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e\u0026#34;justInTimeInstall\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e))\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eOnTeamsMessagingExtensionFetchTaskAsync\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"k\"\u003eelse\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"k\"\u003eswitch\u003c/span\u003e \u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e.\u003c/span\u003e\u003cspan class=\"n\"\u003eCommandId\u003c/span\u003e\u003cspan class=\"p\"\u003e)\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e{\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003ecase\u003c/span\u003e \u003cspan class=\"s\"\u003e\u0026#34;createTaskModule\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"c1\"\u003e// This command will first call OnTeamsMessagingExtensionFetchTaskAsync and then CreateTaskModuleCommand\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ereturn\u003c/span\u003e \u003cspan class=\"k\"\u003eawait\u003c/span\u003e \u003cspan class=\"n\"\u003eCreateTaskModuleCommand\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"n\"\u003eturnContext\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003eaction\u003c/span\u003e\u003cspan class=\"p\"\u003e,\u003c/span\u003e \u003cspan class=\"n\"\u003ecancellationToken\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e            \u003cspan class=\"k\"\u003edefault\u003c/span\u003e\u003cspan class=\"p\"\u003e:\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e                \u003cspan class=\"k\"\u003ethrow\u003c/span\u003e \u003cspan class=\"k\"\u003enew\u003c/span\u003e \u003cspan class=\"n\"\u003eNotImplementedException\u003c/span\u003e\u003cspan class=\"p\"\u003e(\u003c/span\u003e\u003cspan class=\"s\"\u003e$\u0026#34;Invalid CommandId: {action.CommandId}\u0026#34;\u003c/span\u003e\u003cspan class=\"p\"\u003e);\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e        \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e    \u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003cspan class=\"line\"\u003e\u003cspan class=\"cl\"\u003e\u003cspan class=\"p\"\u003e}\u003c/span\u003e\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003ch2 id=\"create-teams-app\"\u003eCreate Teams App\u003ca class=\"heading-anchor\" href=\"#create-teams-app\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eNow that the bot is ready, we can create our new Microsoft Teams application using the Teams App Studio. Within there we well connect our Bot Channels Registration service we created earlier and also add a messaging extension command with the name \u003cstrong\u003ecreateTaskModule\u003c/strong\u003e exactly as we have used in our EchoBot.cs:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-09.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eFrom the Bots section, make sure to add personal, team and group as a scope so users can use your messaging extension in 1:1 \u0026amp; group chats and teams conversations.\u003c/p\u003e\n\u003cp\u003eIn order to create the messaging extension correctly, you\u0026rsquo;ll need to select the same bot as before and then add a new command like this:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-10.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cfigure\u003e\u003cimg src=\"/images/061-11.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cfigure\u003e\u003cimg src=\"/images/061-12.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eFrom the Domains and permissions section also add token.botframework.com to the list of valid domains to make authentication work:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-13.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eAfter installing the bot for your users you can test it (make sure you added the Teams channel to your Bot Channels registration in the Azure portal) and you should be greeted immediately by the bot:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-14.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eNow if you click the ellipsis (\u0026hellip;) on a message and select more actions you should see your \u0026ldquo;Creat Task\u0026rdquo; command there:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-15.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eIf you click that the first time you will be prompted to authenticate:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-16.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eAfter you have signed, in the bot will show the Adaptive Card where you can select to create either a To Do task or a Planner task:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-17.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eIf you click on \u003cstrong\u003eTodo Task\u003c/strong\u003e you can insert the title, start and due date of your to be created task:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-18.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eAfter hitting \u003cstrong\u003eCreate ToDo Task\u003c/strong\u003e the bot will create the task in your ToDo task list and send you back a message that the task creation has been done successfully:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-19.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eNow if you click on \u003cstrong\u003eOpen Task\u003c/strong\u003e you will be directly getting to that newly created task in To Do:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-20.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cp\u003eNow even cooler is the functionality in a team conversation, where you have a Planner Plan attached. If I select the \u003cstrong\u003eCreate Task\u003c/strong\u003e action again on a conversation in a team and then create a new Planner task, it will let me select my favorite Planner plans as well as the Planner plan for this particular team and the bot will send you a 1:1 direct message when the creation has been finished:\u003c/p\u003e\n\u003cfigure\u003e\u003cimg src=\"/images/061-21.png\" alt=\"\" loading=\"lazy\" decoding=\"async\"\u003e\u003c/figure\u003e\n\n\u003cblockquote\u003e\n\u003cp\u003eThe code is published in the Bot Builder Community GitHub repo and can be found \u003ca href=\"https://github.com/BotBuilderCommunity/botbuilder-community-dotnet/tree/develop/samples/Teams%20Graph%20Messaging%20Extensions\" rel=\"noopener\"\u003ehere\u003c/a\u003e\n (feel free to use or contribute)\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003ch2 id=\"conclusion\"\u003eConclusion\u003ca class=\"heading-anchor\" href=\"#conclusion\" aria-label=\"Link to this section\"\u003e#\u003c/a\u003e\u003c/h2\u003e\u003cp\u003eNOTE: This code is definetly NOT production ready but you can of course use it and modify it to use it for your use case (but please don\u0026rsquo;t blame me if there are bugs 😁).\nThe things I learned while developing this bot are:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eAuthentication is still a bit tricky with so many components playing together (Azure AD, Graph, Teams, Bot Framework, \u0026hellip;)\u003c/li\u003e\n\u003cli\u003eAdaptive Cards come in handy when you want to build your own UI for your messaging extensions\u003c/li\u003e\n\u003cli\u003eNotifying users using a 1:1 chat message from a team conversation is a bit hacky as of now\u003c/li\u003e\n\u003cli\u003eThe Microsoft Bot Framework is awesome 👍\u003c/li\u003e\n\u003c/ul\u003e\n","date_modified":"2020-05-19T10:34:56+02:00","date_published":"2020-05-19T10:34:56+02:00","id":"https://bisser.io/bot-framework-teams-messaging-extensions-walkthrough/","image":"https://bisser.io/images/061-21.png","summary":"A step-by-step tutorial for building a Microsoft Teams messaging extension using the Microsoft Bot Framework to handle task management (To Do and Planer) directly within conversations!","tags":["AI","Bot Framework"],"title":"Bot Framework Teams Messaging Extensions Walkthrough","url":"https://bisser.io/bot-framework-teams-messaging-extensions-walkthrough/"}],"language":"en","title":"bisser.io","version":"https://jsonfeed.org/version/1.1"}