mirror of
https://github.com/microsoft/agent-framework.git
synced 2026-06-16 21:04:09 +08:00
cc0cfaaac8
* Python: fix OpenAI Azure routing and provider samples Prefer OpenAI when OPENAI_API_KEY is present unless Azure is explicitly requested. Clarify constructor docs, keep deprecated Azure wrappers compatible with stricter settings validation, and refresh the provider samples and tests to use the current client patterns. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix bandit * Python: align OpenAI embedding Azure routing Extend the shared OpenAI-vs-Azure routing and credential behavior to the embedding client, add Azure embedding regression coverage, and refresh the embedding samples to use the generic client path. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: fix embedding client pyright check Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: thin OpenAI embedding wrapper Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: document embedding overload routing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: fix callable OpenAI key routing Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: fix Azure credential routing tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: address OpenAI review feedback Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: narrow Azure routing markers Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: refine OpenAI model fallback order Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: narrow Azure deployment docs Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: remove embedding routing wording Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: run embedding Azure integration tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * changed variable name * Python: expand OpenAI package README Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * clarified readme * Python: fix Azure OpenAI integration setup Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * Python: correct Azure integration env mapping Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * updated code to fix int tests * test updates * test fix * fix test setup * updates to tests and setup * remove openai assistants int tests * improvements in int tests * fix env var * fix env vars * fix azure responses test * trigger actions --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
152 lines
5.2 KiB
Python
152 lines
5.2 KiB
Python
# Copyright (c) Microsoft. All rights reserved.
|
|
|
|
import asyncio
|
|
from random import randint
|
|
from typing import Annotated
|
|
|
|
from agent_framework import Agent, AgentSession, tool
|
|
from agent_framework.openai import OpenAIChatClient
|
|
from dotenv import load_dotenv
|
|
from pydantic import Field
|
|
|
|
# Load environment variables from .env file
|
|
load_dotenv()
|
|
|
|
"""
|
|
OpenAI Chat Client with Session Management Example
|
|
|
|
This sample demonstrates session management with OpenAI Chat Client, showing
|
|
persistent conversation context and simplified response handling.
|
|
"""
|
|
|
|
|
|
# NOTE: approval_mode="never_require" is for sample brevity. Use "always_require" in production;
|
|
# see samples/02-agents/tools/function_tool_with_approval.py
|
|
# and samples/02-agents/tools/function_tool_with_approval_and_sessions.py.
|
|
@tool(approval_mode="never_require")
|
|
def get_weather(
|
|
location: Annotated[str, Field(description="The location to get the weather for.")],
|
|
) -> str:
|
|
"""Get the weather for a given location."""
|
|
conditions = ["sunny", "cloudy", "rainy", "stormy"]
|
|
return f"The weather in {location} is {conditions[randint(0, 3)]} with a high of {randint(10, 30)}°C."
|
|
|
|
|
|
async def example_with_automatic_session_creation() -> None:
|
|
"""Example showing automatic session creation."""
|
|
print("=== Automatic Session Creation Example ===")
|
|
|
|
agent = Agent(
|
|
client=OpenAIChatClient(),
|
|
instructions="You are a helpful weather agent.",
|
|
tools=get_weather,
|
|
)
|
|
|
|
# First conversation - no session provided, will be created automatically
|
|
query1 = "What's the weather like in Seattle?"
|
|
print(f"User: {query1}")
|
|
result1 = await agent.run(query1)
|
|
print(f"Agent: {result1.text}")
|
|
|
|
# Second conversation - still no session provided, will create another new session
|
|
query2 = "What was the last city I asked about?"
|
|
print(f"\nUser: {query2}")
|
|
result2 = await agent.run(query2)
|
|
print(f"Agent: {result2.text}")
|
|
print("Note: Each call creates a separate session, so the agent doesn't remember previous context.\n")
|
|
|
|
|
|
async def example_with_session_persistence_in_memory() -> None:
|
|
"""
|
|
Example showing session persistence across multiple conversations.
|
|
In this example, messages are stored in-memory.
|
|
"""
|
|
print("=== Session Persistence Example (In-Memory) ===")
|
|
|
|
agent = Agent(
|
|
client=OpenAIChatClient(),
|
|
instructions="You are a helpful weather agent.",
|
|
tools=get_weather,
|
|
)
|
|
|
|
# Create a new session that will be reused
|
|
session = agent.create_session()
|
|
|
|
# First conversation
|
|
query1 = "What's the weather like in Tokyo?"
|
|
print(f"User: {query1}")
|
|
result1 = await agent.run(query1, session=session, store=False)
|
|
print(f"Agent: {result1.text}")
|
|
|
|
# Second conversation using the same session - maintains context
|
|
query2 = "How about London?"
|
|
print(f"\nUser: {query2}")
|
|
result2 = await agent.run(query2, session=session, store=False)
|
|
print(f"Agent: {result2.text}")
|
|
|
|
# Third conversation - agent should remember both previous cities
|
|
query3 = "Which of the cities I asked about has better weather?"
|
|
print(f"\nUser: {query3}")
|
|
result3 = await agent.run(query3, session=session, store=False)
|
|
print(f"Agent: {result3.text}")
|
|
print("Note: The agent remembers context from previous messages in the same session.\n")
|
|
|
|
|
|
async def example_with_existing_session_id() -> None:
|
|
"""
|
|
Example showing how to work with an existing session ID from the service.
|
|
In this example, messages are stored on the server using OpenAI conversation state.
|
|
"""
|
|
print("=== Existing Session ID Example ===")
|
|
|
|
# First, create a conversation and capture the session ID
|
|
existing_session_id = None
|
|
|
|
agent = Agent(
|
|
client=OpenAIChatClient(),
|
|
instructions="You are a helpful weather agent.",
|
|
tools=get_weather,
|
|
)
|
|
|
|
# Start a conversation and get the session ID
|
|
session = agent.create_session()
|
|
|
|
query1 = "What's the weather in Paris?"
|
|
print(f"User: {query1}")
|
|
result1 = await agent.run(query1, session=session)
|
|
print(f"Agent: {result1.text}")
|
|
|
|
# The session ID is set after the first response
|
|
existing_session_id = session.service_session_id
|
|
print(f"Session ID: {existing_session_id}")
|
|
|
|
if existing_session_id:
|
|
print("\n--- Continuing with the same session ID in a new agent instance ---")
|
|
|
|
agent = Agent(
|
|
client=OpenAIChatClient(),
|
|
instructions="You are a helpful weather agent.",
|
|
tools=get_weather,
|
|
)
|
|
|
|
# Create a session with the existing ID
|
|
session = AgentSession(service_session_id=existing_session_id)
|
|
|
|
query2 = "What was the last city I asked about?"
|
|
print(f"User: {query2}")
|
|
result2 = await agent.run(query2, session=session)
|
|
print(f"Agent: {result2.text}")
|
|
print("Note: The agent continues the conversation from the previous session by using session ID.\n")
|
|
|
|
|
|
async def main() -> None:
|
|
print("=== OpenAI Response Client Agent Session Management Examples ===\n")
|
|
|
|
await example_with_automatic_session_creation()
|
|
await example_with_session_persistence_in_memory()
|
|
await example_with_existing_session_id()
|
|
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(main())
|