news 2026/9/10 19:05:42

openai-agents-python 模型设置完全指南:ModelSettings 参数详解、合并规则与底层实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
openai-agents-python 模型设置完全指南:ModelSettings 参数详解、合并规则与底层实现

openai-agents-python 模型设置完全指南:ModelSettings 参数详解、合并规则与底层实现

【免费下载链接】openai-agents-pythonA lightweight, powerful framework for multi-agent workflows项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-python

导读

ModelSettings是 openai-agents-python 框架中统一管理 LLM 调用参数的入口对象,它覆盖 temperature、top_p、工具选择、截断策略、提示词缓存、重试策略与超时等全部可选配置。本文以 ModelSettings 参考文档 为骨架,结合 源码实现、序列化测试 与 模型配置指南,系统讲解每个字段的语义、resolve()合并机制、与RunConfig的覆盖关系,以及底层请求映射原理,帮助你精确控制每一次模型调用。

一、ModelSettings 是什么

在 openai-agents-python 中,Agent通过model指定模型,通过model_settings指定调用参数。ModelSettings是定义在 src/agents/model_settings.py 中的一个 pydantic dataclass,文档注释明确说明:

Settings to use when calling an LLM. This class holds optional model configuration parameters (e.g. temperature, top_p, penalties, truncation, etc.).

它被 SDK 导出在agents顶层命名空间(见 src/agents/init.py 中的ModelSettingsModelRetrySettingsretry_policies导出)。需要注意文档中反复强调的一个事实:并非所有模型/提供商都支持全部参数,具体字段是否生效取决于你使用的模型与 API(Responses API 或 Chat Completions API)。

最小的使用方式:

from agents import Agent, ModelSettings english_agent = Agent( name="English agent", instructions="You only speak English", model="gpt-4.1", model_settings=ModelSettings(temperature=0.1), )

二、字段全景解析

ModelSettings的全部字段均以None为默认值,None表示"不设置、交给模型提供商默认行为"。下面按功能分组逐一说明,字段名、类型与语义均以 源码 和 模型指南 为准。

2.1 采样与生成控制

字段类型说明
temperaturefloat \| None调用模型时的温度,控制输出的随机性。
top_pfloat \| None核采样参数(nucleus sampling)。
frequency_penaltyfloat \| None频率惩罚,抑制重复出现的 token。
presence_penaltyfloat \| None存在惩罚,鼓励谈论新主题。
max_tokensint \| None生成的最大输出 token 数。
verbosityLiteral["low", "medium", "high"] \| None约束模型回复的详细程度,是 GPT-5 系列模型的高频配置。

2.2 工具调用控制

字段类型说明
tool_choiceToolChoice \| None工具选择策略。ToolChoice定义为Literal["auto", "required", "none"] \| str \| MCPToolChoice \| None,其中MCPToolChoice(server_label, name)用于精确指定某个 MCP 服务器上的工具(见 tests/model_settings/test_serialization.py 中test_mcp_tool_choice_serialization)。
parallel_tool_callsbool \| None是否允许模型在一轮中发起多个并行工具调用。None时交给提供商默认(对 OpenAI 等大多数提供商通常为启用);显式False可限制模型每轮最多调用一个工具。

2.3 上下文、存储与截断

字段类型说明
truncationLiteral["auto", "disabled"] \| NoneResponses API 的截断策略。"auto"表示当上下文溢出时让 API 丢弃最旧的历史消息而不是报错。
storebool \| None是否把生成的响应保存在服务端以便后续通过 response ID 检索。Responses API 未指定时默认启用;Chat Completions 路径对官方 OpenAI API 默认启用,对其他提供商则省略该字段以使用其自身默认。store=False时,依赖响应 ID 的后续流程(如 OpenAIResponsesCompactionSession 的自动压缩路径)需要回退到本地输入。
context_managementlist[ContextManagement] \| None服务端上下文管理,例如[{"type": "compaction", "compact_threshold": 200000}]开启服务端压缩:当渲染后的上下文超过阈值时,Responses API 会在响应中产出 compaction item。注意它与OpenAIResponsesCompactionSession(通过独立的responses.compact端点压缩并重写本地会话历史)是两种不同机制。
prompt_cache_retentionLiteral["in_memory", "24h"] \| None提示词缓存的保留策略,"24h"启用最长 24 小时的长效缓存,适用于较早的模型家族。

