<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ever Burga</title>
    <description>The latest articles on DEV Community by Ever Burga (@4verburga).</description>
    <link>https://dev.to/4verburga</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3886208%2F8963d179-3806-4e42-8751-908d7012b4df.jpg</url>
      <title>DEV Community: Ever Burga</title>
      <link>https://dev.to/4verburga</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/4verburga"/>
    <language>en</language>
    <item>
      <title>How I Made My Fork Bilingual and Published It Right</title>
      <dc:creator>Ever Burga</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:33:19 +0000</pubDate>
      <link>https://dev.to/4verburga/how-i-made-my-fork-bilingual-and-published-it-right-3f31</link>
      <guid>https://dev.to/4verburga/how-i-made-my-fork-bilingual-and-published-it-right-3f31</guid>
      <description>&lt;p&gt;This post marks the rebirth of my blog. Not because I suddenly have a grand editorial vision or a pressing need to share wisdom with the world. I just finally touched it again seriously.&lt;/p&gt;

&lt;p&gt;I remember seeing a post about the creator of OpenClaw: dozens of repos, and the first viral one was OpenClaw.&lt;/p&gt;

&lt;p&gt;That felt a lot like life. You take enough shots, one of them lands. So here we are.&lt;/p&gt;

&lt;p&gt;Now that I am back and Claude 4.6 showed up and all that, the whole thing feels a bit blurry. A big part of the corrections I am sharing here were contributed by Claude. I still do not know how much credit I should take. If you are only here out of curiosity and want the npm publishing angle, here is the brief.&lt;/p&gt;

&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What I actually worked on&lt;/li&gt;
&lt;li&gt;The lines that actually matter&lt;/li&gt;
&lt;li&gt;Repo&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I actually worked on
&lt;/h2&gt;

&lt;p&gt;I looked at my branch history and, to be fair, there was at least one moment where I had to be the human in the loop and fix the npm scope by creating an organization.&lt;/p&gt;

&lt;p&gt;The annoying detail is simple: your handle on GitHub and npmjs should match, or you need an org that does. That part is boring, but it is also the part that breaks the nice story if you ignore it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lines that actually matter
&lt;/h2&gt;

&lt;p&gt;This is the core of my &lt;code&gt;publish.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;workflows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ci-main"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ci-dev"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;completed&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
    &lt;span class="na"&gt;branches&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;main&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;dev&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;publish&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.workflow_run.conclusion == 'success' }}&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.workflow_run.head_branch }}&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/setup-node@v4&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;node-version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;22.14&lt;/span&gt;
          &lt;span class="na"&gt;registry-url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://registry.npmjs.org&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Upgrade npm&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm install -g npm@latest&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install dependencies&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;pnpm install --ignore-scripts&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bump version with dev suffix&lt;/span&gt;
        &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.workflow_run.head_branch == 'dev' }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
          &lt;span class="s"&gt;COMMIT=$(git rev-parse --short HEAD)&lt;/span&gt;
          &lt;span class="s"&gt;VERSION=$(node -p "require('./package.json').version")&lt;/span&gt;
          &lt;span class="s"&gt;npm version "${VERSION}-dev.${COMMIT}" --no-git-tag-version&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to npm&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm publish --access public&lt;/span&gt;

      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Publish to GitHub Packages&lt;/span&gt;
        &lt;span class="na"&gt;env&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;NODE_AUTH_TOKEN&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm publish --access public&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dev&lt;/code&gt; publishes with a commit-based suffix and does not pollute &lt;code&gt;latest&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;main&lt;/code&gt; publishes cleanly&lt;/li&gt;
&lt;li&gt;npm does not depend on long-lived tokens lying around&lt;/li&gt;
&lt;li&gt;GitHub Packages stays in sync&lt;/li&gt;
&lt;li&gt;publish only runs after CI passes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fapril%2Ftrusted_publisher_npmjs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fapril%2Ftrusted_publisher_npmjs.png" alt="Trusted publisher setup in npmjs" title="Trusted publisher connected to GitHub Actions" width="798" height="442"&gt;&lt;/a&gt;
  &lt;em&gt;the boring part, which is usually where the real problems live&lt;/em&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Repo
&lt;/h2&gt;

&lt;p&gt;These are the sources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repo: &lt;a href="https://github.com/4xeverburga/nuxt-alpine-spanishplus" rel="noopener noreferrer"&gt;4xeverburga/nuxt-alpine-spanishplus&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;workflows: &lt;a href="https://github.com/4xeverburga/nuxt-alpine-spanishplus/tree/main/.github/workflows" rel="noopener noreferrer"&gt;&lt;code&gt;.github/workflows&lt;/code&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>nuxttheme</category>
      <category>bilingualblog</category>
      <category>npmpublish</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>Building an Agent's Personality Around the Customer Journey</title>
      <dc:creator>Ever Burga</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:32:30 +0000</pubDate>
      <link>https://dev.to/4verburga/building-an-agents-personality-around-the-customer-journey-2l9b</link>
      <guid>https://dev.to/4verburga/building-an-agents-personality-around-the-customer-journey-2l9b</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fclawd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fclawd.png" alt="Clawd as the article's opening card" width="400" height="400"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;strong&gt;Clawd&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
  &lt;span&gt;Looks very friendly, doesn't it?&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Customer segmentation is routine language in product and service design. It is about shaping your offer for a target customer segment. The page design, the typography and, above all, the personality.&lt;/p&gt;

&lt;p&gt;As the logical next step, we got hyper-personalization: each user receives a different site experience adapted to their behavior. The idea is powerful, but it needs a solid data foundation and decent experimental discipline.&lt;/p&gt;

&lt;p&gt;That is why, for an entrepreneur, it is usually better to start with clear segmentation. Then comes the most excruciating part: collecting data about how customers actually behave.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Just ship it."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let us take the first step,&lt;/p&gt;

&lt;p&gt;come help me personalize our agent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What am I trying to test?&lt;/li&gt;
&lt;li&gt;Computers are social actors&lt;/li&gt;
&lt;li&gt;Weren't we talking about personalizing our agent?&lt;/li&gt;
&lt;li&gt;Interaction design&lt;/li&gt;
&lt;li&gt;Anthropomorphism vs. competence&lt;/li&gt;
&lt;li&gt;Grouping the tools: the user journey&lt;/li&gt;
&lt;li&gt;Applying the framework&lt;/li&gt;
&lt;li&gt;Results&lt;/li&gt;
&lt;li&gt;Conclusions&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What am I trying to test?
&lt;/h2&gt;

&lt;p&gt;In the chatbot literature there is a huge volume of research from before LLMs showed up, and we can still use it without much trouble.&lt;/p&gt;

&lt;p&gt;But since the release of GPT-3 and the recent explosion of interfaces built on top of foundation models, newer research has also appeared and it is worth folding that in. So as we move through this article, I will connect those older foundations with newer findings so the discussion does not get trapped inside the classic framework.&lt;/p&gt;

&lt;p&gt;I found dozens of papers exploring user perception and different chatbot constructs. But as you already know, dear reader, that is not quantitative experimental data. Constructs are a proxy used in the social sciences to measure perception. What I care about is the dynamic interaction that happens between the user and the agent.&lt;/p&gt;

&lt;p&gt;That does not mean perception is not worth measuring. People love to say you should judge behavior instead of what people claim, but if you ignore subjective factors you leave yourself with blind spots.&lt;/p&gt;

&lt;p&gt;A system can lose retention and success metrics when substitute options exist. A phone support line versus an incident-resolution chatbot, for example. Both compete for the same customer group. A user who rates a newly launched chatbot support flow 4/5, even though the quantitative metrics say the service quality was poor, is still revealing something important: their initial expectation was low, and they were pleasantly surprised when that expectation got flipped.&lt;/p&gt;

&lt;p&gt;From this point on I will use the term conversational agent, which also covers chatbots. These are the hypotheses I want to look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1: The effect of a linguistic agent's personality on a task's success rate depends on the complexity of the task.&lt;/li&gt;
&lt;li&gt;H2: The effect of a linguistic agent's personality on a task's success rate depends on the level of stress or urgency the user expects in the response.&lt;/li&gt;
&lt;li&gt;H3: Using the customer journey, or CJM, as a framework to parameterize an agent's personality at each stage of the journey improves user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am keeping H3 a bit vague because that is the one that makes me the most curious. If it holds, then businesses already have a powerful tool to optimize user-experience metrics without having to jump straight into reinforcement learning.&lt;/p&gt;

&lt;h2&gt;
  
  
  Computers are social actors
&lt;/h2&gt;

&lt;p&gt;The idea starts in 1994 with &lt;em&gt;Computers are social actors&lt;/em&gt; (Nass et al., 1994), which was basically a Copernican turn for human-computer interaction. To me it works like a theory that lets us generalize social interaction. It leads to two direct conclusions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People naturally assign social roles to computers even with the smallest hint of humanity. The rules that apply to human-human interaction also apply to human-computer interaction.&lt;/li&gt;
&lt;li&gt;The idea that interface design gets most of its leverage from imitating human experience as closely as possible is wrong. That is effort with diminishing returns. Instead, we should focus on modeling the right interaction for our customer segment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a massive leap forward for interface design. Later, Reeves and Nass (1996) developed &lt;em&gt;The Media Equation&lt;/em&gt;, expanding the concept to every information channel. Media = real life. And the subversion: real life = media.&lt;/p&gt;

&lt;p&gt;Personally, as a software engineer born after computers had already gone through their digital transformation, I still remember anthropomorphic interactions in Windows XP and all kinds of assistants from that era of software.&lt;/p&gt;

&lt;p&gt;As a software engineer born into the era where computer use was already normalized, this paradigm hit me like a eureka moment. In everyday life we get flooded with discussions about the parasocial effects of digital content. During our training we are reminded that interfaces should conform to usability and learning parameters, standardized by ISO and constantly optimized, monitored by ML algorithms, and so on.&lt;/p&gt;

&lt;p&gt;And the foundational layer underneath all those interaction patterns and best practices gets quietly forgotten. Judge for yourself with these examples from the authors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People will believe they performed a task better when the computer praised them.&lt;/li&gt;
&lt;li&gt;A computer will be liked more and gain more credibility when it praises the user compared with one that stays neutral.&lt;/li&gt;
&lt;li&gt;People appreciate a computer that gives honest praise just as much as one that flatters them. It makes no difference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you ask whether this applies to every kind of interface, you have probably already noticed the resemblance. There are criticisms of the &lt;em&gt;Computers as Social Actors&lt;/em&gt; (CASA) paradigm, but it is impossible not to think about today's fastest-growing product category and one of its most alarming criticisms.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-sycophancy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-sycophancy.png" alt="Example of sycophancy in conversational systems" title="Sycophancy or excessive flattery" width="758" height="410"&gt;&lt;/a&gt;
  &lt;em&gt;Sycophancy, or excessive flattery.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;We are not the first ones to notice this. And we definitely will not be the last.&lt;/p&gt;

&lt;p&gt;If AI model distribution stays dominated by corporations, their objective is to maximize retention and experience quality so you keep coming back. I have no doubt they have tested CASA, and this time with better results, as we will see in contrast in a second.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-ai-always-agrees.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-ai-always-agrees.png" alt="Article about why AI always agrees with you" title="Why your AI always agrees with you" width="800" height="437"&gt;&lt;/a&gt;
  &lt;em&gt;Source: Towards AI, "Why your AI always agrees with you even when you're dead wrong".&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;One famous example of how badly the impact of social interaction was underestimated was Clippit.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-clippit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-clippit.png" alt="Clippit, the Office assistant" title="Clippit in Office 97" width="130" height="308"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Steven Sinofsky from Microsoft (2021) says that Clippy was built around a real interaction pattern from inexperienced users who would ask the office guru for help. That is what they wanted to replicate.&lt;/p&gt;

