{"id":2914,"date":"2026-09-24T08:00:57","date_gmt":"2026-09-24T15:00:57","guid":{"rendered":"https:\/\/devblogs.microsoft.com\/foundry\/?p=2914"},"modified":"2026-09-24T10:10:22","modified_gmt":"2026-09-24T17:10:22","slug":"from-chatbots-to-automated-assistants-routines-in-microsoft-foundry-are-now-generally-available","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/foundry\/from-chatbots-to-automated-assistants-routines-in-microsoft-foundry-are-now-generally-available\/","title":{"rendered":"From Chatbots to Automated Agents: Routines in Microsoft Foundry Are Now Generally Available"},"content":{"rendered":"<p>Agents are rapidly evolving beyond chat. The first generation of agents waited for a person to send a message. Today, organizations want agents that can monitor work, respond to business events, and continue tasks over time. An agent might triage a newly opened GitHub issue, respond when a message appears in a Microsoft Teams channel, prepare a report every morning, or check back on a long-running process until it finishes.<\/p>\n<p>Building that automation yourself is difficult. You need schedulers, event listeners, webhooks, queues, infrastructure, authentication, run history, and monitoring\u2014before you can focus on the agent\u2019s actual job. Today, we\u2019re announcing the general availability of <strong>r<\/strong><strong>outines in <\/strong><strong>Foundry Agent Service<\/strong>, a managed way to run agents on a schedule, at a specific time, or in response to an external event. The trigger, agent action, identity, connections, and run history live together in your Foundry project. You define when the agent should run and what it should do, and Foundry handles the rest.<\/p>\n<h2><strong>Why build automated agents with Foundry?<\/strong><\/h2>\n<p>Moving from a chatbot to an automated agent introduces a different set of engineering challenges. Suppose you want an agent to triage every new GitHub issue assigned to your team. The agent itself might already understand how to classify the issue, find related documentation, and recommend an owner. But something still needs to:<\/p>\n<ul>\n<li>Monitor GitHub for the right event.<\/li>\n<li>Authenticate to the repository.<\/li>\n<li>Deliver the event payload to the agent.<\/li>\n<li>Invoke the agent reliably.<\/li>\n<li>Authenticate the agent to its tools.<\/li>\n<li>Track whether the run succeeded.<\/li>\n<li>Preserve an audit trail.<\/li>\n<\/ul>\n<p>A recurring agent creates similar work: a scheduler, hosting infrastructure, retry logic, credentials, and a database for execution history. Every new automation adds more infrastructure to deploy and maintain. Routines bring managed agent execution into Foundry Agent Service. Create a trigger, select an agent, provide its instructions, and start the routine. Foundry queues the invocation, runs the agent, and records the result for later inspection. Teams can spend less time assembling automation infrastructure and more time building the agent capabilities that differentiate their applications.<\/p>\n<h2><strong>Run agents when work happens<\/strong><\/h2>\n<p>Routines support several ways to start an agent:<\/p>\n<table>\n<tbody>\n<tr>\n<th scope=\"col\">Trigger type<\/th>\n<th scope=\"col\">When it runs<\/th>\n<th scope=\"col\">Example uses<\/th>\n<\/tr>\n<tr>\n<td>Timer<\/td>\n<td>Once at a future date and time<\/td>\n<td>Release-day preparation, deadline reminders, and scheduled follow-ups<\/td>\n<\/tr>\n<tr>\n<td>Recurring<\/td>\n<td>Repeatedly on a schedule<\/td>\n<td>Daily summaries, weekly reports, compliance checks, backlog reviews, and operational monitoring<\/td>\n<\/tr>\n<tr>\n<td>Event-based<\/td>\n<td>When an event occurs in a connected system<\/td>\n<td>GitHub issue triage and responses to new Microsoft Teams channel messages<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Timer routines are ideal for work that should happen at a specific moment. Recurring routines let you manage a schedule alongside the agent instead of maintaining a separate scheduler and invocation service. Event-based routines allow agents to react when something changes\u2014not when someone remembers to ask. Initial integrations include GitHub issue events and new messages in Microsoft Teams channels, with more event sources planned.<\/p>\n<p>When an event occurs, Foundry receives it through the configured connection and forwards its payload to the agent. The agent can reason over the event, use its tools, and take the next appropriate action. A GitHub agent can triage an issue as soon as it arrives, while a Teams agent can detect a support request, retrieve relevant context, and initiate a response without waiting for a separate chat interaction.<\/p>\n<h2><strong>Build agents that can continue their own work<\/strong><\/h2>\n<p>Some tasks cannot be completed in a single run. An agent might start a data export, request an approval, launch a deployment, or call an API that takes several minutes to finish. The agent needs to check back later swithout requiring a person to restart it. The <strong>r<\/strong><strong>eminder tool<\/strong> <strong>(preview)<\/strong> lets a Hosted Agent in Foundry Agent Service schedule itself to run again after a delay. When the reminder fires, Foundry invokes the same agent on the same conversation, preserving the context it needs to continue.<\/p>\n<p>Consider an agent monitoring a long-running task:<\/p>\n<ol>\n<li>The agent starts the task and receives a task ID.<\/li>\n<li>It schedules a reminder for 15 minutes later.<\/li>\n<li>Foundry re-invokes it on the same session.<\/li>\n<li>The agent checks the task\u2019s status.<\/li>\n<li>If the task is still running, it schedules another reminder.<\/li>\n<li>When the task finishes, the agent summarizes the result and notifies the user.<\/li>\n<\/ol>\n<p>The agent decides when it needs to continue. Developers don\u2019t need to build a polling service, persist conversational state separately, or write custom code to invoke the agent again. Together, routines and the reminder tool support both sides of automation: externally defined triggers that start an agent and agent-directed reminders that let it continue working over time.<\/p>\n<h2><strong>Identity designed for unattended agents<\/strong><\/h2>\n<p>Automation also raises a critical question: <strong>whose identity is being used?<\/strong> For every routine type\u2014timer, recurring, or event-based\u2014you can choose whether the agent and its tools are invoked using the <strong>routine creator\u2019s identity<\/strong> or the <strong>agent\u2019s identity<\/strong>.<\/p>\n<ul>\n<li><strong>Creator identity<\/strong> lets the routine act with the creator\u2019s delegated access, keeping actions within that person\u2019s permissions and access boundaries. Use creator identity when you have tools configured to authenticate with user identity, such as Oauth.<\/li>\n<li><strong>Agent identity<\/strong> lets the routine run as an independent agent using its own configured permissions in Microsoft Entra ID. Use Agent identity when all of your tools only need key-based or managed identity for authentication.<\/li>\n<\/ul>\n<p>This flexibility lets you choose the identity model that fits the task, whether a routine runs once, repeats on a schedule, or responds to an external event. Foundry manages the underlying authentication and token exchange, helping keep identity plumbing out of agent code while making automated activity governable and auditable.<\/p>\n<h2><strong>Quickstart: create a routine with Python<\/strong><\/h2>\n<p>Install the required packages:<\/p>\n<pre><code class=\"language-bash\">pip install azure-ai-projects azure-identity<\/code><\/pre>\n<p>The following example creates a recurring routine that invokes an agent every weekday at 7:00 AM UTC:<\/p>\n<pre><code class=\"language-python\">import os\r\n\r\nfrom azure.ai.projects import AIProjectClient\r\nfrom azure.identity import DefaultAzureCredential\r\n\r\nproject = AIProjectClient(\r\n    endpoint=os.environ[\"PROJECT_ENDPOINT\"],\r\n    credential=DefaultAzureCredential(),\r\n)\r\n\r\nroutine = project.beta.routines.create_or_update(\r\n    routine_name=\"daily-summary\",\r\n    description=\"Runs a daily summary agent on weekday mornings.\",\r\n    enabled=True,\r\n    triggers={\r\n        \"weekday-morning\": {\r\n            \"type\": \"schedule\",\r\n            \"cron_expression\": \"0 7 * * 1-5\",\r\n            \"time_zone\": \"UTC\",\r\n        }\r\n    },\r\n    action={\r\n        \"type\": \"invoke_agent_responses_api\",\r\n        \"agent_name\": os.environ[\"AGENT_NAME\"],\r\n        \"input\": \"Summarize activity from the last 24 hours.\",\r\n    },\r\n)\r\n\r\nprint(f\"Created routine: {routine.name}\")\r\n<\/code><\/pre>\n<p><span data-contrast=\"auto\">If you want to use the routine creator\u2019s ide<\/span><span data-contrast=\"auto\">ntity to authenticate with the agent and the following tool calls, you can follow <\/span><span data-contrast=\"auto\">the followin<\/span><span data-contrast=\"auto\">g samples:<\/span><\/p>\n<pre class=\"prettyprint language-py\"><code class=\"language-py\">from azure.ai.projects import AIProjectClient \u00a0\r\n\r\nfrom azure.ai.projects.models import RoutineAuthorization \u00a0\r\n\r\nfrom azure.identity import AzureCliCredential\u00a0\r\n\r\n\r\n\u00a0project = AIProjectClient(\u00a0\r\n\r\n\u00a0\u00a0\u00a0 endpoint=os.environ[\"PROJECT_ENDPOINT\"],\u00a0\r\n\r\n\u00a0\u00a0\u00a0 credential=DefaultAzureCredential(),\u00a0\r\n\r\n)\u00a0\r\n\r\nroutine = project.beta.routines.create_or_update(\u00a0\r\n\r\n\u00a0\u00a0\u00a0 routine_name=\"daily-summary\",\u00a0\r\n\r\n\u00a0\u00a0\u00a0 description=\"Runs a daily summary agent on weekday mornings.\",\u00a0\r\n\r\n\u00a0\u00a0\u00a0 enabled=True,\u00a0\r\n\r\n\u00a0 \u00a0 authorization=RoutineAuthorization(identity=\"creator\"),\u00a0\r\n\r\n\u00a0\u00a0\u00a0 triggers={\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"weekday-morning\": {\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"schedule\",\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"cron_expression\": \"0 7 * * 1-5\",\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"time_zone\": \"UTC\",\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\u00a0\r\n\r\n\u00a0\u00a0\u00a0 },\u00a0\r\n\r\n\u00a0\u00a0\u00a0 action={\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"type\": \"invoke_agent_responses_api\",\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"agent_name\": os.environ[\"AGENT_NAME\"],\u00a0\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \"input\": \"Summarize activity from the last 24 hours.\",\u00a0\r\n\r\n\u00a0\u00a0\u00a0 },\u00a0\r\n\r\n)\u00a0\r\n\r\n\u00a0\u00a0\r\n\r\nprint(f\"Created routine: {routine.name}\")\r\n\r\n<\/code><\/pre>\n<p>Set <strong>PROJECT_ENDPOINT<\/strong> to your Foundry project endpoint and <strong>AGENT_NAME<\/strong> to the name of your deployed agent. You can also create and manage routines in the Microsoft Foundry portal or by using the REST API, the JavaScript and .NET SDKs, or the Azure Developer CLI. For an event-based routine, first create and authorize the corresponding project connection, then reference it when defining the trigger.<\/p>\n<h2><strong>Start building automated agents today<\/strong><\/h2>\n<p>The next generation of agents won\u2019t wait in a chat window. They will notice when work happens, act with the right identity, use the right tools, and continue until the task is complete. With Routines in Microsoft Foundry, you can build that behavior without assembling and operating the surrounding automation infrastructure yourself.\nExplore the <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/foundry\/agents\/how-to\/use-routines\">routines documentation<\/a>, add the <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/foundry\/agents\/how-to\/tools\/reminder-tool\">reminder tool<\/a> to a hosted agent, or open the <a href=\"https:\/\/ai.azure.com\/\">Microsoft Foundry portal<\/a> to create your first routine.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Agents are rapidly evolving beyond chat. The first generation of agents waited for a person to send a message. Today, organizations want agents that can monitor work, respond to business events, and continue tasks over time. An agent might triage a newly opened GitHub issue, respond when a message appears in a Microsoft Teams channel, [&hellip;]<\/p>\n","protected":false},"author":166509,"featured_media":1563,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-2914","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-microsoft-foundry"],"acf":[],"blog_post_summary":"<p>Agents are rapidly evolving beyond chat. The first generation of agents waited for a person to send a message. Today, organizations want agents that can monitor work, respond to business events, and continue tasks over time. An agent might triage a newly opened GitHub issue, respond when a message appears in a Microsoft Teams channel, [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/posts\/2914","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/users\/166509"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/comments?post=2914"}],"version-history":[{"count":2,"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/posts\/2914\/revisions"}],"predecessor-version":[{"id":2927,"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/posts\/2914\/revisions\/2927"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/media\/1563"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/media?parent=2914"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/categories?post=2914"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/foundry\/wp-json\/wp\/v2\/tags?post=2914"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}