OpenAI

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 範例。

下一步