2.4 提示词缓存(GPT-5.6 显式缓存)

字段类型说明
prompt_cache_optionsPromptCacheOptions \| NoneOpenAI 请求的提示词缓存配置。例如{"mode": "explicit", "ttl": "30m"}配合内容分块上的缓存断点(breakpoint),精确控制哪些 prompt 前缀可被缓存。该字段在 Responses 与 Chat Completions 请求上都会被透传,Chat Completions 转换器会保留文本、图片、音频、文件内容块上的断点。

配合显式缓存断点的用法:

from agents import Runner result = await Runner.run( research_agent, [ { "role": "user", "content": [ { "type": "input_text", "text": "Reusable background material...", "prompt_cache_breakpoint": {"mode": "explicit"}, }, { "type": "input_text", "text": "Analyze the latest question.", }, ], } ], )

官方提示:prompt_cache_retention面向使用传统保留控制的早期模型家族,不要把同一个请求字段同时通过ModelSettings直接字段与extra_args重复设置。

2.5 推理(Reasoning)与输出细节

字段类型说明
reasoningReasoning \| None推理模型的配置(OpenAI 的Reasoning类型),例如Reasoning(effort="high")。序列化测试 test_serialization.py 验证了Reasoning(mode="pro", effort="max", context="all_turns")的完整序列化,以及直接构造时对 OpenAI 扩展字段的保留。
response_includelist[ResponseIncludable \| str] \| None请求响应中附加的输出数据,例如web_search_call.action.sourcesfile_search_call.resultsreasoning.encrypted_content
top_logprobsint \| None返回 top token 的 logprobs 数量;设置后 SDK 会自动把"message.output_text.logprobs"加入 include。
include_usagebool \| None是否返回 usage 数据块,仅对 Chat Completions API 可用。对于 Any-LLM / LiteLLM 等流式后端,需要ModelSettings(include_usage=True)才能拿到 usage 指标。
metadatadict[str, str] \| None随模型响应调用一起发送的元数据。
preserve_raw_usagebool \| None是否在完成的模型响应上保留提供商原始 usage 载荷。开启后,若模型适配器仍持有未归一化的提供商载荷,ModelResponse.raw_usage会包含一份 JSON 兼容快照。它不会主动向提供商请求 usage,流式场景请单独使用include_usage

2.6 请求级扩展

字段类型说明
extra_queryQuery \| None附加到请求的查询字段。
extra_bodyBody \| None附加到请求体的字段。
extra_headersHeaders \| None附加的请求头,Headers定义为Mapping[str, str \| Omit]Omit可显式从请求中移除某个头。
extra_argsdict[str, Any] \| None直接透传给底层模型提供商 API 的任意关键字参数。用于 SDK 尚未顶层暴露的新字段,例如extra_args={"service_tier": "flex", "user": "user_12345"}"service_tier": "fast"可开启部分模型的 Fast mode("priority"与之等价)。使用需谨慎,并非所有模型都支持所有参数。

序列化测试 test_serialization.py 中的test_all_fields_serialization展示了一次设置全部 26 个字段的完整示例,可作为参数书写的权威参考。

2.7 超时与重试(2.8、2.9 详见下文专节)

字段类型说明
timeoutAnnotated[FiniteFloat, Field(gt=0)] \| None每次模型调用尝试的最大时长(秒),必须是正数。
retryModelRetrySettings \| None选择加入(opt-in)的 runner 托管重试设置。

三、超时:ModelSettings.timeout

模型指南 与 源码字段注释 对timeout的定义完全一致:

  • 以秒为单位的正数,同时约束流式与非流式调用;
  • 覆盖一次完整的模型调用尝试(含传输等待),通过常规 asyncio 取消机制协作式生效;
  • 约束整个 agent run、函数工具执行或重试退避时长。
