By the end of this blog you will learn how to build a structured, modular conversational AI system using a multi-agent architecture with Azure AI Agent Service and OpenAI Agent SDK. You'll understand how to set up specialized agents—such as Triage, FAQ, Account Management, and Live Agent—to efficiently handle diverse customer interactions by delegating tasks based on user input.
In the rapidly evolving landscape of artificial intelligence (AI), the development of systems that can autonomously interact, learn, and make decisions has become a focal point. A pivotal aspect of t...
Thanks for sharing this. Did you just simulate a hand-off scenario or this live agent will actually wait for the inputs to be given by the human?
For example, if the conversation is handed off to the live agent then the agent will wait for human to answer it first and then move forward? I am struggling to run that scenario.
Hi arafattehsin, thanks for going through the tutorial. Yes, in this demo, the live agent is just another LLM for simulation purposes, but feel free to use a tool to connect to a live chat agent. In this case, you have some code changes to bypass the Triage Agent and have direct routing between the user and the live human agent.
Are you asking about Azure Monitor and Log Analytics? Log Analytics is a service within Azure Monitor. Its a bit like the relationship of Office to Word, Excel etc... Monitor is the brand, and Log Analytics is one of the solutions.
Log Analytics and Application Insights have been consolidated into Azure Monitor to provide a single integrated experience for monitoring Azure resources and hybrid environments. Documentation for each of these services has been consolidated into a single set of content for Azure Monitor.
February 2019 - Log Analytics terminology
After the consolidation of different services under Azure Monitor, we're taking the next step by modifying terminology in our documentation to better describe the Azure Monitor service and its different components.
Log Analytics
Azure Monitor log data is still stored in a Log Analytics workspace and is still collected and analyzed by the same Log Analytics service, but we are changing the termLog Analyticsin many places toAzure Monitor logs. This term better reflects its role in Azure Monitor and provides better consistency withmetrics in Azure Monitor.
The termlog analyticsnow primarily applies to the page in the Azure portal used to write and run queries and analyze log data. It's the functional equivalent ofmetrics explorer, which is the page in the Azure portal used to analyze metric data.
CliveWatson Thanks so much for taking time to answer my question
"}},"componentScriptGroups({\"componentId\":\"custom.widget.MicrosoftFooter\"})":{"__typename":"ComponentScriptGroups","scriptGroups":{"__typename":"ComponentScriptGroupsDefinition","afterInteractive":{"__typename":"PageScriptGroupDefinition","group":"AFTER_INTERACTIVE","scriptIds":[]},"lazyOnLoad":{"__typename":"PageScriptGroupDefinition","group":"LAZY_ON_LOAD","scriptIds":[]}},"componentScripts":[]},"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/community/NavbarDropdownToggle\"]})":[{"__ref":"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/common/QueryHandler\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCoverImage\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCoverImage-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeTitle\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTimeToRead\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageSubject\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageSubject-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserLink\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserLink-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserRank\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageTime\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageTime-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageBody\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageBody-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageCustomFields\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageRevision\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageRevision-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageReplyButton\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/MessageAuthorBio\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1745505310029"}],"message({\"id\":\"message:4396267\"})":{"__ref":"BlogTopicMessage:message:4396267"},"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/users/UserAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/ranks/UserRankLabel\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/users/UserRegistrationDate\"]})":[{"__ref":"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeAvatar\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeDescription\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/messages/ThreadedReplyList\"]})":[{"__ref":"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1745505310029"}],"message({\"id\":\"message:4396353\"})":{"__ref":"BlogReplyMessage:message:4396353"},"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"components/tags/TagView/TagViewChip\"]})":[{"__ref":"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745505310029"}],"cachedText({\"lastModified\":\"1745505310029\",\"locale\":\"en-US\",\"namespaces\":[\"shared/client/components/nodes/NodeIcon\"]})":[{"__ref":"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505310029"}]},"CachedAsset:pages-1745487429246":{"__typename":"CachedAsset","id":"pages-1745487429246","value":[{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"BlogViewAllPostsPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId/all-posts/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"CasePortalPage","type":"CASE_PORTAL","urlPath":"/caseportal","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"CreateGroupHubPage","type":"GROUP_HUB","urlPath":"/groups/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"CaseViewPage","type":"CASE_DETAILS","urlPath":"/case/:caseId/:caseNumber","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"InboxPage","type":"COMMUNITY","urlPath":"/inbox","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"HelpFAQPage","type":"COMMUNITY","urlPath":"/help","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"IdeaMessagePage","type":"IDEA_POST","urlPath":"/idea/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"IdeaViewAllIdeasPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/all-ideas/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"LoginPage","type":"USER","urlPath":"/signin","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"BlogPostPage","type":"BLOG","urlPath":"/category/:categoryId/blogs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"UserBlogPermissions.Page","type":"COMMUNITY","urlPath":"/c/user-blog-permissions/page","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ThemeEditorPage","type":"COMMUNITY","urlPath":"/designer/themes","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"TkbViewAllArticlesPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId/all-articles/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730142000000,"localOverride":null,"page":{"id":"AllEvents","type":"CUSTOM","urlPath":"/Events","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"OccasionEditPage","type":"EVENT","urlPath":"/event/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"OAuthAuthorizationAllowPage","type":"USER","urlPath":"/auth/authorize/allow","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"PageEditorPage","type":"COMMUNITY","urlPath":"/designer/pages","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"PostPage","type":"COMMUNITY","urlPath":"/category/:categoryId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ForumBoardPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"TkbBoardPage","type":"TKB","urlPath":"/category/:categoryId/kb/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"EventPostPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"UserBadgesPage","type":"COMMUNITY","urlPath":"/users/:login/:userId/badges","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"GroupHubMembershipAction","type":"GROUP_HUB","urlPath":"/membership/join/:nodeId/:membershipType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"MaintenancePage","type":"COMMUNITY","urlPath":"/maintenance","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"IdeaReplyPage","type":"IDEA_REPLY","urlPath":"/idea/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"UserSettingsPage","type":"USER","urlPath":"/mysettings/:userSettingsTab","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"GroupHubsPage","type":"GROUP_HUB","urlPath":"/groups","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ForumPostPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"OccasionRsvpActionPage","type":"OCCASION","urlPath":"/event/:boardId/:messageSubject/:messageId/rsvp/:responseType","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"VerifyUserEmailPage","type":"USER","urlPath":"/verifyemail/:userId/:verifyEmailToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"AllOccasionsPage","type":"OCCASION","urlPath":"/category/:categoryId/events/:boardId/all-events/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"EventBoardPage","type":"EVENT","urlPath":"/category/:categoryId/events/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"TkbReplyPage","type":"TKB_REPLY","urlPath":"/kb/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"IdeaBoardPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"CommunityGuideLinesPage","type":"COMMUNITY","urlPath":"/communityguidelines","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"CaseCreatePage","type":"SALESFORCE_CASE_CREATION","urlPath":"/caseportal/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"TkbEditPage","type":"TKB","urlPath":"/kb/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ForgotPasswordPage","type":"USER","urlPath":"/forgotpassword","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"IdeaEditPage","type":"IDEA","urlPath":"/idea/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"TagPage","type":"COMMUNITY","urlPath":"/tag/:tagName","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"BlogBoardPage","type":"BLOG","urlPath":"/category/:categoryId/blog/:boardId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"OccasionMessagePage","type":"OCCASION_TOPIC","urlPath":"/event/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ManageContentPage","type":"COMMUNITY","urlPath":"/managecontent","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ClosedMembershipNodeNonMembersPage","type":"GROUP_HUB","urlPath":"/closedgroup/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"CommunityPage","type":"COMMUNITY","urlPath":"/","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ForumMessagePage","type":"FORUM_TOPIC","urlPath":"/discussions/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"IdeaPostPage","type":"IDEA","urlPath":"/category/:categoryId/ideas/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730142000000,"localOverride":null,"page":{"id":"CommunityHub.Page","type":"CUSTOM","urlPath":"/Directory","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"BlogMessagePage","type":"BLOG_ARTICLE","urlPath":"/blog/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"RegistrationPage","type":"USER","urlPath":"/register","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"EditGroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ForumEditPage","type":"FORUM","urlPath":"/discussions/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ResetPasswordPage","type":"USER","urlPath":"/resetpassword/:userId/:resetPasswordToken","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1730142000000,"localOverride":null,"page":{"id":"AllBlogs.Page","type":"CUSTOM","urlPath":"/blogs","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"TkbMessagePage","type":"TKB_ARTICLE","urlPath":"/kb/:boardId/:messageSubject/:messageId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"BlogEditPage","type":"BLOG","urlPath":"/blog/:boardId/:messageSubject/:messageId/edit","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ManageUsersPage","type":"USER","urlPath":"/users/manage/:tab?/:manageUsersTab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ForumReplyPage","type":"FORUM_REPLY","urlPath":"/discussions/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"PrivacyPolicyPage","type":"COMMUNITY","urlPath":"/privacypolicy","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"NotificationPage","type":"COMMUNITY","urlPath":"/notifications","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"UserPage","type":"USER","urlPath":"/users/:login/:userId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"OccasionReplyPage","type":"OCCASION_REPLY","urlPath":"/event/:boardId/:messageSubject/:messageId/comments/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ManageMembersPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/manage/:tab?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"SearchResultsPage","type":"COMMUNITY","urlPath":"/search","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"BlogReplyPage","type":"BLOG_REPLY","urlPath":"/blog/:boardId/:messageSubject/:messageId/replies/:replyId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"GroupHubPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"TermsOfServicePage","type":"COMMUNITY","urlPath":"/termsofservice","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"CategoryPage","type":"CATEGORY","urlPath":"/category/:categoryId","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"ForumViewAllTopicsPage","type":"FORUM","urlPath":"/category/:categoryId/discussions/:boardId/all-topics/(/:after|/:before)?","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"TkbPostPage","type":"TKB","urlPath":"/category/:categoryId/kbs/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"},{"lastUpdatedTime":1745487429246,"localOverride":null,"page":{"id":"GroupHubPostPage","type":"GROUP_HUB","urlPath":"/group/:groupHubId/:boardId/create","__typename":"PageDescriptor"},"__typename":"PageResource"}],"localOverride":false},"CachedAsset:text:en_US-components/context/AppContext/AppContextProvider-0":{"__typename":"CachedAsset","id":"text:en_US-components/context/AppContext/AppContextProvider-0","value":{"noCommunity":"Cannot find community","noUser":"Cannot find current user","noNode":"Cannot find node with id {nodeId}","noMessage":"Cannot find message with id {messageId}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-0":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-0","value":{"title":"Loading..."},"localOverride":false},"User:user:-1":{"__typename":"User","id":"user:-1","uid":-1,"login":"Deleted","email":"","avatar":null,"rank":null,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":"ANONYMOUS","registrationTime":null,"confirmEmailStatus":false,"registrationAccessLevel":"VIEW","ssoRegistrationFields":[]},"ssoId":null,"profileSettings":{"__typename":"ProfileSettings","dateDisplayStyle":{"__typename":"InheritableStringSettingWithPossibleValues","key":"layout.friendly_dates_enabled","value":"false","localValue":"true","possibleValues":["true","false"]},"dateDisplayFormat":{"__typename":"InheritableStringSetting","key":"layout.format_pattern_date","value":"MMM dd yyyy","localValue":"MM-dd-yyyy"},"language":{"__typename":"InheritableStringSettingWithPossibleValues","key":"profile.language","value":"en-US","localValue":"en","possibleValues":["en-US"]}},"deleted":false},"Theme:customTheme1":{"__typename":"Theme","id":"customTheme1"},"Category:category:AI":{"__typename":"Category","id":"category:AI","entityType":"CATEGORY","displayId":"AI","nodeType":"category","depth":3,"title":"Artificial Intelligence and Machine Learning","shortTitle":"Artificial Intelligence and Machine Learning","parent":{"__ref":"Category:category:solutions"},"categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:top":{"__typename":"Category","id":"category:top","displayId":"top","nodeType":"category","depth":0,"title":"Top","entityType":"CATEGORY","shortTitle":"Top"},"Category:category:communities":{"__typename":"Category","id":"category:communities","displayId":"communities","nodeType":"category","depth":1,"parent":{"__ref":"Category:category:top"},"title":"Communities","entityType":"CATEGORY","shortTitle":"Communities"},"Category:category:solutions":{"__typename":"Category","id":"category:solutions","displayId":"solutions","nodeType":"category","depth":2,"parent":{"__ref":"Category:category:communities"},"title":"Topics","entityType":"CATEGORY","shortTitle":"Topics"},"Blog:board:Azure-AI-Services-blog":{"__typename":"Blog","id":"board:Azure-AI-Services-blog","entityType":"BLOG","displayId":"Azure-AI-Services-blog","nodeType":"board","depth":4,"conversationStyle":"BLOG","title":"AI - Azure AI services Blog","description":"","avatar":null,"profileSettings":{"__typename":"ProfileSettings","language":null},"parent":{"__ref":"Category:category:AI"},"ancestors":{"__typename":"CoreNodeConnection","edges":[{"__typename":"CoreNodeEdge","node":{"__ref":"Community:community:gxcuf89792"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:communities"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:solutions"}},{"__typename":"CoreNodeEdge","node":{"__ref":"Category:category:AI"}}]},"userContext":{"__typename":"NodeUserContext","canAddAttachments":false,"canUpdateNode":false,"canPostMessages":false,"isSubscribed":false},"boardPolicies":{"__typename":"BoardPolicies","canPublishArticleOnCreate":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_create_workflow_action.accessDenied","args":[]}}},"shortTitle":"AI - Azure AI services Blog","repliesProperties":{"__typename":"RepliesProperties","sortOrder":"REVERSE_PUBLISH_TIME","repliesFormat":"threaded"},"tagProperties":{"__typename":"TagNodeProperties","tagsEnabled":{"__typename":"PolicyResult","failureReason":null}},"requireTags":true,"tagType":"PRESET_ONLY"},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc","height":512,"width":512,"mimeType":"image/png"},"Rank:rank:4":{"__typename":"Rank","id":"rank:4","position":6,"name":"Microsoft","color":"333333","icon":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/cmstNC05WEo0blc\"}"},"rankStyle":"OUTLINE"},"User:user:2618628":{"__typename":"User","id":"user:2618628","uid":2618628,"login":"robertrita","deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0yNjE4NjI4LVJGNmp6eA?image-coordinates=0%2C0%2C600%2C600"},"rank":{"__ref":"Rank:rank:4"},"email":"","messagesCount":15,"biography":null,"topicsCount":2,"kudosReceivedCount":6,"kudosGivenCount":5,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2024-08-12T01:18:06.976-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"BlogTopicMessage:message:4396267":{"__typename":"BlogTopicMessage","uid":4396267,"subject":"Building a multimodal, multi-agent system using Azure AI Agent Service and OpenAI Agent SDK","id":"message:4396267","revisionNum":3,"repliesCount":5,"author":{"__ref":"User:user:2618628"},"depth":0,"hasGivenKudo":false,"board":{"__ref":"Blog:board:Azure-AI-Services-blog"},"conversation":{"__ref":"Conversation:conversation:4396267"},"messagePolicies":{"__typename":"MessagePolicies","canPublishArticleOnEdit":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","key":"error.lithium.policies.forums.policy_can_publish_on_edit_workflow_action.accessDenied","args":[]}},"canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"contentWorkflow":{"__typename":"ContentWorkflow","state":"PUBLISH","scheduledPublishTime":null,"scheduledTimezone":null,"userContext":{"__typename":"MessageWorkflowContext","canSubmitForReview":null,"canEdit":false,"canRecall":null,"canSubmitForPublication":null,"canReturnToAuthor":null,"canPublish":null,"canReturnToReview":null,"canSchedule":false},"shortScheduledTimezone":null},"readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:4396267"},"teaser@stripHtml({\"truncateLength\":200})":"","body@stripHtml({\"truncateLength\":200})":" In the rapidly evolving landscape of artificial intelligence (AI), the development of systems that can autonomously interact, learn, and make decisions has become a focal point. A pivotal aspect of t...","body@stringLength":"34385","rawBody":"
In the rapidly evolving landscape of artificial intelligence (AI), the development of systems that can autonomously interact, learn, and make decisions has become a focal point. A pivotal aspect of this advancement is the architecture of these systems, specifically the distinction between single-agent and multi-agent frameworks.
\n
Single-Agent Systems
\n
A single-agent system consists of one autonomous entity operating within an environment to achieve specific goals. This agent perceives its surroundings, processes information, and acts accordingly, all in isolation. For example, a standalone chatbot designed to handle customer inquiries functions as a single-agent system, managing interactions without collaborating with other agents.
\n
Multi-Agent Systems
\n
In contrast, a multi-agent system (MAS) comprises multiple autonomous agents that interact within a shared environment. These agents can collaborate, negotiate, or even compete to achieve individual or collective objectives. For instance, in a smart manufacturing setup, various robots (agents) might work together on an assembly line, each performing distinct tasks but coordinating to optimize the overall production process.
\n
Distinctions Between Single-Agent and Multi-Agent Architectures
\n
\n
Interaction Dynamics: Single-agent systems operate independently without the need for communication protocols. In contrast, MAS require sophisticated mechanisms for agents to interact effectively, ensuring coordination and conflict resolution.
\n
Complexity and Scalability: While single-agent systems are generally simpler to design and implement, they may struggle with complex or large-scale problems. MAS offer scalability by distributing tasks among agents, enhancing the system’s ability to handle intricate challenges.
\n
Robustness and Fault Tolerance: The decentralized nature of MAS contributes to greater resilience. If one agent fails, others can adapt or take over its functions, maintaining overall system performance. Single-agent systems lack this redundancy, making them more vulnerable to failures.
\n
\n
Context of This Guide
\n
This guide focuses on setting up a Telco Customer Service use case using OpenAI’s Agent SDK within a multi-agent architecture. By leveraging Microsoft’s Azure AI Agent Service and integrating Azure AI Search, we aim to create a system where specialized agents collaborate to provide efficient and accurate responses to user inquiries. This approach not only showcases the practical application of MAS but also highlights the benefits of combining advanced AI tools to enhance the user experience.
\nBy the end of this tutorial you should be able to run this demo.\n
Prerequisites
\n
Before setting up your multi-agent system, ensure you have the following:
\n
\n
Azure Subscription: An active Azure account is essential to access Azure AI services. If you don’t have one, you can create a free account.
\n
Azure AI Foundry Access: Access to Azure AI Foundry is necessary for creating AI hubs and projects.
\n
Azure AI Search Resource: Set up an Azure AI Search resource to enable the agent to retrieve relevant information efficiently.
\n
Development Environment: Set up a suitable environment for development, which includes:\n
\n
Azure CLI: Install the Azure Command-Line Interface to manage Azure resources from your terminal. Ensure it’s updated to the latest version.
\n
Azure AI Foundry SDK: For creating and managing AI agents.
\n
OpenAI Agent SDK: Install the OpenAI Agent SDK to facilitate the development of agentic applications.
\n
Code Editor: Such as Visual Studio Code, for writing and editing your deployment scripts.
\n
\n
\n
\n
Setting Up Azure AI Agent Service
\n
\n
Follow this blog to set up an AI Hub in Azure AI Foundry, deploy a GPT-4o model, and create your AI agent with specific instructions and tools.
\n
Add the Azure AI Search tool by following this guide. Ensure you have a sample knowledge reference PDF document uploaded to the blob storage for indexing.
\n
\n\n
Setting Up Multimodal, Multi-Agent System
\n
This code implements a conversational AI application using Azure OpenAI and Chainlit. It defines multiple specialized agents to handle user interactions, each with distinct responsibilities:
\n
Setup your local development environment:
\n
\n
Follow the steps below from cloning the repository to running the chainlit application.
\n
You can find the “Project connection string” inside your project “Overview” section in AI Foundry.
\n
Still in AI Foundry, “Agent ID” can be found inside your “Agents” section.
\n
Azure OpenAI credentials can be found under \"Models + endpoints\"
\n
\n# Your AI Foundry Project connection string, found in the Foundry Project Overview page\nAIPROJECT_CONNECTION_STRING=\"<your-foundry-project-region>.api.azureml.ms;<your-subscription-id>;<your-resource-group>;<your-foundry-project>\"\nFAQ_AGENT_ID=<agent-id>\n\n# Azure OpenAI Configuration\nAZURE_OPENAI_API_KEY=your_azure_openai_api_key\nAZURE_OPENAI_API_VERSION=2024-02-15-preview\nAZURE_OPENAI_ENDPOINT=https://your-resource-name.openai.azure.com\nAZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o\n\n
\n1. git clone -b Multi-AI-Agent-OpenAI-Agent-SDK https://github.com/robrita/tech-blogs\n\n2. copy sample.env to .env and update\n\n3. python -m venv venv\n\n4. .\\venv\\Scripts\\activate\n\n5. python -m pip install -r requirements.txt\n\n6. chainlit run app.py\n
Main Components:
\n
Agents:
\n
\n
Triage Agent: Routes user requests to the appropriate specialized agent based on the user’s query.
\n
FAQ Agent: Answers frequently asked questions by using an external FAQ lookup tool which is basically our Azure AI Agent Service.
\n
Account Management Agent: Handles user account updates, such as changing usernames, uploading ID images, and updating birth dates.
\n
Live Agent: Simulates a human customer service representative named Sarah, handling complex issues or explicit requests for human assistance.
\n
\nfaq_agent = Agent[TelcoAgentContext](\n name=\"FAQ Agent\",\n handoff_description=\"A helpful agent that can answer questions about Telco Digital.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are an FAQ agent. If you are speaking to a customer, you probably were transferred to from the triage agent.\n Use the following routine to support the customer.\n # Routine\n 1. Identify the last question asked by the customer.\n 2. Use the faq lookup tool to answer the question. Do not rely on your own knowledge.\n 3. If you cannot answer the question, transfer back to the triage agent.\"\"\",\n tools=[faq_lookup_tool],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\naccount_management_agent = Agent[TelcoAgentContext](\n name=\"Account Management Agent\",\n handoff_description=\"A helpful agent that can update customer user name.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are an account management agent. If you are speaking to a customer, you probably were transferred to from the triage agent.\n Use the following routine to support the customer.\n # Routine\n 1. Ask for their new user name, an image of their government ID or passport to be uploaded, and their birth date.\n # Very Important Notes\n - If the customer asks a question that is not related to the routine, transfer back to the triage agent.\n - Never respond to the user with any PII data such as password, ID number, etc.\"\"\",\n tools=[update_user_name],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\nlive_agent = Agent[TelcoAgentContext](\n name=\"Live Agent\",\n handoff_description=\"A live human agent that can handle complex issues or when a user specifically requests human assistance.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are a human customer service representative named Sarah. Act as if you are a real person, not an AI.\n Use a conversational, friendly tone and occasionally add small human touches to your responses.\n \n You should handle:\n 1. Complex issues that other agents couldn't resolve\n 2. Situations where a user has asked the same question multiple times\n 3. When a user explicitly asks to speak with a human agent\n 4. Technical errors or issues within the application\n \n # Human touches you can incorporate:\n - Mention taking notes: \"Let me note that down for you\"\n - Reference checking systems: \"Let me check our system for that information\"\n - Personalize responses: \"I understand how frustrating that can be\"\n - Occasionally mention your \"team\" or \"colleagues\"\n \n If the customer's issue is resolved or is actually simple enough for the automated system to handle,\n you can transfer them back to the triage agent.\"\"\",\n tools=[],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\ntriage_agent = Agent[TelcoAgentContext](\n name=\"Triage Agent\",\n handoff_description=\"A triage agent that can delegate a customer's request to the appropriate agent.\",\n instructions=(\n f\"{RECOMMENDED_PROMPT_PREFIX} \"\n \"You are a helpful triaging agent. You can use your tools to delegate questions to other appropriate agents.\"\n \"Use the response from other agents to answer the question. Do not rely on your own knowledge.\"\n \"Other than greetings, do not answer any questions yourself.\"\n \"If a user explicitly asks for a human agent or live support, transfer them to the Live Agent.\"\n \"If a user is asking the same question more than two times, transfer them to the Live Agent.\"\n \"# Very Important Notes\"\n \"- Never respond to the user with any PII data such as password, ID number, etc.\"\n ),\n handoffs=[\n handoff(agent=account_management_agent, on_handoff=on_account_management_handoff),\n faq_agent,\n live_agent,\n ],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\n
Tools:
\n
\n
faq_lookup_tool: Queries an external FAQ system to answer user questions.
\n
\n@function_tool(\n name_override=\"faq_lookup_tool\", description_override=\"Lookup frequently asked questions.\"\n)\nasync def faq_lookup_tool(question: str) -> str:\n print(f\"User Question: {question}\")\n start_time = cl.user_session.get(\"start_time\")\n print(f\"Elapsed time: {(time.time() - start_time):.2f} seconds - faq_lookup_tool\")\n is_first_token = None\n\n try:\n # create thread for the agent\n thread_id = cl.user_session.get(\"new_threads\").get(FAQ_AGENT_ID)\n print(f\"thread ID: {thread_id}\")\n\n # Create a message, with the prompt being the message content that is sent to the model\n project_client.agents.create_message(\n thread_id=thread_id,\n role=\"user\",\n content=question,\n )\n\n async with cl.Step(name=\"faq-agent\") as step:\n step.input = question\n\n # Run the agent to process tne message in the thread\n with project_client.agents.create_stream(thread_id=thread_id, agent_id=FAQ_AGENT_ID) as stream:\n for event_type, event_data, _ in stream:\n if isinstance(event_data, MessageDeltaChunk):\n # Stream the message delta chunk\n await step.stream_token(event_data.text)\n if not is_first_token:\n print(f\"Elapsed time: {(time.time() - start_time):.2f} seconds - {event_data.text}\")\n is_first_token = True\n\n elif isinstance(event_data, ThreadRun):\n if event_data.status == \"failed\":\n print(f\"Run failed. Error: {event_data.last_error}\")\n raise Exception(event_data.last_error)\n\n elif event_type == AgentStreamEvent.ERROR:\n print(f\"An error occurred. Data: {event_data}\")\n raise Exception(event_data)\n\n # Get all messages from the thread\n messages = project_client.agents.list_messages(thread_id)\n # Get the last message from the agent\n last_msg = messages.get_last_text_message_by_role(MessageRole.AGENT)\n if not last_msg:\n raise Exception(\"No response from the model.\")\n\n # Delete the thread later after processing\n delete_threads = cl.user_session.get(\"delete_threads\") or []\n delete_threads.append(thread_id)\n cl.user_session.set(\"delete_threads\", delete_threads)\n\n # print(f\"Last message: {last_msg.text.value}\")\n return last_msg.text.value\n\n except Exception as e:\n logger.error(f\"Error: {e}\")\n return \"I'm sorry, I encountered an error while processing your request. Please try again.\"\n\n
\n
update_user_name: Updates user account information based on provided details.
\n
\n@function_tool\nasync def update_user_name(\n context: RunContextWrapper[TelcoAgentContext], user_name: str, image_path: str, birth_date: str,\n) -> str:\n \"\"\"\n Update the customer user name using government ID or passport image and birth date.\n\n Args:\n user_name: The new customer user name.\n image_path: image file path of government ID or passport.\n birth_date: The customer birth date.\n \"\"\"\n # Update the context\n context.context.user_name = user_name\n context.context.image_path = image_path\n context.context.birth_date = birth_date\n print(f\"Context context: {context.context}\")\n\n # Ensure that the user ID has been set by the incoming handoff\n assert context.context.user_id is not None, \"User ID is required\"\n return f\"Updated user name to {user_name}. ID image saved successfully.\"\n\n
\n
Session Management: Uses Chainlit’s user_session to store and manage session-specific data, such as the current agent, input history, context, and thread IDs.
\n
Thread Management: Creates and deletes conversation threads using Azure AI Project Client to manage isolated conversations for each agent interaction.
\n
Streaming Responses: Streams responses from Azure OpenAI models to the user interface in real-time, providing immediate feedback (“thinking…”) and incremental updates.
\n
Error Handling: Implements robust error handling to gracefully inform users of issues during processing.
\n
Chainlit Integration: Uses Chainlit decorators (@cl.on_chat_start, .on_message) to handle chat initialization and incoming messages.
\n
\n
Full code for reference:
\nfrom __future__ import annotations as _annotations\nimport os\nimport time\nimport logging\nimport asyncio\nimport random\nimport chainlit as cl\n\nfrom pydantic import BaseModel\nfrom dotenv import load_dotenv\nfrom azure.ai.projects import AIProjectClient\nfrom azure.identity import DefaultAzureCredential\nfrom openai.types.responses import ResponseTextDeltaEvent\nfrom openai import AsyncAzureOpenAI\nfrom azure.ai.projects.models import (\n AgentStreamEvent,\n MessageDeltaChunk,\n MessageRole,\n ThreadRun,\n)\nfrom agents import (\n Agent,\n RunContextWrapper,\n Runner,\n TResponseInputItem,\n function_tool,\n handoff,\n OpenAIChatCompletionsModel,\n set_tracing_disabled,\n set_default_openai_client,\n set_default_openai_api\n)\nfrom agents.extensions.handoff_prompt import RECOMMENDED_PROMPT_PREFIX\n\nload_dotenv()\n# Disable verbose connection logs\nlogger = logging.getLogger(\"azure.core.pipeline.policies.http_logging_policy\")\nlogger.setLevel(logging.WARNING)\nset_tracing_disabled(True)\n\nAIPROJECT_CONNECTION_STRING = os.getenv(\"AIPROJECT_CONNECTION_STRING\")\nDEPLOYMENT_NAME = os.getenv(\"AZURE_OPENAI_DEPLOYMENT_NAME\")\nFAQ_AGENT_ID = os.getenv(\"FAQ_AGENT_ID\")\n\nazure_client = AsyncAzureOpenAI(\n api_version=os.getenv(\"AZURE_OPENAI_API_VERSION\"),\n azure_endpoint=os.getenv(\"AZURE_OPENAI_ENDPOINT\"),\n api_key=os.getenv(\"MY_OPENAI_API_KEY\"),\n)\n\nset_default_openai_client(azure_client, use_for_tracing=False)\nset_default_openai_api(\"chat_completions\")\n\nproject_client = AIProjectClient.from_connection_string(\n conn_str=AIPROJECT_CONNECTION_STRING, credential=DefaultAzureCredential()\n)\n\n\nclass TelcoAgentContext(BaseModel):\n user_name: str | None = None\n image_path: str | None = None\n birth_date: str | None = None\n user_id: str | None = None\n\n\n### TOOLS\n\n\n@function_tool(\n name_override=\"faq_lookup_tool\", description_override=\"Lookup frequently asked questions.\"\n)\nasync def faq_lookup_tool(question: str) -> str:\n print(f\"User Question: {question}\")\n start_time = cl.user_session.get(\"start_time\")\n print(f\"Elapsed time: {(time.time() - start_time):.2f} seconds - faq_lookup_tool\")\n is_first_token = None\n\n try:\n # create thread for the agent\n thread_id = cl.user_session.get(\"new_threads\").get(FAQ_AGENT_ID)\n print(f\"thread ID: {thread_id}\")\n\n # Create a message, with the prompt being the message content that is sent to the model\n project_client.agents.create_message(\n thread_id=thread_id,\n role=\"user\",\n content=question,\n )\n\n async with cl.Step(name=\"faq-agent\") as step:\n step.input = question\n\n # Run the agent to process tne message in the thread\n with project_client.agents.create_stream(thread_id=thread_id, agent_id=FAQ_AGENT_ID) as stream:\n for event_type, event_data, _ in stream:\n if isinstance(event_data, MessageDeltaChunk):\n # Stream the message delta chunk\n await step.stream_token(event_data.text)\n if not is_first_token:\n print(f\"Elapsed time: {(time.time() - start_time):.2f} seconds - {event_data.text}\")\n is_first_token = True\n\n elif isinstance(event_data, ThreadRun):\n if event_data.status == \"failed\":\n print(f\"Run failed. Error: {event_data.last_error}\")\n raise Exception(event_data.last_error)\n\n elif event_type == AgentStreamEvent.ERROR:\n print(f\"An error occurred. Data: {event_data}\")\n raise Exception(event_data)\n\n # Get all messages from the thread\n messages = project_client.agents.list_messages(thread_id)\n # Get the last message from the agent\n last_msg = messages.get_last_text_message_by_role(MessageRole.AGENT)\n if not last_msg:\n raise Exception(\"No response from the model.\")\n\n # Delete the thread later after processing\n delete_threads = cl.user_session.get(\"delete_threads\") or []\n delete_threads.append(thread_id)\n cl.user_session.set(\"delete_threads\", delete_threads)\n\n # print(f\"Last message: {last_msg.text.value}\")\n return last_msg.text.value\n\n except Exception as e:\n logger.error(f\"Error: {e}\")\n return \"I'm sorry, I encountered an error while processing your request. Please try again.\"\n\n\n@function_tool\nasync def update_user_name(\n context: RunContextWrapper[TelcoAgentContext], user_name: str, image_path: str, birth_date: str,\n) -> str:\n \"\"\"\n Update the customer user name using government ID or passport image and birth date.\n\n Args:\n user_name: The new customer user name.\n image_path: image file path of government ID or passport.\n birth_date: The customer birth date.\n \"\"\"\n # Update the context\n context.context.user_name = user_name\n context.context.image_path = image_path\n context.context.birth_date = birth_date\n print(f\"Context context: {context.context}\")\n\n # Ensure that the user ID has been set by the incoming handoff\n assert context.context.user_id is not None, \"User ID is required\"\n return f\"Updated user name to {user_name}. ID image saved successfully.\"\n\n\n### HOOKS\n\n\nasync def on_account_management_handoff(context: RunContextWrapper[TelcoAgentContext]) -> None:\n user_id = f\"ID-{random.randint(100, 999)}\"\n context.context.user_id = user_id\n\n\n### AGENTS\n\nfaq_agent = Agent[TelcoAgentContext](\n name=\"FAQ Agent\",\n handoff_description=\"A helpful agent that can answer questions about Telco Digital.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are an FAQ agent. If you are speaking to a customer, you probably were transferred to from the triage agent.\n Use the following routine to support the customer.\n # Routine\n 1. Identify the last question asked by the customer.\n 2. Use the faq lookup tool to answer the question. Do not rely on your own knowledge.\n 3. If you cannot answer the question, transfer back to the triage agent.\"\"\",\n tools=[faq_lookup_tool],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\naccount_management_agent = Agent[TelcoAgentContext](\n name=\"Account Management Agent\",\n handoff_description=\"A helpful agent that can update customer user name.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are an account management agent. If you are speaking to a customer, you probably were transferred to from the triage agent.\n Use the following routine to support the customer.\n # Routine\n 1. Ask for their new user name, an image of their government ID or passport to be uploaded, and their birth date.\n # Very Important Notes\n - If the customer asks a question that is not related to the routine, transfer back to the triage agent.\n - Never respond to the user with any PII data such as password, ID number, etc.\"\"\",\n tools=[update_user_name],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\nlive_agent = Agent[TelcoAgentContext](\n name=\"Live Agent\",\n handoff_description=\"A live human agent that can handle complex issues or when a user specifically requests human assistance.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are a human customer service representative named Sarah. Act as if you are a real person, not an AI.\n Use a conversational, friendly tone and occasionally add small human touches to your responses.\n \n You should handle:\n 1. Complex issues that other agents couldn't resolve\n 2. Situations where a user has asked the same question multiple times\n 3. When a user explicitly asks to speak with a human agent\n 4. Technical errors or issues within the application\n \n # Human touches you can incorporate:\n - Mention taking notes: \"Let me note that down for you\"\n - Reference checking systems: \"Let me check our system for that information\"\n - Personalize responses: \"I understand how frustrating that can be\"\n - Occasionally mention your \"team\" or \"colleagues\"\n \n If the customer's issue is resolved or is actually simple enough for the automated system to handle,\n you can transfer them back to the triage agent.\"\"\",\n tools=[],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\ntriage_agent = Agent[TelcoAgentContext](\n name=\"Triage Agent\",\n handoff_description=\"A triage agent that can delegate a customer's request to the appropriate agent.\",\n instructions=(\n f\"{RECOMMENDED_PROMPT_PREFIX} \"\n \"You are a helpful triaging agent. You can use your tools to delegate questions to other appropriate agents.\"\n \"Use the response from other agents to answer the question. Do not rely on your own knowledge.\"\n \"Other than greetings, do not answer any questions yourself.\"\n \"If a user explicitly asks for a human agent or live support, transfer them to the Live Agent.\"\n \"If a user is asking the same question more than two times, transfer them to the Live Agent.\"\n \"# Very Important Notes\"\n \"- Never respond to the user with any PII data such as password, ID number, etc.\"\n ),\n handoffs=[\n handoff(agent=account_management_agent, on_handoff=on_account_management_handoff),\n faq_agent,\n live_agent,\n ],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\nfaq_agent.handoffs.append(triage_agent)\naccount_management_agent.handoffs.append(triage_agent)\nlive_agent.handoffs.append(triage_agent)\n\n\nasync def main(user_input: str) -> None:\n current_agent = cl.user_session.get(\"current_agent\")\n input_items = cl.user_session.get(\"input_items\")\n context = cl.user_session.get(\"context\")\n print(f\"Received message: {user_input}\")\n\n # Show thinking message to user\n msg = await cl.Message(f\"thinking...\", author=\"agent\").send()\n msg_final = cl.Message(\"\", author=\"agent\")\n\n # Set an empty list for delete_threads in the user session\n cl.user_session.set(\"delete_threads\", [])\n is_thinking = True\n\n try:\n input_items.append({\"content\": user_input, \"role\": \"user\"})\n # Run the agent with streaming\n result = Runner.run_streamed(current_agent, input_items, context=context)\n last_agent = \"\"\n\n # Stream the response\n async for event in result.stream_events():\n # Get the last agent name\n if event.type == \"agent_updated_stream_event\":\n if is_thinking:\n last_agent = event.new_agent.name\n msg.content = f\"[{last_agent}] thinking...\"\n await msg.send()\n # Get the message delta chunk\n elif event.type == \"raw_response_event\" and isinstance(event.data, ResponseTextDeltaEvent):\n if is_thinking:\n is_thinking = False\n await msg.remove()\n msg_final.content = f\"[{last_agent}] \"\n await msg_final.send()\n\n await msg_final.stream_token(event.data.delta)\n\n # Update the current agent and input items in the user session\n cl.user_session.set(\"current_agent\", result.last_agent)\n cl.user_session.set(\"input_items\", result.to_input_list())\n\n except Exception as e:\n logger.error(f\"Error: {e}\")\n msg_final.content = \"I'm sorry, I encountered an error while processing your request. Please try again.\"\n\n # show the last response in the UI\n await msg_final.update()\n\n # Delete threads after processing\n delete_threads = cl.user_session.get(\"delete_threads\") or []\n for thread_id in delete_threads:\n try:\n project_client.agents.delete_thread(thread_id)\n print(f\"Deleted thread: {thread_id}\")\n except Exception as e:\n print(f\"Error deleting thread {thread_id}: {e}\")\n\n # Create new thread for the next message\n new_threads = cl.user_session.get(\"new_threads\") or {}\n\n for key in new_threads:\n if new_threads[key] in delete_threads:\n thread = project_client.agents.create_thread()\n new_threads[key] = thread.id\n print(f\"Created new thread: {thread.id}\")\n\n # Update new threads in the user session\n cl.user_session.set(\"new_threads\", new_threads)\n\n\n# Chainlit setup\n@cl.on_chat_start\nasync def on_chat_start():\n # Initialize user session\n current_agent: Agent[TelcoAgentContext] = triage_agent\n input_items: list[TResponseInputItem] = []\n\n cl.user_session.set(\"current_agent\", current_agent)\n cl.user_session.set(\"input_items\", input_items)\n cl.user_session.set(\"context\", TelcoAgentContext())\n\n # Create a thread for the agent\n thread = project_client.agents.create_thread()\n cl.user_session.set(\"new_threads\", {\n FAQ_AGENT_ID: thread.id,\n })\n\n\n@cl.on_message\nasync def on_message(message: cl.Message):\n cl.user_session.set(\"start_time\", time.time())\n user_input = message.content\n\n for element in message.elements:\n # check if the element is an image\n if element.mime.startswith(\"image/\"):\n user_input += f\"\\n[uploaded image] {element.path}\"\n print(f\"Received file: {element.path}\")\n\n asyncio.run(main(user_input))\n\nif __name__ == \"__main__\":\n # Chainlit will automatically run the application\n pass\n
Workflow: When a user sends a message:
\n
\n
The Triage Agent initially handles the request.
\n
Based on the user’s input, the Triage Agent delegates the request to the appropriate specialized agent (FAQ, Account Management, or Live Agent).
\n
The selected agent processes the request using its defined tools and instructions.
\n
Responses are streamed back to the user interface.
\n
After processing, temporary conversation threads are cleaned up, and new threads are created for subsequent interactions.
\n
\n
Technologies Used:
\n
\n
Azure OpenAI: For generating conversational responses.
\n
Azure AI Project Client: For managing agent threads and messages.
\n
OpenAI Agents SDK: For orchestrating multiple agents.
\n
Chainlit: For building interactive conversational UI.
\n
Pydantic: For structured data modeling.
\n
Asyncio: For asynchronous operations and streaming responses.
\n
\n
In summary, multi-agent system provides a structured, modular conversational AI system designed to handle customer interactions efficiently, delegate tasks to specialized agents, manage user sessions, and integrate seamlessly with Azure’s AI services.
","kudosSumWeight":1,"postTime":"2025-03-23T04:02:13.086-07:00","images":{"__typename":"AssociatedImageConnection","edges":[{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDE","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LThsbmd1Sw?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDI","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LUtHdG9SRQ?revision=3\"}"}},{"__typename":"AssociatedImageEdge","cursor":"MjUuMXwyLjF8b3wyNXxfTlZffDM","node":{"__ref":"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LWlZdm1KaA?revision=3\"}"}}],"totalCount":3,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"tags":{"__typename":"TagConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDE","node":{"__typename":"Tag","id":"tag:azure ai search","text":"azure ai search","time":"2019-12-04T13:04:54.809-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDI","node":{"__typename":"Tag","id":"tag:azure ai studio","text":"azure ai studio","time":"2023-11-11T00:57:52.231-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}},{"__typename":"TagEdge","cursor":"MjUuMXwyLjF8b3wxMHxfTlZffDM","node":{"__typename":"Tag","id":"tag:azure openai service","text":"azure openai service","time":"2022-12-14T08:49:09.396-08:00","lastActivityTime":null,"messagesCount":null,"followersCount":null}}]},"timeToRead":15,"rawTeaser":"","introduction":"By the end of this blog you will learn how to build a structured, modular conversational AI system using a multi-agent architecture with Azure AI Agent Service and OpenAI Agent SDK. You'll understand how to set up specialized agents—such as Triage, FAQ, Account Management, and Live Agent—to efficiently handle diverse customer interactions by delegating tasks based on user input.","coverImage":{"__typename":"UploadedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LThsbmd1Sw?revision=3","width":853,"height":480},"coverImageProperties":{"__typename":"CoverImageProperties","style":"WIDE","titlePosition":"BOTTOM","altText":""},"currentRevision":{"__ref":"Revision:revision:4396267_3"},"latestVersion":{"__typename":"FriendlyVersion","major":"2","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":4536},"visibilityScope":"PUBLIC","canonicalUrl":"","seoTitle":"","seoDescription":null,"placeholder":false,"originalMessageForPlaceholder":null,"contributors":{"__typename":"UserConnection","edges":[]},"nonCoAuthorContributors":{"__typename":"UserConnection","edges":[]},"coAuthors":{"__typename":"UserConnection","edges":[]},"blogMessagePolicies":{"__typename":"BlogMessagePolicies","canDoAuthoringActionsOnBlog":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","key":"error.lithium.policies.blog.action_can_do_authoring_action.accessDenied","args":[]}}},"archivalData":null,"customFields":[],"revisions({\"constraints\":{\"isPublished\":{\"eq\":true}},\"first\":1})":{"__typename":"RevisionConnection","totalCount":3},"body":"
In the rapidly evolving landscape of artificial intelligence (AI), the development of systems that can autonomously interact, learn, and make decisions has become a focal point. A pivotal aspect of this advancement is the architecture of these systems, specifically the distinction between single-agent and multi-agent frameworks.
\n
Single-Agent Systems
\n
A single-agent system consists of one autonomous entity operating within an environment to achieve specific goals. This agent perceives its surroundings, processes information, and acts accordingly, all in isolation. For example, a standalone chatbot designed to handle customer inquiries functions as a single-agent system, managing interactions without collaborating with other agents.
\n
Multi-Agent Systems
\n
In contrast, a multi-agent system (MAS) comprises multiple autonomous agents that interact within a shared environment. These agents can collaborate, negotiate, or even compete to achieve individual or collective objectives. For instance, in a smart manufacturing setup, various robots (agents) might work together on an assembly line, each performing distinct tasks but coordinating to optimize the overall production process.
\n
Distinctions Between Single-Agent and Multi-Agent Architectures
\n
\n
Interaction Dynamics: Single-agent systems operate independently without the need for communication protocols. In contrast, MAS require sophisticated mechanisms for agents to interact effectively, ensuring coordination and conflict resolution.
\n
Complexity and Scalability: While single-agent systems are generally simpler to design and implement, they may struggle with complex or large-scale problems. MAS offer scalability by distributing tasks among agents, enhancing the system’s ability to handle intricate challenges.
\n
Robustness and Fault Tolerance: The decentralized nature of MAS contributes to greater resilience. If one agent fails, others can adapt or take over its functions, maintaining overall system performance. Single-agent systems lack this redundancy, making them more vulnerable to failures.
\n
\n
Context of This Guide
\n
This guide focuses on setting up a Telco Customer Service use case using OpenAI’s Agent SDK within a multi-agent architecture. By leveraging Microsoft’s Azure AI Agent Service and integrating Azure AI Search, we aim to create a system where specialized agents collaborate to provide efficient and accurate responses to user inquiries. This approach not only showcases the practical application of MAS but also highlights the benefits of combining advanced AI tools to enhance the user experience.
\nBy the end of this tutorial you should be able to run this demo.\n
Prerequisites
\n
Before setting up your multi-agent system, ensure you have the following:
\n
\n
Azure Subscription: An active Azure account is essential to access Azure AI services. If you don’t have one, you can create a free account.
\n
Azure AI Foundry Access: Access to Azure AI Foundry is necessary for creating AI hubs and projects.
\n
Azure AI Search Resource: Set up an Azure AI Search resource to enable the agent to retrieve relevant information efficiently.
\n
Development Environment: Set up a suitable environment for development, which includes:\n
\n
Azure CLI: Install the Azure Command-Line Interface to manage Azure resources from your terminal. Ensure it’s updated to the latest version.
\n
Azure AI Foundry SDK: For creating and managing AI agents.
\n
OpenAI Agent SDK: Install the OpenAI Agent SDK to facilitate the development of agentic applications.
\n
Code Editor: Such as Visual Studio Code, for writing and editing your deployment scripts.
\n
\n
\n
\n
Setting Up Azure AI Agent Service
\n
\n
Follow this blog to set up an AI Hub in Azure AI Foundry, deploy a GPT-4o model, and create your AI agent with specific instructions and tools.
\n
Add the Azure AI Search tool by following this guide. Ensure you have a sample knowledge reference PDF document uploaded to the blob storage for indexing.
\n
\n\n
Setting Up Multimodal, Multi-Agent System
\n
This code implements a conversational AI application using Azure OpenAI and Chainlit. It defines multiple specialized agents to handle user interactions, each with distinct responsibilities:
\n
Setup your local development environment:
\n
\n
Follow the steps below from cloning the repository to running the chainlit application.
\n
You can find the “Project connection string” inside your project “Overview” section in AI Foundry.
\n
Still in AI Foundry, “Agent ID” can be found inside your “Agents” section.
\n
Azure OpenAI credentials can be found under \"Models + endpoints\"
\n
\n
# Your AI Foundry Project connection string, found in the Foundry Project Overview page\nAIPROJECT_CONNECTION_STRING=\"<your-foundry-project-region>.api.azureml.ms;<your-subscription-id>;<your-resource-group>;<your-foundry-project>\"\nFAQ_AGENT_ID=<agent-id>\n\n# Azure OpenAI Configuration\nAZURE_OPENAI_API_KEY=your_azure_openai_api_key\nAZURE_OPENAI_API_VERSION=2024-02-15-preview\nAZURE_OPENAI_ENDPOINT=https://your-resource-name.openai.azure.com\nAZURE_OPENAI_DEPLOYMENT_NAME=gpt-4o\n
\n
\n
1. git clone -b Multi-AI-Agent-OpenAI-Agent-SDK https://github.com/robrita/tech-blogs\n\n2. copy sample.env to .env and update\n\n3. python -m venv venv\n\n4. .\\venv\\Scripts\\activate\n\n5. python -m pip install -r requirements.txt\n\n6. chainlit run app.py
\n
Main Components:
\n
Agents:
\n
\n
Triage Agent: Routes user requests to the appropriate specialized agent based on the user’s query.
\n
FAQ Agent: Answers frequently asked questions by using an external FAQ lookup tool which is basically our Azure AI Agent Service.
\n
Account Management Agent: Handles user account updates, such as changing usernames, uploading ID images, and updating birth dates.
\n
Live Agent: Simulates a human customer service representative named Sarah, handling complex issues or explicit requests for human assistance.
\n
\n
faq_agent = Agent[TelcoAgentContext](\n name=\"FAQ Agent\",\n handoff_description=\"A helpful agent that can answer questions about Telco Digital.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are an FAQ agent. If you are speaking to a customer, you probably were transferred to from the triage agent.\n Use the following routine to support the customer.\n # Routine\n 1. Identify the last question asked by the customer.\n 2. Use the faq lookup tool to answer the question. Do not rely on your own knowledge.\n 3. If you cannot answer the question, transfer back to the triage agent.\"\"\",\n tools=[faq_lookup_tool],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\naccount_management_agent = Agent[TelcoAgentContext](\n name=\"Account Management Agent\",\n handoff_description=\"A helpful agent that can update customer user name.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are an account management agent. If you are speaking to a customer, you probably were transferred to from the triage agent.\n Use the following routine to support the customer.\n # Routine\n 1. Ask for their new user name, an image of their government ID or passport to be uploaded, and their birth date.\n # Very Important Notes\n - If the customer asks a question that is not related to the routine, transfer back to the triage agent.\n - Never respond to the user with any PII data such as password, ID number, etc.\"\"\",\n tools=[update_user_name],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\nlive_agent = Agent[TelcoAgentContext](\n name=\"Live Agent\",\n handoff_description=\"A live human agent that can handle complex issues or when a user specifically requests human assistance.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are a human customer service representative named Sarah. Act as if you are a real person, not an AI.\n Use a conversational, friendly tone and occasionally add small human touches to your responses.\n \n You should handle:\n 1. Complex issues that other agents couldn't resolve\n 2. Situations where a user has asked the same question multiple times\n 3. When a user explicitly asks to speak with a human agent\n 4. Technical errors or issues within the application\n \n # Human touches you can incorporate:\n - Mention taking notes: \"Let me note that down for you\"\n - Reference checking systems: \"Let me check our system for that information\"\n - Personalize responses: \"I understand how frustrating that can be\"\n - Occasionally mention your \"team\" or \"colleagues\"\n \n If the customer's issue is resolved or is actually simple enough for the automated system to handle,\n you can transfer them back to the triage agent.\"\"\",\n tools=[],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\ntriage_agent = Agent[TelcoAgentContext](\n name=\"Triage Agent\",\n handoff_description=\"A triage agent that can delegate a customer's request to the appropriate agent.\",\n instructions=(\n f\"{RECOMMENDED_PROMPT_PREFIX} \"\n \"You are a helpful triaging agent. You can use your tools to delegate questions to other appropriate agents.\"\n \"Use the response from other agents to answer the question. Do not rely on your own knowledge.\"\n \"Other than greetings, do not answer any questions yourself.\"\n \"If a user explicitly asks for a human agent or live support, transfer them to the Live Agent.\"\n \"If a user is asking the same question more than two times, transfer them to the Live Agent.\"\n \"# Very Important Notes\"\n \"- Never respond to the user with any PII data such as password, ID number, etc.\"\n ),\n handoffs=[\n handoff(agent=account_management_agent, on_handoff=on_account_management_handoff),\n faq_agent,\n live_agent,\n ],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n
\n
Tools:
\n
\n
faq_lookup_tool: Queries an external FAQ system to answer user questions.
\n
\n
@function_tool(\n name_override=\"faq_lookup_tool\", description_override=\"Lookup frequently asked questions.\"\n)\nasync def faq_lookup_tool(question: str) -> str:\n print(f\"User Question: {question}\")\n start_time = cl.user_session.get(\"start_time\")\n print(f\"Elapsed time: {(time.time() - start_time):.2f} seconds - faq_lookup_tool\")\n is_first_token = None\n\n try:\n # create thread for the agent\n thread_id = cl.user_session.get(\"new_threads\").get(FAQ_AGENT_ID)\n print(f\"thread ID: {thread_id}\")\n\n # Create a message, with the prompt being the message content that is sent to the model\n project_client.agents.create_message(\n thread_id=thread_id,\n role=\"user\",\n content=question,\n )\n\n async with cl.Step(name=\"faq-agent\") as step:\n step.input = question\n\n # Run the agent to process tne message in the thread\n with project_client.agents.create_stream(thread_id=thread_id, agent_id=FAQ_AGENT_ID) as stream:\n for event_type, event_data, _ in stream:\n if isinstance(event_data, MessageDeltaChunk):\n # Stream the message delta chunk\n await step.stream_token(event_data.text)\n if not is_first_token:\n print(f\"Elapsed time: {(time.time() - start_time):.2f} seconds - {event_data.text}\")\n is_first_token = True\n\n elif isinstance(event_data, ThreadRun):\n if event_data.status == \"failed\":\n print(f\"Run failed. Error: {event_data.last_error}\")\n raise Exception(event_data.last_error)\n\n elif event_type == AgentStreamEvent.ERROR:\n print(f\"An error occurred. Data: {event_data}\")\n raise Exception(event_data)\n\n # Get all messages from the thread\n messages = project_client.agents.list_messages(thread_id)\n # Get the last message from the agent\n last_msg = messages.get_last_text_message_by_role(MessageRole.AGENT)\n if not last_msg:\n raise Exception(\"No response from the model.\")\n\n # Delete the thread later after processing\n delete_threads = cl.user_session.get(\"delete_threads\") or []\n delete_threads.append(thread_id)\n cl.user_session.set(\"delete_threads\", delete_threads)\n\n # print(f\"Last message: {last_msg.text.value}\")\n return last_msg.text.value\n\n except Exception as e:\n logger.error(f\"Error: {e}\")\n return \"I'm sorry, I encountered an error while processing your request. Please try again.\"\n
\n
\n
update_user_name: Updates user account information based on provided details.
\n
\n
@function_tool\nasync def update_user_name(\n context: RunContextWrapper[TelcoAgentContext], user_name: str, image_path: str, birth_date: str,\n) -> str:\n \"\"\"\n Update the customer user name using government ID or passport image and birth date.\n\n Args:\n user_name: The new customer user name.\n image_path: image file path of government ID or passport.\n birth_date: The customer birth date.\n \"\"\"\n # Update the context\n context.context.user_name = user_name\n context.context.image_path = image_path\n context.context.birth_date = birth_date\n print(f\"Context context: {context.context}\")\n\n # Ensure that the user ID has been set by the incoming handoff\n assert context.context.user_id is not None, \"User ID is required\"\n return f\"Updated user name to {user_name}. ID image saved successfully.\"\n
\n
\n
Session Management: Uses Chainlit’s user_session to store and manage session-specific data, such as the current agent, input history, context, and thread IDs.
\n
Thread Management: Creates and deletes conversation threads using Azure AI Project Client to manage isolated conversations for each agent interaction.
\n
Streaming Responses: Streams responses from Azure OpenAI models to the user interface in real-time, providing immediate feedback (“thinking…”) and incremental updates.
\n
Error Handling: Implements robust error handling to gracefully inform users of issues during processing.
\n
Chainlit Integration: Uses Chainlit decorators (@cl.on_chat_start, cl.on_message) to handle chat initialization and incoming messages.
\n
\n
Full code for reference:
\n
from __future__ import annotations as _annotations\nimport os\nimport time\nimport logging\nimport asyncio\nimport random\nimport chainlit as cl\n\nfrom pydantic import BaseModel\nfrom dotenv import load_dotenv\nfrom azure.ai.projects import AIProjectClient\nfrom azure.identity import DefaultAzureCredential\nfrom openai.types.responses import ResponseTextDeltaEvent\nfrom openai import AsyncAzureOpenAI\nfrom azure.ai.projects.models import (\n AgentStreamEvent,\n MessageDeltaChunk,\n MessageRole,\n ThreadRun,\n)\nfrom agents import (\n Agent,\n RunContextWrapper,\n Runner,\n TResponseInputItem,\n function_tool,\n handoff,\n OpenAIChatCompletionsModel,\n set_tracing_disabled,\n set_default_openai_client,\n set_default_openai_api\n)\nfrom agents.extensions.handoff_prompt import RECOMMENDED_PROMPT_PREFIX\n\nload_dotenv()\n# Disable verbose connection logs\nlogger = logging.getLogger(\"azure.core.pipeline.policies.http_logging_policy\")\nlogger.setLevel(logging.WARNING)\nset_tracing_disabled(True)\n\nAIPROJECT_CONNECTION_STRING = os.getenv(\"AIPROJECT_CONNECTION_STRING\")\nDEPLOYMENT_NAME = os.getenv(\"AZURE_OPENAI_DEPLOYMENT_NAME\")\nFAQ_AGENT_ID = os.getenv(\"FAQ_AGENT_ID\")\n\nazure_client = AsyncAzureOpenAI(\n api_version=os.getenv(\"AZURE_OPENAI_API_VERSION\"),\n azure_endpoint=os.getenv(\"AZURE_OPENAI_ENDPOINT\"),\n api_key=os.getenv(\"MY_OPENAI_API_KEY\"),\n)\n\nset_default_openai_client(azure_client, use_for_tracing=False)\nset_default_openai_api(\"chat_completions\")\n\nproject_client = AIProjectClient.from_connection_string(\n conn_str=AIPROJECT_CONNECTION_STRING, credential=DefaultAzureCredential()\n)\n\n\nclass TelcoAgentContext(BaseModel):\n user_name: str | None = None\n image_path: str | None = None\n birth_date: str | None = None\n user_id: str | None = None\n\n\n### TOOLS\n\n\n@function_tool(\n name_override=\"faq_lookup_tool\", description_override=\"Lookup frequently asked questions.\"\n)\nasync def faq_lookup_tool(question: str) -> str:\n print(f\"User Question: {question}\")\n start_time = cl.user_session.get(\"start_time\")\n print(f\"Elapsed time: {(time.time() - start_time):.2f} seconds - faq_lookup_tool\")\n is_first_token = None\n\n try:\n # create thread for the agent\n thread_id = cl.user_session.get(\"new_threads\").get(FAQ_AGENT_ID)\n print(f\"thread ID: {thread_id}\")\n\n # Create a message, with the prompt being the message content that is sent to the model\n project_client.agents.create_message(\n thread_id=thread_id,\n role=\"user\",\n content=question,\n )\n\n async with cl.Step(name=\"faq-agent\") as step:\n step.input = question\n\n # Run the agent to process tne message in the thread\n with project_client.agents.create_stream(thread_id=thread_id, agent_id=FAQ_AGENT_ID) as stream:\n for event_type, event_data, _ in stream:\n if isinstance(event_data, MessageDeltaChunk):\n # Stream the message delta chunk\n await step.stream_token(event_data.text)\n if not is_first_token:\n print(f\"Elapsed time: {(time.time() - start_time):.2f} seconds - {event_data.text}\")\n is_first_token = True\n\n elif isinstance(event_data, ThreadRun):\n if event_data.status == \"failed\":\n print(f\"Run failed. Error: {event_data.last_error}\")\n raise Exception(event_data.last_error)\n\n elif event_type == AgentStreamEvent.ERROR:\n print(f\"An error occurred. Data: {event_data}\")\n raise Exception(event_data)\n\n # Get all messages from the thread\n messages = project_client.agents.list_messages(thread_id)\n # Get the last message from the agent\n last_msg = messages.get_last_text_message_by_role(MessageRole.AGENT)\n if not last_msg:\n raise Exception(\"No response from the model.\")\n\n # Delete the thread later after processing\n delete_threads = cl.user_session.get(\"delete_threads\") or []\n delete_threads.append(thread_id)\n cl.user_session.set(\"delete_threads\", delete_threads)\n\n # print(f\"Last message: {last_msg.text.value}\")\n return last_msg.text.value\n\n except Exception as e:\n logger.error(f\"Error: {e}\")\n return \"I'm sorry, I encountered an error while processing your request. Please try again.\"\n\n\n@function_tool\nasync def update_user_name(\n context: RunContextWrapper[TelcoAgentContext], user_name: str, image_path: str, birth_date: str,\n) -> str:\n \"\"\"\n Update the customer user name using government ID or passport image and birth date.\n\n Args:\n user_name: The new customer user name.\n image_path: image file path of government ID or passport.\n birth_date: The customer birth date.\n \"\"\"\n # Update the context\n context.context.user_name = user_name\n context.context.image_path = image_path\n context.context.birth_date = birth_date\n print(f\"Context context: {context.context}\")\n\n # Ensure that the user ID has been set by the incoming handoff\n assert context.context.user_id is not None, \"User ID is required\"\n return f\"Updated user name to {user_name}. ID image saved successfully.\"\n\n\n### HOOKS\n\n\nasync def on_account_management_handoff(context: RunContextWrapper[TelcoAgentContext]) -> None:\n user_id = f\"ID-{random.randint(100, 999)}\"\n context.context.user_id = user_id\n\n\n### AGENTS\n\nfaq_agent = Agent[TelcoAgentContext](\n name=\"FAQ Agent\",\n handoff_description=\"A helpful agent that can answer questions about Telco Digital.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are an FAQ agent. If you are speaking to a customer, you probably were transferred to from the triage agent.\n Use the following routine to support the customer.\n # Routine\n 1. Identify the last question asked by the customer.\n 2. Use the faq lookup tool to answer the question. Do not rely on your own knowledge.\n 3. If you cannot answer the question, transfer back to the triage agent.\"\"\",\n tools=[faq_lookup_tool],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\naccount_management_agent = Agent[TelcoAgentContext](\n name=\"Account Management Agent\",\n handoff_description=\"A helpful agent that can update customer user name.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are an account management agent. If you are speaking to a customer, you probably were transferred to from the triage agent.\n Use the following routine to support the customer.\n # Routine\n 1. Ask for their new user name, an image of their government ID or passport to be uploaded, and their birth date.\n # Very Important Notes\n - If the customer asks a question that is not related to the routine, transfer back to the triage agent.\n - Never respond to the user with any PII data such as password, ID number, etc.\"\"\",\n tools=[update_user_name],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\nlive_agent = Agent[TelcoAgentContext](\n name=\"Live Agent\",\n handoff_description=\"A live human agent that can handle complex issues or when a user specifically requests human assistance.\",\n instructions=f\"\"\"{RECOMMENDED_PROMPT_PREFIX}\n You are a human customer service representative named Sarah. Act as if you are a real person, not an AI.\n Use a conversational, friendly tone and occasionally add small human touches to your responses.\n \n You should handle:\n 1. Complex issues that other agents couldn't resolve\n 2. Situations where a user has asked the same question multiple times\n 3. When a user explicitly asks to speak with a human agent\n 4. Technical errors or issues within the application\n \n # Human touches you can incorporate:\n - Mention taking notes: \"Let me note that down for you\"\n - Reference checking systems: \"Let me check our system for that information\"\n - Personalize responses: \"I understand how frustrating that can be\"\n - Occasionally mention your \"team\" or \"colleagues\"\n \n If the customer's issue is resolved or is actually simple enough for the automated system to handle,\n you can transfer them back to the triage agent.\"\"\",\n tools=[],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\ntriage_agent = Agent[TelcoAgentContext](\n name=\"Triage Agent\",\n handoff_description=\"A triage agent that can delegate a customer's request to the appropriate agent.\",\n instructions=(\n f\"{RECOMMENDED_PROMPT_PREFIX} \"\n \"You are a helpful triaging agent. You can use your tools to delegate questions to other appropriate agents.\"\n \"Use the response from other agents to answer the question. Do not rely on your own knowledge.\"\n \"Other than greetings, do not answer any questions yourself.\"\n \"If a user explicitly asks for a human agent or live support, transfer them to the Live Agent.\"\n \"If a user is asking the same question more than two times, transfer them to the Live Agent.\"\n \"# Very Important Notes\"\n \"- Never respond to the user with any PII data such as password, ID number, etc.\"\n ),\n handoffs=[\n handoff(agent=account_management_agent, on_handoff=on_account_management_handoff),\n faq_agent,\n live_agent,\n ],\n model=OpenAIChatCompletionsModel(\n model=DEPLOYMENT_NAME,\n openai_client=azure_client,\n ),\n)\n\nfaq_agent.handoffs.append(triage_agent)\naccount_management_agent.handoffs.append(triage_agent)\nlive_agent.handoffs.append(triage_agent)\n\n\nasync def main(user_input: str) -> None:\n current_agent = cl.user_session.get(\"current_agent\")\n input_items = cl.user_session.get(\"input_items\")\n context = cl.user_session.get(\"context\")\n print(f\"Received message: {user_input}\")\n\n # Show thinking message to user\n msg = await cl.Message(f\"thinking...\", author=\"agent\").send()\n msg_final = cl.Message(\"\", author=\"agent\")\n\n # Set an empty list for delete_threads in the user session\n cl.user_session.set(\"delete_threads\", [])\n is_thinking = True\n\n try:\n input_items.append({\"content\": user_input, \"role\": \"user\"})\n # Run the agent with streaming\n result = Runner.run_streamed(current_agent, input_items, context=context)\n last_agent = \"\"\n\n # Stream the response\n async for event in result.stream_events():\n # Get the last agent name\n if event.type == \"agent_updated_stream_event\":\n if is_thinking:\n last_agent = event.new_agent.name\n msg.content = f\"[{last_agent}] thinking...\"\n await msg.send()\n # Get the message delta chunk\n elif event.type == \"raw_response_event\" and isinstance(event.data, ResponseTextDeltaEvent):\n if is_thinking:\n is_thinking = False\n await msg.remove()\n msg_final.content = f\"[{last_agent}] \"\n await msg_final.send()\n\n await msg_final.stream_token(event.data.delta)\n\n # Update the current agent and input items in the user session\n cl.user_session.set(\"current_agent\", result.last_agent)\n cl.user_session.set(\"input_items\", result.to_input_list())\n\n except Exception as e:\n logger.error(f\"Error: {e}\")\n msg_final.content = \"I'm sorry, I encountered an error while processing your request. Please try again.\"\n\n # show the last response in the UI\n await msg_final.update()\n\n # Delete threads after processing\n delete_threads = cl.user_session.get(\"delete_threads\") or []\n for thread_id in delete_threads:\n try:\n project_client.agents.delete_thread(thread_id)\n print(f\"Deleted thread: {thread_id}\")\n except Exception as e:\n print(f\"Error deleting thread {thread_id}: {e}\")\n\n # Create new thread for the next message\n new_threads = cl.user_session.get(\"new_threads\") or {}\n\n for key in new_threads:\n if new_threads[key] in delete_threads:\n thread = project_client.agents.create_thread()\n new_threads[key] = thread.id\n print(f\"Created new thread: {thread.id}\")\n\n # Update new threads in the user session\n cl.user_session.set(\"new_threads\", new_threads)\n\n\n# Chainlit setup\n@cl.on_chat_start\nasync def on_chat_start():\n # Initialize user session\n current_agent: Agent[TelcoAgentContext] = triage_agent\n input_items: list[TResponseInputItem] = []\n\n cl.user_session.set(\"current_agent\", current_agent)\n cl.user_session.set(\"input_items\", input_items)\n cl.user_session.set(\"context\", TelcoAgentContext())\n\n # Create a thread for the agent\n thread = project_client.agents.create_thread()\n cl.user_session.set(\"new_threads\", {\n FAQ_AGENT_ID: thread.id,\n })\n\n\n@cl.on_message\nasync def on_message(message: cl.Message):\n cl.user_session.set(\"start_time\", time.time())\n user_input = message.content\n\n for element in message.elements:\n # check if the element is an image\n if element.mime.startswith(\"image/\"):\n user_input += f\"\\n[uploaded image] {element.path}\"\n print(f\"Received file: {element.path}\")\n\n asyncio.run(main(user_input))\n\nif __name__ == \"__main__\":\n # Chainlit will automatically run the application\n pass
\n
Workflow: When a user sends a message:
\n
\n
The Triage Agent initially handles the request.
\n
Based on the user’s input, the Triage Agent delegates the request to the appropriate specialized agent (FAQ, Account Management, or Live Agent).
\n
The selected agent processes the request using its defined tools and instructions.
\n
Responses are streamed back to the user interface.
\n
After processing, temporary conversation threads are cleaned up, and new threads are created for subsequent interactions.
\n
\n
Technologies Used:
\n
\n
Azure OpenAI: For generating conversational responses.
\n
Azure AI Project Client: For managing agent threads and messages.
\n
OpenAI Agents SDK: For orchestrating multiple agents.
\n
Chainlit: For building interactive conversational UI.
\n
Pydantic: For structured data modeling.
\n
Asyncio: For asynchronous operations and streaming responses.
\n
\n
In summary, multi-agent system provides a structured, modular conversational AI system designed to handle customer interactions efficiently, delegate tasks to specialized agents, manage user sessions, and integrate seamlessly with Azure’s AI services.
"},"Conversation:conversation:4396267":{"__typename":"Conversation","id":"conversation:4396267","solved":false,"topic":{"__ref":"BlogTopicMessage:message:4396267"},"lastPostingActivityTime":"2025-04-20T18:34:10.464-07:00","lastPostTime":"2025-04-20T18:34:10.464-07:00","unreadReplyCount":5,"isSubscribed":false},"ModerationData:moderation_data:4396267":{"__typename":"ModerationData","id":"moderation_data:4396267","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LThsbmd1Sw?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LThsbmd1Sw?revision=3","title":"agent-sdk-ai-agents2.gif","associationType":"COVER","width":853,"height":480,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LUtHdG9SRQ?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LUtHdG9SRQ?revision=3","title":"sample-demo.png","associationType":"BODY","width":1008,"height":912,"altText":""},"AssociatedImage:{\"url\":\"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LWlZdm1KaA?revision=3\"}":{"__typename":"AssociatedImage","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/bS00Mzk2MjY3LWlZdm1KaA?revision=3","title":"knowledge-tools.png","associationType":"BODY","width":2149,"height":1207,"altText":""},"Revision:revision:4396267_3":{"__typename":"Revision","id":"revision:4396267_3","lastEditTime":"2025-03-23T05:25:07.252-07:00"},"BlogReplyMessage:message:4396358":{"__typename":"BlogReplyMessage","id":"message:4396358","conversation":{"__ref":"Conversation:conversation:4396267"},"author":{"__ref":"User:user:2618628"},"revisionNum":1,"uid":4396358,"depth":2,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:Azure-AI-Services-blog"},"subject":"Re: Building a multimodal, multi-agent system using Azure AI Agent Service and OpenAI Agent SDK","readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:4396358"},"parent":{"__ref":"BlogReplyMessage:message:4396353"},"body":"
Hi arafattehsin, thanks for going through the tutorial. Yes, in this demo, the live agent is just another LLM for simulation purposes, but feel free to use a tool to connect to a live chat agent. In this case, you have some code changes to bypass the Triage Agent and have direct routing between the user and the live human agent.
","body@stringLength":"530","rawBody":"
Hi , thanks for going through the tutorial. Yes, in this demo, the live agent is just another LLM for simulation purposes, but feel free to use a tool to connect to a live chat agent. In this case, you have some code changes to bypass the Triage Agent and have direct routing between the user and the live human agent.
","kudosSumWeight":0,"repliesCount":0,"postTime":"2025-03-23T18:01:47.622-07:00","images":{"__typename":"AssociatedImageConnection","edges":[],"totalCount":0,"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"attachments":{"__typename":"AttachmentConnection","pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null},"edges":[]},"timeToRead":1,"currentRevision":{"__ref":"Revision:revision:4396358_1"},"latestVersion":{"__typename":"FriendlyVersion","major":"1","minor":"0"},"metrics":{"__typename":"MessageMetrics","views":311},"visibilityScope":"PUBLIC","placeholder":false,"originalMessageForPlaceholder":null,"messagePolicies":{"__typename":"MessagePolicies","canModerateSpamMessage":{"__typename":"PolicyResult","failureReason":{"__typename":"FailureReason","message":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","key":"error.lithium.policies.feature.moderation_spam.action.moderate_entity.allowed.accessDenied","args":[]}}},"customFields":[],"replies":{"__typename":"MessageConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}}},"CachedAsset:theme:customTheme1-1744326567500":{"__typename":"CachedAsset","id":"theme:customTheme1-1744326567500","value":{"id":"customTheme1","animation":{"fast":"150ms","normal":"250ms","slow":"500ms","slowest":"750ms","function":"cubic-bezier(0.07, 0.91, 0.51, 1)","__typename":"AnimationThemeSettings"},"avatar":{"borderRadius":"50%","collections":["default"],"__typename":"AvatarThemeSettings"},"basics":{"browserIcon":{"imageAssetName":"favicon-1730836283320.png","imageLastModified":"1730836286415","__typename":"ThemeAsset"},"customerLogo":{"imageAssetName":"favicon-1730836271365.png","imageLastModified":"1730836274203","__typename":"ThemeAsset"},"maximumWidthOfPageContent":"1300px","oneColumnNarrowWidth":"800px","gridGutterWidthMd":"30px","gridGutterWidthXs":"10px","pageWidthStyle":"WIDTH_OF_BROWSER","__typename":"BasicsThemeSettings"},"buttons":{"borderRadiusSm":"3px","borderRadius":"3px","borderRadiusLg":"5px","paddingY":"5px","paddingYLg":"7px","paddingYHero":"var(--lia-bs-btn-padding-y-lg)","paddingX":"12px","paddingXLg":"16px","paddingXHero":"60px","fontStyle":"NORMAL","fontWeight":"700","textTransform":"NONE","disabledOpacity":0.5,"primaryTextColor":"var(--lia-bs-white)","primaryTextHoverColor":"var(--lia-bs-white)","primaryTextActiveColor":"var(--lia-bs-white)","primaryBgColor":"var(--lia-bs-primary)","primaryBgHoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.85))","primaryBgActiveColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) * 0.7))","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","primaryBorderActive":"1px solid transparent","primaryBorderFocus":"1px solid var(--lia-bs-white)","primaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","secondaryTextColor":"var(--lia-bs-gray-900)","secondaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","secondaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","secondaryBgColor":"var(--lia-bs-gray-200)","secondaryBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","secondaryBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","secondaryBorder":"1px solid transparent","secondaryBorderHover":"1px solid transparent","secondaryBorderActive":"1px solid transparent","secondaryBorderFocus":"1px solid transparent","secondaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","tertiaryTextColor":"var(--lia-bs-gray-900)","tertiaryTextHoverColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.95))","tertiaryTextActiveColor":"hsl(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), calc(var(--lia-bs-gray-900-l) * 0.9))","tertiaryBgColor":"transparent","tertiaryBgHoverColor":"transparent","tertiaryBgActiveColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.04)","tertiaryBorder":"1px solid transparent","tertiaryBorderHover":"1px solid hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","tertiaryBorderActive":"1px solid transparent","tertiaryBorderFocus":"1px solid transparent","tertiaryBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","destructiveTextColor":"var(--lia-bs-danger)","destructiveTextHoverColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.95))","destructiveTextActiveColor":"hsl(var(--lia-bs-danger-h), var(--lia-bs-danger-s), calc(var(--lia-bs-danger-l) * 0.9))","destructiveBgColor":"var(--lia-bs-gray-200)","destructiveBgHoverColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.96))","destructiveBgActiveColor":"hsl(var(--lia-bs-gray-200-h), var(--lia-bs-gray-200-s), calc(var(--lia-bs-gray-200-l) * 0.92))","destructiveBorder":"1px solid transparent","destructiveBorderHover":"1px solid transparent","destructiveBorderActive":"1px solid transparent","destructiveBorderFocus":"1px solid transparent","destructiveBoxShadowFocus":"0 0 0 1px var(--lia-bs-primary), 0 0 0 4px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","__typename":"ButtonsThemeSettings"},"border":{"color":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","mainContent":"NONE","sideContent":"LIGHT","radiusSm":"3px","radius":"5px","radiusLg":"9px","radius50":"100vw","__typename":"BorderThemeSettings"},"boxShadow":{"xs":"0 0 0 1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.08), 0 3px 0 -1px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.16)","sm":"0 2px 4px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.12)","md":"0 5px 15px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","lg":"0 10px 30px hsla(var(--lia-bs-gray-900-h), var(--lia-bs-gray-900-s), var(--lia-bs-gray-900-l), 0.3)","__typename":"BoxShadowThemeSettings"},"cards":{"bgColor":"var(--lia-panel-bg-color)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":"var(--lia-box-shadow-xs)","__typename":"CardsThemeSettings"},"chip":{"maxWidth":"300px","height":"30px","__typename":"ChipThemeSettings"},"coreTypes":{"defaultMessageLinkColor":"var(--lia-bs-link-color)","defaultMessageLinkDecoration":"none","defaultMessageLinkFontStyle":"NORMAL","defaultMessageLinkFontWeight":"400","defaultMessageFontStyle":"NORMAL","defaultMessageFontWeight":"400","forumColor":"#4099E2","forumFontFamily":"var(--lia-bs-font-family-base)","forumFontWeight":"var(--lia-default-message-font-weight)","forumLineHeight":"var(--lia-bs-line-height-base)","forumFontStyle":"var(--lia-default-message-font-style)","forumMessageLinkColor":"var(--lia-default-message-link-color)","forumMessageLinkDecoration":"var(--lia-default-message-link-decoration)","forumMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","forumMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","forumSolvedColor":"#148563","blogColor":"#1CBAA0","blogFontFamily":"var(--lia-bs-font-family-base)","blogFontWeight":"var(--lia-default-message-font-weight)","blogLineHeight":"1.75","blogFontStyle":"var(--lia-default-message-font-style)","blogMessageLinkColor":"var(--lia-default-message-link-color)","blogMessageLinkDecoration":"var(--lia-default-message-link-decoration)","blogMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","blogMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","tkbColor":"#4C6B90","tkbFontFamily":"var(--lia-bs-font-family-base)","tkbFontWeight":"var(--lia-default-message-font-weight)","tkbLineHeight":"1.75","tkbFontStyle":"var(--lia-default-message-font-style)","tkbMessageLinkColor":"var(--lia-default-message-link-color)","tkbMessageLinkDecoration":"var(--lia-default-message-link-decoration)","tkbMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","tkbMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaColor":"#4099E2","qandaFontFamily":"var(--lia-bs-font-family-base)","qandaFontWeight":"var(--lia-default-message-font-weight)","qandaLineHeight":"var(--lia-bs-line-height-base)","qandaFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkColor":"var(--lia-default-message-link-color)","qandaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","qandaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","qandaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","qandaSolvedColor":"#3FA023","ideaColor":"#FF8000","ideaFontFamily":"var(--lia-bs-font-family-base)","ideaFontWeight":"var(--lia-default-message-font-weight)","ideaLineHeight":"var(--lia-bs-line-height-base)","ideaFontStyle":"var(--lia-default-message-font-style)","ideaMessageLinkColor":"var(--lia-default-message-link-color)","ideaMessageLinkDecoration":"var(--lia-default-message-link-decoration)","ideaMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","ideaMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","contestColor":"#FCC845","contestFontFamily":"var(--lia-bs-font-family-base)","contestFontWeight":"var(--lia-default-message-font-weight)","contestLineHeight":"var(--lia-bs-line-height-base)","contestFontStyle":"var(--lia-default-message-link-font-style)","contestMessageLinkColor":"var(--lia-default-message-link-color)","contestMessageLinkDecoration":"var(--lia-default-message-link-decoration)","contestMessageLinkFontStyle":"ITALIC","contestMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","occasionColor":"#D13A1F","occasionFontFamily":"var(--lia-bs-font-family-base)","occasionFontWeight":"var(--lia-default-message-font-weight)","occasionLineHeight":"var(--lia-bs-line-height-base)","occasionFontStyle":"var(--lia-default-message-font-style)","occasionMessageLinkColor":"var(--lia-default-message-link-color)","occasionMessageLinkDecoration":"var(--lia-default-message-link-decoration)","occasionMessageLinkFontStyle":"var(--lia-default-message-link-font-style)","occasionMessageLinkFontWeight":"var(--lia-default-message-link-font-weight)","grouphubColor":"#333333","categoryColor":"#949494","communityColor":"#FFFFFF","productColor":"#949494","__typename":"CoreTypesThemeSettings"},"colors":{"black":"#000000","white":"#FFFFFF","gray100":"#F7F7F7","gray200":"#F7F7F7","gray300":"#E8E8E8","gray400":"#D9D9D9","gray500":"#CCCCCC","gray600":"#717171","gray700":"#707070","gray800":"#545454","gray900":"#333333","dark":"#545454","light":"#F7F7F7","primary":"#0069D4","secondary":"#333333","bodyText":"#1E1E1E","bodyBg":"#FFFFFF","info":"#409AE2","success":"#41C5AE","warning":"#FCC844","danger":"#BC341B","alertSystem":"#FF6600","textMuted":"#707070","highlight":"#FFFCAD","outline":"var(--lia-bs-primary)","custom":["#D3F5A4","#243A5E"],"__typename":"ColorsThemeSettings"},"divider":{"size":"3px","marginLeft":"4px","marginRight":"4px","borderRadius":"50%","bgColor":"var(--lia-bs-gray-600)","bgColorActive":"var(--lia-bs-gray-600)","__typename":"DividerThemeSettings"},"dropdown":{"fontSize":"var(--lia-bs-font-size-sm)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius-sm)","dividerBg":"var(--lia-bs-gray-300)","itemPaddingY":"5px","itemPaddingX":"20px","headerColor":"var(--lia-bs-gray-700)","__typename":"DropdownThemeSettings"},"email":{"link":{"color":"#0069D4","hoverColor":"#0061c2","decoration":"none","hoverDecoration":"underline","__typename":"EmailLinkSettings"},"border":{"color":"#e4e4e4","__typename":"EmailBorderSettings"},"buttons":{"borderRadiusLg":"5px","paddingXLg":"16px","paddingYLg":"7px","fontWeight":"700","primaryTextColor":"#ffffff","primaryTextHoverColor":"#ffffff","primaryBgColor":"#0069D4","primaryBgHoverColor":"#005cb8","primaryBorder":"1px solid transparent","primaryBorderHover":"1px solid transparent","__typename":"EmailButtonsSettings"},"panel":{"borderRadius":"5px","borderColor":"#e4e4e4","__typename":"EmailPanelSettings"},"__typename":"EmailThemeSettings"},"emoji":{"skinToneDefault":"#ffcd43","skinToneLight":"#fae3c5","skinToneMediumLight":"#e2cfa5","skinToneMedium":"#daa478","skinToneMediumDark":"#a78058","skinToneDark":"#5e4d43","__typename":"EmojiThemeSettings"},"heading":{"color":"var(--lia-bs-body-color)","fontFamily":"Segoe UI","fontStyle":"NORMAL","fontWeight":"400","h1FontSize":"34px","h2FontSize":"32px","h3FontSize":"28px","h4FontSize":"24px","h5FontSize":"20px","h6FontSize":"16px","lineHeight":"1.3","subHeaderFontSize":"11px","subHeaderFontWeight":"500","h1LetterSpacing":"normal","h2LetterSpacing":"normal","h3LetterSpacing":"normal","h4LetterSpacing":"normal","h5LetterSpacing":"normal","h6LetterSpacing":"normal","subHeaderLetterSpacing":"2px","h1FontWeight":"var(--lia-bs-headings-font-weight)","h2FontWeight":"var(--lia-bs-headings-font-weight)","h3FontWeight":"var(--lia-bs-headings-font-weight)","h4FontWeight":"var(--lia-bs-headings-font-weight)","h5FontWeight":"var(--lia-bs-headings-font-weight)","h6FontWeight":"var(--lia-bs-headings-font-weight)","__typename":"HeadingThemeSettings"},"icons":{"size10":"10px","size12":"12px","size14":"14px","size16":"16px","size20":"20px","size24":"24px","size30":"30px","size40":"40px","size50":"50px","size60":"60px","size80":"80px","size120":"120px","size160":"160px","__typename":"IconsThemeSettings"},"imagePreview":{"bgColor":"var(--lia-bs-gray-900)","titleColor":"var(--lia-bs-white)","controlColor":"var(--lia-bs-white)","controlBgColor":"var(--lia-bs-gray-800)","__typename":"ImagePreviewThemeSettings"},"input":{"borderColor":"var(--lia-bs-gray-600)","disabledColor":"var(--lia-bs-gray-600)","focusBorderColor":"var(--lia-bs-primary)","labelMarginBottom":"10px","btnFontSize":"var(--lia-bs-font-size-sm)","focusBoxShadow":"0 0 0 3px hsla(var(--lia-bs-primary-h), var(--lia-bs-primary-s), var(--lia-bs-primary-l), 0.2)","checkLabelMarginBottom":"2px","checkboxBorderRadius":"3px","borderRadiusSm":"var(--lia-bs-border-radius-sm)","borderRadius":"var(--lia-bs-border-radius)","borderRadiusLg":"var(--lia-bs-border-radius-lg)","formTextMarginTop":"4px","textAreaBorderRadius":"var(--lia-bs-border-radius)","activeFillColor":"var(--lia-bs-primary)","__typename":"InputThemeSettings"},"loading":{"dotDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.2)","dotLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.5)","barDarkColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.06)","barLightColor":"hsla(var(--lia-bs-white-h), var(--lia-bs-white-s), var(--lia-bs-white-l), 0.4)","__typename":"LoadingThemeSettings"},"link":{"color":"var(--lia-bs-primary)","hoverColor":"hsl(var(--lia-bs-primary-h), var(--lia-bs-primary-s), calc(var(--lia-bs-primary-l) - 10%))","decoration":"none","hoverDecoration":"underline","__typename":"LinkThemeSettings"},"listGroup":{"itemPaddingY":"15px","itemPaddingX":"15px","borderColor":"var(--lia-bs-gray-300)","__typename":"ListGroupThemeSettings"},"modal":{"contentTextColor":"var(--lia-bs-body-color)","contentBg":"var(--lia-bs-white)","backgroundBg":"var(--lia-bs-black)","smSize":"440px","mdSize":"760px","lgSize":"1080px","backdropOpacity":0.3,"contentBoxShadowXs":"var(--lia-bs-box-shadow-sm)","contentBoxShadow":"var(--lia-bs-box-shadow)","headerFontWeight":"700","__typename":"ModalThemeSettings"},"navbar":{"position":"FIXED","background":{"attachment":null,"clip":null,"color":"var(--lia-bs-white)","imageAssetName":"","imageLastModified":"0","origin":null,"position":"CENTER_CENTER","repeat":"NO_REPEAT","size":"COVER","__typename":"BackgroundProps"},"backgroundOpacity":0.8,"paddingTop":"15px","paddingBottom":"15px","borderBottom":"1px solid var(--lia-bs-border-color)","boxShadow":"var(--lia-bs-box-shadow-sm)","brandMarginRight":"30px","brandMarginRightSm":"10px","brandLogoHeight":"30px","linkGap":"10px","linkJustifyContent":"flex-start","linkPaddingY":"5px","linkPaddingX":"10px","linkDropdownPaddingY":"9px","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkColor":"var(--lia-bs-body-color)","linkHoverColor":"var(--lia-bs-primary)","linkFontSize":"var(--lia-bs-font-size-sm)","linkFontStyle":"NORMAL","linkFontWeight":"400","linkTextTransform":"NONE","linkLetterSpacing":"normal","linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkBgColor":"transparent","linkBgHoverColor":"transparent","linkBorder":"none","linkBorderHover":"none","linkBoxShadow":"none","linkBoxShadowHover":"none","linkTextBorderBottom":"none","linkTextBorderBottomHover":"none","dropdownPaddingTop":"10px","dropdownPaddingBottom":"15px","dropdownPaddingX":"10px","dropdownMenuOffset":"2px","dropdownDividerMarginTop":"10px","dropdownDividerMarginBottom":"10px","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","controllerIconColor":"var(--lia-bs-body-color)","controllerIconHoverColor":"var(--lia-bs-body-color)","controllerTextColor":"var(--lia-nav-controller-icon-color)","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","controllerHighlightColor":"hsla(30, 100%, 50%)","controllerHighlightTextColor":"var(--lia-yiq-light)","controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerColor":"var(--lia-nav-controller-icon-color)","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","hamburgerBgColor":"transparent","hamburgerBgHoverColor":"transparent","hamburgerBorder":"none","hamburgerBorderHover":"none","collapseMenuMarginLeft":"20px","collapseMenuDividerBg":"var(--lia-nav-link-color)","collapseMenuDividerOpacity":0.16,"__typename":"NavbarThemeSettings"},"pager":{"textColor":"var(--lia-bs-link-color)","textFontWeight":"var(--lia-font-weight-md)","textFontSize":"var(--lia-bs-font-size-sm)","__typename":"PagerThemeSettings"},"panel":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-bs-border-radius)","borderColor":"var(--lia-bs-border-color)","boxShadow":"none","__typename":"PanelThemeSettings"},"popover":{"arrowHeight":"8px","arrowWidth":"16px","maxWidth":"300px","minWidth":"100px","headerBg":"var(--lia-bs-white)","borderColor":"var(--lia-bs-border-color)","borderRadius":"var(--lia-bs-border-radius)","boxShadow":"0 0.5rem 1rem hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.15)","__typename":"PopoverThemeSettings"},"prism":{"color":"#000000","bgColor":"#f5f2f0","fontFamily":"var(--font-family-monospace)","fontSize":"var(--lia-bs-font-size-base)","fontWeightBold":"var(--lia-bs-font-weight-bold)","fontStyleItalic":"italic","tabSize":2,"highlightColor":"#b3d4fc","commentColor":"#62707e","punctuationColor":"#6f6f6f","namespaceOpacity":"0.7","propColor":"#990055","selectorColor":"#517a00","operatorColor":"#906736","operatorBgColor":"hsla(0, 0%, 100%, 0.5)","keywordColor":"#0076a9","functionColor":"#d3284b","variableColor":"#c14700","__typename":"PrismThemeSettings"},"rte":{"bgColor":"var(--lia-bs-white)","borderRadius":"var(--lia-panel-border-radius)","boxShadow":" var(--lia-panel-box-shadow)","customColor1":"#bfedd2","customColor2":"#fbeeb8","customColor3":"#f8cac6","customColor4":"#eccafa","customColor5":"#c2e0f4","customColor6":"#2dc26b","customColor7":"#f1c40f","customColor8":"#e03e2d","customColor9":"#b96ad9","customColor10":"#3598db","customColor11":"#169179","customColor12":"#e67e23","customColor13":"#ba372a","customColor14":"#843fa1","customColor15":"#236fa1","customColor16":"#ecf0f1","customColor17":"#ced4d9","customColor18":"#95a5a6","customColor19":"#7e8c8d","customColor20":"#34495e","customColor21":"#000000","customColor22":"#ffffff","defaultMessageHeaderMarginTop":"40px","defaultMessageHeaderMarginBottom":"20px","defaultMessageItemMarginTop":"0","defaultMessageItemMarginBottom":"10px","diffAddedColor":"hsla(170, 53%, 51%, 0.4)","diffChangedColor":"hsla(43, 97%, 63%, 0.4)","diffNoneColor":"hsla(0, 0%, 80%, 0.4)","diffRemovedColor":"hsla(9, 74%, 47%, 0.4)","specialMessageHeaderMarginTop":"40px","specialMessageHeaderMarginBottom":"20px","specialMessageItemMarginTop":"0","specialMessageItemMarginBottom":"10px","__typename":"RteThemeSettings"},"tags":{"bgColor":"var(--lia-bs-gray-200)","bgHoverColor":"var(--lia-bs-gray-400)","borderRadius":"var(--lia-bs-border-radius-sm)","color":"var(--lia-bs-body-color)","hoverColor":"var(--lia-bs-body-color)","fontWeight":"var(--lia-font-weight-md)","fontSize":"var(--lia-font-size-xxs)","textTransform":"UPPERCASE","letterSpacing":"0.5px","__typename":"TagsThemeSettings"},"toasts":{"borderRadius":"var(--lia-bs-border-radius)","paddingX":"12px","__typename":"ToastsThemeSettings"},"typography":{"fontFamilyBase":"Segoe UI","fontStyleBase":"NORMAL","fontWeightBase":"400","fontWeightLight":"300","fontWeightNormal":"400","fontWeightMd":"500","fontWeightBold":"700","letterSpacingSm":"normal","letterSpacingXs":"normal","lineHeightBase":"1.5","fontSizeBase":"16px","fontSizeXxs":"11px","fontSizeXs":"12px","fontSizeSm":"14px","fontSizeLg":"20px","fontSizeXl":"24px","smallFontSize":"14px","customFonts":[{"source":"SERVER","name":"Segoe UI","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"},{"style":"NORMAL","weight":"300","__typename":"FontStyleData"},{"style":"NORMAL","weight":"600","__typename":"FontStyleData"},{"style":"NORMAL","weight":"700","__typename":"FontStyleData"},{"style":"ITALIC","weight":"400","__typename":"FontStyleData"}],"assetNames":["SegoeUI-normal-400.woff2","SegoeUI-normal-300.woff2","SegoeUI-normal-600.woff2","SegoeUI-normal-700.woff2","SegoeUI-italic-400.woff2"],"__typename":"CustomFont"},{"source":"SERVER","name":"MWF Fluent Icons","styles":[{"style":"NORMAL","weight":"400","__typename":"FontStyleData"}],"assetNames":["MWFFluentIcons-normal-400.woff2"],"__typename":"CustomFont"}],"__typename":"TypographyThemeSettings"},"unstyledListItem":{"marginBottomSm":"5px","marginBottomMd":"10px","marginBottomLg":"15px","marginBottomXl":"20px","marginBottomXxl":"25px","__typename":"UnstyledListItemThemeSettings"},"yiq":{"light":"#ffffff","dark":"#000000","__typename":"YiqThemeSettings"},"colorLightness":{"primaryDark":0.36,"primaryLight":0.74,"primaryLighter":0.89,"primaryLightest":0.95,"infoDark":0.39,"infoLight":0.72,"infoLighter":0.85,"infoLightest":0.93,"successDark":0.24,"successLight":0.62,"successLighter":0.8,"successLightest":0.91,"warningDark":0.39,"warningLight":0.68,"warningLighter":0.84,"warningLightest":0.93,"dangerDark":0.41,"dangerLight":0.72,"dangerLighter":0.89,"dangerLightest":0.95,"__typename":"ColorLightnessThemeSettings"},"localOverride":false,"__typename":"Theme"},"localOverride":false},"CachedAsset:text:en_US-components/common/EmailVerification-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/common/EmailVerification-1745505310029","value":{"email.verification.title":"Email Verification Required","email.verification.message.update.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. To change your email, visit My Settings.","email.verification.message.resend.email":"To participate in the community, you must first verify your email address. The verification email was sent to {email}. Resend email."},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/Loading/LoadingDot-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/Loading/LoadingDot-1745505310029","value":{"title":"Loading..."},"localOverride":false},"CachedAsset:quilt:o365.prod:pages/blogs/BlogMessagePage:board:Azure-AI-Services-blog-1745502714819":{"__typename":"CachedAsset","id":"quilt:o365.prod:pages/blogs/BlogMessagePage:board:Azure-AI-Services-blog-1745502714819","value":{"id":"BlogMessagePage","container":{"id":"Common","headerProps":{"backgroundImageProps":null,"backgroundColor":null,"addComponents":null,"removeComponents":["community.widget.bannerWidget"],"componentOrder":null,"__typename":"QuiltContainerSectionProps"},"headerComponentProps":{"community.widget.breadcrumbWidget":{"disableLastCrumbForDesktop":false}},"footerProps":null,"footerComponentProps":null,"items":[{"id":"blog-article","layout":"ONE_COLUMN","bgColor":null,"showTitle":null,"showDescription":null,"textPosition":null,"textColor":null,"sectionEditLevel":"LOCKED","bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"OneColumnQuiltSection","columnMap":{"main":[{"id":"blogs.widget.blogArticleWidget","className":"lia-blog-container","props":null,"__typename":"QuiltComponent"}],"__typename":"OneSectionColumns"}},{"id":"section-1729184836777","layout":"MAIN_SIDE","bgColor":"transparent","showTitle":false,"showDescription":false,"textPosition":"CENTER","textColor":"var(--lia-bs-body-color)","sectionEditLevel":null,"bgImage":null,"disableSpacing":null,"edgeToEdgeDisplay":null,"fullHeight":null,"showBorder":null,"__typename":"MainSideQuiltSection","columnMap":{"main":[],"side":[],"__typename":"MainSideSectionColumns"}}],"__typename":"QuiltContainer"},"__typename":"Quilt","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-pages/blogs/BlogMessagePage-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-pages/blogs/BlogMessagePage-1745505310029","value":{"title":"{contextMessageSubject} | {communityTitle}","errorMissing":"This blog post cannot be found","name":"Blog Message Page","section.blog-article.title":"Blog Post","archivedMessageTitle":"This Content Has Been Archived","section.section-1729184836777.title":"","section.section-1729184836777.description":"","section.CncIde.title":"Blog Post","section.tifEmD.description":"","section.tifEmD.title":""},"localOverride":false},"CachedAsset:quiltWrapper:o365.prod:Common:1745505310986":{"__typename":"CachedAsset","id":"quiltWrapper:o365.prod:Common:1745505310986","value":{"id":"Common","header":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"community.widget.navbarWidget","props":{"showUserName":true,"showRegisterLink":true,"useIconLanguagePicker":true,"useLabelLanguagePicker":true,"className":"QuiltComponent_lia-component-edit-mode__0nCcm","links":{"sideLinks":[],"mainLinks":[{"children":[],"linkType":"INTERNAL","id":"gxcuf89792","params":{},"routeName":"CommunityPage"},{"children":[],"linkType":"EXTERNAL","id":"external-link","url":"/Directory","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft365","params":{"categoryId":"microsoft365"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows","params":{"categoryId":"Windows"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-microsoft365-copilot-link","params":{"categoryId":"Microsoft365Copilot"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-teams","params":{"categoryId":"MicrosoftTeams"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-securityand-compliance","params":{"categoryId":"microsoft-security"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"azure","params":{"categoryId":"Azure"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"Common-content_management-link","params":{"categoryId":"Content_Management"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"exchange","params":{"categoryId":"Exchange"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"windows-server","params":{"categoryId":"Windows-Server"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"outlook","params":{"categoryId":"Outlook"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-endpoint-manager","params":{"categoryId":"microsoftintune"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-2","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities","url":"/","target":"BLANK"},{"children":[{"linkType":"INTERNAL","id":"a-i","params":{"categoryId":"AI"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"education-sector","params":{"categoryId":"EducationSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"partner-community","params":{"categoryId":"PartnerCommunity"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"i-t-ops-talk","params":{"categoryId":"ITOpsTalk"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"healthcare-and-life-sciences","params":{"categoryId":"HealthcareAndLifeSciences"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-mechanics","params":{"categoryId":"MicrosoftMechanics"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"public-sector","params":{"categoryId":"PublicSector"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"s-m-b","params":{"categoryId":"MicrosoftforNonprofits"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"io-t","params":{"categoryId":"IoT"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"startupsat-microsoft","params":{"categoryId":"StartupsatMicrosoft"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"driving-adoption","params":{"categoryId":"DrivingAdoption"},"routeName":"CategoryPage"},{"linkType":"EXTERNAL","id":"external-link-1","url":"/Directory","target":"SELF"}],"linkType":"EXTERNAL","id":"communities-1","url":"/","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external","url":"/Blogs","target":"SELF"},{"children":[],"linkType":"EXTERNAL","id":"external-1","url":"/Events","target":"SELF"},{"children":[{"linkType":"INTERNAL","id":"microsoft-learn-1","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"linkType":"INTERNAL","id":"microsoft-learn-blog","params":{"boardId":"MicrosoftLearnBlog","categoryId":"MicrosoftLearn"},"routeName":"BlogBoardPage"},{"linkType":"EXTERNAL","id":"external-10","url":"https://learningroomdirectory.microsoft.com/","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-3","url":"https://docs.microsoft.com/learn/dynamics365/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-4","url":"https://docs.microsoft.com/learn/m365/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-5","url":"https://docs.microsoft.com/learn/topics/sci/?wt.mc_id=techcom_header-webpage-m365","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-6","url":"https://docs.microsoft.com/learn/powerplatform/?wt.mc_id=techcom_header-webpage-powerplatform","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-7","url":"https://docs.microsoft.com/learn/github/?wt.mc_id=techcom_header-webpage-github","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-8","url":"https://docs.microsoft.com/learn/teams/?wt.mc_id=techcom_header-webpage-teams","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-9","url":"https://docs.microsoft.com/learn/dotnet/?wt.mc_id=techcom_header-webpage-dotnet","target":"BLANK"},{"linkType":"EXTERNAL","id":"external-2","url":"https://docs.microsoft.com/learn/azure/?WT.mc_id=techcom_header-webpage-m365","target":"BLANK"}],"linkType":"INTERNAL","id":"microsoft-learn","params":{"categoryId":"MicrosoftLearn"},"routeName":"CategoryPage"},{"children":[],"linkType":"INTERNAL","id":"community-info-center","params":{"categoryId":"Community-Info-Center"},"routeName":"CategoryPage"}]},"style":{"boxShadow":"var(--lia-bs-box-shadow-sm)","controllerHighlightColor":"hsla(30, 100%, 50%)","linkFontWeight":"400","dropdownDividerMarginBottom":"10px","hamburgerBorderHover":"none","linkBoxShadowHover":"none","linkFontSize":"14px","backgroundOpacity":0.8,"controllerBorderRadius":"var(--lia-border-radius-50)","hamburgerBgColor":"transparent","hamburgerColor":"var(--lia-nav-controller-icon-color)","linkTextBorderBottom":"none","brandLogoHeight":"30px","linkBgHoverColor":"transparent","linkLetterSpacing":"normal","collapseMenuDividerOpacity":0.16,"dropdownPaddingBottom":"15px","paddingBottom":"15px","dropdownMenuOffset":"2px","hamburgerBgHoverColor":"transparent","borderBottom":"1px solid var(--lia-bs-border-color)","hamburgerBorder":"none","dropdownPaddingX":"10px","brandMarginRightSm":"10px","linkBoxShadow":"none","collapseMenuDividerBg":"var(--lia-nav-link-color)","linkColor":"var(--lia-bs-body-color)","linkJustifyContent":"flex-start","dropdownPaddingTop":"10px","controllerHighlightTextColor":"var(--lia-yiq-dark)","controllerTextColor":"var(--lia-nav-controller-icon-color)","background":{"imageAssetName":"","color":"var(--lia-bs-white)","size":"COVER","repeat":"NO_REPEAT","position":"CENTER_CENTER","imageLastModified":""},"linkBorderRadius":"var(--lia-bs-border-radius-sm)","linkHoverColor":"var(--lia-bs-body-color)","position":"FIXED","linkBorder":"none","linkTextBorderBottomHover":"2px solid var(--lia-bs-body-color)","brandMarginRight":"30px","hamburgerHoverColor":"var(--lia-nav-controller-icon-color)","linkBorderHover":"none","collapseMenuMarginLeft":"20px","linkFontStyle":"NORMAL","controllerTextHoverColor":"var(--lia-nav-controller-icon-hover-color)","linkPaddingX":"10px","linkPaddingY":"5px","paddingTop":"15px","linkTextTransform":"NONE","dropdownBorderColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.08)","controllerBgHoverColor":"hsla(var(--lia-bs-black-h), var(--lia-bs-black-s), var(--lia-bs-black-l), 0.1)","linkBgColor":"transparent","linkDropdownPaddingX":"var(--lia-nav-link-px)","linkDropdownPaddingY":"9px","controllerIconColor":"var(--lia-bs-body-color)","dropdownDividerMarginTop":"10px","linkGap":"10px","controllerIconHoverColor":"var(--lia-bs-body-color)"},"showSearchIcon":false,"languagePickerStyle":"iconAndLabel"},"__typename":"QuiltComponent"},{"id":"community.widget.breadcrumbWidget","props":{"backgroundColor":"transparent","linkHighlightColor":"var(--lia-bs-primary)","visualEffects":{"showBottomBorder":true},"linkTextColor":"var(--lia-bs-gray-700)"},"__typename":"QuiltComponent"},{"id":"custom.widget.community_banner","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"usePageWidth":false,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"},{"id":"custom.widget.HeroBanner","props":{"widgetVisibility":"signedInOrAnonymous","usePageWidth":false,"useTitle":true,"cMax_items":3,"useBackground":false,"title":"","lazyLoad":false,"widgetChooser":"custom.widget.HeroBanner"},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"footer":{"backgroundImageProps":{"assetName":null,"backgroundSize":"COVER","backgroundRepeat":"NO_REPEAT","backgroundPosition":"CENTER_CENTER","lastModified":null,"__typename":"BackgroundImageProps"},"backgroundColor":"transparent","items":[{"id":"custom.widget.MicrosoftFooter","props":{"widgetVisibility":"signedInOrAnonymous","useTitle":true,"useBackground":false,"title":"","lazyLoad":false},"__typename":"QuiltComponent"}],"__typename":"QuiltWrapperSection"},"__typename":"QuiltWrapper","localOverride":false},"localOverride":false},"CachedAsset:text:en_US-components/common/ActionFeedback-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/common/ActionFeedback-1745505310029","value":{"joinedGroupHub.title":"Welcome","joinedGroupHub.message":"You are now a member of this group and are subscribed to updates.","groupHubInviteNotFound.title":"Invitation Not Found","groupHubInviteNotFound.message":"Sorry, we could not find your invitation to the group. The owner may have canceled the invite.","groupHubNotFound.title":"Group Not Found","groupHubNotFound.message":"The grouphub you tried to join does not exist. It may have been deleted.","existingGroupHubMember.title":"Already Joined","existingGroupHubMember.message":"You are already a member of this group.","accountLocked.title":"Account Locked","accountLocked.message":"Your account has been locked due to multiple failed attempts. Try again in {lockoutTime} minutes.","editedGroupHub.title":"Changes Saved","editedGroupHub.message":"Your group has been updated.","leftGroupHub.title":"Goodbye","leftGroupHub.message":"You are no longer a member of this group and will not receive future updates.","deletedGroupHub.title":"Deleted","deletedGroupHub.message":"The group has been deleted.","groupHubCreated.title":"Group Created","groupHubCreated.message":"{groupHubName} is ready to use","accountClosed.title":"Account Closed","accountClosed.message":"The account has been closed and you will now be redirected to the homepage","resetTokenExpired.title":"Reset Password Link has Expired","resetTokenExpired.message":"Try resetting your password again","invalidUrl.title":"Invalid URL","invalidUrl.message":"The URL you're using is not recognized. Verify your URL and try again.","accountClosedForUser.title":"Account Closed","accountClosedForUser.message":"{userName}'s account is closed","inviteTokenInvalid.title":"Invitation Invalid","inviteTokenInvalid.message":"Your invitation to the community has been canceled or expired.","inviteTokenError.title":"Invitation Verification Failed","inviteTokenError.message":"The url you are utilizing is not recognized. Verify your URL and try again","pageNotFound.title":"Access Denied","pageNotFound.message":"You do not have access to this area of the community or it doesn't exist","eventAttending.title":"Responded as Attending","eventAttending.message":"You'll be notified when there's new activity and reminded as the event approaches","eventInterested.title":"Responded as Interested","eventInterested.message":"You'll be notified when there's new activity and reminded as the event approaches","eventNotFound.title":"Event Not Found","eventNotFound.message":"The event you tried to respond to does not exist.","redirectToRelatedPage.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.title":"Showing Related Content","redirectToRelatedPageForBaseUsers.message":"The content you are trying to access is archived","redirectToRelatedPage.message":"The content you are trying to access is archived","relatedUrl.archivalLink.flyoutMessage":"The content you are trying to access is archived View Archived Content"},"localOverride":false},"CachedAsset:component:custom.widget.community_banner-en-1744400827952":{"__typename":"CachedAsset","id":"component:custom.widget.community_banner-en-1744400827952","value":{"component":{"id":"custom.widget.community_banner","template":{"id":"community_banner","markupLanguage":"HANDLEBARS","style":".community-banner {\n a.top-bar.btn {\n top: 0px;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0px;\n background: #0068b8;\n color: white;\n padding: 10px 0px;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0px !important;\n font-size: 14px;\n }\n}\n","texts":null,"defaults":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.community_banner","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"community announcement text","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_community_banner_community-banner_1x9u2_1 {\n a.custom_widget_community_banner_top-bar_1x9u2_2.custom_widget_community_banner_btn_1x9u2_2 {\n top: 0;\n width: 100%;\n z-index: 999;\n text-align: center;\n left: 0;\n background: #0068b8;\n color: white;\n padding: 0.625rem 0;\n display: block;\n box-shadow: none !important;\n border: none !important;\n border-radius: none !important;\n margin: 0 !important;\n font-size: 0.875rem;\n }\n}\n","tokens":{"community-banner":"custom_widget_community_banner_community-banner_1x9u2_1","top-bar":"custom_widget_community_banner_top-bar_1x9u2_2","btn":"custom_widget_community_banner_btn_1x9u2_2"}},"form":null},"localOverride":false},"CachedAsset:component:custom.widget.HeroBanner-en-1744400827952":{"__typename":"CachedAsset","id":"component:custom.widget.HeroBanner-en-1744400827952","value":{"component":{"id":"custom.widget.HeroBanner","template":{"id":"HeroBanner","markupLanguage":"REACT","style":null,"texts":{"searchPlaceholderText":"Search this community","followActionText":"Follow","unfollowActionText":"Following","searchOnHoverText":"Please enter your search term(s) and then press return key to complete a search.","blogs.sidebar.pagetitle":"Latest Blogs | Microsoft Tech Community","followThisNode":"Follow this node","unfollowThisNode":"Unfollow this node"},"defaults":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.HeroBanner","form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":null,"fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[{"id":"max_items","dataType":"NUMBER","list":false,"defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"control":"INPUT","__typename":"PropDefinition"}],"__typename":"ComponentProperties"},"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"},"__typename":"Component","localOverride":false},"globalCss":null,"form":{"fields":[{"id":"widgetChooser","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"title","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useTitle","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"useBackground","validation":null,"noValidation":null,"dataType":"BOOLEAN","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"widgetVisibility","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"moreOptions","validation":null,"noValidation":null,"dataType":"STRING","list":null,"control":null,"defaultValue":null,"label":null,"description":null,"possibleValues":null,"__typename":"FormField"},{"id":"cMax_items","validation":null,"noValidation":null,"dataType":"NUMBER","list":false,"control":"INPUT","defaultValue":"3","label":"Max Items","description":"The maximum number of items to display in the carousel","possibleValues":null,"__typename":"FormField"}],"layout":{"rows":[{"id":"widgetChooserGroup","type":"fieldset","as":null,"items":[{"id":"widgetChooser","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"titleGroup","type":"fieldset","as":null,"items":[{"id":"title","className":null,"__typename":"FormFieldRef"},{"id":"useTitle","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"useBackground","type":"fieldset","as":null,"items":[{"id":"useBackground","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"widgetVisibility","type":"fieldset","as":null,"items":[{"id":"widgetVisibility","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"moreOptionsGroup","type":"fieldset","as":null,"items":[{"id":"moreOptions","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"},{"id":"componentPropsGroup","type":"fieldset","as":null,"items":[{"id":"cMax_items","className":null,"__typename":"FormFieldRef"}],"props":null,"legend":null,"description":null,"className":null,"viewVariant":null,"toggleState":null,"__typename":"FormFieldset"}],"actionButtons":null,"className":"custom_widget_HeroBanner_form","formGroupFieldSeparator":"divider","__typename":"FormLayout"},"__typename":"Form"}},"localOverride":false},"CachedAsset:component:custom.widget.MicrosoftFooter-en-1744400827952":{"__typename":"CachedAsset","id":"component:custom.widget.MicrosoftFooter-en-1744400827952","value":{"component":{"id":"custom.widget.MicrosoftFooter","template":{"id":"MicrosoftFooter","markupLanguage":"HANDLEBARS","style":".context-uhf {\n min-width: 280px;\n font-size: 15px;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.c-uhff-link {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.c-uhff {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.c-uhff-nav {\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n .c-heading-4 {\n color: #616161;\n word-break: break-word;\n font-size: 15px;\n line-height: 20px;\n padding: 36px 0 4px;\n font-weight: 600;\n }\n .c-uhff-nav-row {\n .c-uhff-nav-group {\n display: block;\n float: left;\n min-height: 1px;\n vertical-align: text-top;\n padding: 0 12px;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 12px;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.c-list.f-bare {\n font-size: 11px;\n line-height: 16px;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 8px 0;\n margin: 0;\n }\n }\n }\n }\n}\n.c-uhff-base {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(1600px + 10%);\n padding: 30px 5% 16px;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.c-uhff-ccpa {\n font-size: 11px;\n line-height: 16px;\n float: left;\n margin: 3px 0;\n }\n a.c-uhff-ccpa:hover {\n text-decoration: underline;\n }\n ul.c-list {\n font-size: 11px;\n line-height: 16px;\n float: right;\n margin: 3px 0;\n color: #616161;\n li {\n padding: 0 24px 4px 0;\n display: inline-block;\n }\n }\n .c-list.f-bare {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 30px 24px 16px;\n }\n}\n\n.social-share {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n\n.sharing-options {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 43px;\n border-radius: 0px 7px 7px 0px;\n}\n.linkedin-icon {\n border-top-right-radius: 7px;\n}\n.linkedin-icon:hover {\n border-radius: 0;\n}\n.social-share-rss-image {\n border-bottom-right-radius: 7px;\n}\n.social-share-rss-image:hover {\n border-radius: 0;\n}\n\n.social-link-footer {\n position: relative;\n display: block;\n margin: -2px 0;\n transition: all 0.2s ease;\n}\n.social-link-footer:hover .linkedin-icon {\n border-radius: 0;\n}\n.social-link-footer:hover .social-share-rss-image {\n border-radius: 0;\n}\n\n.social-link-footer img {\n width: 40px;\n height: auto;\n transition: filter 0.3s ease;\n}\n\n.social-share-list {\n width: 40px;\n}\n.social-share-rss-image {\n width: 40px;\n}\n\n.share-icon {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n\n.share-icon:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n\n.share-icon:hover .label {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n\n.label {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 10px;\n top: 50%;\n transform: translateY(-50%);\n height: 40px;\n border-radius: 0 6px 6px 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 20px 5px 20px 8px;\n margin-left: -1px;\n}\n.linkedin {\n background-color: #0474b4;\n}\n.facebook {\n background-color: #3c5c9c;\n}\n.twitter {\n background-color: white;\n color: black;\n}\n.reddit {\n background-color: #fc4404;\n}\n.mail {\n background-color: #848484;\n}\n.bluesky {\n background-color: white;\n color: black;\n}\n.rss {\n background-color: #ec7b1c;\n}\n#RSS {\n width: 40px;\n height: 40px;\n}\n\n@media (max-width: 991px) {\n .social-share {\n display: none;\n }\n}\n","texts":{"New tab":"What's New","New 1":"Surface Laptop Studio 2","New 2":"Surface Laptop Go 3","New 3":"Surface Pro 9","New 4":"Surface Laptop 5","New 5":"Surface Studio 2+","New 6":"Copilot in Windows","New 7":"Microsoft 365","New 8":"Windows 11 apps","Store tab":"Microsoft Store","Store 1":"Account Profile","Store 2":"Download Center","Store 3":"Microsoft Store Support","Store 4":"Returns","Store 5":"Order tracking","Store 6":"Certified Refurbished","Store 7":"Microsoft Store Promise","Store 8":"Flexible Payments","Education tab":"Education","Edu 1":"Microsoft in education","Edu 2":"Devices for education","Edu 3":"Microsoft Teams for Education","Edu 4":"Microsoft 365 Education","Edu 5":"How to buy for your school","Edu 6":"Educator Training and development","Edu 7":"Deals for students and parents","Edu 8":"Azure for students","Business tab":"Business","Bus 1":"Microsoft Cloud","Bus 2":"Microsoft Security","Bus 3":"Dynamics 365","Bus 4":"Microsoft 365","Bus 5":"Microsoft Power Platform","Bus 6":"Microsoft Teams","Bus 7":"Microsoft Industry","Bus 8":"Small Business","Developer tab":"Developer & IT","Dev 1":"Azure","Dev 2":"Developer Center","Dev 3":"Documentation","Dev 4":"Microsoft Learn","Dev 5":"Microsoft Tech Community","Dev 6":"Azure Marketplace","Dev 7":"AppSource","Dev 8":"Visual Studio","Company tab":"Company","Com 1":"Careers","Com 2":"About Microsoft","Com 3":"Company News","Com 4":"Privacy at Microsoft","Com 5":"Investors","Com 6":"Diversity and inclusion","Com 7":"Accessiblity","Com 8":"Sustainibility"},"defaults":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"components":[{"id":"custom.widget.MicrosoftFooter","form":null,"config":null,"props":[],"__typename":"Component"}],"grouping":"CUSTOM","__typename":"ComponentTemplate"},"properties":{"config":{"applicablePages":[],"description":"The Microsoft Footer","fetchedContent":null,"__typename":"ComponentConfiguration"},"props":[],"__typename":"ComponentProperties"},"form":null,"__typename":"Component","localOverride":false},"globalCss":{"css":".custom_widget_MicrosoftFooter_context-uhf_105bp_1 {\n min-width: 17.5rem;\n font-size: 0.9375rem;\n box-sizing: border-box;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n & *,\n & *:before,\n & *:after {\n box-sizing: inherit;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-link_105bp_12 {\n color: #616161;\n word-break: break-word;\n text-decoration: none;\n }\n &a:link,\n &a:focus,\n &a:hover,\n &a:active,\n &a:visited {\n text-decoration: none;\n color: inherit;\n }\n & div {\n font-family: 'Segoe UI', SegoeUI, 'Helvetica Neue', Helvetica, Arial, sans-serif;\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff_105bp_12 {\n background: #f2f2f2;\n margin: -1.5625;\n width: auto;\n height: auto;\n}\n.custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35 {\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 0 5%;\n box-sizing: inherit;\n &:before,\n &:after {\n content: ' ';\n display: table;\n clear: left;\n }\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n .custom_widget_MicrosoftFooter_c-heading-4_105bp_49 {\n color: #616161;\n word-break: break-word;\n font-size: 0.9375rem;\n line-height: 1.25rem;\n padding: 2.25rem 0 0.25rem;\n font-weight: 600;\n }\n .custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57 {\n .custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58 {\n display: block;\n float: left;\n min-height: 0.0625rem;\n vertical-align: text-top;\n padding: 0 0.75rem;\n width: 100%;\n zoom: 1;\n &:first-child {\n padding-left: 0;\n @media only screen and (max-width: 1083px) {\n padding-left: 0.75rem;\n }\n }\n @media only screen and (min-width: 540px) and (max-width: 1082px) {\n width: 33.33333%;\n }\n @media only screen and (min-width: 1083px) {\n width: 16.6666666667%;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n margin-top: 0;\n margin-bottom: 0;\n padding-left: 0;\n list-style-type: none;\n li {\n word-break: break-word;\n padding: 0.5rem 0;\n margin: 0;\n }\n }\n }\n }\n}\n.custom_widget_MicrosoftFooter_c-uhff-base_105bp_94 {\n background: #f2f2f2;\n margin: 0 auto;\n max-width: calc(100rem + 10%);\n padding: 1.875rem 5% 1rem;\n &:before,\n &:after {\n content: ' ';\n display: table;\n }\n &:after {\n clear: both;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: left;\n margin: 0.1875rem 0;\n }\n a.custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107:hover {\n text-decoration: underline;\n }\n ul.custom_widget_MicrosoftFooter_c-list_105bp_78 {\n font-size: 0.6875rem;\n line-height: 1rem;\n float: right;\n margin: 0.1875rem 0;\n color: #616161;\n li {\n padding: 0 1.5rem 0.25rem 0;\n display: inline-block;\n }\n }\n .custom_widget_MicrosoftFooter_c-list_105bp_78.custom_widget_MicrosoftFooter_f-bare_105bp_78 {\n padding-left: 0;\n list-style-type: none;\n }\n @media only screen and (max-width: 1083px) {\n display: flex;\n flex-wrap: wrap;\n padding: 1.875rem 1.5rem 1rem;\n }\n}\n.custom_widget_MicrosoftFooter_social-share_105bp_138 {\n position: fixed;\n top: 60%;\n transform: translateY(-50%);\n left: 0;\n z-index: 1000;\n}\n.custom_widget_MicrosoftFooter_sharing-options_105bp_146 {\n list-style: none;\n padding: 0;\n margin: 0;\n display: block;\n flex-direction: column;\n background-color: white;\n width: 2.6875rem;\n border-radius: 0 0.4375rem 0.4375rem 0;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-top-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_linkedin-icon_105bp_156:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-bottom-right-radius: 7px;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162:hover {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 {\n position: relative;\n display: block;\n margin: -0.125rem 0;\n transition: all 0.2s ease;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_linkedin-icon_105bp_156 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169:hover .custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n border-radius: 0;\n}\n.custom_widget_MicrosoftFooter_social-link-footer_105bp_169 img {\n width: 2.5rem;\n height: auto;\n transition: filter 0.3s ease;\n}\n.custom_widget_MicrosoftFooter_social-share-list_105bp_188 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162 {\n width: 2.5rem;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195 {\n border: 2px solid transparent;\n display: inline-block;\n position: relative;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover {\n opacity: 1;\n border: 2px solid white;\n box-sizing: border-box;\n}\n.custom_widget_MicrosoftFooter_share-icon_105bp_195:hover .custom_widget_MicrosoftFooter_label_105bp_207 {\n opacity: 1;\n visibility: visible;\n border: 2px solid white;\n box-sizing: border-box;\n border-left: none;\n}\n.custom_widget_MicrosoftFooter_label_105bp_207 {\n position: absolute;\n left: 100%;\n white-space: nowrap;\n opacity: 0;\n visibility: hidden;\n transition: all 0.2s ease;\n color: white;\n border-radius: 0 10 0 0.625rem;\n top: 50%;\n transform: translateY(-50%);\n height: 2.5rem;\n border-radius: 0 0.375rem 0.375rem 0;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 1.25rem 0.3125rem 1.25rem 0.5rem;\n margin-left: -0.0625rem;\n}\n.custom_widget_MicrosoftFooter_linkedin_105bp_156 {\n background-color: #0474b4;\n}\n.custom_widget_MicrosoftFooter_facebook_105bp_237 {\n background-color: #3c5c9c;\n}\n.custom_widget_MicrosoftFooter_twitter_105bp_240 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_reddit_105bp_244 {\n background-color: #fc4404;\n}\n.custom_widget_MicrosoftFooter_mail_105bp_247 {\n background-color: #848484;\n}\n.custom_widget_MicrosoftFooter_bluesky_105bp_250 {\n background-color: white;\n color: black;\n}\n.custom_widget_MicrosoftFooter_rss_105bp_254 {\n background-color: #ec7b1c;\n}\n#custom_widget_MicrosoftFooter_RSS_105bp_1 {\n width: 2.5rem;\n height: 2.5rem;\n}\n@media (max-width: 991px) {\n .custom_widget_MicrosoftFooter_social-share_105bp_138 {\n display: none;\n }\n}\n","tokens":{"context-uhf":"custom_widget_MicrosoftFooter_context-uhf_105bp_1","c-uhff-link":"custom_widget_MicrosoftFooter_c-uhff-link_105bp_12","c-uhff":"custom_widget_MicrosoftFooter_c-uhff_105bp_12","c-uhff-nav":"custom_widget_MicrosoftFooter_c-uhff-nav_105bp_35","c-heading-4":"custom_widget_MicrosoftFooter_c-heading-4_105bp_49","c-uhff-nav-row":"custom_widget_MicrosoftFooter_c-uhff-nav-row_105bp_57","c-uhff-nav-group":"custom_widget_MicrosoftFooter_c-uhff-nav-group_105bp_58","c-list":"custom_widget_MicrosoftFooter_c-list_105bp_78","f-bare":"custom_widget_MicrosoftFooter_f-bare_105bp_78","c-uhff-base":"custom_widget_MicrosoftFooter_c-uhff-base_105bp_94","c-uhff-ccpa":"custom_widget_MicrosoftFooter_c-uhff-ccpa_105bp_107","social-share":"custom_widget_MicrosoftFooter_social-share_105bp_138","sharing-options":"custom_widget_MicrosoftFooter_sharing-options_105bp_146","linkedin-icon":"custom_widget_MicrosoftFooter_linkedin-icon_105bp_156","social-share-rss-image":"custom_widget_MicrosoftFooter_social-share-rss-image_105bp_162","social-link-footer":"custom_widget_MicrosoftFooter_social-link-footer_105bp_169","social-share-list":"custom_widget_MicrosoftFooter_social-share-list_105bp_188","share-icon":"custom_widget_MicrosoftFooter_share-icon_105bp_195","label":"custom_widget_MicrosoftFooter_label_105bp_207","linkedin":"custom_widget_MicrosoftFooter_linkedin_105bp_156","facebook":"custom_widget_MicrosoftFooter_facebook_105bp_237","twitter":"custom_widget_MicrosoftFooter_twitter_105bp_240","reddit":"custom_widget_MicrosoftFooter_reddit_105bp_244","mail":"custom_widget_MicrosoftFooter_mail_105bp_247","bluesky":"custom_widget_MicrosoftFooter_bluesky_105bp_250","rss":"custom_widget_MicrosoftFooter_rss_105bp_254","RSS":"custom_widget_MicrosoftFooter_RSS_105bp_1"}},"form":null},"localOverride":false},"CachedAsset:text:en_US-components/community/Breadcrumb-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/community/Breadcrumb-1745505310029","value":{"navLabel":"Breadcrumbs","dropdown":"Additional parent page navigation"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBanner-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBanner-1745505310029","value":{"messageMarkedAsSpam":"This post has been marked as spam","messageMarkedAsSpam@board:TKB":"This article has been marked as spam","messageMarkedAsSpam@board:BLOG":"This post has been marked as spam","messageMarkedAsSpam@board:FORUM":"This discussion has been marked as spam","messageMarkedAsSpam@board:OCCASION":"This event has been marked as spam","messageMarkedAsSpam@board:IDEA":"This idea has been marked as spam","manageSpam":"Manage Spam","messageMarkedAsAbuse":"This post has been marked as abuse","messageMarkedAsAbuse@board:TKB":"This article has been marked as abuse","messageMarkedAsAbuse@board:BLOG":"This post has been marked as abuse","messageMarkedAsAbuse@board:FORUM":"This discussion has been marked as abuse","messageMarkedAsAbuse@board:OCCASION":"This event has been marked as abuse","messageMarkedAsAbuse@board:IDEA":"This idea has been marked as abuse","preModCommentAuthorText":"This comment will be published as soon as it is approved","preModCommentModeratorText":"This comment is awaiting moderation","messageMarkedAsOther":"This post has been rejected due to other reasons","messageMarkedAsOther@board:TKB":"This article has been rejected due to other reasons","messageMarkedAsOther@board:BLOG":"This post has been rejected due to other reasons","messageMarkedAsOther@board:FORUM":"This discussion has been rejected due to other reasons","messageMarkedAsOther@board:OCCASION":"This event has been rejected due to other reasons","messageMarkedAsOther@board:IDEA":"This idea has been rejected due to other reasons","messageArchived":"This post was archived on {date}","relatedUrl":"View Related Content","relatedContentText":"Showing related content","archivedContentLink":"View Archived Content"},"localOverride":false},"Category:category:Exchange":{"__typename":"Category","id":"category:Exchange","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Outlook":{"__typename":"Category","id":"category:Outlook","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Community-Info-Center":{"__typename":"Category","id":"category:Community-Info-Center","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:EducationSector":{"__typename":"Category","id":"category:EducationSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:DrivingAdoption":{"__typename":"Category","id":"category:DrivingAdoption","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Azure":{"__typename":"Category","id":"category:Azure","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows-Server":{"__typename":"Category","id":"category:Windows-Server","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftTeams":{"__typename":"Category","id":"category:MicrosoftTeams","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PublicSector":{"__typename":"Category","id":"category:PublicSector","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft365":{"__typename":"Category","id":"category:microsoft365","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:IoT":{"__typename":"Category","id":"category:IoT","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:HealthcareAndLifeSciences":{"__typename":"Category","id":"category:HealthcareAndLifeSciences","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:ITOpsTalk":{"__typename":"Category","id":"category:ITOpsTalk","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftLearn":{"__typename":"Category","id":"category:MicrosoftLearn","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Blog:board:MicrosoftLearnBlog":{"__typename":"Blog","id":"board:MicrosoftLearnBlog","blogPolicies":{"__typename":"BlogPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}},"boardPolicies":{"__typename":"BoardPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftMechanics":{"__typename":"Category","id":"category:MicrosoftMechanics","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:MicrosoftforNonprofits":{"__typename":"Category","id":"category:MicrosoftforNonprofits","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:StartupsatMicrosoft":{"__typename":"Category","id":"category:StartupsatMicrosoft","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:PartnerCommunity":{"__typename":"Category","id":"category:PartnerCommunity","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Microsoft365Copilot":{"__typename":"Category","id":"category:Microsoft365Copilot","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Windows":{"__typename":"Category","id":"category:Windows","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:Content_Management":{"__typename":"Category","id":"category:Content_Management","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoft-security":{"__typename":"Category","id":"category:microsoft-security","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"Category:category:microsoftintune":{"__typename":"Category","id":"category:microsoftintune","categoryPolicies":{"__typename":"CategoryPolicies","canReadNode":{"__typename":"PolicyResult","failureReason":null}}},"CachedAsset:text:en_US-components/community/Navbar-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/community/Navbar-1745505310029","value":{"community":"Community Home","inbox":"Inbox","manageContent":"Manage Content","tos":"Terms of Service","forgotPassword":"Forgot Password","themeEditor":"Theme Editor","edit":"Edit Navigation Bar","skipContent":"Skip to content","gxcuf89792":"Tech Community","external-1":"Events","s-m-b":"Nonprofit Community","windows-server":"Windows Server","education-sector":"Education Sector","driving-adoption":"Driving Adoption","Common-content_management-link":"Content Management","microsoft-learn":"Microsoft Learn","s-q-l-server":"Content Management","partner-community":"Microsoft Partner Community","microsoft365":"Microsoft 365","external-9":".NET","external-8":"Teams","external-7":"Github","products-services":"Products","external-6":"Power Platform","communities-1":"Topics","external-5":"Microsoft Security","planner":"Outlook","external-4":"Microsoft 365","external-3":"Dynamics 365","azure":"Azure","healthcare-and-life-sciences":"Healthcare and Life Sciences","external-2":"Azure","microsoft-mechanics":"Microsoft Mechanics","microsoft-learn-1":"Community","external-10":"Learning Room Directory","microsoft-learn-blog":"Blog","windows":"Windows","i-t-ops-talk":"ITOps Talk","external-link-1":"View All","microsoft-securityand-compliance":"Microsoft Security","public-sector":"Public Sector","community-info-center":"Lounge","external-link-2":"View All","microsoft-teams":"Microsoft Teams","external":"Blogs","microsoft-endpoint-manager":"Microsoft Intune","startupsat-microsoft":"Startups at Microsoft","exchange":"Exchange","a-i":"AI and Machine Learning","io-t":"Internet of Things (IoT)","Common-microsoft365-copilot-link":"Microsoft 365 Copilot","outlook":"Microsoft 365 Copilot","external-link":"Community Hubs","communities":"Products"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarHamburgerDropdown-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarHamburgerDropdown-1745505310029","value":{"hamburgerLabel":"Side Menu"},"localOverride":false},"CachedAsset:text:en_US-components/community/BrandLogo-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/community/BrandLogo-1745505310029","value":{"logoAlt":"Khoros","themeLogoAlt":"Brand Logo"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarTextLinks-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarTextLinks-1745505310029","value":{"more":"More"},"localOverride":false},"CachedAsset:text:en_US-components/authentication/AuthenticationLink-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/authentication/AuthenticationLink-1745505310029","value":{"title.login":"Sign In","title.registration":"Register","title.forgotPassword":"Forgot Password","title.multiAuthLogin":"Sign In"},"localOverride":false},"CachedAsset:text:en_US-components/nodes/NodeLink-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/nodes/NodeLink-1745505310029","value":{"place":"Place {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageView/MessageViewStandard-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageView/MessageViewStandard-1745505310029","value":{"anonymous":"Anonymous","author":"{messageAuthorLogin}","authorBy":"{messageAuthorLogin}","board":"{messageBoardTitle}","replyToUser":" to {parentAuthor}","showMoreReplies":"Show More","replyText":"Reply","repliesText":"Replies","markedAsSolved":"Marked as Solved","movedMessagePlaceholder.BLOG":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.TKB":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.FORUM":"{count, plural, =0 {This reply has been} other {These replies have been} }","movedMessagePlaceholder.IDEA":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholder.OCCASION":"{count, plural, =0 {This comment has been} other {These comments have been} }","movedMessagePlaceholderUrlText":"moved.","messageStatus":"Status: ","statusChanged":"Status changed: {previousStatus} to {currentStatus}","statusAdded":"Status added: {status}","statusRemoved":"Status removed: {status}","labelExpand":"expand replies","labelCollapse":"collapse replies","unhelpfulReason.reason1":"Content is outdated","unhelpfulReason.reason2":"Article is missing information","unhelpfulReason.reason3":"Content is for a different Product","unhelpfulReason.reason4":"Doesn't match what I was searching for"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageDeepLink-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageDeepLink-1745505310029","value":{"viewFullDiscussion@board:FORUM":"View Full Discussion ({repliesCount} Replies)","viewFullDiscussion@board:BLOG":"View Full Discussion ({repliesCount} Comments)","viewFullDiscussion@board:TKB":"View Full Discussion ({repliesCount} Comments)","viewFullDiscussion@board:IDEA":"View Full Discussion ({repliesCount} Comments)","viewFullDiscussion@board:OCCASION":"View Full Discussion ({repliesCount} Comments)","showParents@board:FORUM":"Show Parent Replies","showParents@board:BLOG":"Show Parent Comments","showParents@board:TKB":"Show Parent Comments","showParents@board:IDEA":"Show Parent Comments","showParents@board:OCCASION":"Show Parent Comments"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyCallToAction-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyCallToAction-1745505310029","value":{"leaveReply":"Leave a reply...","leaveReply@board:BLOG@message:root":"Leave a comment...","leaveReply@board:TKB@message:root":"Leave a comment...","leaveReply@board:IDEA@message:root":"Leave a comment...","leaveReply@board:OCCASION@message:root":"Leave a comment...","repliesTurnedOff.FORUM":"Replies are turned off for this topic","repliesTurnedOff.BLOG":"Comments are turned off for this topic","repliesTurnedOff.TKB":"Comments are turned off for this topic","repliesTurnedOff.IDEA":"Comments are turned off for this topic","repliesTurnedOff.OCCASION":"Comments are turned off for this topic","infoText":"Stop poking me!"},"localOverride":false},"CachedAsset:text:en_US-components/community/NavbarDropdownToggle-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/community/NavbarDropdownToggle-1745505310029","value":{"ariaLabelClosed":"Press the down arrow to open the menu"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/common/QueryHandler-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/common/QueryHandler-1745505310029","value":{"title":"Query Handler"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCoverImage-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCoverImage-1745505310029","value":{"coverImageTitle":"Cover Image"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeTitle-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeTitle-1745505310029","value":{"nodeTitle":"{nodeTitle, select, community {Community} other {{nodeTitle}}} "},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTimeToRead-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTimeToRead-1745505310029","value":{"minReadText":"{min} MIN READ"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageSubject-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageSubject-1745505310029","value":{"noSubject":"(no subject)"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserLink-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserLink-1745505310029","value":{"authorName":"View Profile: {author}","anonymous":"Anonymous"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/users/UserRank-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserRank-1745505310029","value":{"rankName":"{rankName}","userRank":"Author rank {rankName}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageTime-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageTime-1745505310029","value":{"postTime":"Published: {time}","lastPublishTime":"Last Update: {time}","conversation.lastPostingActivityTime":"Last posting activity time: {time}","conversation.lastPostTime":"Last post time: {time}","moderationData.rejectTime":"Rejected time: {time}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageBody-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageBody-1745505310029","value":{"showMessageBody":"Show More","mentionsErrorTitle":"{mentionsType, select, board {Board} user {User} message {Message} other {}} No Longer Available","mentionsErrorMessage":"The {mentionsType} you are trying to view has been removed from the community.","videoProcessing":"Video is being processed. Please try again in a few minutes.","bannerTitle":"Video provider requires cookies to play the video. Accept to continue or {url} it directly on the provider's site.","buttonTitle":"Accept","urlText":"watch"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageCustomFields-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageCustomFields-1745505310029","value":{"CustomField.default.label":"Value of {name}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageRevision-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageRevision-1745505310029","value":{"lastUpdatedDatePublished":"{publishCount, plural, one{Published} other{Updated}} {date}","lastUpdatedDateDraft":"Created {date}","version":"Version {major}.{minor}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageReplyButton-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageReplyButton-1745505310029","value":{"repliesCount":"{count}","title":"Reply","title@board:BLOG@message:root":"Comment","title@board:TKB@message:root":"Comment","title@board:IDEA@message:root":"Comment","title@board:OCCASION@message:root":"Comment"},"localOverride":false},"CachedAsset:text:en_US-components/messages/MessageAuthorBio-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/MessageAuthorBio-1745505310029","value":{"sendMessage":"Send Message","actionMessage":"Follow this blog board to get notified when there's new activity","coAuthor":"CO-PUBLISHER","contributor":"CONTRIBUTOR","userProfile":"View Profile","iconlink":"Go to {name} {type}"},"localOverride":false},"ModerationData:moderation_data:4396358":{"__typename":"ModerationData","id":"moderation_data:4396358","status":"APPROVED","rejectReason":null,"isReportedAbuse":false,"rejectUser":null,"rejectTime":null,"rejectActorType":null},"ModerationData:moderation_data:4396353":{"__typename":"ModerationData","id":"moderation_data:4396353","status":"UNMODERATED","rejectReason":null},"User:user:211780":{"__typename":"User","id":"user:211780","login":"arafattehsin","uid":211780,"deleted":false,"avatar":{"__typename":"UserAvatar","url":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/images/dS0yMTE3ODAtNDU2MDI4aTNGNUUwM0UzMUVDRjRBRjU"},"rank":{"__ref":"Rank:rank:26"},"email":"","messagesCount":14,"biography":null,"topicsCount":2,"kudosReceivedCount":15,"kudosGivenCount":13,"kudosWeight":1,"registrationData":{"__typename":"RegistrationData","status":null,"registrationTime":"2018-09-25T11:46:25.524-07:00","confirmEmailStatus":null},"followersCount":null,"solutionsCount":0},"Rank:rank:26":{"__typename":"Rank","id":"rank:26","position":4,"name":"Learn Expert","color":"333333","icon":null,"rankStyle":"TEXT"},"BlogReplyMessage:message:4396353":{"__typename":"BlogReplyMessage","id":"message:4396353","revisionNum":1,"uid":4396353,"depth":1,"hasGivenKudo":false,"subscribed":false,"board":{"__ref":"Blog:board:Azure-AI-Services-blog"},"conversation":{"__ref":"Conversation:conversation:4396267"},"subject":"Re: Building a multimodal, multi-agent system using Azure AI Agent Service and OpenAI Agent SDK","readOnly":false,"editFrozen":false,"moderationData":{"__ref":"ModerationData:moderation_data:4396353"},"body":"
Thanks for sharing this. Did you just simulate a hand-off scenario or this live agent will actually wait for the inputs to be given by the human?
For example, if the conversation is handed off to the live agent then the agent will wait for human to answer it first and then move forward? I am struggling to run that scenario.
","body@stringLength":"344","rawBody":"
Thanks for sharing this. Did you just simulate a hand-off scenario or this live agent will actually wait for the inputs to be given by the human?
For example, if the conversation is handed off to the live agent then the agent will wait for human to answer it first and then move forward? I am struggling to run that scenario.
","author":{"__ref":"User:user:211780"},"postTime":"2025-03-23T17:27:27.071-07:00","parent":{"__ref":"BlogTopicMessage:message:4396267"},"customFields":[],"attachments":{"__typename":"AttachmentConnection","edges":[],"pageInfo":{"__typename":"PageInfo","hasNextPage":false,"endCursor":null,"hasPreviousPage":false,"startCursor":null}},"repliesCount":1},"Revision:revision:4396358_1":{"__typename":"Revision","id":"revision:4396358_1","lastEditTime":"2025-03-23T18:01:47.622-07:00"},"QueryVariables:ReplyList:message:4396358:1":{"__typename":"QueryVariables","id":"ReplyList:message:4396358:1","value":{"id":"message:4396358","first":10,"sorts":{"postTime":{"direction":"DESC"}},"repliesFirst":3,"repliesFirstDepthThree":1,"repliesSorts":{"postTime":{"direction":"DESC"}},"useAvatar":true,"useAuthorLogin":true,"useAuthorRank":true,"useBody":true,"useKudosCount":true,"useTimeToRead":false,"useMedia":false,"useReadOnlyIcon":false,"useRepliesCount":true,"useSearchSnippet":false,"useAcceptedSolutionButton":false,"useSolvedBadge":false,"useAttachments":false,"attachmentsFirst":5,"useTags":false,"useNodeAncestors":false,"useUserHoverCard":false,"useNodeHoverCard":false,"useModerationStatus":true,"usePreviewSubjectModal":false,"useMessageStatus":true}},"ROOT_MUTATION":{"__typename":"Mutation"},"CachedAsset:text:en_US-shared/client/components/users/UserAvatar-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/users/UserAvatar-1745505310029","value":{"altText":"{login}'s avatar","altTextGeneric":"User's avatar"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/ranks/UserRankLabel-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/ranks/UserRankLabel-1745505310029","value":{"altTitle":"Icon for {rankName} rank"},"localOverride":false},"CachedAsset:text:en_US-components/users/UserRegistrationDate-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/users/UserRegistrationDate-1745505310029","value":{"noPrefix":"{date}","withPrefix":"Joined {date}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeAvatar-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeAvatar-1745505310029","value":{"altTitle":"Node avatar for {nodeTitle}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeDescription-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeDescription-1745505310029","value":{"description":"{description}"},"localOverride":false},"CachedAsset:text:en_US-components/messages/ThreadedReplyList-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/messages/ThreadedReplyList-1745505310029","value":{"title":"{count, plural, one{# Reply} other{# Replies}}","title@board:BLOG":"{count, plural, one{# Comment} other{# Comments}}","title@board:TKB":"{count, plural, one{# Comment} other{# Comments}}","title@board:IDEA":"{count, plural, one{# Comment} other{# Comments}}","title@board:OCCASION":"{count, plural, one{# Comment} other{# Comments}}","noRepliesTitle":"No Replies","noRepliesTitle@board:BLOG":"No Comments","noRepliesTitle@board:TKB":"No Comments","noRepliesTitle@board:IDEA":"No Comments","noRepliesTitle@board:OCCASION":"No Comments","noRepliesDescription":"Be the first to reply","noRepliesDescription@board:BLOG":"Be the first to comment","noRepliesDescription@board:TKB":"Be the first to comment","noRepliesDescription@board:IDEA":"Be the first to comment","noRepliesDescription@board:OCCASION":"Be the first to comment","messageReadOnlyAlert:BLOG":"Comments have been turned off for this post","messageReadOnlyAlert:TKB":"Comments have been turned off for this article","messageReadOnlyAlert:IDEA":"Comments have been turned off for this idea","messageReadOnlyAlert:FORUM":"Replies have been turned off for this discussion","messageReadOnlyAlert:OCCASION":"Comments have been turned off for this event"},"localOverride":false},"CachedAsset:text:en_US-components/tags/TagView/TagViewChip-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-components/tags/TagView/TagViewChip-1745505310029","value":{"tagLabelName":"Tag name {tagName}"},"localOverride":false},"CachedAsset:text:en_US-shared/client/components/nodes/NodeIcon-1745505310029":{"__typename":"CachedAsset","id":"text:en_US-shared/client/components/nodes/NodeIcon-1745505310029","value":{"contentType":"Content Type {style, select, FORUM {Forum} BLOG {Blog} TKB {Knowledge Base} IDEA {Ideas} OCCASION {Events} other {}} icon"},"localOverride":false}}}},"page":"/blogs/BlogMessagePage/BlogMessagePage","query":{"boardId":"azure-ai-services-blog","messageSubject":"building-a-multimodal-multi-agent-system-using-azure-ai-agent-service-and-openai","messageId":"4396267","replyId":"4396358"},"buildId":"HEhyUrv5OXNBIbfCLaOrw","runtimeConfig":{"buildInformationVisible":false,"logLevelApp":"info","logLevelMetrics":"info","openTelemetryClientEnabled":false,"openTelemetryConfigName":"o365","openTelemetryServiceVersion":"25.1.0","openTelemetryUniverse":"prod","openTelemetryCollector":"http://localhost:4318","openTelemetryRouteChangeAllowedTime":"5000","apolloDevToolsEnabled":false,"inboxMuteWipFeatureEnabled":false},"isFallback":false,"isExperimentalCompile":false,"dynamicIds":["./components/community/Navbar/NavbarWidget.tsx","./components/community/Breadcrumb/BreadcrumbWidget.tsx","./components/customComponent/CustomComponent/CustomComponent.tsx","./components/blogs/BlogArticleWidget/BlogArticleWidget.tsx","./components/external/components/ExternalComponent.tsx","./components/messages/MessageView/MessageViewStandard/MessageViewStandard.tsx","../shared/client/components/common/List/UnwrappedList/UnwrappedList.tsx","./components/tags/TagView/TagView.tsx","./components/tags/TagView/TagViewChip/TagViewChip.tsx"],"appGip":true,"scriptLoader":[{"id":"analytics","src":"https://techcommunity.microsoft.com/t5/s/gxcuf89792/pagescripts/1730819800000/analytics.js?page.id=BlogReplyPage&entity.id=board%3Aazure-ai-services-blog&entity.id=message%3A4396358","strategy":"afterInteractive"}]}