mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
b05fc9e849
* Initial plan * Add load_dotenv() to 303 Python samples for environment variable loading Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Update SAMPLE_GUIDELINES.md to document load_dotenv() requirement Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Update samples README.md to document .env file usage Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Run ruff format on all changed sample files Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Clarify load_dotenv() usage in README - local dev vs production Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Remove deprecated getting_started folder as requested Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Document env_file_path parameter for per-client configuration Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Merge main branch to resolve conflicts Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Fix run_evaluation.py file that was empty in merge commit Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Remove dotnet changes from merge - out of scope for this PR Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Remove package and test changes from merge - only sample changes needed Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Remove test_func_utils.py - only sample changes needed Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Revert sample files not in original changeset - keep only load_dotenv additions Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Move load_dotenv() outside snippet tag in 06_host_your_agent.py Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Fix comment placement - move load_dotenv before code comments Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Fix load_dotenv() placement across all samples - after docstring, before code comments Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Merge latest main branch with load_dotenv changes Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Remove non-sample changes from merge - keep only load_dotenv additions Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Revert non-load_dotenv sample changes from merge Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Fix run_evaluation.py - use main's improved version (file already had load_dotenv) Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> * Manual update * Manual update 2 * Fix Role usage and load_dotenv placement per PR review feedback Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Fix Role usage - use string literals not enum attributes Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Fix SAMPLE_GUIDELINES.md example - load_dotenv before docstring per guidance Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Move load_dotenv() before docstrings in all samples per SAMPLE_GUIDELINES ordering Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Address PR review: rename files, fix placement, add session usage, remove note Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> * Update Redis README to reference renamed file redis_history_provider.py Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> --------- Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com> Co-authored-by: TaoChenOSU <12570346+TaoChenOSU@users.noreply.github.com> Co-authored-by: Tao Chen <taochen@microsoft.com> Co-authored-by: eavanvalkenburg <13749212+eavanvalkenburg@users.noreply.github.com> Co-authored-by: Eduard van Valkenburg <eavanvalkenburg@users.noreply.github.com>
93 lines
3.6 KiB
Python
93 lines
3.6 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import asyncio
|
|
import logging
|
|
from pathlib import Path
|
|
|
|
from agent_framework import 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 = client.as_agent(
|
|
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())
|