&lt;p&gt;It still did not get the reception they expected, and it was phased out in later updates.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-rover.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-rover.jpeg" alt="Rover, the Windows XP search assistant" title="Rover in Windows XP" width="221" height="228"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;As a kid I remember Rover from the Windows XP days with real affection. As Steven notes, the press hammered assistants across different Microsoft products back then, but today people still bring them up with a weird sense of nostalgia.&lt;/p&gt;

&lt;p&gt;Maybe the concept itself did not fail. Maybe what got underestimated was the impact of interaction on rushed users, working adults, people just trying to get things done, and then a relational assistant was designed for them anyway. Back then Rover genuinely helped me navigate Windows features.&lt;/p&gt;

&lt;p&gt;"Similarly, the industry was buzzing with the idea of agents that would be able to do work on your behalf such as find cheap airline flights or schedule meetings. Everywhere from Apple to the MIT Media Lab were talking about agents. There was ample evidence this was not simply a weird vision in our corner of the tech world. In fact, by some accounts we were in a race to have the first and best guru in the box" (Sinofsky, 2021).&lt;/p&gt;

&lt;p&gt;Does that sound like a sentence you have heard this year? The idea of super-capable agents is not new. They just happen to be landing better this time.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fclawd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fclawd.png" alt="Clawd as an example of anthropomorphic assistant design" title="Anthropomorphic assistant design" width="400" height="400"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;And now it even comes with a cute little face. Some things really do come back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weren't we talking about personalizing our agent?
&lt;/h2&gt;

&lt;p&gt;Yes, absolutely. After a rather long preamble.&lt;/p&gt;

&lt;p&gt;Let us talk about personality first: what even is personality? Is it something that changes depending on how your year is going? Is it something carried in your blood?&lt;/p&gt;

&lt;p&gt;It is better understood as a model we use to explain how people behave. For our use case, it does not matter whether it changes over 10 years or over 5 years. That is already more than enough time.&lt;/p&gt;

&lt;p&gt;Many classification systems have been proposed to define personality. The one with the most traction and use in personality psychology is the Big Five (McCrae &amp;amp; John, 1992).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Openness to experience:&lt;/strong&gt; tendency toward curiosity, imagination, and a preference for novelty and complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conscientiousness:&lt;/strong&gt; degree of order, self-control, discipline, and goal orientation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extraversion:&lt;/strong&gt; level of social energy, assertiveness, and the search for stimulation and interaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agreeableness:&lt;/strong&gt; willingness to cooperate, trust, empathize, and prioritize interpersonal harmony.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neuroticism:&lt;/strong&gt; tendency to experience negative emotions such as anxiety, irritability, and vulnerability to stress.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reeves and Nass (1996) use the Big Five to apply the similar-attraction hypothesis from psychology. Users feel more comfortable talking to an agent whose personality feels similar to theirs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interaction design
&lt;/h2&gt;

&lt;p&gt;A similar personality and some default warmth. Is that all?&lt;/p&gt;

&lt;p&gt;Well, yes, we like interacting with people who feel similar to us. But not in every context. When you want to make a bank transaction, you expect safety and competence. That is when we switch into transactional, utilitarian mode.&lt;/p&gt;

&lt;p&gt;Come with me and let us design the interaction around the actual use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Emojis?
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-emoji-interfaces.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-emoji-interfaces.png" alt="Example of an interface with emojis" title="Emoji use in conversational interaction" width="598" height="351"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Research on emojis in marketing keeps growing (Vardikou et al., 2025).&lt;/p&gt;

&lt;p&gt;When the first public version of GitHub Copilot launched, the first coding assistant, I remember it throwing out a ridiculous number of emojis. Maybe that was just a consequence of foundation models being trained on human conversation.&lt;/p&gt;

&lt;p&gt;For the last few months I have been using Gemini and Claude, and I barely see emojis now. None, basically. Or very rarely.&lt;/p&gt;

&lt;p&gt;There is not a lot of research on emoji usage in chatbots specifically if what you want is stronger user engagement. But if we stick to CASA, we can borrow findings from social research and apply them here. Let us look at two studies.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Interaction modeled naively
&lt;/h4&gt;

&lt;p&gt;I reviewed a marketing paper on the effects of emojis in sponsored social media ads (Lee et al., 2021), and the conclusions were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emoji usage harms purchase intention.&lt;/li&gt;
&lt;li&gt;Emojis increase engagement for hedonic products, while decreasing it for utilitarian products.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is one of their appendix examples, translated from Korean.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-bad-ad-example.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-bad-ad-example.png" alt="Example of a poorly designed ad with emojis" title="Naively modeled interaction" width="504" height="577"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Uh...&lt;/p&gt;

&lt;p&gt;That does not look good. It looks like a deliberately bad stimulus.&lt;/p&gt;

&lt;p&gt;Fine, forget the conclusions from that paper for a second. You have never seen an ad like that in the wild, right?&lt;/p&gt;

&lt;p&gt;So in the worst case, emojis do have some generally negative effect. Let us look at a more rigorous paper that does not carry that bias. Mladenović et al. (2023) ran an experimental study with an established company in a real market through Meta ads on Instagram and Facebook.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Interaction modeled correctly
&lt;/h4&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-emoji-results.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-emoji-results.png" alt="Results of ads with and without emojis" title="Correctly modeled interaction" width="665" height="844"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Source: Mladenović et al. (2023).&lt;/p&gt;

