{"id":"7213d56b-66b8-4f90-92a7-7a7985971602","shortId":"73xLbE","kind":"skill","title":"agent-framework-azure-ai-py","tagline":"Build persistent agents on Azure AI Foundry using the Microsoft Agent Framework Python SDK.","description":"# Agent Framework Azure Hosted Agents\n\nBuild persistent agents on Azure AI Foundry using the Microsoft Agent Framework Python SDK.\n\n## Architecture\n\n```\nUser Query → AzureAIAgentsProvider → Azure AI Agent Service (Persistent)\n                    ↓\n              Agent.run() / Agent.run_stream()\n                    ↓\n              Tools: Functions | Hosted (Code/Search/Web) | MCP\n                    ↓\n              AgentThread (conversation persistence)\n```\n\n## Installation\n\n```bash\n# Full framework (recommended)\npip install agent-framework --pre\n\n# Or Azure-specific package only\npip install agent-framework-azure-ai --pre\n```\n\n## Environment Variables\n\n```bash\nexport AZURE_AI_PROJECT_ENDPOINT=\"https://<project>.services.ai.azure.com/api/projects/<project-id>\"\nexport AZURE_AI_MODEL_DEPLOYMENT_NAME=\"gpt-4o-mini\"\nexport BING_CONNECTION_ID=\"your-bing-connection-id\"  # For web search\n```\n\n## Authentication\n\n```python\nfrom azure.identity.aio import AzureCliCredential, DefaultAzureCredential\n\n# Development\ncredential = AzureCliCredential()\n\n# Production\ncredential = DefaultAzureCredential()\n```\n\n## Core Workflow\n\n### Basic Agent\n\n```python\nimport asyncio\nfrom agent_framework.azure import AzureAIAgentsProvider\nfrom azure.identity.aio import AzureCliCredential\n\nasync def main():\n    async with (\n        AzureCliCredential() as credential,\n        AzureAIAgentsProvider(credential=credential) as provider,\n    ):\n        agent = await provider.create_agent(\n            name=\"MyAgent\",\n            instructions=\"You are a helpful assistant.\",\n        )\n        \n        result = await agent.run(\"Hello!\")\n        print(result.text)\n\nasyncio.run(main())\n```\n\n### Agent with Function Tools\n\n```python\nfrom typing import Annotated\nfrom pydantic import Field\nfrom agent_framework.azure import AzureAIAgentsProvider\nfrom azure.identity.aio import AzureCliCredential\n\ndef get_weather(\n    location: Annotated[str, Field(description=\"City name to get weather for\")],\n) -> str:\n    \"\"\"Get the current weather for a location.\"\"\"\n    return f\"Weather in {location}: 72°F, sunny\"\n\ndef get_current_time() -> str:\n    \"\"\"Get the current UTC time.\"\"\"\n    from datetime import datetime, timezone\n    return datetime.now(timezone.utc).strftime(\"%Y-%m-%d %H:%M:%S UTC\")\n\nasync def main():\n    async with (\n        AzureCliCredential() as credential,\n        AzureAIAgentsProvider(credential=credential) as provider,\n    ):\n        agent = await provider.create_agent(\n            name=\"WeatherAgent\",\n            instructions=\"You help with weather and time queries.\",\n            tools=[get_weather, get_current_time],  # Pass functions directly\n        )\n        \n        result = await agent.run(\"What's the weather in Seattle?\")\n        print(result.text)\n```\n\n### Agent with Hosted Tools\n\n```python\nfrom agent_framework import (\n    HostedCodeInterpreterTool,\n    HostedFileSearchTool,\n    HostedWebSearchTool,\n)\nfrom agent_framework.azure import AzureAIAgentsProvider\nfrom azure.identity.aio import AzureCliCredential\n\nasync def main():\n    async with (\n        AzureCliCredential() as credential,\n        AzureAIAgentsProvider(credential=credential) as provider,\n    ):\n        agent = await provider.create_agent(\n            name=\"MultiToolAgent\",\n            instructions=\"You can execute code, search files, and search the web.\",\n            tools=[\n                HostedCodeInterpreterTool(),\n                HostedWebSearchTool(name=\"Bing\"),\n            ],\n        )\n        \n        result = await agent.run(\"Calculate the factorial of 20 in Python\")\n        print(result.text)\n```\n\n### Streaming Responses\n\n```python\nasync def main():\n    async with (\n        AzureCliCredential() as credential,\n        AzureAIAgentsProvider(credential=credential) as provider,\n    ):\n        agent = await provider.create_agent(\n            name=\"StreamingAgent\",\n            instructions=\"You are a helpful assistant.\",\n        )\n        \n        print(\"Agent: \", end=\"\", flush=True)\n        async for chunk in agent.run_stream(\"Tell me a short story\"):\n            if chunk.text:\n                print(chunk.text, end=\"\", flush=True)\n        print()\n```\n\n### Conversation Threads\n\n```python\nfrom agent_framework.azure import AzureAIAgentsProvider\nfrom azure.identity.aio import AzureCliCredential\n\nasync def main():\n    async with (\n        AzureCliCredential() as credential,\n        AzureAIAgentsProvider(credential=credential) as provider,\n    ):\n        agent = await provider.create_agent(\n            name=\"ChatAgent\",\n            instructions=\"You are a helpful assistant.\",\n            tools=[get_weather],\n        )\n        \n        # Create thread for conversation persistence\n        thread = agent.get_new_thread()\n        \n        # First turn\n        result1 = await agent.run(\"What's the weather in Seattle?\", thread=thread)\n        print(f\"Agent: {result1.text}\")\n        \n        # Second turn - context is maintained\n        result2 = await agent.run(\"What about Portland?\", thread=thread)\n        print(f\"Agent: {result2.text}\")\n        \n        # Save thread ID for later resumption\n        print(f\"Conversation ID: {thread.conversation_id}\")\n```\n\n### Structured Outputs\n\n```python\nfrom pydantic import BaseModel, ConfigDict\nfrom agent_framework.azure import AzureAIAgentsProvider\nfrom azure.identity.aio import AzureCliCredential\n\nclass WeatherResponse(BaseModel):\n    model_config = ConfigDict(extra=\"forbid\")\n    \n    location: str\n    temperature: float\n    unit: str\n    conditions: str\n\nasync def main():\n    async with (\n        AzureCliCredential() as credential,\n        AzureAIAgentsProvider(credential=credential) as provider,\n    ):\n        agent = await provider.create_agent(\n            name=\"StructuredAgent\",\n            instructions=\"Provide weather information in structured format.\",\n            response_format=WeatherResponse,\n        )\n        \n        result = await agent.run(\"Weather in Seattle?\")\n        weather = WeatherResponse.model_validate_json(result.text)\n        print(f\"{weather.location}: {weather.temperature}°{weather.unit}\")\n```\n\n## Provider Methods\n\n| Method | Description |\n|--------|-------------|\n| `create_agent()` | Create new agent on Azure AI service |\n| `get_agent(agent_id)` | Retrieve existing agent by ID |\n| `as_agent(sdk_agent)` | Wrap SDK Agent object (no HTTP call) |\n\n## Hosted Tools Quick Reference\n\n| Tool | Import | Purpose |\n|------|--------|---------|\n| `HostedCodeInterpreterTool` | `from agent_framework import HostedCodeInterpreterTool` | Execute Python code |\n| `HostedFileSearchTool` | `from agent_framework import HostedFileSearchTool` | Search vector stores |\n| `HostedWebSearchTool` | `from agent_framework import HostedWebSearchTool` | Bing web search |\n| `HostedMCPTool` | `from agent_framework import HostedMCPTool` | Service-managed MCP |\n| `MCPStreamableHTTPTool` | `from agent_framework import MCPStreamableHTTPTool` | Client-managed MCP |\n\n## Complete Example\n\n```python\nimport asyncio\nfrom typing import Annotated\nfrom pydantic import BaseModel, Field\nfrom agent_framework import (\n    HostedCodeInterpreterTool,\n    HostedWebSearchTool,\n    MCPStreamableHTTPTool,\n)\nfrom agent_framework.azure import AzureAIAgentsProvider\nfrom azure.identity.aio import AzureCliCredential\n\n\ndef get_weather(\n    location: Annotated[str, Field(description=\"City name\")],\n) -> str:\n    \"\"\"Get weather for a location.\"\"\"\n    return f\"Weather in {location}: 72°F, sunny\"\n\n\nclass AnalysisResult(BaseModel):\n    summary: str\n    key_findings: list[str]\n    confidence: float\n\n\nasync def main():\n    async with (\n        AzureCliCredential() as credential,\n        MCPStreamableHTTPTool(\n            name=\"Docs MCP\",\n            url=\"https://learn.microsoft.com/api/mcp\",\n        ) as mcp_tool,\n        AzureAIAgentsProvider(credential=credential) as provider,\n    ):\n        agent = await provider.create_agent(\n            name=\"ResearchAssistant\",\n            instructions=\"You are a research assistant with multiple capabilities.\",\n            tools=[\n                get_weather,\n                HostedCodeInterpreterTool(),\n                HostedWebSearchTool(name=\"Bing\"),\n                mcp_tool,\n            ],\n        )\n        \n        thread = agent.get_new_thread()\n        \n        # Non-streaming\n        result = await agent.run(\n            \"Search for Python best practices and summarize\",\n            thread=thread,\n        )\n        print(f\"Response: {result.text}\")\n        \n        # Streaming\n        print(\"\\nStreaming: \", end=\"\")\n        async for chunk in agent.run_stream(\"Continue with examples\", thread=thread):\n            if chunk.text:\n                print(chunk.text, end=\"\", flush=True)\n        print()\n        \n        # Structured output\n        result = await agent.run(\n            \"Analyze findings\",\n            thread=thread,\n            response_format=AnalysisResult,\n        )\n        analysis = AnalysisResult.model_validate_json(result.text)\n        print(f\"\\nConfidence: {analysis.confidence}\")\n\n\nif __name__ == \"__main__\":\n    asyncio.run(main())\n```\n\n## Conventions\n\n- Always use async context managers: `async with provider:`\n- Pass functions directly to `tools=` parameter (auto-converted to AIFunction)\n- Use `Annotated[type, Field(description=...)]` for function parameters\n- Use `get_new_thread()` for multi-turn conversations\n- Prefer `HostedMCPTool` for service-managed MCP, `MCPStreamableHTTPTool` for client-managed\n\n## Reference Files\n\n- references/tools.md: Detailed hosted tool patterns\n- references/mcp.md: MCP integration (hosted + local)\n- references/threads.md: Thread and conversation management\n- references/advanced.md: OpenAPI, citations, structured outputs\n\n## When to Use\nThis skill is applicable to execute the workflow or actions described in the overview.\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.","tags":["agent","framework","azure","antigravity","awesome","skills","sickn33","agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding"],"capabilities":["skill","source-sickn33","skill-agent-framework-azure-ai-py","topic-agent-skills","topic-agentic-skills","topic-ai-agent-skills","topic-ai-agents","topic-ai-coding","topic-ai-workflows","topic-antigravity","topic-antigravity-skills","topic-claude-code","topic-claude-code-skills","topic-codex-cli","topic-codex-skills"],"categories":["antigravity-awesome-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/sickn33/antigravity-awesome-skills/agent-framework-azure-ai-py","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add sickn33/antigravity-awesome-skills","source_repo":"https://github.com/sickn33/antigravity-awesome-skills","install_from":"skills.sh"}},"qualityScore":"0.700","qualityRationale":"deterministic score 0.70 from registry signals: · indexed on github topic:agent-skills · 34997 github stars · SKILL.md body (10,122 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-25T06:50:22.796Z","embedding":null,"createdAt":"2026-04-18T21:30:26.426Z","updatedAt":"2026-04-25T06:50:22.796Z","lastSeenAt":"2026-04-25T06:50:22.796Z","tsv":"'/api/mcp':759 '/api/projects/':95 '20':365 '4o':104 '72':227,730 'action':947 'agent':2,9,17,21,25,28,36,46,68,80,134,159,162,179,269,272,303,309,336,339,386,389,399,446,449,485,502,561,564,598,601,607,608,612,616,618,621,635,644,653,662,672,695,768,771 'agent-framework':67 'agent-framework-azure-ai':79 'agent-framework-azure-ai-pi':1 'agent.get':467,793 'agent.run':49,50,173,294,360,407,474,494,579,801,823,842 'agent_framework.azure':139,193,316,426,525,702 'agentthread':57 'ai':5,12,31,45,83,90,98,604 'aifunct':883 'alway':865 'analysi':850 'analysis.confidence':858 'analysisresult':734,849 'analysisresult.model':851 'analyz':843 'annot':187,204,688,713,885 'applic':941 'architectur':40 'ask':985 'assist':170,397,457,779 'async':146,149,256,259,323,326,373,376,403,433,436,548,551,744,747,819,867,870 'asyncio':137,684 'asyncio.run':177,862 'authent':118 'auto':880 'auto-convert':879 'await':160,172,270,293,337,359,387,447,473,493,562,578,769,800,841 'azur':4,11,23,30,44,73,82,89,97,603 'azure-specif':72 'azure.identity.aio':121,143,197,320,430,529,706 'azureaiagentsprovid':43,141,154,195,264,318,331,381,428,441,527,556,704,763 'azureclicredenti':123,127,145,151,199,261,322,328,378,432,438,531,553,708,749 'basemodel':522,534,692,735 'bash':61,87 'basic':133 'best':805 'bing':107,112,357,657,789 'boundari':993 'build':7,26 'calcul':361 'call':625 'capabl':782 'chatag':451 'chunk':405,821 'chunk.text':415,417,831,833 'citat':932 'citi':208,717 'clarif':987 'class':532,733 'clear':960 'client':677,911 'client-manag':676,910 'code':346,641 'code/search/web':55 'complet':680 'condit':546 'confid':742 'config':536 'configdict':523,537 'connect':108,113 'context':489,868 'continu':825 'convent':864 'convers':58,422,464,512,900,928 'convert':881 'core':131 'creat':461,597,599 'credenti':126,129,153,155,156,263,265,266,330,332,333,380,382,383,440,442,443,555,557,558,751,764,765 'criteria':996 'current':217,232,237,287 'd':251 'datetim':241,243 'datetime.now':246 'def':147,200,230,257,324,374,434,549,709,745 'defaultazurecredenti':124,130 'deploy':100 'describ':948,964 'descript':207,596,716,888 'detail':916 'develop':125 'direct':291,875 'doc':754 'end':400,418,818,834 'endpoint':92 'environ':85,976 'environment-specif':975 'exampl':681,827 'execut':345,639,943 'exist':611 'expert':981 'export':88,96,106 'extra':538 'f':223,228,484,501,511,589,726,731,812,856 'factori':363 'field':191,206,693,715,887 'file':348,914 'find':739,844 'first':470 'float':543,743 'flush':401,419,835 'forbid':539 'format':573,575,848 'foundri':13,32 'framework':3,18,22,37,63,69,81,310,636,645,654,663,673,696 'full':62 'function':53,181,290,874,890 'get':201,211,215,231,235,284,286,459,606,710,720,784,893 'gpt':103 'gpt-4o-mini':102 'h':252 'hello':174 'help':169,277,396,456 'host':24,54,305,626,917,923 'hostedcodeinterpretertool':312,354,633,638,698,786 'hostedfilesearchtool':313,642,647 'hostedmcptool':660,665,902 'hostedwebsearchtool':314,355,651,656,699,787 'http':624 'id':109,114,506,513,515,609,614 'import':122,136,140,144,186,190,194,198,242,311,317,321,427,431,521,526,530,631,637,646,655,664,674,683,687,691,697,703,707 'inform':570 'input':990 'instal':60,66,78 'instruct':165,275,342,392,452,567,774 'integr':922 'json':586,853 'key':738 'later':508 'learn.microsoft.com':758 'learn.microsoft.com/api/mcp':757 'limit':952 'list':740 'local':924 'locat':203,221,226,540,712,724,729 'm':250,253 'main':148,178,258,325,375,435,550,746,861,863 'maintain':491 'manag':668,678,869,906,912,929 'match':961 'mcp':56,669,679,755,761,790,907,921 'mcpstreamablehttptool':670,675,700,752,908 'method':594,595 'microsoft':16,35 'mini':105 'miss':998 'model':99,535 'multi':898 'multi-turn':897 'multipl':781 'multitoolag':341 'myagent':164 'name':101,163,209,273,340,356,390,450,565,718,753,772,788,860 'nconfid':857 'new':468,600,794,894 'non':797 'non-stream':796 'nstream':817 'object':622 'openapi':931 'output':517,839,934,970 'overview':951 'packag':75 'paramet':878,891 'pass':289,873 'pattern':919 'permiss':991 'persist':8,27,48,59,465 'pip':65,77 'portland':497 'practic':806 'pre':70,84 'prefer':901 'print':175,301,368,398,416,421,483,500,510,588,811,816,832,837,855 'product':128 'project':91 'provid':158,268,335,385,445,560,568,593,767,872 'provider.create':161,271,338,388,448,563,770 'purpos':632 'py':6 'pydant':189,520,690 'python':19,38,119,135,183,307,367,372,424,518,640,682,804 'queri':42,282 'quick':628 'recommend':64 'refer':629,913 'references/advanced.md':930 'references/mcp.md':920 'references/threads.md':925 'references/tools.md':915 'requir':989 'research':778 'researchassist':773 'respons':371,574,813,847 'result':171,292,358,577,799,840 'result.text':176,302,369,587,814,854 'result1':472 'result1.text':486 'result2':492 'result2.text':503 'resumpt':509 'retriev':610 'return':222,245,725 'review':982 'safeti':992 'save':504 'scope':963 'sdk':20,39,617,620 'search':117,347,350,648,659,802 'seattl':300,480,582 'second':487 'servic':47,605,667,905 'service-manag':666,904 'services.ai.azure.com':94 'services.ai.azure.com/api/projects/':93 'short':412 'skill':939,955 'skill-agent-framework-azure-ai-py' 'source-sickn33' 'specif':74,977 'stop':983 'store':650 'stori':413 'str':205,214,234,541,545,547,714,719,737,741 'stream':51,370,408,798,815,824 'streamingag':391 'strftime':248 'structur':516,572,838,933 'structuredag':566 'substitut':973 'success':995 'summar':808 'summari':736 'sunni':229,732 'task':959 'tell':409 'temperatur':542 'test':979 'thread':423,462,466,469,481,482,498,499,505,792,795,809,810,828,829,845,846,895,926 'thread.conversation':514 'time':233,239,281,288 'timezon':244 'timezone.utc':247 'tool':52,182,283,306,353,458,627,630,762,783,791,877,918 'topic-agent-skills' 'topic-agentic-skills' 'topic-ai-agent-skills' 'topic-ai-agents' 'topic-ai-coding' 'topic-ai-workflows' 'topic-antigravity' 'topic-antigravity-skills' 'topic-claude-code' 'topic-claude-code-skills' 'topic-codex-cli' 'topic-codex-skills' 'treat':968 'true':402,420,836 'turn':471,488,899 'type':185,686,886 'unit':544 'url':756 'use':14,33,866,884,892,937,953 'user':41 'utc':238,255 'valid':585,852,978 'variabl':86 'vector':649 'weather':202,212,218,224,279,285,298,460,478,569,580,583,711,721,727,785 'weather.location':590 'weather.temperature':591 'weather.unit':592 'weatherag':274 'weatherrespons':533,576 'weatherresponse.model':584 'web':116,352,658 'workflow':132,945 'wrap':619 'y':249 'your-bing-connection-id':110","prices":[{"id":"123ce782-4f2b-4900-8384-e0d16411b8b5","listingId":"7213d56b-66b8-4f90-92a7-7a7985971602","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"sickn33","category":"antigravity-awesome-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T21:30:26.426Z"}],"sources":[{"listingId":"7213d56b-66b8-4f90-92a7-7a7985971602","source":"github","sourceId":"sickn33/antigravity-awesome-skills/agent-framework-azure-ai-py","sourceUrl":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/agent-framework-azure-ai-py","isPrimary":false,"firstSeenAt":"2026-04-18T21:30:26.426Z","lastSeenAt":"2026-04-25T06:50:22.796Z"}],"details":{"listingId":"7213d56b-66b8-4f90-92a7-7a7985971602","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"sickn33","slug":"agent-framework-azure-ai-py","github":{"repo":"sickn33/antigravity-awesome-skills","stars":34997,"topics":["agent-skills","agentic-skills","ai-agent-skills","ai-agents","ai-coding","ai-workflows","antigravity","antigravity-skills","claude-code","claude-code-skills","codex-cli","codex-skills","cursor","cursor-skills","developer-tools","gemini-cli","gemini-skills","kiro","mcp","skill-library"],"license":"mit","html_url":"https://github.com/sickn33/antigravity-awesome-skills","pushed_at":"2026-04-25T06:33:17Z","description":"Installable GitHub library of 1,400+ agentic skills for Claude Code, Cursor, Codex CLI, Gemini CLI, Antigravity, and more. Includes installer CLI, bundles, workflows, and official/community skill collections.","skill_md_sha":"68e8d41395b6468aa702dcb4909a57c8c06100a4","skill_md_path":"skills/agent-framework-azure-ai-py/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/agent-framework-azure-ai-py"},"layout":"multi","source":"github","category":"antigravity-awesome-skills","frontmatter":{"name":"agent-framework-azure-ai-py","description":"Build persistent agents on Azure AI Foundry using the Microsoft Agent Framework Python SDK."},"skills_sh_url":"https://skills.sh/sickn33/antigravity-awesome-skills/agent-framework-azure-ai-py"},"updatedAt":"2026-04-25T06:50:22.796Z"}}