Small fixes (#969)

This commit is contained in:
Dmytro Struk
2025-09-29 01:43:00 -07:00
committed by GitHub
Unverified
parent d6f2c6b3e5
commit 4cd76bf2b0
5 changed files with 53 additions and 29 deletions
@@ -212,6 +212,17 @@ class BaseChatClient(AFBaseModel, ABC):
"""Turn the allowed input into a list of chat messages."""
return prepare_messages(messages)
def _filter_internal_kwargs(self, kwargs: dict[str, Any]) -> dict[str, Any]:
"""Filter out internal framework parameters that shouldn't be passed to chat client implementations.
Args:
kwargs: The original kwargs dictionary.
Returns:
A filtered kwargs dictionary without internal parameters.
"""
return {k: v for k, v in kwargs.items() if not k.startswith("_")}
@staticmethod
def _normalize_tools(
tools: ToolProtocol
@@ -360,7 +371,8 @@ class BaseChatClient(AFBaseModel, ABC):
prepped_messages = self.prepare_messages(messages)
self._prepare_tool_choice(chat_options=chat_options)
return await self._inner_get_response(messages=prepped_messages, chat_options=chat_options, **kwargs)
filtered_kwargs = self._filter_internal_kwargs(kwargs)
return await self._inner_get_response(messages=prepped_messages, chat_options=chat_options, **filtered_kwargs)
async def get_streaming_response(
self,
@@ -440,8 +452,9 @@ class BaseChatClient(AFBaseModel, ABC):
prepped_messages = self.prepare_messages(messages)
self._prepare_tool_choice(chat_options=chat_options)
filtered_kwargs = self._filter_internal_kwargs(kwargs)
async for update in self._inner_get_streaming_response(
messages=prepped_messages, chat_options=chat_options, **kwargs
messages=prepped_messages, chat_options=chat_options, **filtered_kwargs
):
yield update
@@ -1,6 +1,6 @@
# Agent Examples
This folder contains examples demonstrating how to create and use agents with different chat clients from the Agent Framework. Each sub-folder focuses on a specific provider and client type, showing various capabilities like function tools, code interpreter, thread management, and more.
This folder contains examples demonstrating how to create and use agents with different chat clients from the Agent Framework. Each sub-folder focuses on a specific provider and client type, showing various capabilities like function tools, code interpreter, thread management, structured outputs, image processing, web search, Model Context Protocol (MCP) integration, and more.
## Examples by Provider
@@ -8,29 +8,34 @@ This folder contains examples demonstrating how to create and use agents with di
| Folder | Description |
|--------|-------------|
| **[`azure_ai/`](azure_ai/)** | Create agents using Azure AI Foundry Agent Service |
| **[`azure_ai/`](azure_ai/)** | Create agents using Azure AI Foundry Agent Service with various tools including function tools, code interpreter, MCP integration, and thread management |
### Microsoft Copilot Studio Examples
| Folder | Description |
|--------|-------------|
| **[`copilotstudio/`](copilotstudio/)** | Create agents using Microsoft Copilot Studio |
| **[`copilotstudio/`](copilotstudio/)** | Create agents using Microsoft Copilot Studio with streaming and non-streaming responses, authentication handling, and explicit configuration options |
### Azure OpenAI Examples
| Folder | Description |
|--------|-------------|
| **[`azure_openai/`](azure_openai/)** | Create agents using Azure OpenAI APIs |
| **[`azure_openai/`](azure_openai/)** | Create agents using Azure OpenAI APIs with multiple client types (Assistants, Chat, and Responses clients) supporting function tools, code interpreter, thread management, and more |
### OpenAI Examples
| Folder | Description |
|--------|-------------|
| **[`openai/`](openai/)** | Create agents using OpenAI APIs |
| **[`openai/`](openai/)** | Create agents using OpenAI APIs with comprehensive examples including Assistants, Chat, and Responses clients featuring function tools, code interpreter, file search, web search, MCP integration, image analysis/generation, structured outputs, reasoning, and thread management |
### Custom Client Examples
### Anthropic Examples
| Folder | Description |
|--------|-------------|
| **[`custom_client/`](custom_client/)** | Create agents using a custom chat client or a custom agent |
| **[`anthropic/`](anthropic/)** | Create agents using Anthropic APIs |
| **[`anthropic/`](anthropic/)** | Create agents using Anthropic models through OpenAI Chat Client configuration, demonstrating tool calling capabilities |
### Custom Implementation Examples
| Folder | Description |
|--------|-------------|
| **[`custom/`](custom/)** | Create custom agents and chat clients by extending the base framework classes, showing complete control over agent behavior and backend integration |
@@ -37,7 +37,7 @@ async def main() -> None:
async with ChatAgent(
# passing in the client is optional here, so if you take the agent_id from the portal
# you can use it directly without the two lines above.
chat_client=AzureAIAgentClient(client=client, agent_id=created_agent.id),
chat_client=AzureAIAgentClient(project_client=client, agent_id=created_agent.id),
instructions="You are a helpful weather agent.",
tools=get_weather,
) as agent:
@@ -6,11 +6,12 @@ import base64
import requests
from agent_framework import ChatMessage, DataContent, Role, TextContent
from agent_framework.azure import AzureOpenAIChatClient
from azure.identity import AzureCliCredential
async def test_image():
async def test_image() -> None:
"""Test image analysis with Azure."""
client = AzureOpenAIChatClient()
client = AzureOpenAIChatClient(credential=AzureCliCredential())
# Fetch image from httpbin
image_url = "https://httpbin.org/image/jpeg"
@@ -27,7 +28,7 @@ async def test_image():
print(f"Image Response: {response}")
async def main():
async def main() -> None:
print("=== Testing Azure Multimodal ===")
await test_image()
@@ -2,12 +2,14 @@
import asyncio
import base64
import requests
import struct
import requests
from agent_framework import ChatMessage, DataContent, Role, TextContent
from agent_framework.openai import OpenAIChatClient
async def test_image():
async def test_image() -> None:
"""Test image analysis with OpenAI."""
client = OpenAIChatClient(ai_model_id="gpt-4o")
@@ -19,26 +21,27 @@ async def test_image():
message = ChatMessage(
role=Role.USER,
contents=[
TextContent(text="What's in this image?"),
DataContent(uri=image_uri, media_type="image/jpeg")
]
contents=[TextContent(text="What's in this image?"), DataContent(uri=image_uri, media_type="image/jpeg")],
)
response = await client.get_response(message)
print(f"Image Response: {response}")
async def test_audio():
async def test_audio() -> None:
"""Test audio analysis with OpenAI."""
client = OpenAIChatClient(ai_model_id="gpt-4o-audio-preview")
# Create minimal WAV file (0.1 seconds of silence)
wav_header = (
b'RIFF' + struct.pack('<I', 44) + # file size
b'WAVEfmt ' + struct.pack('<I', 16) + # fmt chunk
struct.pack('<HHIIHH', 1, 1, 8000, 16000, 2, 16) + # PCM, mono, 8kHz
b'data' + struct.pack('<I', 1600) + # data chunk
b'\x00' * 1600 # 0.1 sec silence
b"RIFF"
+ struct.pack("<I", 44) # file size
+ b"WAVEfmt "
+ struct.pack("<I", 16) # fmt chunk
+ struct.pack("<HHIIHH", 1, 1, 8000, 16000, 2, 16) # PCM, mono, 8kHz
+ b"data"
+ struct.pack("<I", 1600) # data chunk
+ b"\x00" * 1600 # 0.1 sec silence
)
audio_b64 = base64.b64encode(wav_header).decode()
audio_uri = f"data:audio/wav;base64,{audio_b64}"
@@ -47,17 +50,19 @@ async def test_audio():
role=Role.USER,
contents=[
TextContent(text="What do you hear in this audio?"),
DataContent(uri=audio_uri, media_type="audio/wav")
]
DataContent(uri=audio_uri, media_type="audio/wav"),
],
)
response = await client.get_response(message)
print(f"Audio Response: {response}")
async def main():
async def main() -> None:
print("=== Testing OpenAI Multimodal ===")
await test_image()
await test_audio()
if __name__ == "__main__":
asyncio.run(main())