from agents import Agent, ModelSettings agent = Agent( name="Assistant", model_settings=ModelSettings(timeout=30.0), )

超时后 SDK 会取消该次尝试并等待清理完成,然后抛出ModelTimeoutError(可参见 运行指南 中的异常说明)。若启用了 runner 托管重试,超时失败会以context.normalized.is_timeout=True交给重试策略判断,例如retry_policies.network_error()就能命中该分类;每次被允许的重试都会获得一个全新的按尝试计时的超时窗口。

四、Runner 托管重试:ModelSettings.retry

重试在 openai-agents-python 中是运行时、选择加入的机制:除非你在ModelSettings(retry=...)中配置ModelRetrySettings且策略决定重试,否则 SDK 不会重试一般模型请求。

ModelRetrySettings定义在 src/agents/retry.py,有三个字段:

字段类型说明
max_retriesint \| None初始请求之后允许的重试次数。
backoffModelRetryBackoffSettings \| dict \| None策略未返回显式延迟时的默认退避策略。ModelRetryBackoffSettingsinitial_delay(首次重试前延迟秒数)、max_delay(最大延迟上限,仅约束计算出的退避延迟,不约束策略显式返回的延迟或 retry-after 提示)、multiplier(每次重试后的倍数)、jitter(是否加随机抖动),四个字段均非负。
policyRetryPolicy \| None决定是否重试的回调,仅运行时存在,不参与序列化

一个完整的重试配置示例:

from agents import Agent, ModelRetrySettings, ModelSettings, retry_policies agent = Agent( name="Assistant", model="gpt-5.6-sol", model_settings=ModelSettings( retry=ModelRetrySettings( max_retries=4, backoff={ "initial_delay": 0.5, "max_delay": 5.0, "multiplier": 2.0, "jitter": True, }, policy=retry_policies.any( retry_policies.provider_suggested(), retry_policies.retry_after(), retry_policies.network_error(), retry_policies.http_status([408, 409, 429, 500, 502, 503, 504]), ), ) ), )

4.1 重试策略上下文 RetryPolicyContext

策略回调接收一个RetryPolicyContext(见 src/agents/retry.py),包含:

  • attemptmax_retries:支持基于尝试次数的决策;
  • stream:区分流式与非流式分支;
  • error:原始异常,供深度检查;
  • normalized:归一化错误事实,如status_coderetry_aftererror_codeis_network_erroris_timeoutis_abort
  • provider_advice:底层模型适配器给出的重试建议(如suggestedretry_afterreason);
  • response_startedreplay_safety(取值"safe"/"unsafe"/"unknown")、stateful_request(请求是否携带previous_response_idconversation_id):在策略运行前就已固化的重放安全事实。

策略可返回True/False做简单决策,也可返回RetryDecision以覆盖延迟、附加诊断 reason,或显式批准一次范围受限的不安全重放(approve_unsafe_replay=True)。普通RetryDecision(retry=True)永远不能绕过重放保护。

4.2 内置策略助手 retry_policies

SDK 在retry_policies上导出了即用型策略(实现在 src/agents/retry.py 的_RetryPolicies类中):

助手行为
retry_policies.never()始终不重试。
retry_policies.provider_suggested()跟随提供商的重试建议。
retry_policies.network_error()命中瞬时传输错误与超时失败。
retry_policies.http_status([...])命中指定的 HTTP 状态码。
retry_policies.retry_after()仅在存在 retry-after 提示时重试,并把该值当作显式策略延迟(不受backoff.max_delay限制)。
retry_policies.any(...)任一嵌套策略选择重试即重试。
retry_policies.all(...)全部嵌套策略都选择重试才重试。

组合策略时,provider_suggested()是最安全的第一构建块:它能保留提供商在可区分时给出的否决(veto)与重放安全批准。

4.3 安全边界

以下失败永不重试(模型指南):

  • 中止类错误(abort errors);
  • 流式运行中输出已经开始、重放已不安全的失败;
  • 带独立本地副作用重放否决的请求(包括 Programmatic Tool Calling 请求),除非提供商已单独标记为重放安全。

