mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
5e056b672e
* Python: Provider-leading client design & OpenAI package extraction Major refactoring of the Python Agent Framework client architecture: - Extract OpenAI clients into new `agent-framework-openai` package - Core package no longer depends on openai, azure-identity, azure-ai-projects - Rename clients for discoverability: OpenAIResponsesClient → OpenAIChatClient, OpenAIChatClient → OpenAIChatCompletionClient - Unify `model_id`/`deployment_name`/`model_deployment_name` → `model` param - New FoundryChatClient for Azure AI Foundry Responses API - New FoundryAgent/FoundryAgentClient for connecting to pre-configured Foundry agents - Remove OpenAIBase/OpenAIConfigMixin from non-deprecated client MRO - Deprecate AzureOpenAI* clients, AzureAIClient, OpenAIAssistantsClient - Reorganize samples: azure_openai+azure_ai+azure_ai_agent → azure/ - ADR-0020: Provider-Leading Client Design Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: missing Agent imports in samples, .model_id → .model in foundry_local sample Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: CI failures — mypy errors, coverage targets, sample imports - azure-ai mypy: add type ignores for TypedDict total=, model arg, forward ref - Coverage: replace core.azure/openai targets with openai package target - project_provider: add type annotation for opts dict Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: populate openai .pyi stub, fix broken README links, coverage targets Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fixes * updated observabilitty * reset azure init.pyi * fix errors * updated adr number * fix foundry local * fixed not renamed docstrings and comments, and added deprecated markers to old classes * fix tests and pyprojects * fix test vars * updated function tests * update durable * updated test setup for functions * Fix Foundry auth in workflow samples Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Stabilize Python integration workflows Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Update hosting samples for Foundry Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Trigger full CI rerun Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Trigger CI rerun again Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * trigger rerun * trigger rerun * fix for litellm * undo durabletask changes * Move Foundry APIs into foundry namespace Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Fix Foundry pyproject formatting Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Split provider samples by Foundry surface Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Restore hosting sample requirements Also fix the Foundry Local sample link after the provider sample move. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * updated tests * udpated foundry integration tests * removed dist from azurefunctions tests * Use separate Foundry clients for concurrent agents Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix client setup in azfunc and durable * disabled two tests * updated setup for some function and durable tests * improved azure openai setup with new clients * ignore deprecated * fixes * skip 11 * remove openai assistants int tests --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
94 lines
3.6 KiB
Python
94 lines
3.6 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import asyncio
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
from agent_framework import Agent, Content
|
|
from agent_framework.anthropic import AnthropicChatOptions, AnthropicClient
|
|
from dotenv import load_dotenv
|
|
|
|
# Load environment variables from .env file
|
|
load_dotenv()
|
|
|
|
logger = logging.getLogger(__name__)
|
|
"""
|
|
Anthropic Skills Agent Example
|
|
|
|
This sample demonstrates using Anthropic with:
|
|
- Listing and using Anthropic-managed Skills.
|
|
- One approach to add additional beta flags.
|
|
You can also set additonal_chat_options with "additional_beta_flags" per request.
|
|
- Creating an agent with the Code Interpreter tool and a Skill.
|
|
- Catching and downloading generated files from the agent.
|
|
"""
|
|
|
|
|
|
async def main() -> None:
|
|
"""Example of streaming response (get results as they are generated)."""
|
|
client = AnthropicClient[AnthropicChatOptions](additional_beta_flags=["skills-2025-10-02"])
|
|
|
|
# List Anthropic-managed Skills
|
|
skills = await client.anthropic_client.beta.skills.list(source="anthropic", betas=["skills-2025-10-02"])
|
|
for skill in skills.data:
|
|
print(f"{skill.source}: {skill.id} (version: {skill.latest_version})")
|
|
|
|
# Create a agent with the pptx skill enabled
|
|
# Skills also need the code interpreter tool to function
|
|
agent = Agent(
|
|
client=client,
|
|
name="DocsAgent",
|
|
instructions="You are a helpful agent for creating powerpoint presentations.",
|
|
tools=client.get_code_interpreter_tool(),
|
|
default_options={
|
|
"max_tokens": 4096,
|
|
"thinking": {"type": "enabled", "budget_tokens": 2000},
|
|
"container": {"skills": [{"type": "anthropic", "skill_id": "pptx", "version": "latest"}]},
|
|
},
|
|
)
|
|
|
|
print(
|
|
"The agent output will use the following colors:\n"
|
|
"\033[0mUser: (default)\033[0m\n"
|
|
"\033[0mAgent: (default)\033[0m\n"
|
|
"\033[32mAgent Reasoning: (green)\033[0m\n"
|
|
"\033[34mUsage: (blue)\033[0m\n"
|
|
)
|
|
query = "Create a simple presentation with 2 slides about Python programming"
|
|
print(f"User: {query}")
|
|
print("Agent: ", end="", flush=True)
|
|
files: list[Content] = []
|
|
async for chunk in agent.run(query, stream=True):
|
|
for content in chunk.contents:
|
|
match content.type:
|
|
case "text":
|
|
print(content.text, end="", flush=True)
|
|
case "text_reasoning":
|
|
print(f"\033[32m{content.text}\033[0m", end="", flush=True)
|
|
case "usage":
|
|
print(f"\n\033[34m[Usage so far: {content.usage_details}]\033[0m\n", end="", flush=True)
|
|
case "hosted_file":
|
|
# Catch generated files
|
|
files.append(content)
|
|
case _:
|
|
logger.debug("Unhandled content type: %s", content.type)
|
|
pass
|
|
|
|
print("\n")
|
|
if files:
|
|
# Save to a new file (will be in the folder where you are running this script)
|
|
# When running this sample multiple times, the files will be overritten
|
|
# Since I'm using the pptx skill, the files will be PowerPoint presentations
|
|
print("Generated files:")
|
|
for idx, file in enumerate(files):
|
|
file_content = await client.anthropic_client.beta.files.download(
|
|
file_id=file.file_id, betas=["files-api-2025-04-14"]
|
|
)
|
|
with open(Path(__file__).parent / f"python_programming-{idx}.pptx", "wb") as f:
|
|
await file_content.write_to_file(f.name)
|
|
print(f"File {idx}: python_programming-{idx}.pptx saved to disk.")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|