模型配置
为 Deep Agents 配置模型提供商和参数
选对模型、配好参数——Agent 才能跑得稳为什么关注模型
你的 Agent 效果好坏,很大程度上取决于底层模型的选型和配置
随意选模型的困境
- 不知道哪些模型支持工具调用,Agent 根本跑不起来
- 参数没调好,模型要么太"懒"要么太"发散"
- 换了模型后行为完全不同,没有统一的配置方式
- 想运行时切换模型?只能重写代码
Deep Agents 的解法
- 只需
provider:model一行字符串即可指定模型 - 通过
ProviderProfile统一管理参数,提供商级 + 模型级分层配置 - 用中间件实现运行时动态切换,无需重建 Agent
- 官方评测套件帮你筛选表现良好的模型
模型格式
用 provider:model 格式指定模型
白话:你想用哪个模型,只需写一行 提供商名:模型名。比如 openai:gpt-5.4 就是 OpenAI 的 GPT-5.4,anthropic:claude-sonnet-4-6 就是 Anthropic 的 Claude。
使用 provider:model 格式传给 createDeepAgent,冒号前面是提供商前缀,冒号后面是模型标识符。提供商前缀用于选择对应的 LangChain 集成。
// 格式:provider:model
"google-genai:gemini-3.1-pro-preview"
"openai:gpt-5.4"
"anthropic:claude-sonnet-4-6"
"baseten:zai-org/GLM-5.1" // 带命名空间的 ID
"ollama:llama3"
提供商前缀
决定使用哪个 LangChain 集成包。例如 openai 会加载 @langchain/openai。
有效前缀参见 init_chat_model 的 model_provider 参数。
模型标识符
冒号之后的所有内容直接传递给提供商。
有些用简单名称(如 gpt-5.4),有些用命名空间路径(如 zai-org/GLM-5.1)。
推荐模型
通过 Deep Agents 评测套件验证的模型
以下模型在官方评测套件中表现良好,该套件测试基本的 Agent 操作(文件操作、信息检索、工具使用等)。通过评测是必要条件,但不保证在更复杂任务中同样出色。
| 提供商 | 推荐模型 |
|---|---|
gemini-3.1-pro-preview、gemini-3-flash-preview |
|
| OpenAI | gpt-5.4、gpt-4o、gpt-4o-mini、o4-mini、gpt-5.2-codex、gpt-5.5 |
| Anthropic | claude-opus-4-6、claude-opus-4-5、claude-sonnet-4-6、claude-sonnet-4、claude-sonnet-4-5、claude-haiku-4-5、claude-opus-4-1 |
| 开源权重 | GLM-5、Kimi-K2.5、MiniMax-M2.5、qwen3.5-397B-A17B、devstral-2-123B |
openrouter:deepseek/deepseek-v4-pro、ollama:minimax-m2.7:cloud。
google-genai:gemini-3.1-pro-preview 或 openai:gpt-5.4 开始——它们在文件操作和信息检索两项上均拿到 100%。
评测成绩
主流模型在 Deep Agents 评测套件中的表现一览
评测涵盖六大类 Agent 操作,加粗数字表示该维度最佳表现。数据来自官方 CI 运行记录。
| 模型 | 文件操作 | 信息检索 | 工具使用 | 记忆 | 对话 | 摘要 |
|---|---|---|---|---|---|---|
gemini-3.1-pro |
100% | 100% | 25% | 54% | 48% | 80% |
gpt-5.4 |
100% | 100% | 18% | 51% | 38% | 100% |
claude-opus-4-6 |
92% | 100% | 26% | 69% | 22% | 100% |
claude-opus-4-7 |
100% | 100% | 18% | -- | 52% | 100% |
GLM-5 |
92% | 100% | 87% | 44% | 29% | 60% |
minimax-m2.7 |
92% | 90% | 82% | 38% | 29% | 60% |
gpt-5.5 |
92% | 100% | 20% | 64% | 52% | 80% |
Kimi-K2.6 |
100% | 100% | 20% | -- | -- | 60% |
deepseek-v4-pro |
100% | 100% | 25% | -- | -- | 80% |
minimax-m2.7 (OpenRouter) |
92% | 100% | 20% | -- | -- | 60% |
nemotron-3-super-120b |
0% | 0% | 0% | 0% | 0% | 0% |
glm-5.1 |
92% | 100% | 25% | -- | 33% | 80% |
GLM-5(87%)或 minimax-m2.7(82%)。
配置参数
两种方式精细控制模型行为
白话:如果你只想换模型名称,传字符串就够了。但如果你要调参数(如 temperature、reasoning_effort),有两种更灵活的方式。
除了传入 provider:model 字符串,你还可以传入一个已配置的模型实例来获得完全控制。底层通过 init_chat_model 解析。
方式一:initChatModel
import { initChatModel } from "langchain/chat_models/universal";
import { createDeepAgent } from "deepagents";
// 用通用工厂方法初始化模型,字符串指定提供商和模型
// reasoningEffort 控制推理深度,"medium" 为中等,可选 "low"/"high"
const model = await initChatModel(
"google-genai:gemini-3.1-pro-preview",
{ reasoningEffort: "medium" }
);
// 将已配置的模型实例传入,Agent 直接使用它
const agent = createDeepAgent({ model });
方式二:提供商包
import { ChatGoogle } from "@langchain/google";
import { createDeepAgent } from "deepagents";
// 直接用提供商包实例化,可访问该提供商的所有专有参数
const model = new ChatGoogle({
model: "gemini-3.1-pro-preview", // 模型标识符,只需写模型名
reasoningEffort: "medium", // 推理深度参数
});
const agent = createDeepAgent({ model });
initChatModel
通用方法,用字符串指定模型,通过选项配置参数。适合快速切换模型时使用。
提供商包
直接实例化提供商类,可访问该提供商的所有专有参数。适合需要深度定制的场景。
reasoningEffort 可能只对部分模型有效。请查阅各提供商的集成文档确认支持的参数列表。
配置档案
用 ProviderProfile 统一管理模型参数
白话:ProviderProfile 就像"模型配置模板"。你可以写一个模板说"所有 OpenAI 模型温度设 0",再写一个说"GPT-5.4 额外开启推理功能"——它们会自动合并。
ProviderProfile 封装了在使用 provider:model 字符串创建 Agent 时应用的初始化参数。它支持两级注册,且两者可以共存、自动合并。
import { ProviderProfile, registerProviderProfile } from "deepagents";
// 提供商级别:所有 openai 模型都设置 temperature=0
registerProviderProfile(
"openai",
new ProviderProfile({ temperature: 0 }),
);
// 模型级别:gpt-5.4 额外设置 reasoningEffort
// 会继承上面提供商级别的 temperature=0
registerProviderProfile(
"openai:gpt-5.4",
new ProviderProfile({ reasoningEffort: "medium" }),
);
提供商级别
用裸提供商键名(如 "openai")注册,应用于该提供商的所有模型。
适合设置通用默认值,如 temperature。
模型级别
用 provider:model 键名(如 "openai:gpt-5.4")注册,仅应用于特定模型。
会与提供商级别配置合并,模型级优先。
运行时切换
用中间件在运行时动态选择模型,无需重建 Agent
如果你的应用允许用户通过 UI 下拉菜单选择模型,可以使用 LangChain 中间件(middleware)在运行时切换。
import { initChatModel, createMiddleware } from "langchain";
import { createDeepAgent } from "deepagents";
import * as z from "zod";
// 定义上下文的 schema,model 字段存放用户选择的模型名
const contextSchema = z.object({
model: z.string(),
});
// 定义中间件:拦截每次模型调用,替换为用户选择的模型
const configurableModel = createMiddleware({
name: "ConfigurableModel",
// wrapModelCall 会在每次 LLM 调用前执行
wrapModelCall: async (request, handler) => {
// 从运行时上下文中读取用户选择的模型名
const modelName = request.runtime.context.model;
// 动态初始化新模型实例
const model = await initChatModel(modelName);
// 用新模型替换原请求中的模型,继续执行后续流程
return handler({ ...request, model });
},
});
const agent = await createDeepAgent({
model: "google-genai:gemini-3.1-pro-preview", // 默认模型(首次调用时使用)
middleware: [configurableModel], // 注册中间件
contextSchema, // 绑定上下文 schema
});
context 即可切换模型。
切换实战
用不同模型调用同一个 Agent
// 用 Google 模型调用——context.model 指定模型,中间件会拦截并切换
const result1 = await agent.invoke(
{ messages: [{ role: "user", content: "分析这段代码" }] },
{ context: { model: "google-genai:gemini-3.1-pro-preview" } },
);
// 切换到 OpenAI 模型——同一个 agent 实例,无需重建
const result2 = await agent.invoke(
{ messages: [{ role: "user", content: "分析这段代码" }] },
{ context: { model: "openai:gpt-5.4" } },
);
// 切换到 Anthropic 模型——只需改变 context 中的 model 值
const result3 = await agent.invoke(
{ messages: [{ role: "user", content: "分析这段代码" }] },
{ context: { model: "anthropic:claude-sonnet-4-6" } },
);
适用场景
- 用户在 UI 中自选模型
- 根据任务复杂度路由到不同模型
- A/B 测试不同模型的效果
注意事项
- 每次切换都会初始化新模型,有少量延迟
- 确保所有候选模型都支持工具调用
- 不同模型的输出格式可能有差异
本章小结
模型配置的三层能力:选模型、调参数、运行时切换
选模型
- 格式:
provider:model - 必须支持工具调用
- 参考官方评测套件选择
- Google / OpenAI / Anthropic 整体领先
调参数
initChatModel通用配置- 提供商包直接实例化
ProviderProfile分层管理- 提供商级 + 模型级自动合并
运行时切换
- 中间件拦截模型调用
- 上下文传入模型名称
- 无需重建 Agent
- 适合用户自选和 A/B 测试
延伸阅读
官方文档
- init_chat_model API -- 模型初始化参考
- 评测套件 -- 模型评测详情和运行记录
- 聊天模型集成 -- 各提供商配置选项
相关概念
- LangChain 中间件 -- 动态模型选择的基础
- LangChain 中的模型 -- 工具调用、结构化输出、多模态