提供商标记为不安全("unsafe")的失败默认也被阻止。对于非流式且无独立本地副作用否决的请求,应用可以通过RetryDecision(retry=True, approve_unsafe_replay=True)接受提供商侧的重放风险,但应先用context.response_startedcontext.replay_safetycontext.stateful_request核实,且该批准不能授权流式重试或本地副作用。

使用previous_response_id/conversation_id的有状态后续请求在重放安全未知时失败关闭(fail closed):仅靠network_error()http_status([500])这类非提供商谓词不足以触发重试,需要提供商的重放安全批准(典型是retry_policies.provider_suggested()),或按上述方式显式批准提供商标记为非流式不安全的重放。

序列化测试 test_retry_policy_is_excluded_from_json_dict 验证了policy回调不会进入to_json_dict(),只会保留max_retriesbackoff

五、默认模型设置:GPT-5 与通用模型

src/agents/models/default_models.py 中get_default_model_settings(model)会根据模型名返回不同的默认ModelSettings

  • 对 GPT-5 系列模型(默认模型为gpt-5.6-luna,可用环境变量OPENAI_DEFAULT_MODEL覆盖),按型号前缀映射默认reasoning.effort(如gpt-5"low"gpt-5.6-sol"none"gpt-5.2-pro"medium"等),并统一设置verbosity="low"
  • 对尚未确认 effort 取值范围的 GPT-5 变体,仅保留verbosity="low"而省略reasoning.effort
  • 对非 GPT-5 模型返回空的ModelSettings(),即全部交给提供商默认。

Agent在未显式传model_settings时会通过field(default_factory=get_default_model_settings)使用上述默认(见 src/agents/agent.py)。这也解释了 模型指南 中"用gpt-5.6-sol时 SDK 自动应用默认 ModelSettings,想调整推理强度就传入自己的ModelSettings(reasoning=Reasoning(effort="high"), verbosity="low")"的建议。需要说明:GPT-5 的reasoning.effort取值以模型文档为准,内置默认选择"none"/"low"等是基于成本敏感与高频 agent 工作流的取舍。

六、字典配置与严格校验

SDK 的配置边界普遍接受"类型化对象或同字段字典"两种写法(见 docs/config.md):

from agents import Agent agent = Agent( name="Assistant", model="gpt-5.6-sol", model_settings={ "reasoning": {"effort": "high"}, "verbosity": "low", }, )

字典会被归一化为ModelSettings对象。归一化过程(_coerce_model_settings,见 src/agents/model_settings.py)具有严格校验:未知字段直接抛出TypeError,帮助你在早期发现拼写错误。测试 test_model_settings_dictionary_override_rejects_unknown_fields 验证了ModelSettings().resolve({"temperatur": 0.5})会报Unknown model settings: temperatur。此外_validate_first_party_model_settings还会对tool_choiceretryretry.backoffcontext_managementprompt_cache_options等 SDK 自有结构化设置做嵌套字段级拼写校验,同时保留 OpenAI 模型扩展的透传。

七、合并机制:resolve() 与 Runner/Agent 覆盖

ModelSettings.resolve(override)(见 src/agents/model_settings.py)用于把 override 中所有非None值叠加到当前实例之上,返回一个新对象。语义要点:

  • 普通字段:override 非None即覆盖;None表示"不修改",保持继承值;
  • extra_args字典合并而非整体替换——override 的键覆盖同名键,其余键保留(测试 test_extra_args_resolve 验证了三个键的合并结果);
  • retry深度合并max_retries可单独覆盖而继承 runner 的policybackoff支持按字段合并(测试 test_retry_resolve_deep_merges_backoff 验证了initial_delaymax_delay继承自 base,multiplierjitter来自 override)。

在运行期,src/agents/run.py 通过current_agent.model_settings.resolve(run_config.model_settings)合并 Agent 级与 Runner 级设置(例如读取合并后的store值来决定会话持久化行为)。因此 运行指南 建议:RunConfig.model_settings可覆盖 Agent 级设置,例如统一设置全局temperaturetop_p

