Microsoft Agent Framework 支援 C#、Python 和 Go 中的 OpenAI 代理程式。 C# 和 Python 支援兩種 OpenAI 用戶端類型——回應(Responses)和聊天完成(Chat Completions),而 Go 目前使用聊天完成服務提供者。 Responses 是推薦的主要用戶端(若有):它針對較新的 OpenAI 回應 API,並支援完整的託管工具組合(程式碼解譯器、檔案搜尋、網頁搜尋、託管 MCP 及影像生成)。 當你需要廣泛的模型相容性、Go 支援,或想保留現有的 Chat Completions 整合時,請使用 Chat Completion。
| 客戶類型 | API | 最適合 |
|---|---|---|
| 回應(建議) | 回應 API | 具備完整功能代理,並附有託管工具(程式碼解譯器、檔案搜尋、網頁搜尋、託管 MCP) |
| 聊天完成 | 聊天完成 API | 簡單的代理,廣泛的模型支援 |
備註
OpenAI 助理 API 已被 OpenAI 取代。 新程式碼應該使用回應客戶端。 如果你是從現有的 Assistants 應用程式遷移過來,請參考 語意核心 遷移指南。
使用者入門
將必要的 NuGet 套件新增至您的專案。
dotnet add package Microsoft.Agents.AI.OpenAI --prerelease
Responses 用戶端
Responses 用戶端是推薦的主要用戶端,提供最豐富的工具支援,包括程式碼直譯器、檔案搜尋、網頁搜尋及託管 MCP。
using Microsoft.Agents.AI;
using OpenAI;
OpenAIClient client = new OpenAIClient("<your_api_key>");
var responsesClient = client.GetResponsesClient();
AIAgent agent = responsesClient.AsAIAgent(
model: "gpt-4o-mini",
instructions: "You are a helpful coding assistant.",
name: "CodeHelper");
Console.WriteLine(await agent.RunAsync("Write a Python function to sort a list."));
支援工具: 功能工具、工具審核、程式碼解譯器、檔案搜尋、網頁搜尋、託管 MCP、本地 MCP 工具。
聊天完成客戶端
聊天完成客戶端提供了一種直接使用聊天完成 API 來建立代理的方式。 當你需要廣泛的模型相容性或已有 Chat Completions 整合時,可以使用它。
using Microsoft.Agents.AI;
using OpenAI;
OpenAIClient client = new OpenAIClient("<your_api_key>");
var chatClient = client.GetChatClient("gpt-4o-mini");
AIAgent agent = chatClient.AsAIAgent(
instructions: "You are good at telling jokes.",
name: "Joker");
Console.WriteLine(await agent.RunAsync("Tell me a joke about a pirate."));
支援工具: 功能工具、網頁搜尋、本地 MCP 工具。
助理用戶端
備註
OpenAI 助理的 API 已被 OpenAI 取代。 Agent Framework 不再提供 Assistants 用戶端的說明文件;新程式碼請改用上述的 Responses 用戶端。 關於遷移現有應用程式,請參閱 語意核心 遷移指南。
使用代理程式
兩種用戶端類型都會產生一個標準的 AIAgent,支援相同的代理程式操作(串流、執行緒、中介軟體)。
更多資訊請參閱 入門教學。
Tools
OpenAI .NET 用戶端會根據目標 API 暴露不同的工具表面。 同樣的對照表也適用於 Azure OpenAI 提供者頁面 上相對應的 Azure OpenAI 用戶端。
| Tool | 回應 | 聊天完成 |
|---|---|---|
| 函式工具 | ✅ | ✅ |
| 工具核准 | ✅ | ✅ |
| 程式碼解譯器 | ✅ | ❌ |
| 檔案搜尋 | ✅ | ❌ |
| 網路搜尋 | ✅ | ✅ |
| 託管 MCP 工具 | ✅ | ❌ |
| 本地 MCP 工具 | ✅ | ✅ |
備註
工具核准 由框架的函式調用聊天客戶端提供,因此無論底層 API 為何,都能對任何函式工具呼叫有效。
備註
OpenAI 已棄用 OpenAI 助理 API,且 Python 不再提供助理相容客戶端/服務提供者。 回應請使用 OpenAIChatClient,聊天完成請使用 OpenAIChatCompletionClient。 如果你是從先前的代理框架Python版本遷移過來,請參閱 Python重大變更指南。 如果你是從 語意核心 遷移,請參考 語意核心 遷移指南。
Tip
在 Python 中,Azure OpenAI 現在使用與此處所示相同的 agent_framework.openai 用戶端。 當您需要 Azure 路由時,請傳遞明確的 Azure 路由輸入,例如 credential 或 azure_endpoint,然後針對您要使用的 Azure API 介面設定api_version。 如果 OPENAI_API_KEY 已設定,通用客戶端即使在 AZURE_OPENAI_* 變數存在時也會留在 OpenAI。 如果你已經有完整 .../openai/v1 網址,請用 base_url 代替 azure_endpoint。 關於 Microsoft Foundry 專案端點及 Foundry 代理服務,請參見 Microsoft Foundry 提供者頁面。 關於本地執行環境,請參見 Foundry Local。
Installation
pip install agent-framework-openai
agent-framework-openai 是可選的 Python 提供者套件,適用於直接使用 OpenAI 和 Azure OpenAI。
傳送 MP3 或 WAV 音訊
兩個 Python OpenAI 聊天客戶端都接受支援音訊輸入的模型所提供的音訊輸入。
MP3 內容請使用註冊的 audio/wav 媒體類型,WAV 內容請使用 audio/mpeg:
from agent_framework import Content, Message
with open("question.mp3", "rb") as audio_file:
message = Message(
role="user",
contents=[
Content.from_text("Transcribe this audio."),
Content.from_data(
data=audio_file.read(),
media_type="audio/mpeg",
),
],
)
response = await agent.run(message)
print(response.text)
OpenAIChatClient 同時 OpenAIChatCompletionClient 也接受常見的舊有 MP3 媒體別名,包括 audio/mp3。 新程式碼請使用 audio/mpeg。
其他音訊格式需要供應商支援,且不會轉換成 OpenAI MP3 或 WAV 輸入。
並行重複使用 Responses 用戶端
一個 OpenAIChatClient 實例可以在同一事件迴圈上同時提供非同步通話,包括重疊的串流與非串流通話。 此保證不適用於 OpenAIChatCompletionClient。
為每個並行執行個體建立個別的 Agent 和 AgentSession,並分別傳遞訊息和選項。 使用者提供的中介軟體、工具與回調也必須支援並行性。 不要在作業系統執行緒或事件迴圈間共享客戶端,或在呼叫進行時改變設定。
Configuration
Python OpenAI 聊天客戶端使用以下環境變數模式:
OPENAI_API_KEY="your-openai-api-key"
OPENAI_CHAT_MODEL="gpt-4o-mini"
# Optional shared fallback:
# OPENAI_MODEL="gpt-4o-mini"
共同特徵
這些客戶端類型支援以下標準客服專員功能:
功能工具
from agent_framework import Agent, tool
@tool
def get_weather(location: str) -> str:
"""Get the weather for a given location."""
return f"The weather in {location} is sunny, 25°C."
async def example():
agent = Agent(
client=OpenAIChatClient(),
instructions="You are a weather assistant.",
tools=get_weather,
)
result = await agent.run("What's the weather in Tokyo?")
print(result)
多回合交談
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
async def thread_example():
agent = Agent(
client=OpenAIChatClient(),
instructions="You are a helpful assistant.",
)
session = agent.create_session()
result1 = await agent.run("My name is Alice", session=session)
print(result1)
result2 = await agent.run("What's my name?", session=session)
print(result2) # Remembers "Alice"
Streaming
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
async def streaming_example():
agent = Agent(
client=OpenAIChatClient(),
instructions="You are a creative storyteller.",
)
print("Agent: ", end="", flush=True)
async for chunk in agent.run("Tell me a short story about AI.", stream=True):
if chunk.text:
print(chunk.text, end="", flush=True)
print()
提示快取
在支援明確提示快取斷點的模型上,OpenAIChatClient 可以使用 prompt_cache_key、prompt_cache_options 和 Content.additional_properties["prompt_cache_breakpoint"] 來控制可重複使用的前綴。 在支援的模型上,快取寫入可另行計費。
OpenAI 快取使用量會在 response.usage_details 中標準化:
-
cache_creation_input_token_count- 寫入提供者受控快取的輸入權杖。 -
cache_read_input_token_count- 從快取中提供的輸入權杖。
啟用 OpenTelemetry 時,這些值會對應到 gen_ai.usage.cache_creation.input_tokens 和 gen_ai.usage.cache_read.input_tokens。
import asyncio
import time
from agent_framework import Content, Message
from agent_framework.openai import OpenAIChatClient, OpenAIChatOptions
from dotenv import load_dotenv
load_dotenv()
# A stable block of context that is reused across requests, for example a product
# catalog, a policy document, or long system guidance. Repeated here to clear the
# 1024-token minimum a cache breakpoint requires.
STABLE_CONTEXT = (
"You are a support assistant for the Contoso appliance store. "
"Always answer briefly, quote the relevant catalog section, and never invent "
"model numbers. If a question is out of scope, say so and point the customer "
"to support@contoso.example. "
) * 40
def build_messages(question: str) -> list[Message]:
"""Build a request with a cache breakpoint at the end of the stable prefix."""
return [
Message(
role="user",
contents=[
Content.from_text(
STABLE_CONTEXT,
additional_properties={"prompt_cache_breakpoint": {"mode": "explicit"}},
)
],
),
Message(role="user", contents=[Content.from_text(question)]),
]
async def main() -> None:
print("\033[92m=== OpenAI Chat Client Prompt Caching Example ===\033[0m\n")
client = OpenAIChatClient[OpenAIChatOptions](model="gpt-5.6-luna")
options: OpenAIChatOptions = {
"prompt_cache_options": {"mode": "explicit"},
"prompt_cache_key": f"contoso_appliance_store-{time.time()}",
}
questions = ["Do you sell refrigerators?", "What is the return policy contact?"]
for turn, question in enumerate(questions, start=1):
response = await client.get_response(build_messages(question), options=options)
usage = response.usage_details or {}
cached = usage.get("cache_read_input_token_count", 0)
cached_write = usage.get("cache_creation_input_token_count", 0)
print(f"Turn {turn}: {question}")
print(f" Answer: {response.text}")
print(f" Cached input tokens (read): {cached}\n")
print(f" Cached input tokens (created): {cached_write}\n")
if turn < len(questions):
# A freshly written cache entry becomes readable shortly after the request
# completes; the brief pause keeps the next turn from racing this one.
await asyncio.sleep(2)
print("The first turn writes the prefix to the cache; later turns read it back.")
使用代理程式
所有客戶端類型都會產生一個標準Agent,支援相同的操作。
更多資訊請參閱 入門教學。
Tools
Python OpenAI 用戶端會根據底層 API 暴露不同的工具表面。
OpenAIChatClient (Responses) 透過 client.get_*_tool(...) 發佈託管工具工廠 — get_code_interpreter_tool、get_file_search_tool、get_web_search_tool、get_image_generation_tool、get_shell_tool 和 get_mcp_tool。
OpenAIChatCompletionClient 只暴露 get_web_search_tool。 兩者都能搭配函式工具和本地 MCP 伺服器運作。
當你將這些客戶端指向 OpenAI Azure,也同樣適用這個矩陣——參見 Azure OpenAI。
| Tool |
OpenAIChatClient (回應) |
OpenAIChatCompletionClient (聊天結束) |
|---|---|---|
| 函式工具 | ✅ | ✅ |
| 工具核准 | ✅ | ✅ |
| 程式碼解譯器 | ✅ | ❌ |
| 檔案搜尋 | ✅ | ❌ |
| 網路搜尋 | ✅ | ✅ |
| 影像生成 |
✅ (get_image_generation_tool) |
❌ |
| 託管 Shell |
✅ (get_shell_tool) |
❌ |
| 託管 MCP 工具 | ✅ | ❌ |
| 本地 MCP 工具 | ✅ | ✅ |
備註
工具審核 由框架的函式呼叫聊天客戶端處理,因此無論底層 API 為何,都能對任何函式工具呼叫有效。
OpenAI 對話完成
該 openaiprovider 套件使用 OpenAI 聊天完成 API 來建立代理。
Installation
go get github.com/microsoft/agent-framework-go
直接使用 OpenAI
import (
"github.com/microsoft/agent-framework-go/agent"
"github.com/microsoft/agent-framework-go/provider/openaiprovider"
"github.com/openai/openai-go/v3"
)
a := openaiprovider.NewChatCompletionsAgent(
openai.NewClient(), // uses OPENAI_API_KEY env var
openaiprovider.AgentConfig{
Model: "gpt-4o-mini",
Instructions: "You are a helpful assistant.",
Config: agent.Config{
Name: "MyAgent",
},
},
)
resp, err := a.RunText(ctx, "Tell me a joke.").Collect()
Azure OpenAI
使用相同的 openaiprovider 套件,搭配 Azure 憑證:
import (
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
openai "github.com/openai/openai-go/v3"
"github.com/openai/openai-go/v3/azure"
)
token, _ := azidentity.NewDefaultAzureCredential(nil)
a := openaiprovider.NewChatCompletionsAgent(
openai.NewClient(
azure.WithEndpoint(endpoint, apiVersion),
azure.WithTokenCredential(token),
),
openaiprovider.AgentConfig{
Model: deployment,
Instructions: "You are a helpful assistant.",
Config: agent.Config{
},
},
)
Warning
azidentity.NewDefaultAzureCredential 開發方便,但在生產過程中需謹慎考量。 在生產環境中,建議使用特定的憑證,例如 azidentity.NewManagedIdentityCredential,以避免延遲問題、意外的憑證探測,以及備用機制帶來的安全風險。
自訂選項
使用 openaiprovider.ChatCompletionNewParams 傳遞提供者專屬選項:
resp, err := a.RunText(ctx, "Hello!",
openaiprovider.ChatCompletionNewParams(openai.ChatCompletionNewParams{
Temperature: openai.Float(0.7),
}),
).Collect()
支援工具: 功能工具、網頁搜尋、本地 MCP 工具。
Tip
完整範例請參閱 OpenAI 提供者範例與 Azure OpenAI 範例。