Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Это руководство поможет обновить код Python до новой системы на основе Options TypedDict, представленной в версии 1.0.0b260114 Microsoft Agent Framework. Это критическое изменение , которое обеспечивает улучшенную безопасность типов, автозавершение интегрированной среды разработки и расширяемость среды выполнения.
Обзор изменений
В этом выпуске представлено основное рефакторинг способов передачи параметров клиентам чата и агентам чата.
Как это работало раньше
Ранее параметры были переданы в качестве прямых аргументов ключевых слов в таких методах, как get_response(), get_streaming_response()run()и конструкторы агента:
# Options were individual keyword arguments
response = await client.get_response(
"Hello!",
model="gpt-4",
temperature=0.7,
max_tokens=1000,
)
# For provider-specific options not in the base set, you used additional_properties
response = await client.get_response(
"Hello!",
model="gpt-4",
additional_properties={"reasoning_effort": "medium"},
)
Как это работает сейчас
Большинство параметров теперь передаются через один options параметр в виде типизированного словаря:
# Most options go in a single typed dict
response = await client.get_response(
"Hello!",
options={
"model": "gpt-4",
"temperature": 0.7,
"max_tokens": 1000,
"reasoning_effort": "medium", # Provider-specific options included directly
},
)
Примечание: Для Агентов параметры
instructionsиtoolsостаются доступными в качестве прямых аргументов наAgent.__init__()иclient.as_agent(). Дляagent.run()доступен толькоtoolsв качестве аргумента ключевого слова.# Agent creation accepts both tools and instructions as keyword arguments agent = Agent( client=client, tools=[my_function], instructions="You are a helpful assistant.", default_options={"model": "gpt-4", "temperature": 0.7}, ) # agent.run() only accepts tools as a keyword argument response = await agent.run( "Hello!", tools=[another_function], # Can override tools per-run )
Ключевые изменения
-
Параметр консолидированных параметров: большинство аргументов ключевых слов (
model,temperatureи т. д.) теперь передаются через одинoptionsдикт. -
Исключение для создания агента:
instructionsиtoolsостаются доступными как ключевые слова дляAgent.__init__()иas_agent() -
Исключение для запуска агента:
toolsостается доступным в качестве прямого аргумента ключевого слова вagent.run() -
Параметры на основе TypedDict: Опции определяются как
TypedDictклассы для безопасности типов - Поддержка универсальных типов: клиенты и агенты чата поддерживают универсальные шаблоны для параметров, относящихся к поставщику, чтобы разрешить перегрузки среды выполнения.
-
Параметры для конкретного поставщика: у каждого поставщика есть собственный типdDict по умолчанию (например,
OpenAIChatOptions, )OllamaChatOptions - Нет больше additional_properties: параметры, относящиеся к поставщику, теперь являются типизированными полями первого класса.
Преимущества
- Безопасность типов: автозавершение и проверка типов для всех опций в IDE
- Гибкость поставщика: поддержка параметров для конкретного поставщика в день один
- Более чистый код: последовательная передача параметров на основе словаря
- Упрощенное расширение. Создание настраиваемых параметров для специализированных вариантов использования (например, моделей причин или других серверных компонентов API)
Руководство по миграции
1. Преобразование аргументов ключевых слов в параметры Дикт
Наиболее частое изменение — преобразование отдельных аргументов ключевых слов в options словарь.
До (аргументы ключевых слов):
from agent_framework.openai import OpenAIChatClient
client = OpenAIChatClient()
# Options passed as individual keyword arguments
response = await client.get_response(
"Hello!",
model="gpt-4",
temperature=0.7,
max_tokens=1000,
)
# Streaming also used keyword arguments
async for chunk in client.get_streaming_response(
"Tell me a story",
model="gpt-4",
temperature=0.9,
):
print(chunk.text, end="")
После (словарь параметров):
from agent_framework.openai import OpenAIChatClient
client = OpenAIChatClient()
# All options now go in a single 'options' parameter
response = await client.get_response(
"Hello!",
options={
"model": "gpt-4",
"temperature": 0.7,
"max_tokens": 1000,
},
)
# Same pattern for streaming
async for chunk in client.get_streaming_response(
"Tell me a story",
options={
"model": "gpt-4",
"temperature": 0.9,
},
):
print(chunk.text, end="")
Если вы передаете параметры, которые не подходят для этого клиента, вы получите ошибку типа в интегрированной среде разработки.
2. Использование специфических параметров поставщика (нет больше additional_properties)
Ранее для передачи параметров, относящихся к поставщику, которые не были частью базового набора аргументов ключевых слов, необходимо было использовать additional_properties этот параметр:
Перед использованием additional_properties:
from agent_framework.openai import OpenAIChatClient
client = OpenAIChatClient()
response = await client.get_response(
"What is 2 + 2?",
model="gpt-4",
temperature=0.7,
additional_properties={
"reasoning_effort": "medium", # No type checking or autocomplete
},
)
После (прямые параметры с TypedDict):
from agent_framework.openai import OpenAIChatClient
# Provider-specific options are now first-class citizens with full type support
client = OpenAIChatClient()
response = await client.get_response(
"What is 2 + 2?",
options={
"model": "gpt-4",
"temperature": 0.7,
"reasoning_effort": "medium", # Type checking or autocomplete
},
)
После (настраиваемое подклассирование для новых параметров):
Или если это параметр, который еще не является частью Agent Framework (так как он новый или поскольку он настраивается для серверной части, совместимой с OpenAI), теперь можно подклассить параметры и использовать универсальную поддержку:
from typing import Literal
from agent_framework.openai import OpenAIChatOptions, OpenAIChatClient
class MyCustomOpenAIChatOptions(OpenAIChatOptions, total=False):
"""Custom OpenAI chat options with additional parameters."""
# New or custom parameters
custom_param: str
# Use with the client
client = OpenAIChatClient[MyCustomOpenAIChatOptions]()
response = await client.get_response(
"Hello!",
options={
"model": "gpt-4",
"temperature": 0.7,
"custom_param": "my_value", # IDE autocomplete works!
},
)
Ключевым преимуществом является то, что большинство параметров для конкретного поставщика теперь являются частью словаря типизированных параметров, предоставляя вам следующее:
- Автозавершение интегрированной среды разработки для всех доступных параметров
- Проверка типа для перехвата недопустимых ключей или значений
- Нет необходимости в дополнительных_свойствах для известных параметров поставщика
- Простое расширение для пользовательских или новых параметров
3. Обновление конфигурации агента
Методы инициализации агента и запуска соответствуют тому же шаблону:
До (аргументы ключевых слов в конструкторе и выполнении):
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
client = OpenAIChatClient()
# Default options as keyword arguments on constructor
agent = Agent(
client=client,
name="assistant",
model="gpt-4",
temperature=0.7,
)
# Run also took keyword arguments
response = await agent.run(
"Hello!",
max_tokens=1000,
)
After:
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient, OpenAIChatOptions
client = OpenAIChatClient()
agent = Agent(
client=client,
name="assistant",
default_options={ # <- type checkers will verify this dict
"model": "gpt-4",
"temperature": 0.7,
},
)
response = await agent.run("Hello!", options={ # <- and this dict too
"max_tokens": 1000,
})
4. Специфические параметры поставщика
Теперь у каждого поставщика есть собственный TypedDict для параметров, они включены по умолчанию. Это позволяет использовать параметры, специфичные для поставщика, обеспечивая полную безопасность типов.
Пример OpenAI:
from agent_framework.openai import OpenAIChatClient
client = OpenAIChatClient()
response = await client.get_response(
"Hello!",
options={
"model": "gpt-4",
"temperature": 0.7,
"reasoning_effort": "medium",
},
)
Но вы также можете сделать его явным:
from agent_framework_anthropic import AnthropicClient, AnthropicChatOptions
client = AnthropicClient[AnthropicChatOptions]()
response = await client.get_response(
"Hello!",
options={
"model": "claude-3-opus-20240229",
"max_tokens": 1000,
},
)
5. Создание настраиваемых параметров для специализированных моделей
Одной из мощных функций новой системы является возможность создания настраиваемых параметров TypedDict для специализированных моделей. Это особенно полезно для моделей с уникальными параметрами, такими как модели причин с помощью OpenAI:
from typing import Literal
from agent_framework.openai import OpenAIChatOptions, OpenAIChatClient
class OpenAIReasoningChatOptions(OpenAIChatOptions, total=False):
"""Chat options for OpenAI reasoning models (o1, o3, o4-mini, etc.)."""
# Reasoning-specific parameters
reasoning_effort: Literal["none", "minimal", "low", "medium", "high", "xhigh"]
# Unsupported parameters for reasoning models (override with None)
temperature: None
top_p: None
frequency_penalty: None
presence_penalty: None
logit_bias: None
logprobs: None
top_logprobs: None
stop: None
# Use with the client
client = OpenAIChatClient[OpenAIReasoningChatOptions]()
response = await client.get_response(
"What is 2 + 2?",
options={
"model": "o3",
"max_tokens": 100,
"allow_multiple_tool_calls": True,
"reasoning_effort": "medium", # IDE autocomplete works!
# "temperature": 0.7, # Would raise a type error, because the value is not None
},
)
6. Агенты чата с параметрами
Универсальная настройка также распространяется на агентов чата.
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
agent = Agent(
client=OpenAIChatClient[OpenAIReasoningChatOptions](),
default_options={
"model": "o3",
"max_tokens": 100,
"allow_multiple_tool_calls": True,
"reasoning_effort": "medium",
},
)
и вы можете указать универсальный тип как для клиента, так и агента, поэтому это также допустимо:
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
agent = Agent[OpenAIReasoningChatOptions](
client=OpenAIChatClient(),
default_options={
"model": "o3",
"max_tokens": 100,
"allow_multiple_tool_calls": True,
"reasoning_effort": "medium",
},
)
6. Обновление пользовательских реализаций клиента чата
Если вы реализовали пользовательский клиент чата, расширив BaseChatClient, обновите внутренние методы:
Before:
from agent_framework import BaseChatClient, Message, ChatOptions, ChatResponse
class MyCustomClient(BaseChatClient):
async def _inner_get_response(
self,
*,
messages: MutableSequence[Message],
chat_options: ChatOptions,
**kwargs: Any,
) -> ChatResponse:
# Access options via class attributes
model = chat_options.model
temp = chat_options.temperature
# ...
After:
from typing import Generic
from agent_framework import BaseChatClient, Message, ChatOptions, ChatResponse
# Define your provider's options TypedDict
class MyCustomChatOptions(ChatOptions, total=False):
my_custom_param: str
# This requires the TypeVar from Python 3.13+ or from typing_extensions, so for Python 3.13+:
from typing import TypeVar
TOptions = TypeVar("TOptions", bound=TypedDict, default=MyCustomChatOptions, covariant=True)
class MyCustomClient(BaseChatClient[TOptions], Generic[TOptions]):
async def _inner_get_response(
self,
*,
messages: MutableSequence[Message],
options: dict[str, Any], # Note: parameter renamed and just a dict
**kwargs: Any,
) -> ChatResponse:
# Access options via dict access
model = options.get("model")
temp = options.get("temperature")
# ...
Общие шаблоны миграции
Шаблон 1. Простое обновление параметров
# Before - keyword arguments
await client.get_response("Hello", temperature=0.7)
# After - options dict
await client.get_response("Hello", options={"temperature": 0.7})
Шаблон 2. Несколько параметров
# Before - multiple keyword arguments
await client.get_response(
"Hello",
model="gpt-4",
temperature=0.7,
max_tokens=1000,
)
# After - all in options dict
await client.get_response(
"Hello",
options={
"model": "gpt-4",
"temperature": 0.7,
"max_tokens": 1000,
},
)
Шаблон 3. Клиент чата с инструментами
Для чат-клиентов tools теперь переходит в словарь параметров:
# Before - tools as keyword argument on chat client
await client.get_response(
"What's the weather?",
model="gpt-4",
tools=[my_function],
tool_choice="auto",
)
# After - tools in options dict for chat clients
await client.get_response(
"What's the weather?",
options={
"model": "gpt-4",
"tools": [my_function],
"tool_choice": "auto",
},
)
Шаблон 4. Агент с инструментами и инструкциями
Для создания агента tools и instructions могут оставаться в качестве ключевых аргументов. Для run(), доступно только tools :
# Before
agent = Agent(
client=client,
name="assistant",
tools=[my_function],
instructions="You are helpful.",
model="gpt-4",
)
# After - tools and instructions stay as keyword args on creation
agent = Agent(
client=client,
name="assistant",
tools=[my_function], # Still a keyword argument!
instructions="You are helpful.", # Still a keyword argument!
default_options={"model": "gpt-4"},
)
# For run(), only tools is available as keyword argument
response = await agent.run(
"Hello!",
tools=[another_function], # Can override tools
options={"max_tokens": 100},
)
# Before - using additional_properties
await client.get_response(
"Solve this problem",
model="o3",
additional_properties={"reasoning_effort": "high"},
)
# After - directly in options
await client.get_response(
"Solve this problem",
options={
"model": "o3",
"reasoning_effort": "high",
},
)
Шаблон 5. Параметры, специфичные для поставщика
# Define reusable options
my_options: OpenAIChatOptions = {
"model": "gpt-4",
"temperature": 0.7,
}
# Use with different messages
await client.get_response("Hello", options=my_options)
await client.get_response("Goodbye", options=my_options)
# Extend options using dict merge
extended_options = {**my_options, "max_tokens": 500}
Сводка критических изменений
| Аспект | До | После |
|---|---|---|
| Параметры клиента чата | Отдельные аргументы ключевых слов (temperature=0.7) |
Один options словарь (options={"temperature": 0.7}) |
| Клиентские средства чата |
tools=[...] аргумент ключевого слова |
options={"tools": [...]} |
Создание tools агента и instructions |
Аргументы ключевых слов | Аргументы ключевых слов по-прежнему (без изменений) |
Агент run()tools |
Аргумент ключевого слова | По-прежнему аргумент ключевого слова (без изменений) |
Агент run()instructions |
Аргумент ключевого слова | Перемещено в options={"instructions": ...} |
| Параметры, специфические для поставщика | additional_properties={...} |
Включен непосредственно в options словарь |
| Параметры агента по умолчанию | Ключевые аргументы конструктора | default_options={...} |
| Параметры запуска агента | Аргументы ключевых слов в run() |
options={...} параметр |
| Клиент набирает текст | OpenAIChatClient() |
OpenAIChatClient[CustomOptions]() (необязательно) |
| Агент печатает | Agent(...) |
Agent[CustomOptions](...) (необязательно) |
Тестирование миграции
Обновления ChatClient
- Найдите все вызовы
get_response()иget_streaming_response(), которые используют ключевые аргументы, напримерmodel=,temperature=,tools=, и т. д. - Переместите все ключевые аргументы в
options={...}словарь - Переместите любые
additional_propertiesзначения непосредственно вoptionsсловарь
Обновления агента
- Поиск всех
Agentконструкторов иrun()вызовов, использующих аргументы ключевых слов - Переместите ключевые аргументы в конструкторах в
default_options={...} - Переместите аргументы ключевых слов с
run()наoptions={...} -
Исключение:
toolsиinstructionsмогут оставаться в качестве аргументов ключевых слов наAgent.__init__()иas_agent() -
Исключение:
toolsможет оставаться в качестве аргумента ключевого слова вrun()
Обновления пользовательского клиента чата
- Обновите сигнатуры метода
_inner_get_response()и_inner_get_streaming_response(): измените параметрchat_options: ChatOptionsнаoptions: dict[str, Any] - Обновите доступ к атрибутам (например,
chat_options.model) для доступа к словарю (например,options.get("model")) - (Необязательно) При использовании нестандартных параметров: определение настраиваемого TypedDict
- Добавление параметров универсального типа в клиентский класс
Для всех
-
Запуск средства проверки типов: используйте
mypyилиpyrightдля перехвата ошибок типа - Сквозное тестирование: запустите приложение для проверки функциональности
Поддержка интегрированной среды разработки
Новая система typedDict обеспечивает отличную поддержку интегрированной среды разработки:
- Автозавершение: получение предложений для всех доступных параметров
- Проверка типов: обнаружение недопустимых ключей опций в процессе разработки
- Документация. Наведите указатель мыши на ключи для просмотра описаний
- Для конкретного поставщика: параметры каждого поставщика отображают только соответствующие параметры.
Дальнейшие шаги
Чтобы просмотреть типизированные словари в действии при использовании моделей логического вывода OpenAI с API завершения чата, изучите этот пример.
После завершения миграции:
- Изучение параметров, относящихся к поставщику, в документации по API
- Просмотр обновленных примеров
- Узнайте о создании пользовательских клиентов чата
Дополнительные сведения см. в документации по Agent Framework или обратитесь к сообществу.