八、底层请求映射:从 ModelSettings 到 API 调用

在 OpenAI Responses 路径上,src/agents/models/openai_responses.py 会把ModelSettings逐字段映射为请求参数:

  • temperaturetop_ptruncationmax_tokens(映射为max_output_tokens)、storeprompt_cache_retentionprompt_cache_optionsreasoning直接映射(值为None时通过_non_null_or_omit转为省略,而非显式发送 null);
  • parallel_tool_callstool_choice映射到工具调用相关参数;
  • response_includetop_logprobs会被合并进 include 集合;
  • verbosity被写入response_format
  • extra_queryextra_bodyextra_args透传到底层请求。

这也解释了为什么 Responses API 上parallel_tool_callstruncationstorecontext_managementprompt_cache_retentionprompt_cache_optionsresponse_includetop_logprobsretry等字段都有直接字段,不需要再通过extra_args传递。

九、序列化与可追踪性

ModelSettings提供两种序列化方法:

  • to_json_dict():完整序列化为 JSON 兼容字典(基于TypeAdapter(ModelSettings).dump_python(mode="json")),policy回调、嵌套 dataclass 等都会被正确处理;
  • to_traceable_dict():仅保留_TRACEABLE_MODEL_SETTING_FIELDS中列出的 19 个字段(temperaturetop_preasoningretrycontext_managementprompt_cache_optionstimeout等),剔除extra_headersextra_queryextra_bodyextra_args等可能携带密钥的请求级扩展,专用于 tracing 上报。

测试 test_traceable_serialization_omits_request_extras 明确验证:Authorization头、api-keysecret等不会出现在 traceable 输出中。Pydantic 往返(to_json/validate_json)在 test_pydantic_serialization 中也有覆盖,嵌套 dict 输入(如retry.backoff)会被自动强制转换为 dataclass。

十、最佳实践小结

  1. 先查模型文档:不同模型/提供商对参数支持不同,ModelSettings只负责把字段传下去;
  2. 用字典还是对象:简单场景可直接传字典并享受未知字段拼写校验;复杂场景(需要reasoning扩展字段或retry.policy回调)建议用类型化对象;
  3. 善用resolve()层级覆盖:Agent 级放个性化参数,RunConfig.model_settings放全局默认,retryextra_args是深度合并的例外;
  4. 不要把同一字段同时写进直接字段和extra_args(如prompt_cache_retentionservice_tier);
  5. 重试必须显式 opt-in,且组合策略以provider_suggested()打底以保留重放安全否决;
  6. 关注store=Falseinclude_usage的副作用:前者影响基于 response ID 的后续流程,后者是部分流式后端拿到 usage 指标的前提。

完整可运行的示例还可参考仓库中的 examples/basic/retry.py 与 examples/basic/retry_litellm.py,以及 docs/models/index.md 中的进阶配置章节。

【免费下载链接】openai-agents-pythonA lightweight, powerful framework for multi-agent workflows项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-python

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 19:04:10

工业闸阀分类与选型:水电化工核心差异解析

1. 工业闸阀的基本分类与核心差异水厂、电站和化工厂使用的闸阀看似外形相似,实则存在显著差异。这三种工业场景对闸阀的要求差异主要体现在介质特性、压力等级和操作环境三个方面。从结构材质来看,水厂常用铸铁或球墨铸铁闸阀,表面会做环氧树…

作者头像 李华
网站建设 2026/9/10 19:03:30

魔术公式轮胎模型:从原理到工程应用

1. 魔术公式轮胎模型初探:从赛车到日常驾驶的工程奇迹第一次听说"魔术公式轮胎模型"这个词,是在2018年上海国际汽车工程研讨会上。当时一位米其林工程师的演讲让我大开眼界——原来我们每天开车时轮胎与地面那些复杂的相互作用,早被…

作者头像 李华
网站建设 2026/9/10 19:02:48

昇腾AI芯片性能真相:破除4%误读,看端到端交付效率

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华