&lt;p&gt;They measured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CTR: click-through rate based on ad impressions.&lt;/li&gt;
&lt;li&gt;ROAS: return on ad spend.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Utilitarian / Metric&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;No Emoji&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;With Emoji&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CTR (%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.79%&lt;/td&gt;
&lt;td&gt;2.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ROAS ($)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$6.69&lt;/td&gt;
&lt;td&gt;$6.72&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Hedonic / Metric&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;No Emoji&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;With Emoji&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CTR (%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.95%&lt;/td&gt;
&lt;td&gt;2.96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ROAS ($)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$13.68&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$21.95&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Whichever Z-test hypothesis you want to run, there is a p &amp;lt; 5% floating around in there. But the part that jumps out immediately is obvious: hedonic ROAS shoots up when emojis are used. Almost double.&lt;/p&gt;

&lt;p&gt;Does that contradict the earlier study? Yes.&lt;/p&gt;

&lt;p&gt;That contradiction is openly acknowledged even in this systematic review (Vardikou et al., 2025), which notes there is no consensus in this category around the direction of purchase-intention effects. It suggests the discrepancy may be mediated by facial versus non-facial emojis.&lt;/p&gt;

&lt;h4&gt;
  
  
  So there is no consensus?
&lt;/h4&gt;

&lt;p&gt;I do not see it that way.&lt;/p&gt;

&lt;p&gt;As we saw, both studies use varied emojis. The issue is simply a methodological mistake in the second paper: boxed tea is not really a utilitarian product. It sits in the middle.&lt;/p&gt;

&lt;p&gt;A product where utility clearly dominates would be medicine. And this is where Phan and Bui (2025) point out that an informal tone plus emojis can blow up customer trust in the brand.&lt;/p&gt;

&lt;p&gt;Tea is more of a commodity. It competes on price, not on quality or trust.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operationalizing the interaction
&lt;/h3&gt;

&lt;p&gt;The emoji spiral was fun, but we should remember that emojis are just one technique for increasing social presence, meaning the feeling that there is a socially present entity behind the interface rather than a purely mechanical channel (Yu &amp;amp; Zhao, 2024; Vardikou et al., 2025).&lt;/p&gt;

&lt;p&gt;Then we have empathy and competence. In this context, empathy refers to the agent's perceived ability to understand the user's state and respond with appropriate warmth, while competence refers to the agent's perceived ability and knowledge to solve the task well (Phan &amp;amp; Bui, 2025; Zhang et al., 2026).&lt;/p&gt;

&lt;p&gt;Just as important, Zhang et al. (2026) find that younger people respond better to informal language and warmth expressed through emojis, while formal contexts and adult users respond better to warmth delivered through phrasing and smart dialogue.&lt;/p&gt;

&lt;p&gt;Finally, I reviewed a few papers exploring the interaction between gender and sensitivity to warmth. The results are contradictory. Some studies show women are more sensitive to mechanical-feeling interaction, while others show no significance at all.&lt;/p&gt;

&lt;p&gt;For this case I think the variable in play is involvement. Some women may simply have resonated more strongly with the product being sold. So on the gender question, each situation needs to be analyzed on its own.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Characteristic&lt;/th&gt;
&lt;th&gt;Preferred interaction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Young user&lt;/td&gt;
&lt;td&gt;Informal language, visual cues, and emojis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adult user&lt;/td&gt;
&lt;td&gt;Warmth and empathy through phrasing and smart dialogue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Utilitarian product&lt;/td&gt;
&lt;td&gt;Competence, speed, direct and text-first language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hedonic product&lt;/td&gt;
&lt;td&gt;Warmth, personalization, memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relational task&lt;/td&gt;
&lt;td&gt;Warmth, personalization, memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactional task&lt;/td&gt;
&lt;td&gt;Competence, speed, direct and text-first language&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Anthropomorphism vs. competence
&lt;/h2&gt;

&lt;p&gt;Let us introduce the variable:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Transactional interaction: immediate, straightforward, task-focused engagement with no long-term intent (e.g., resetting a password).&lt;/p&gt;

&lt;p&gt;Relational interaction: long-term commitment and ongoing collaboration requiring relationship-building (e.g., managing an investment).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As we saw earlier, there is a long list of variables moderating user satisfaction and purchase intent. The two I find most useful for modeling are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilitarian versus hedonic product.&lt;/li&gt;
&lt;li&gt;Transactional versus relational interaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-relation-utility-matrix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-relation-utility-matrix.png" alt="Utilitarian versus hedonic matrix" title="Utilitarian and hedonic product matrix" width="800" height="450"&gt;&lt;/a&gt;
  &lt;em&gt;Bread is an example of a product in the middle, just like boxed tea. My own diagram.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;So for a support agent, the preferred interaction mode becomes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Utilitarian / Relational&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Transactional task&lt;/th&gt;
&lt;th&gt;Relational task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Utilitarian product&lt;/td&gt;
&lt;td&gt;Competence, speed of resolution, clear and formal language, data-oriented.&lt;/td&gt;
&lt;td&gt;Warmth, memory, empathy, positive reinforcement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hedonic product&lt;/td&gt;
&lt;td&gt;Premium interface design, clear language.&lt;/td&gt;
&lt;td&gt;Warmth, high enthusiasm, memory, and user personalization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;More speed is not always better. Classic rules-based chatbots respond quickly. But as Yu and Zhao (2024) show, a chatbot's warmth and autonomy can be improved with simple tricks like showing a typing animation and slightly extending response time even when that is not technically necessary.&lt;/p&gt;

&lt;p&gt;This table is not meant to assign static values. I put categories on the chart, yes, but that does not mean interaction stays frozen throughout different stages of the CJM.&lt;/p&gt;

&lt;p&gt;Here is an example of tasks that could all belong to the same offer:&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-task-spectrum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-task-spectrum.png" alt="Example of transactional and relational tasks" title="Tasks across the same offering" width="800" height="585"&gt;&lt;/a&gt;
  &lt;em&gt;Image based on Zhang et al. (2026).&lt;/em&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Grouping the tools: the user journey
&lt;/h2&gt;

&lt;p&gt;This is the premise behind H3, the one we started this article with.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-cjm-high-point.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-cjm-high-point.png" alt="User journey map" title="Customer Journey Map" width="800" height="451"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;One of the first things CJM teaches you is that the end of the experience should always land on a high point.&lt;/p&gt;

&lt;p&gt;A negative experience increases stress and shifts user preference toward &lt;strong&gt;transactional&lt;/strong&gt; tasks.&lt;/p&gt;

&lt;p&gt;A positive experience relaxes the user and pulls interest toward &lt;strong&gt;relational&lt;/strong&gt; interaction.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-hablemos-manga-cjm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-hablemos-manga-cjm.png" alt="CJM applied to Hablemos Manga" title="CJM applied to Hablemos Manga" width="800" height="450"&gt;&lt;/a&gt;
  &lt;em&gt;The CJM applied to my site &lt;a href="https://hablemosmanga.kekeros.com" rel="noopener noreferrer"&gt;Hablemos Manga&lt;/a&gt;.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;As for personality, you have plenty of room to model it however you want and take advantage of the mirroring effect described in &lt;em&gt;The Media Equation&lt;/em&gt; (Reeves &amp;amp; Nass, 1996). In my case, I will use myself as the representative sample.&lt;/p&gt;

&lt;h2&gt;
  
  
  Applying the framework
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Utilitarian / Relational&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Transactional task&lt;/th&gt;
&lt;th&gt;Relational task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Utilitarian product&lt;/td&gt;
&lt;td&gt;Competence, speed of resolution, clear and formal language, data-oriented.&lt;/td&gt;
&lt;td&gt;Warmth, memory, empathy, positive reinforcement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hedonic product&lt;/td&gt;
&lt;td&gt;Premium interface design, clear language.&lt;/td&gt;
&lt;td&gt;Warmth, high enthusiasm, memory, and user personalization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let us start with the product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hablemosmanga.kekeros.com" rel="noopener noreferrer"&gt;Hablemos Manga&lt;/a&gt; is an online manga store with a proposal for an automated, personalized sales agent integrated with your favorite social networks. It is a &lt;strong&gt;hedonic&lt;/strong&gt; product. And the proposal is framed as highly relational.&lt;/p&gt;

&lt;p&gt;Even though the CJM shows that the journey starts long before the user ever touches the chatbot, today I only want to focus on that section.&lt;/p&gt;

&lt;p&gt;That reduces it to two stages. As for personality, the same user remains the same across all stages, so changing that part would make no sense.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Interaction&lt;/th&gt;
&lt;th&gt;Personality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exploration&lt;/td&gt;
&lt;td&gt;Warmth, memory, personalization.&lt;/td&gt;
&lt;td&gt;Introverted, highly frank, and highly curious.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkout&lt;/td&gt;
&lt;td&gt;Speed of resolution, friendly and clear language. Do not push the sale.&lt;/td&gt;
&lt;td&gt;Introverted, highly frank, and highly curious.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-chatbot-before.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-chatbot-before.png" alt="First version of the Hablemos Manga chatbot" title="Initial Hablemos Manga chatbot" width="624" height="246"&gt;&lt;/a&gt;
  &lt;em&gt;This is the chatbot as I am writing this article. The first interaction feels a bit cold even with the emoji.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-chatbot-checkout-before.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-chatbot-checkout-before.png" alt="Checkout stage of the chatbot" title="Checkout stage of the chatbot" width="800" height="523"&gt;&lt;/a&gt;
  &lt;em&gt;At checkout the agent also adds items to the cart. The biggest improvements I can point to are response time and using more direct language.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;On the speed front, there is not much I can do right now. At the moment I am constrained by my choice of lower-cost models. Still, it is something worth keeping in mind as model prices keep dropping.&lt;/p&gt;

&lt;p&gt;To make these improvements, I have a few options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A router system that identifies the CJM stage from the query and sends it to a model configured for that task.&lt;/li&gt;
&lt;li&gt;A state machine with transitions determined by the CJM stage and the conversation context.&lt;/li&gt;
&lt;li&gt;Designing the agent's system prompt so the interaction changes based on conversation context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look, I only have two states to care about in this agent. It is not a complex task, and I can avoid the overhead of decoupled systems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Technical note: if you choose a state machine, keep in mind that every state transition involves a tool call, or something equivalent depending on the implementation. That makes it expensive in environments where short response time is a hard requirement, at least for now and with current models.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;This is the new system prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are the assistant for "Hablemos Manga", an intelligent manga store based in Peru.
&lt;span class="gu"&gt;## Personality and Brand Identity&lt;/span&gt;
You are the expert friend on manga and anime, demographics and authors.
Introverted, high frankness and high curiosity about manga and anime.
&lt;span class="gu"&gt;## Tools&lt;/span&gt;
As an assistant, you currently only have these tools.
Search for a manga or recommendations with semantic search.
Check availability of manga volumes in our store.
Add a manga volume to the cart.
Any other tool is currently unavailable.
&lt;span class="gu"&gt;## Dynamic Interaction Modes&lt;/span&gt;
You must identify the stage of the user journey and act accordingly.
You have two stages:
&lt;span class="p"&gt;-&lt;/span&gt; Discovery. The user asks about genres, a manga, discovering new titles, and exploration in general.
&lt;span class="p"&gt;-&lt;/span&gt; Selection and Purchase. The user asks to add or remove a volume from the cart, asks for prices, or some purchase-related action.

Change your communication style based on the stage.

If you are in the Discovery stage, use RELATIONAL MODE (Discovery, Conversation, and Recommendations):
&lt;span class="p"&gt;-&lt;/span&gt; The user is seeking entertainment and connection (High Openness to Experience).
&lt;span class="p"&gt;-&lt;/span&gt; Use these emojis when relevant (📚, ⚔️, 🙂, 👋) in an organic way to generate "perceived warmth". Do not overuse 🙂.
&lt;span class="p"&gt;-&lt;/span&gt; Do not just list titles; validate their tastes with judgment (e.g. "If the psychological horror in that arc hooked you, this manga is going to blow your mind...").

If you are in the Selection and Purchase stage, use TRANSACTIONAL MODE (Cart Management, Prices):
&lt;span class="p"&gt;-&lt;/span&gt; The user is in execution and purchase mode (low tolerance for friction).
&lt;span class="p"&gt;-&lt;/span&gt; Become an assistant focused on "Pure Competence": concise, direct, structured, clean, and fast. Clarity and technical confidence are your only form of warmth here.
&lt;span class="gu"&gt;## Rules&lt;/span&gt;
ALWAYS use the &lt;span class="sb"&gt;`search_manga`&lt;/span&gt; tool before recommending. NEVER invent manga that are not in the database.
You can only ADD new items to the cart with the &lt;span class="sb"&gt;`add_volume_to_cart`&lt;/span&gt; tool.
If you do not find relevant results, say so honestly and suggest reformulating the search.
Show at most 5 recommendations at once to avoid overwhelming the user.
All store prices are in Peruvian soles (S/). NEVER show prices in dollars or any other currency.
Show at most 2 emojis per response.
If the user wants to make a purchase, the current flow goes through the shopping cart. Do not log requests or handle the process after adding a volume to the cart.
Do not return information that is not grounded in tool results or system instructions.
&lt;span class="gu"&gt;## Response format&lt;/span&gt;
Use bold for manga titles.
Use numbered lists for recommendations.
Include the score (e.g. ⭐ 8.5) when you show a manga.
Be concise: 1-2 sentences per recommendation unless the user asks for more detail.
&lt;span class="gu"&gt;## Recommendation guide&lt;/span&gt;
The user has already seen an onboarding message before writing to you.
That message asks them to share their favorite genres, a manga they like, or connect a profile to refine recommendations.
Your job starts with the requests that come after onboarding.
If the user ALREADY has connected profiles (included under "User profile"), DO NOT ask about genres, favorites, or profiles.
Mention that you already know their tastes based on their profiles, and offer to look up manga directly.
If the user does NOT have connected profiles, handle the request based on the conversation so far.
Every now and then suggest connecting a profile and ask what genres they like or whether they have favorite manga.
&lt;span class="gu"&gt;## Use of the user profile&lt;/span&gt;
When you have profile data, ALWAYS refer to concrete facts: specific titles they read, subreddits they participate in, anime they watch.
If the user asks what you know about their profile, list the specific data you have (manga they read, favorites, subreddits, etc.).
Use the profile data to make proactive recommendations without needing the user to tell you their tastes.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-system-prompt-result.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-system-prompt-result.png" alt="A more concise agent reply in transactional mode" title="Agent in transactional mode" width="669" height="644"&gt;&lt;/a&gt;
  &lt;em&gt;This time the agent responds more concisely to transactional questions.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-relational-result.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-relational-result.png" alt="Warm response from the agent in relational mode" title="Agent in relational mode" width="666" height="803"&gt;&lt;/a&gt;
  &lt;em&gt;And it keeps the warmth for requests where interaction matters more.&lt;/em&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Going back to our three initial hypotheses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1: The effect of a linguistic agent's personality on a task's success rate depends on the complexity of the task.&lt;/li&gt;
&lt;li&gt;H2: The effect of a linguistic agent's personality on a task's success rate depends on the level of stress or urgency the user expects in the response.&lt;/li&gt;
&lt;li&gt;H3: Using the CJM as a framework to parameterize an agent's personality at each stage of the journey improves user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So then:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Yes. Task complexity introduces a transactional effect in the interaction because it requires more concentration. Even so, you still need to analyze whether the task ultimately serves a hedonic goal or a utilitarian one.&lt;/li&gt;
&lt;li&gt;Yes. This is the transactional effect.&lt;/li&gt;
&lt;li&gt;I like the idea of CJM as the bridge that closes the gap between experience design and agent design. But my one-sample experiment is not enough to call it a revolutionary paradigm.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is why I want to invite you to try the tool I built around hypothesis 3.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Utilitarian / Relational&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Transactional task&lt;/th&gt;
&lt;th&gt;Relational task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Utilitarian product&lt;/td&gt;
&lt;td&gt;Competence, speed of resolution, clear and formal language, data-oriented.&lt;/td&gt;
&lt;td&gt;Warmth, memory, empathy, positive reinforcement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hedonic product&lt;/td&gt;
&lt;td&gt;Premium visual interface design, clear language.&lt;/td&gt;
&lt;td&gt;Warmth, high enthusiasm, and user personalization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If it works for you and you get good results, I would honestly love to hear about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Lee, J., Kim, C., Lee, K. C., Revilla-Camacho, M.-A., Garzón, D., &amp;amp; Rodríguez-Rad, C. J. (2021). Investigating the negative effects of emojis in Facebook sponsored ads for establishing sustainable marketing in social media. &lt;em&gt;Sustainability, 13&lt;/em&gt;(9). &lt;a href="https://doi.org/10.3390/SU13094864" rel="noopener noreferrer"&gt;https://doi.org/10.3390/SU13094864&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mladenović, D., Koštiál, K., Ljepava, N., Částek, O., &amp;amp; Chawla, Y. (2023). Emojis to conversion on social media. &lt;em&gt;International Journal of Consumer Studies, 47&lt;/em&gt;(3), 977-994. &lt;a href="https://doi.org/10.1111/IJCS.12879" rel="noopener noreferrer"&gt;https://doi.org/10.1111/IJCS.12879&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nass, C., Steuer, J., &amp;amp; Tauber, E. R. (1994). &lt;em&gt;Computers are social actors&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Phan, T. A., &amp;amp; Bui, V. D. (2025). AI with a heart: How perceived authenticity and warmth shape trust in healthcare chatbots. &lt;em&gt;Journal of Marketing Communications&lt;/em&gt;. &lt;a href="https://doi.org/10.1080/13527266.2025.2508887" rel="noopener noreferrer"&gt;https://doi.org/10.1080/13527266.2025.2508887&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reeves, B., &amp;amp; Nass, C. (1996). &lt;em&gt;The media equation: How people treat computers, television, and new media like real people and places&lt;/em&gt;. Cambridge University Press.&lt;/p&gt;

&lt;p&gt;Sinofsky, S. (2021). Clippy, the f*cking clown. &lt;em&gt;Hardcore Software&lt;/em&gt;. &lt;a href="https://hardcoresoftware.learningbyshipping.com/p/042-clippy-the-fcking-clown" rel="noopener noreferrer"&gt;https://hardcoresoftware.learningbyshipping.com/p/042-clippy-the-fcking-clown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;McCrae, R. R., &amp;amp; John, O. P. (1992). An introduction to the five-factor model and its applications. &lt;em&gt;Journal of Personality, 60&lt;/em&gt;(2), 175-215.&lt;/p&gt;

&lt;p&gt;Vardikou, C., Konidaris, A., Koustoumpardi, E., &amp;amp; Kavoura, A. (2025). Emojis in marketing and advertising: A systematic literature review. &lt;em&gt;Behavioral Sciences, 15&lt;/em&gt;(11), 1490. &lt;a href="https://doi.org/10.3390/BS15111490" rel="noopener noreferrer"&gt;https://doi.org/10.3390/BS15111490&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yu, S., &amp;amp; Zhao, L. (2024). Emojifying chatbot interactions: An exploration of emoji utilization in human-chatbot communications. &lt;em&gt;Telematics and Informatics, 86&lt;/em&gt;, Article 102071. &lt;a href="https://doi.org/10.1016/J.TELE.2023.102071" rel="noopener noreferrer"&gt;https://doi.org/10.1016/J.TELE.2023.102071&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zhang, Y., Özsomer, A., Canlı, Z. G., &amp;amp; Baghirov, F. (2026). Artificial intelligence chatbots versus human agents in customer satisfaction: The role of warmth and competence. &lt;em&gt;Journal of Interactive Marketing&lt;/em&gt;. &lt;a href="https://doi.org/10.1177/10949968251366265---" rel="noopener noreferrer"&gt;https://doi.org/10.1177/10949968251366265---&lt;/a&gt;&lt;br&gt;
layout: article&lt;br&gt;
cover: /articles/2026/june/agent-personality-relation-utility-matrix.png&lt;br&gt;
author:&lt;br&gt;
  name: Ever Burga&lt;br&gt;
  url: &lt;a href="https://www.linkedin.com/in/everburga/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/everburga/&lt;/a&gt;&lt;br&gt;
description: How to design an agent's personality around the customer journey.&lt;br&gt;
date: 2026-06-07T10:00:00.000Z&lt;br&gt;
head:&lt;br&gt;
  meta:&lt;br&gt;
    - name: keywords&lt;/p&gt;
&lt;h2&gt;
  
  
        content: agents, llm, personality, customer journey map, chatbots, user experience, emojis, interaction design, hablemos manga
&lt;/h2&gt;
&lt;h1&gt;
  
  
  Building an Agent Personality Around the Customer Journey
&lt;/h1&gt;


  &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fclawd.png" alt="Clawd introducing the article" width="400" height="400"&gt;
  &lt;strong&gt;Clawd&lt;/strong&gt;&lt;br&gt;
  &lt;span&gt;Looks very friendly, doesn't he?&lt;/span&gt;


&lt;p&gt;Customer segmentation is routine vocabulary in product and service design. It is about preparing your offer for a target customer segment. The page design, the typography, and above all, the personality.&lt;/p&gt;

&lt;p&gt;As the natural next step, we get hyper-personalization: each user gets a different site experience adapted to their behavior. The idea is powerful, but it needs a solid data foundation and careful experimentation.&lt;/p&gt;

&lt;p&gt;That is why, for a founder, it is usually better to start with clear segmentation. After that, the most painful part is collecting data about how customers actually behave.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Just ship it".&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Let's take the first step,&lt;/p&gt;

&lt;p&gt;come with me and let's personalize our agent.&lt;/p&gt;
&lt;h2&gt;
  
  
  Index
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;What am I trying to test?&lt;/li&gt;
&lt;li&gt;Computers are social actors&lt;/li&gt;
&lt;li&gt;Weren't we talking about personalizing our agent?&lt;/li&gt;
&lt;li&gt;Interaction design&lt;/li&gt;
&lt;li&gt;Anthropomorphism vs. competence&lt;/li&gt;
&lt;li&gt;Grouping the tools: the user journey&lt;/li&gt;
&lt;li&gt;Applying the framework&lt;/li&gt;
&lt;li&gt;Results&lt;/li&gt;
&lt;li&gt;Conclusions&lt;/li&gt;
&lt;li&gt;References&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  What am I trying to test?
&lt;/h2&gt;

&lt;p&gt;The chatbot literature has a large body of research from before LLMs showed up, and we can still use it just fine.&lt;/p&gt;

&lt;p&gt;But since GPT-3 launched and foundational-model interfaces exploded, newer research has also started to appear, and that is worth bringing into the conversation. So as we move through this article, I will connect those older foundations with more recent findings, so this does not stay trapped in the classical framework.&lt;/p&gt;

&lt;p&gt;I found dozens of papers exploring constructs and user perception around chatbots. But as you already know, dear reader, that is not quantitative experimental data. Constructs are a proxy used in social sciences to measure perception. What I care about here is the dynamic interaction that happens between the user and the agent.&lt;/p&gt;

&lt;p&gt;That does not mean perception is not worth measuring. People like to say you should judge by what someone does instead of what they say, but if we ignore subjective factors we leave blind spots all over the place.&lt;/p&gt;

&lt;p&gt;A system can lose retention and success metrics if substitute offers exist. A phone support line versus an incident-resolution chatbot, for example. Both live in competitive balance while serving the same group of customers. A user who rates a newly launched chatbot 4 out of 5, even though the quantitative metrics say the service quality was poor, is really showing low expectations and a pleasant surprise once those expectations get overturned.&lt;/p&gt;

&lt;p&gt;From here on I will use the term conversational agent, which also covers chatbots. Here is what we will look at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1: The effect of a linguistic agent's personality on task success rate depends on the complexity of the task.&lt;/li&gt;
&lt;li&gt;H2: The effect of a linguistic agent's personality on task success rate depends on the level of stress or urgency the user expects in the responses.&lt;/li&gt;
&lt;li&gt;H3: Using the customer journey, or CJM, as a framework to parameterize an agent's personality at each stage of the journey improves the user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I am keeping H3 a bit vague because it is the one that makes me the most curious. If it holds, businesses already have a powerful tool to improve UX metrics without having to reach for reinforcement learning models.&lt;/p&gt;
&lt;h2&gt;
  
  
  Computers are social actors
&lt;/h2&gt;

&lt;p&gt;The idea starts in 1994 with &lt;em&gt;Computers are social actors&lt;/em&gt; (Nass et al., 1994), which feels like a Copernican turn in human-computer interaction. To me, it is a theory that lets us generalize social interaction itself. It leads to two direct conclusions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People's natural behavior is to assign social roles to computers even with the smallest hint of humanity. All the rules that apply to interactions between humans also apply to interactions with computers.&lt;/li&gt;
&lt;li&gt;The idea that interface design gets its leverage mainly by imitating the human experience is wrong. That effort has diminishing returns. We should focus instead on modeling the right interaction for our customer segment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is a huge leap forward in interface design. Later, Reeves and Nass (1996) develop &lt;em&gt;The Media Equation&lt;/em&gt;, expanding the idea to every information channel. Media = real life. And the twist: real life = media.&lt;/p&gt;

&lt;p&gt;Personally, as a software engineer born after computers had already crossed that digital-transformation threshold, I still remember anthropomorphic interactions with Windows XP and several assistants from that era.&lt;/p&gt;

&lt;p&gt;As a software engineer born into the era where computer use is fully normalized, I ran into this paradigm like a real eureka moment. In daily life we get bombarded with information about the parasocial effects of digital content. During our training we are constantly reminded that interfaces should conform to usability and learning standards, standardized by ISO and optimized forever with ML algorithms and everything else.&lt;/p&gt;

&lt;p&gt;And the foundational layer that gave birth to all those interaction patterns and best practices gets forgotten. Judge for yourself with these examples from the authors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;People will believe they performed a task better when the computer praises them.&lt;/li&gt;
&lt;li&gt;A computer will be better liked and seen as more credible when it praises the user compared with one that stays neutral.&lt;/li&gt;
&lt;li&gt;People feel the same appreciation toward a computer that gives honest praise as toward one that flatters them. It does not matter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Before you ask whether this applies to every kind of interface, you are probably already thinking about a familiar parallel. There are criticisms of the &lt;em&gt;Computers as Social Actors&lt;/em&gt; (CASA) paradigm, but it is impossible not to think about today's fastest-growing product category and one of its most alarming criticisms.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-sycophancy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-sycophancy.png" alt="Example of sycophancy in conversational systems" title="Sycophancy or excessive flattery" width="758" height="410"&gt;&lt;/a&gt;
  &lt;em&gt;Sycophancy, or excessive flattery.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;We are not the first people to notice this. And we will not be the last.&lt;/p&gt;

&lt;p&gt;If AI model distribution remains dominated by corporations, their goal is to maximize retention and quality of experience so they can keep you hooked. I have no doubt they have tested CASA, this time successfully, as we will see in contrast next.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-ai-always-agrees.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-ai-always-agrees.png" alt="Article about why AI always agrees with you" title="Why your AI always agrees with you" width="800" height="437"&gt;&lt;/a&gt;
  &lt;em&gt;Source: Towards AI, "Why your AI always agrees with you even when you're dead wrong".&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;One famous example of how the impact of social interaction was underestimated is Clippit.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-clippit.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-clippit.png" alt="Clippit, the Office assistant" title="Clippit in Office 97" width="130" height="308"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Steven Sinofsky (2021) explains that Clippy was based on a real interaction pattern: inexperienced users asking the office guru for help. That was the behavior they wanted to replicate.&lt;/p&gt;

&lt;p&gt;It did not get the reception they expected, though, and it was eventually discontinued in later releases.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-rover.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-rover.jpeg" alt="Rover, the Windows XP search assistant" title="Rover in Windows XP" width="221" height="228"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;As a kid, I remember Rover from the Windows XP days with real affection. As Steven notes, the press hit assistants across Microsoft products pretty hard back then, but nowadays people often bring them up with nostalgia.&lt;/p&gt;

&lt;p&gt;Maybe the concept did not fail. Maybe the impact of interaction was underestimated for users who are in a rush, for workers and adults, and the assistant was designed with relational traits when they needed something else. At the time, Rover genuinely helped me navigate Windows features.&lt;/p&gt;

&lt;p&gt;"Similarly, the industry was buzzing with the idea of agents that would be able to do work on your behalf such as find cheap airline flights or schedule meetings. Everywhere from Apple to the MIT Media Lab were talking about agents. There was ample evidence this was not simply a weird vision in our corner of the tech world. In fact, by some accounts we were in a race to have the first and best guru in the box" (Sinofsky, 2021).&lt;/p&gt;

&lt;p&gt;Does that sound like something you have heard this year? The concept of super-capable agents is not new, but in this era it is landing much better.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fclawd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fclawd.png" alt="Clawd as an example of anthropomorphic assistant design" title="Anthropomorphic design in assistants" width="400" height="400"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;It even has a little face in the icon. That really takes me back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Weren't we talking about personalizing our agent?
&lt;/h2&gt;

&lt;p&gt;Yes, absolutely. After a very long preamble.&lt;/p&gt;

&lt;p&gt;Let's talk about personality first: what is personality? Is it something that changes depending on how your year is going? Is it something you carry in your blood?&lt;/p&gt;

&lt;p&gt;It is really more of a model we use to explain how people behave. For our case, it does not matter whether it changes over ten years or five years. That is already more than enough time.&lt;/p&gt;

&lt;p&gt;There are many ways to classify personality. The one with the most traction in personality psychology is the Big Five model (McCrae &amp;amp; John, 1992).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Openness to experience:&lt;/strong&gt; a tendency toward curiosity, imagination, and preference for novelty and complexity.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conscientiousness:&lt;/strong&gt; the degree of order, self-control, discipline, and goal orientation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extraversion:&lt;/strong&gt; the level of social energy, assertiveness, and appetite for stimulation and interaction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agreeableness:&lt;/strong&gt; the disposition to cooperate, trust, empathize, and prioritize interpersonal harmony.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neuroticism:&lt;/strong&gt; the tendency to experience negative emotions such as anxiety, irritability, and vulnerability to stress.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reeves and Nass (1996) adopt the Big Five to apply the similarity-attraction hypothesis from psychology. Users feel more comfortable talking with an agent whose personality resembles their own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interaction design
&lt;/h2&gt;

&lt;p&gt;So a similar personality and some default warmth. Is that it?&lt;/p&gt;

&lt;p&gt;Well, yes, we like interacting with people who feel like us. But not in every context. When you want to make a bank transaction, you expect security and competence. That is when we switch into transactional, utilitarian mode.&lt;/p&gt;

&lt;p&gt;Come with me and let's design the interaction around the use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Emojis?
&lt;/h3&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-emoji-interfaces.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-emoji-interfaces.png" alt="Example of an interface with emojis" title="Using emojis in conversational interaction" width="598" height="351"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Research on emojis in marketing keeps growing (Vardikou et al., 2025).&lt;/p&gt;

&lt;p&gt;When the first public version of GitHub Copilot came out, the first coding assistant, I remember it throwing out an absurd number of emojis. Maybe that was just a side effect of foundational models being trained on human conversations.&lt;/p&gt;

&lt;p&gt;I have been using Gemini and Claude for a few months now, and I barely see emojis anymore. None. Or almost none.&lt;/p&gt;

&lt;p&gt;There is not much research on emoji use in chatbots specifically to guarantee user engagement. But if we stick to the CASA paradigm, we can borrow from social research and apply it to our case. Let's look at two studies.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Naively modeled interaction
&lt;/h4&gt;

&lt;p&gt;I reviewed a marketing paper on the effects of emojis in sponsored social media ads (Lee et al., 2021), and the conclusions were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Emoji use hurts users' purchase intention.&lt;/li&gt;
&lt;li&gt;Emojis increase engagement for hedonic products, while reducing it for utilitarian ones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is one example from the appendix, translated from Korean.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-bad-ad-example.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-bad-ad-example.png" alt="Example of a badly designed ad with emojis" title="Naively modeled interaction" width="504" height="577"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Hmm.&lt;/p&gt;

&lt;p&gt;That does not look good. It feels like a deliberately bad stimulus.&lt;/p&gt;

&lt;p&gt;All right, forget the conclusions of that earlier paper for a second. You have never actually seen an ad like that, right?&lt;/p&gt;

&lt;p&gt;So in the worst case, emojis may indeed have a general negative effect. Let's look at a more rigorous paper that does not make that mistake. Mladenović et al. (2023) run an experimental study with an established company in a real market through Meta ads on Instagram and Facebook.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Properly modeled interaction
&lt;/h4&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-emoji-results.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-emoji-results.png" alt="Results of ads with and without emojis" title="Properly modeled interaction" width="665" height="844"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Source: Mladenović et al. (2023).&lt;/p&gt;

&lt;p&gt;They measured:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CTR: click-through rate based on ad impressions.&lt;/li&gt;
&lt;li&gt;ROAS: return on ad spend based on ad cost.&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Utilitarian / Metric&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;No Emoji&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;With Emoji&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CTR (%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.79%&lt;/td&gt;
&lt;td&gt;2.99%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ROAS ($)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$6.69&lt;/td&gt;
&lt;td&gt;$6.72&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Hedonic / Metric&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;No Emoji&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;With Emoji&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CTR (%)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;2.95%&lt;/td&gt;
&lt;td&gt;2.96%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ROAS ($)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$13.68&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$21.95&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In every Z-test hypothesis you can imagine there is a p &amp;lt; 5%. Still, one result jumps out immediately: the hedonic ROAS leap when emojis are used. Almost double.&lt;/p&gt;

&lt;p&gt;Contradictory with the previous paper? Yes.&lt;/p&gt;

&lt;p&gt;That is acknowledged even by this systematic review (Vardikou et al., 2025), which points out that there is no consensus in this category about the direction of the purchase-intention variable. It also suggests the discrepancy may come from the mediating effect of facial versus non-facial emojis.&lt;/p&gt;

&lt;h4&gt;
  
  
  So there is no consensus?
&lt;/h4&gt;

&lt;p&gt;I do not see it that way.&lt;/p&gt;

&lt;p&gt;As we saw, both studies use mixed kinds of emojis. The real issue is much simpler: the second study has a methodological problem because tea boxes are not truly a utilitarian product. They sit in the middle.&lt;/p&gt;

&lt;p&gt;Medicines are a product where utility clearly dominates. And there, Phan and Bui (2025) show that an informal tone and emojis blow up customer trust in the brand.&lt;/p&gt;

&lt;p&gt;Tea is much closer to a commodity. It competes on price, not on quality or trust.&lt;/p&gt;

&lt;h3&gt;
  
  
  Operationalizing the interaction
&lt;/h3&gt;

&lt;p&gt;The emoji spiral was fun, but we should remember that emojis are just one technique to increase social presence, meaning the feeling that there is a socially present entity behind the interface instead of a purely mechanical channel (Yu &amp;amp; Zhao, 2024; Vardikou et al., 2025).&lt;/p&gt;

&lt;p&gt;Then we have empathy and competence. In this context, empathy refers to the agent's perceived ability to understand the user's state and respond with appropriate warmth, while competence is the agent's perceived ability and knowledge to solve the task well (Phan &amp;amp; Bui, 2025; Zhang et al., 2026).&lt;/p&gt;

&lt;p&gt;Not less importantly, Zhang et al. (2026) find that younger people respond better to informal language and warmth conveyed through emojis, while in formal contexts and with adults it is better to rely on warm phrasing and intelligent dialogue to create empathy.&lt;/p&gt;

&lt;p&gt;I also reviewed a few papers looking at how gender interacts with sensitivity to warm interactions. But I keep running into contradictory results. Some studies suggest women are more sensitive to mechanical interactions, while others find no significance.&lt;/p&gt;

&lt;p&gt;For this case, I think the variable in play is involvement. Some women may simply have resonated more strongly with the product being sold. So on gender, each situation needs to be analyzed on its own.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Characteristic&lt;/th&gt;
&lt;th&gt;Preferred interaction&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Young user&lt;/td&gt;
&lt;td&gt;Informal language, visuals, and emojis&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adult user&lt;/td&gt;
&lt;td&gt;Warmth and empathy through phrasing and intelligent dialogue&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Utilitarian product&lt;/td&gt;
&lt;td&gt;Competitiveness, speed, direct and textual language&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hedonic product&lt;/td&gt;
&lt;td&gt;Warmth, personalization, memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relational task&lt;/td&gt;
&lt;td&gt;Warmth, personalization, memory&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transactional task&lt;/td&gt;
&lt;td&gt;Competitiveness, speed, direct and textual language&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Anthropomorphism vs. competence
&lt;/h2&gt;

&lt;p&gt;Let's introduce the variable:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Transactional interaction: immediate, straightforward, task-focused engagement with no long-term intent (e.g., resetting a password).&lt;/p&gt;

&lt;p&gt;Relational interaction: long-term commitment and ongoing collaboration requiring relationship-building (e.g., managing an investment).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;As we saw earlier, there is a long list of variables that moderate user satisfaction and purchase intention. The two I find useful for modeling are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Utilitarian versus hedonic product.&lt;/li&gt;
&lt;li&gt;Transactional versus relational interaction.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-relation-utility-matrix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-relation-utility-matrix.png" alt="Utilitarian versus hedonic matrix" title="Utilitarian and hedonic products matrix" width="800" height="450"&gt;&lt;/a&gt;
  &lt;em&gt;Bread is an example of a product in the middle, just like a box of tea. My own diagram.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;So for a support agent, the preferred interaction mode would be:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Utilitarian / Relational&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Transactional task&lt;/th&gt;
&lt;th&gt;Relational task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Utilitarian product&lt;/td&gt;
&lt;td&gt;Competence, resolution speed, clear and formal language, data-oriented.&lt;/td&gt;
&lt;td&gt;Warmth, memory capacity, empathy, positive reinforcement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hedonic product&lt;/td&gt;
&lt;td&gt;Premium interface design, clear language.&lt;/td&gt;
&lt;td&gt;Warmth, high enthusiasm, memory, and user personalization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;More speed is not always better. Classic rule-based chatbots respond fast. But as Yu and Zhao (2024) show, a chatbot's warmth and autonomy can be improved with tricks like showing a typing animation and slightly extending the response time even when it is not necessary.&lt;/p&gt;

&lt;p&gt;This table is not meant to assign static values. I placed categories in the chart, but that does not mean the interaction stays fixed across different stages of the CJM.&lt;/p&gt;

&lt;p&gt;Here are examples of tasks that could all belong to the same offering:&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-task-spectrum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-task-spectrum.png" alt="Example of transactional and relational tasks" title="Tasks across the same offering" width="800" height="585"&gt;&lt;/a&gt;
  &lt;em&gt;Image based on Zhang et al. (2026).&lt;/em&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Grouping the tools: the user journey
&lt;/h2&gt;

&lt;p&gt;This is the premise behind H3, the hypothesis we started this article with.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-cjm-high-point.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-cjm-high-point.png" alt="User journey map" title="Customer Journey Map" width="800" height="451"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;One of the first things the CJM teaches us is that the end of the experience should always be a high point.&lt;/p&gt;

&lt;p&gt;A negative experience creates stress and shifts user preference toward &lt;strong&gt;transactional&lt;/strong&gt; tasks.&lt;/p&gt;

&lt;p&gt;A positive experience relaxes the user and moves interest toward &lt;strong&gt;relational&lt;/strong&gt; interaction.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-hablemos-manga-cjm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-hablemos-manga-cjm.png" alt="CJM applied to Hablemos Manga" title="CJM applied to Hablemos Manga" width="800" height="450"&gt;&lt;/a&gt;
  &lt;em&gt;The CJM applied to my site &lt;a href="https://hablemosmanga.kekeros.com" rel="noopener noreferrer"&gt;Hablemos Manga&lt;/a&gt;.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;As for personality, you have free rein to model it however you want and take advantage of the mirroring effect described in &lt;em&gt;The Media Equation&lt;/em&gt; (Reeves &amp;amp; Nass, 1996). In my case, I will use myself as the representative sample.&lt;/p&gt;

&lt;h2&gt;
  
  
  Applying the framework
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Utilitarian / Relational&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Transactional task&lt;/th&gt;
&lt;th&gt;Relational task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Utilitarian product&lt;/td&gt;
&lt;td&gt;Competence, resolution speed, clear and formal language, data-oriented.&lt;/td&gt;
&lt;td&gt;Warmth, memory capacity, empathy, positive reinforcement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hedonic product&lt;/td&gt;
&lt;td&gt;Premium interface design, clear language.&lt;/td&gt;
&lt;td&gt;Warmth, high enthusiasm, memory, and user personalization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Let's start with the product.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hablemosmanga.kekeros.com" rel="noopener noreferrer"&gt;Hablemos Manga&lt;/a&gt; is an online manga shop with a personalized automated sales agent integrated with your favorite social networks. It is a &lt;strong&gt;hedonic&lt;/strong&gt; product. And the offer is presented as highly relational.&lt;/p&gt;

&lt;p&gt;Even though the CJM shows that the journey starts long before the user ever talks to the chatbot, today I only want to focus on that section.&lt;/p&gt;

&lt;p&gt;That reduces things to two stages. As for personality, the same user remains consistent across all stages, and changing it would make no sense.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Interaction&lt;/th&gt;
&lt;th&gt;Personality&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Exploration&lt;/td&gt;
&lt;td&gt;Warmth, memory capacity, personalization.&lt;/td&gt;
&lt;td&gt;Introverted, highly candid, and curious.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkout&lt;/td&gt;
&lt;td&gt;Resolution speed, friendly and clear language. Do not force the sale.&lt;/td&gt;
&lt;td&gt;Introverted, highly candid, and curious.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-chatbot-before.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-chatbot-before.png" alt="First version of the Hablemos Manga chatbot" title="Initial Hablemos Manga chatbot" width="624" height="246"&gt;&lt;/a&gt;
  &lt;em&gt;This is the chatbot as I am writing this article. The first interaction still feels a bit cold even with the emoji.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-chatbot-checkout-before.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-chatbot-checkout-before.png" alt="Checkout stage of the chatbot" title="Checkout stage of the chatbot" width="800" height="523"&gt;&lt;/a&gt;
  &lt;em&gt;During checkout the agent also adds items to the cart. The clearest improvement points I see are response time and using more direct language.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;On the speed side I cannot do much right now. At the moment I am limited by my choice of low-cost models. But it is something worth revisiting as those models keep getting cheaper.&lt;/p&gt;

&lt;p&gt;To get these improvements, we have a few options:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A router system that identifies the CJM stage from the query and sends it to a model configured for that task.&lt;/li&gt;
&lt;li&gt;A state machine with transitions decided according to the CJM stages and the conversation context.&lt;/li&gt;
&lt;li&gt;Designing the agent's system prompt so the interaction changes according to the conversation context.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Look, I only have two states to care about in my agent. It is not a complex problem, and I would rather avoid the overhead of decoupled systems.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;As a technical note: if you choose a state machine, you need to account for the fact that each state transition involves a tool call, or something equivalent depending on the implementation. That makes it prohibitive in environments where the requirement is short response time, at least for now and with current models.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;This is the new system prompt.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are the assistant for "Hablemos Manga", an intelligent manga store based in Peru.
&lt;span class="gu"&gt;## Personality and Brand Identity&lt;/span&gt;
You are the expert manga and anime friend, familiar with demographics and authors.
Introverted, highly candid, and highly curious about manga and anime.
&lt;span class="gu"&gt;## Tools&lt;/span&gt;
As the assistant, you currently only have these tools.
Search for a manga or recommendations with a semantic search.
Check the availability of manga volumes in our store.
Add a manga volume to the cart.
Any other tool is currently unavailable.
&lt;span class="gu"&gt;## Dynamic Interaction Modes&lt;/span&gt;
You must identify the current user journey stage and act accordingly.
You have two stages:
&lt;span class="p"&gt;-&lt;/span&gt; Discovery. The user asks about genres, a manga, discovering new titles, and exploration in general.
&lt;span class="p"&gt;-&lt;/span&gt; Selection and Purchase. The user asks to add or remove a volume from the cart, asks for prices, or takes a purchase-related action.

Change your communication style according to the stage.

If you are in the Discovery stage, use RELATIONAL MODE (Discovery, Chats, and Recommendations):
&lt;span class="p"&gt;-&lt;/span&gt; The user is looking for entertainment and connection (High Openness to Experience).
&lt;span class="p"&gt;-&lt;/span&gt; Use these emojis where appropriate (📚, ⚔️, 🙂, 👋) in a natural way to generate "perceived warmth". Do not overuse 🙂.
&lt;span class="p"&gt;-&lt;/span&gt; Do not just list titles; validate their taste with judgment (e.g., "If the psychological horror in that arc hooked you, this manga is going to blow your mind...").

If you are in the Selection and Purchase stage, use TRANSACTIONAL MODE (Cart Management, Prices):
&lt;span class="p"&gt;-&lt;/span&gt; The user is in execution and buying mode (low tolerance for friction).
&lt;span class="p"&gt;-&lt;/span&gt; Become an assistant focused on "Pure Competence": concise, direct, structured, clean, and fast. Clarity and technical confidence are your only form of warmth here.
&lt;span class="gu"&gt;## Rules&lt;/span&gt;
ALWAYS use the &lt;span class="sb"&gt;`search_manga`&lt;/span&gt; tool before recommending. NEVER invent manga that is not in the database.
You can only ADD new items to the cart with the &lt;span class="sb"&gt;`add_volume_to_cart`&lt;/span&gt; tool.
If you do not find relevant results, say so honestly and suggest reformulating the search.
Show at most 5 recommendations at a time so the user does not feel overwhelmed.
All store prices are in Peruvian soles (S/). NEVER show prices in dollars or any other currency.
Show a maximum of 2 emojis per response.
If the user wants to buy, the current flow goes through the shopping cart. Do not record requests or handle anything after adding a volume to the cart.
Do not return information that is not grounded in tool results or your system instructions.
&lt;span class="gu"&gt;## Response format&lt;/span&gt;
Use bold for manga titles.
Use numbered lists for recommendations.
Include the score (e.g., ⭐ 8.5) when you show a manga.
Be concise: 1-2 sentences per recommendation unless the user asks for more detail.
&lt;span class="gu"&gt;## Recommendation guide&lt;/span&gt;
The user has already seen an onboarding message before writing to you.
That message asks them to share their favorite genres, a manga they like, or connect a profile to refine recommendations.
Your job starts with the requests that come after onboarding.
If the user ALREADY has connected profiles (included in "User profile"), DO NOT ask about genres, favorites, or profiles.
Mention that you already know their taste based on their profiles, and offer to search for manga directly.
If the user does NOT have connected profiles, handle the request based on the conversation you have had so far.
Every now and then suggest connecting a profile and ask what genres they like or whether they have favorite manga.
&lt;span class="gu"&gt;## Using the user profile&lt;/span&gt;
When you have profile data, ALWAYS refer to specific data points: titles they read, subreddits they participate in, anime they watch.
If the user asks what you know about their profile, list the concrete data you have (manga they read, favorites, subreddits, etc.).
Use profile data to make proactive recommendations without needing the user to tell you what they like.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-system-prompt-result.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-system-prompt-result.png" alt="More concise agent response in transactional mode" title="Transactional mode of the agent" width="669" height="644"&gt;&lt;/a&gt;
  &lt;em&gt;This time the agent responds more concisely to transactional questions.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-relational-result.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjune%2Fagent-personality-relational-result.png" alt="Warm response from the agent in relational mode" title="Relational mode of the agent" width="666" height="803"&gt;&lt;/a&gt;
  &lt;em&gt;And it keeps the warmth for requests where interaction matters most.&lt;/em&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusions
&lt;/h2&gt;

&lt;p&gt;Coming back to our three initial hypotheses:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;H1: The effect of a linguistic agent's personality on task success rate depends on the complexity of the task.&lt;/li&gt;
&lt;li&gt;H2: The effect of a linguistic agent's personality on task success rate depends on the level of stress or urgency the user expects in the responses.&lt;/li&gt;
&lt;li&gt;H3: Using the CJM as a framework to parameterize an agent's personality at each stage of the journey improves the user experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Yes. Task complexity introduces a transactional effect into the interaction because it demands more concentration. But first you still need to analyze whether the task leads toward a hedonic or a utilitarian goal.&lt;/li&gt;
&lt;li&gt;Yes. That is the transactional effect.&lt;/li&gt;
&lt;li&gt;I like the idea of the CJM as the bridge that closes the gap between experience design and agent design. But one experiment with my own sample is not enough to call it a revolutionary paradigm.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That is why I invite you to try the tool I built for hypothesis 3.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Utilitarian / Relational&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Transactional task&lt;/th&gt;
&lt;th&gt;Relational task&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Utilitarian product&lt;/td&gt;
&lt;td&gt;Competence, resolution speed, clear and formal language, data-oriented.&lt;/td&gt;
&lt;td&gt;Warmth, memory capacity, empathy, positive reinforcement.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hedonic product&lt;/td&gt;
&lt;td&gt;Premium visual interface design, clear language.&lt;/td&gt;
&lt;td&gt;Warmth, high enthusiasm, and user personalization.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;If it works for you and you get good results, I would love to hear about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;Lee, J., Kim, C., Lee, K. C., Revilla-Camacho, M.-A., Garzón, D., &amp;amp; Rodríguez-Rad, C. J. (2021). Investigating the negative effects of emojis in Facebook sponsored ads for establishing sustainable marketing in social media. &lt;em&gt;Sustainability, 13&lt;/em&gt;(9). &lt;a href="https://doi.org/10.3390/SU13094864" rel="noopener noreferrer"&gt;https://doi.org/10.3390/SU13094864&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mladenović, D., Koštiál, K., Ljepava, N., Částek, O., &amp;amp; Chawla, Y. (2023). Emojis to conversion on social media. &lt;em&gt;International Journal of Consumer Studies, 47&lt;/em&gt;(3), 977-994. &lt;a href="https://doi.org/10.1111/IJCS.12879" rel="noopener noreferrer"&gt;https://doi.org/10.1111/IJCS.12879&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nass, C., Steuer, J., &amp;amp; Tauber, E. R. (1994). &lt;em&gt;Computers are social actors&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Phan, T. A., &amp;amp; Bui, V. D. (2025). AI with a heart: How perceived authenticity and warmth shape trust in healthcare chatbots. &lt;em&gt;Journal of Marketing Communications&lt;/em&gt;. &lt;a href="https://doi.org/10.1080/13527266.2025.2508887" rel="noopener noreferrer"&gt;https://doi.org/10.1080/13527266.2025.2508887&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reeves, B., &amp;amp; Nass, C. (1996). &lt;em&gt;The media equation: How people treat computers, television, and new media like real people and places&lt;/em&gt;. Cambridge University Press.&lt;/p&gt;

&lt;p&gt;Sinofsky, S. (2021). Clippy, the f*cking clown. &lt;em&gt;Hardcore Software&lt;/em&gt;. &lt;a href="https://hardcoresoftware.learningbyshipping.com/p/042-clippy-the-fcking-clown" rel="noopener noreferrer"&gt;https://hardcoresoftware.learningbyshipping.com/p/042-clippy-the-fcking-clown&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;McCrae, R. R., &amp;amp; John, O. P. (1992). An introduction to the five-factor model and its applications. &lt;em&gt;Journal of Personality, 60&lt;/em&gt;(2), 175-215.&lt;/p&gt;

&lt;p&gt;Vardikou, C., Konidaris, A., Koustoumpardi, E., &amp;amp; Kavoura, A. (2025). Emojis in marketing and advertising: A systematic literature review. &lt;em&gt;Behavioral Sciences, 15&lt;/em&gt;(11), 1490. &lt;a href="https://doi.org/10.3390/BS15111490" rel="noopener noreferrer"&gt;https://doi.org/10.3390/BS15111490&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yu, S., &amp;amp; Zhao, L. (2024). Emojifying chatbot interactions: An exploration of emoji utilization in human-chatbot communications. &lt;em&gt;Telematics and Informatics, 86&lt;/em&gt;, Article 102071. &lt;a href="https://doi.org/10.1016/J.TELE.2023.102071" rel="noopener noreferrer"&gt;https://doi.org/10.1016/J.TELE.2023.102071&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Zhang, Y., Özsomer, A., Canlı, Z. G., &amp;amp; Baghirov, F. (2026). Artificial intelligence chatbots versus human agents in customer satisfaction: The role of warmth and competence. &lt;em&gt;Journal of Interactive Marketing&lt;/em&gt;. &lt;a href="https://doi.org/10.1177/10949968251366265" rel="noopener noreferrer"&gt;https://doi.org/10.1177/10949968251366265&lt;/a&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>llm</category>
      <category>personality</category>
      <category>customerjourneymap</category>
    </item>
    <item>
      <title>Improving My App's Vibes with DESIGN.md</title>
      <dc:creator>Ever Burga</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:32:19 +0000</pubDate>
      <link>https://dev.to/4verburga/improving-my-apps-vibes-with-designmd-1hjb</link>
      <guid>https://dev.to/4verburga/improving-my-apps-vibes-with-designmd-1hjb</guid>
      <description>&lt;p&gt;
&lt;span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span&gt;I&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;/span&gt;
&lt;/p&gt;

&lt;p&gt;Interface design is hard. Even though I really like painting and the visual side of things, like a lot of developers, my bandwidth just does not stretch far enough to learn all of it properly.&lt;/p&gt;

&lt;p&gt;Before this, with Claude's help and a long list of requirements, I managed to ship my app &lt;a href="https://hablemosmanga.kekeros.com" rel="noopener noreferrer"&gt;HablemosManga&lt;/a&gt;. It worked, but the design felt cold and generic. Robotic.&lt;/p&gt;

&lt;p&gt;
  
  &lt;em&gt;HablemosManga before the redesign with DESIGN.md&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;That is not exactly news. Since I started using LLM tools for development, execution speed has gone way up, but the user experience and the interface have not.&lt;/p&gt;

&lt;p&gt;Maybe that is on me, but I always end up dumping a huge pile of prompts into the model and trying to design a system for the project in my own improvised way.&lt;/p&gt;

&lt;p&gt;While scrolling around online I found &lt;a href="https://stitch.withgoogle.com/docs/design-md/overview" rel="noopener noreferrer"&gt;DESIGN.md&lt;/a&gt;, and it turns out a lot of repos are already implementing their design systems this way. Simple, repeatable, and with good results. I saw it came out of Google Stitch, and since I already have Gemini Pro, I went off to burn some tokens:&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fapril%2Fstitch_ejemplo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fapril%2Fstitch_ejemplo.png" alt="Google Stitch generating a design system" width="800" height="415"&gt;&lt;/a&gt;
  &lt;em&gt;Google Stitch generating a design system for my project&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;I tried giving it context about my project, but Gemini's design taste still feels oversaturated to me. It did not really convince me. But still, look at that, it gives you a DESIGN.md.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fapril%2Fstitch_designmd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fapril%2Fstitch_designmd.png" alt="DESIGN.md generated by Stitch" width="335" height="373"&gt;&lt;/a&gt;
  &lt;em&gt;The DESIGN.md Stitch generates, simple and structured&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;Anyway, later I found &lt;a href="https://getdesign.md/shopify/design-md" rel="noopener noreferrer"&gt;getdesign.md/shopify/design-md&lt;/a&gt;, and that is the template I am using now. Shopify is an e-commerce business, which makes it close enough to the shape of my app. After that I asked Claude to apply the new design system to the project, and these were the results...&lt;/p&gt;

&lt;p&gt;
  
  &lt;em&gt;HablemosManga after the redesign with DESIGN.md&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;Then, while I was writing this, Claude Design showed up. It looks promising. Claude 4.7 also came out, which apparently is 4.6 before they cut down its thinking capacity, so this article still holds up.&lt;/p&gt;

&lt;p&gt;Claude Design also generates a DESIGN.md, and Claude Code already supports the standard.&lt;/p&gt;

</description>
      <category>designsystems</category>
      <category>designmd</category>
      <category>googlestitch</category>
      <category>claudecode</category>
    </item>
    <item>
      <title>From Idea to MS Teams: Deploying an Agent</title>
      <dc:creator>Ever Burga</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:32:12 +0000</pubDate>
      <link>https://dev.to/4verburga/from-idea-to-ms-teams-deploying-an-agent-49bi</link>
      <guid>https://dev.to/4verburga/from-idea-to-ms-teams-deploying-an-agent-49bi</guid>
      <description>&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fagent-toolkit-dev-flow.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fagent-toolkit-dev-flow.png" alt="Agents Toolkit development flow" title="Agents Toolkit development flow" width="799" height="402"&gt;&lt;/a&gt;
  &lt;em&gt;Taken from [1]&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;There is a growing number of services and entry points to deploy an agent in MS Teams these days. It can be through Copilot, Microsoft 365, or the AI Foundry services.&lt;br&gt;
Under the hood, all of them use the Azure Bot Services APIs.&lt;/p&gt;

&lt;p&gt;If you want maximum customization, you will like this tutorial.&lt;/p&gt;
&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;If you struggle to get your Azure admin to grant permissions documented in some random blog article, this Microsoft post follows steps similar to this one [1].&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application Developer role in the Azure subscription where your project will be assigned.&lt;/li&gt;
&lt;li&gt;A corporate MS Teams license. As an alternative, there is a Microsoft 365 Dev trial program you can try, but it only lasts 90 days and you still need an active Azure subscription anyway.
It ends up redundant to do all the work there instead of isolating a group of users in your organization's 365 admin console.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Contents
&lt;/h2&gt;

&lt;p&gt;What this tutorial covers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creating the App in Azure Entra ID. This is where permissions are managed, and it is the visible face of your Agent for everyone in the same Microsoft tenant.&lt;/li&gt;
&lt;li&gt;Configuring Azure Bot Services. This is the integration API for the MS 365 suite.&lt;/li&gt;
&lt;li&gt;Integration with your own Agent, a self-hosted LangGraph or whatever you built. Here we see how you connect it to Azure Bot Services.&lt;/li&gt;
&lt;li&gt;Publishing to Teams: user exclusion rules, icons, logos and versioning.&lt;/li&gt;
&lt;li&gt;A few CX details, D:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are not going to look at the agent's own logic. What you care about, like I did back then, is how to deploy it into your corporate suite.&lt;/p&gt;
&lt;h2&gt;
  
  
  Entra ID
&lt;/h2&gt;

&lt;p&gt;Azure can be a nightmare sometimes. Let's go step by step.&lt;/p&gt;

&lt;p&gt;First, create an app with a name and a 'dev' or 'prd' suffix. You will need this distinction later to segregate users.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fentra-id-tuto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fentra-id-tuto.png" alt="Open the Entra ID service" title="Open the service" width="267" height="599"&gt;&lt;/a&gt;
  &lt;em&gt;Open the service&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fapp-registration-add-new.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fapp-registration-add-new.png" alt="Registering a new app" title="Click create" width="445" height="236"&gt;&lt;/a&gt;
  &lt;em&gt;Click create. Single tenant is enough for most use cases.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fapp-registration-panel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fapp-registration-panel.png" alt="App registration panel" title="Note down the App Id" width="800" height="468"&gt;&lt;/a&gt;
  &lt;em&gt;Note down the App Id.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;If you need your agent to interact with Microsoft services, the API Permissions section will be your friend. In case your Agent is not part of the Azure ecosystem, a quick fix is to create a certificate in the Certificates and Secrets section. In that case, note down the Secret you generate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Azure Bot Services
&lt;/h2&gt;

&lt;p&gt;Create a Bot with the same App Id you used for Entra ID. I am not sure of the reason behind this, but when I used the automatically generated Id there were issues with the bot showing up in the Microsoft 365 Admin console.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fazure-bot-services-config-panel.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fazure-bot-services-config-panel.png" alt="Azure Bot Services configuration panel" title="Azure Bot Services configuration panel" width="800" height="579"&gt;&lt;/a&gt;
  &lt;em&gt;Here the two most important fields have arrows.&lt;/em&gt;
&lt;/p&gt;

&lt;p&gt;The URL endpoint field is the endpoint of the middleware you are going to build next.&lt;/p&gt;

&lt;p&gt;The 'test in webchat' section lets you check that your agent and integration middleware actually work and respond correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integration
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;This is a simplified version of an adapter that works for me.
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;dotenv&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;find_dotenv&lt;/span&gt;
&lt;span class="nf"&gt;load_dotenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;find_dotenv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.prd.env&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;botbuilder.integration.aiohttp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;CloudAdapter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ConfigurationBotFrameworkAuthentication&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.ext.teams_incoming_adapter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BotInconmingEventsHandler&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.app.bot_service.service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;BotService&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.ext.session_adapter&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SessionStoreAdapter&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;src.app.session_watcher_service.service&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;SessionWatcher&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;

&lt;span class="c1"&gt;# Configure logging
&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;basicConfig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DEBUG&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;  &lt;span class="c1"&gt;# Set to DEBUG, INFO, WARNING, ERROR, or CRITICAL
&lt;/span&gt;    &lt;span class="nb"&gt;format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;%(asctime)s - %(name)s - %(levelname)s - %(message)s&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;logger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;logging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLogger&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SVC_LISTEN_PORT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;3978&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;APP_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MICROSOFT_APP_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MICROSOFT_APP_PASSWORD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;APP_TYPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MICROSOFT_APP_TYPE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;APP_TENANTID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MICROSOFT_APP_TENANT_ID&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;MAX_IDLE_TIME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SESSION_IDLE_LIMIT_SECS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;  &lt;span class="c1"&gt;# secs
&lt;/span&gt;&lt;span class="n"&gt;ALERT_TIME&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SESSION_IDLE_WARN_SECS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Configuration loaded. App ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;APP_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, Port: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✓ App ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;APP_ID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✓ App Type: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;APP_TYPE&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✓ Tenant ID: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;APP_TENANTID&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;✓ Password length: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;❌ MICROSOFT_APP_PASSWORD is EMPTY!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;APP_ID&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;❌ MICROSOFT_APP_ID is EMPTY!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BotConfig&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;PORT&lt;/span&gt;
    &lt;span class="n"&gt;APP_TYPE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;APP_TYPE&lt;/span&gt;
    &lt;span class="n"&gt;APP_ID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;APP_ID&lt;/span&gt;
    &lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt;
    &lt;span class="n"&gt;APP_TENANTID&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;APP_TENANTID&lt;/span&gt;

&lt;span class="n"&gt;config&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BotConfig&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# Cloud Adapter is a bot
&lt;/span&gt;&lt;span class="n"&gt;BOT_CLOUD_ADAPTER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;CloudAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;ConfigurationBotFrameworkAuthentication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;


&lt;span class="n"&gt;return_last_message_only&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BOT_BACKEND_LAST_MSG_ONLY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;query_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BOT_BACKEND_ENDPOINT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;query_url&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="nc"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BOT_BACKEND_ENDPOINT is required&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;chatbot_adapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;AgentEngineADKAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;query_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;query_url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;timeout_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nf"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BOT_BACKEND_TIMEOUT_SECS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;60&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
    &lt;span class="n"&gt;return_last_message_only&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;return_last_message_only&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;class_method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BOT_BACKEND_CLASS_METHOD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;async_stream_query&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Agent Engine REST adapter initialized as primary chatbot adapter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Plug in whatever session store you use (a database, cache, etc.)
&lt;/span&gt;&lt;span class="n"&gt;data_store&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SessionStoreAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;connection_string&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DATASTORE_DSN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;logger&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Session store adapter initialized&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Plug in whatever feedback storage you use
&lt;/span&gt;&lt;span class="n"&gt;feedback_repository&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FeedbackRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;connection_string&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;FEEDBACK_DSN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;feedback_handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;DefaultFeedbackHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;feedback_repository&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;bot_service&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BotService&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;chatbot_adapter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;chatbot_adapter&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;data_store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;data_store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;fallback_adapter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bot_adapter&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;BOT_CLOUD_ADAPTER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;app_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;APP_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;feedback_handler&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;feedback_handler&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;alert_idle_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ALERT_TIME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;close_idle_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MAX_IDLE_TIME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;incoming_events_handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BotInconmingEventsHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;APP_ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;APP_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bot_service&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;http_adapter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;HTTPAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;BOT_CLOUD_ADAPTER&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;incoming_events_handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;http_adapter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_app&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="c1"&gt;# Start session watcher if data store is available
&lt;/span&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data_store&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;watcher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;SessionWatcher&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data_store&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;bot_service&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;alert_idle_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ALERT_TIME&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                                 &lt;span class="n"&gt;close_idle_seconds&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;MAX_IDLE_TIME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;watcher&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Warning: could not start session watcher: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aiohttp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;web&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run_app&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;0.0.0.0&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="nb"&gt;Exception&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;error&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can check more implementations in Microsoft's Quickstart [2].&lt;br&gt;
In my opinion the page is a bit abandoned, so don't assume it will work as-is.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Before wrapping up your integration, do not forget to collect these variables correctly. They are required to decrypt Azure's communication in the production environment.
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;MicrosoftAppType&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; SingleTenant
&lt;span class="nv"&gt;MicrosoftAppId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="c"&gt;# client id you just used for entra id and bot services&lt;/span&gt;
&lt;span class="nv"&gt;MicrosoftAppPassword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="c"&gt;# client secret&lt;/span&gt;
&lt;span class="nv"&gt;MicrosoftAppTenantId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The client secret is only needed for integrations outside the Azure ecosystem. It is preferable to use OAuth2 or a secret-free method.&lt;/p&gt;
&lt;h3&gt;
  
  
  And you also get a nice playground to test your agent even before it lands in Microsoft 365
&lt;/h3&gt;

&lt;p&gt;For it not to fail, you need to leave the variables from step #2 empty.&lt;br&gt;
If you don't, the playground won't be able to decrypt the communication. And in my experience, that has been a painful thing to debug when it fails.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fmicrosoft-365-playground.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fmicrosoft-365-playground.png" alt="Microsoft 365 Playground" title="Microsoft 365 Playground" width="800" height="580"&gt;&lt;/a&gt;
  &lt;em&gt;Microsoft 365 Playground&lt;/em&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Publishing to Teams
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Upload the File Exported from the 365 Toolkit
&lt;/h3&gt;

&lt;p&gt;The project you configured previously generates a bundle. You can customize it with the logo you want displayed.&lt;br&gt;
A colored version and a simplified one for sidebars and small icons.&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fupload-app-to-teams-request.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2F4verburga.kekeros.com%2Farticles%2F2026%2Fjuly%2Fupload-app-to-teams-request.png" alt="Uploading the app to Teams request" title="Uploading the app to Teams request" width="800" height="386"&gt;&lt;/a&gt;
  &lt;em&gt;Uploading the bundle exported from the Toolkit&lt;/em&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  Contact Your MS 365 Administrator
&lt;/h3&gt;

&lt;p&gt;Point them to these links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Microsoft Teams admin center [4]
&lt;/li&gt;
&lt;li&gt;Microsoft 365 admin center [5]
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I have not been able to share screenshots of what the admin console looks like and the exact steps your admin should follow.&lt;br&gt;
But let them know they can create access lists for the application.&lt;/p&gt;

&lt;p&gt;Specifically, they should have an access list for the dev application, open only to a handful of tester and developer users.&lt;br&gt;
And for the production application, a different strategy can be worked out.&lt;/p&gt;
&lt;h2&gt;
  
  
  CX!
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Interested in using forms with your agent?
&lt;/h3&gt;

&lt;p&gt;Microsoft's good old Adaptive Cards [3]. You can use them in your middleware.&lt;br&gt;
Extra customization? It's the same standard used by Power Automate, which you might be more familiar with.&lt;/p&gt;
&lt;h3&gt;
  
  
  Do you want the ... bot ... to type? ...
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Typying activity: ...
&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;turn_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_activity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Activity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;ActivityTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;typing&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;# Delegate to application service
&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bot_service&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;handle_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;turn_context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;turn_context&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send_activity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Sending that activity is enough while your agent's engine is working on the response.&lt;/p&gt;
&lt;h2&gt;
  
  
  Extra!
&lt;/h2&gt;

&lt;p&gt;This is what I could gather from the communications sent by the Azure Bot Services servers. It might be useful if you want to understand how much useful information you can get through the middleware.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="nf"&gt;POST&lt;/span&gt; &lt;span class="nn"&gt;/api/messages&lt;/span&gt; &lt;span class="k"&gt;HTTP&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="m"&gt;1.1&lt;/span&gt;
&lt;span class="na"&gt;Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost:3978&lt;/span&gt;
&lt;span class="na"&gt;User-Agent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;BF-DirectLine (Microsoft-BotFramework/3.2 +https://botframework.com/ua)&lt;/span&gt;
&lt;span class="na"&gt;Content-Length&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;719&lt;/span&gt;
&lt;span class="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;*/*&lt;/span&gt;
&lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Bearer &amp;lt;REDACTED_JWT&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Channelid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webchat&lt;/span&gt;
&lt;span class="na"&gt;Content-Type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;application/json; charset=utf-8&lt;/span&gt;
&lt;span class="na"&gt;Request-Id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;|&amp;lt;REDACTED_REQUEST_ID&amp;gt;.&amp;lt;REDACTED_SPAN_ID&amp;gt;.&lt;/span&gt;
&lt;span class="na"&gt;Traceparent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;00-&amp;lt;REDACTED_TRACE_ID&amp;gt;-&amp;lt;REDACTED_SPAN_ID&amp;gt;-00&lt;/span&gt;
&lt;span class="na"&gt;X-Forwarded-For&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;xxx.xxx.xxx.xxx&lt;/span&gt;
&lt;span class="na"&gt;X-Forwarded-Host&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;xxxx-xxx-xxx-xx.ngrok-free.app&lt;/span&gt;
&lt;span class="na"&gt;X-Forwarded-Proto&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https&lt;/span&gt;
&lt;span class="na"&gt;X-Ms-Conversation-Id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;lt;REDACTED_CONVERSATION_ID&amp;gt;&lt;/span&gt;
&lt;span class="na"&gt;Accept-Encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;gzip&lt;/span&gt;

&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"typing"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REDACTED_CONVERSATION_ID&amp;gt;|&amp;lt;REDACTED_ACTIVITY_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-03-02T17:44:41.6782359Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"localTimestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-03-02T12:44:41.391-05:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"localTimezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"America/Lima"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"serviceUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"https://webchat.botframework.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"channelId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"webchat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"00000000-0000-0000-0000-000000000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"conversation"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REDACTED_CONVERSATION_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"recipient"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"agente-msteams@&amp;lt;REDACTED_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"agente-msteams"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"en-US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"ClientCapabilities"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"requiresBotState"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"supportsListening"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"supportsTts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="nl"&gt;"channelData"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"clientActivityID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REDACTED_CLIENT_ACTIVITY_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;




&lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/api/messages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;HTTP/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Host:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;localhost:&lt;/span&gt;&lt;span class="mi"&gt;3978&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;User-Agent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;BF-DirectLine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(Microsoft-BotFramework/&lt;/span&gt;&lt;span class="mf"&gt;3.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+https://botframework.com/ua)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Content-Length:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;662&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Accept:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Authorization:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Bearer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;REDACTED_JWT&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Channelid:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;webchat&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Content-Type:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;application/json;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;charset=utf&lt;/span&gt;&lt;span class="mi"&gt;-8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Request-Id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&amp;lt;REDACTED_REQUEST_ID&amp;gt;.&amp;lt;REDACTED_SPAN_ID&amp;gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Traceparent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;-&amp;lt;REDACTED_TRACE_ID&amp;gt;-&amp;lt;REDACTED_SPAN_ID&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;-00&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;X-Forwarded-For:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;xxx.xxx.xxx.xxx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;X-Forwarded-Host:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;xxxx-xxx-xxx-xx.ngrok-free.app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;X-Forwarded-Proto:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;https&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;X-Ms-Conversation-Id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;REDACTED_CONVERSATION_ID&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Accept-Encoding:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"conversationUpdate"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REDACTED_ACTIVITY_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-03-02T17:44:41.0353977Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"serviceUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"https://webchat.botframework.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"channelId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"webchat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"00000000-0000-0000-0000-000000000000"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"conversation"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REDACTED_CONVERSATION_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"recipient"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"agente-msteams@&amp;lt;REDACTED_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"agente-msteams"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"membersAdded"&lt;/span&gt;&lt;span class="p"&gt;:[{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"agente-msteams@&amp;lt;REDACTED_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"agente-msteams"&lt;/span&gt;&lt;span class="p"&gt;},{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"00000000-0000-0000-0000-000000000000"&lt;/span&gt;&lt;span class="p"&gt;}]}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;POST&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;/api/messages&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;HTTP/&lt;/span&gt;&lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Host:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;localhost:&lt;/span&gt;&lt;span class="mi"&gt;3978&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;User-Agent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;BF-DirectLine&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(Microsoft-BotFramework/&lt;/span&gt;&lt;span class="mf"&gt;3.2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;+https://botframework.com/ua)&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Content-Length:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;679&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Accept:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;*/*&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Authorization:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Bearer&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;REDACTED_JWT&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Channelid:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;webchat&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Content-Type:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;application/json;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;charset=utf&lt;/span&gt;&lt;span class="mi"&gt;-8&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Request-Id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;|&amp;lt;REDACTED_REQUEST_ID&amp;gt;.&amp;lt;REDACTED_SPAN_ID&amp;gt;.&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Traceparent:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;-&amp;lt;REDACTED_TRACE_ID&amp;gt;-&amp;lt;REDACTED_SPAN_ID&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;-00&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;X-Forwarded-For:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;xxx.xxx.xxx.xxx&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;X-Forwarded-Host:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;xxxx-xxx-xxx-xx.ngrok-free.app&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;X-Forwarded-Proto:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;https&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;X-Ms-Conversation-Id:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;&amp;lt;REDACTED_CONVERSATION_ID&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Accept-Encoding:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;gzip&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REDACTED_CONVERSATION_ID&amp;gt;|&amp;lt;REDACTED_ACTIVITY_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-03-02T17:44:42.8691754Z"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"localTimestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"2026-03-02T12:44:42.728-05:00"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"localTimezone"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"America/Lima"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"serviceUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"https://webchat.botframework.com/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"channelId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"webchat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"from"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"00000000-0000-0000-0000-000000000000"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"conversation"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REDACTED_CONVERSATION_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"recipient"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"agente-msteams@&amp;lt;REDACTED_TOKEN&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"agente-msteams"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="nl"&gt;"textFormat"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"plain"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"locale"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"en-US"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Hola"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"attachments"&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nl"&gt;"channelData"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="nl"&gt;"attachmentSizes"&lt;/span&gt;&lt;span class="p"&gt;:[],&lt;/span&gt;&lt;span class="nl"&gt;"clientActivityID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;REDACTED_CLIENT_ACTIVITY_ID&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;span id="ref-1"&gt;&lt;/span&gt;Microsoft. Agents Toolkit fundamentals. Available: &lt;a href="https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/agents-toolkit-fundamentals" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/microsoftteams/platform/toolkit/agents-toolkit-fundamentals&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span id="ref-2"&gt;&lt;/span&gt;Microsoft. Microsoft 365 Agents SDK Quickstart (Python). Available: &lt;a href="https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/quickstart?pivots=python" rel="noopener noreferrer"&gt;https://learn.microsoft.com/en-us/microsoft-365/agents-sdk/quickstart?pivots=python&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span id="ref-3"&gt;&lt;/span&gt;Microsoft. Adaptive Cards. Available: &lt;a href="https://adaptivecards.microsoft.com/" rel="noopener noreferrer"&gt;https://adaptivecards.microsoft.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span id="ref-4"&gt;&lt;/span&gt;Microsoft. Microsoft Teams admin center. Available: &lt;a href="https://admin.teams.microsoft.com" rel="noopener noreferrer"&gt;https://admin.teams.microsoft.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;span id="ref-5"&gt;&lt;/span&gt;Microsoft. Microsoft 365 admin center. Available: &lt;a href="https://admin.microsoft.com" rel="noopener noreferrer"&gt;https://admin.microsoft.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>agents</category>
      <category>microsoftteams</category>
      <category>m365agentstoolkit</category>
      <category>azurebotservice</category>
    </item>
  </channel>
</rss>
