使用 fakeModel 模拟聊天模型
fakeModel 是一个构建器风格的模拟聊天模型,允许您编写精确的响应(文本、工具调用、错误)并断言模型接收到的内容。它扩展了 BaseChatModel,因此可以在任何需要真实模型的地方使用。
快速开始
创建一个模型,使用.respond() 排队响应,然后调用。每次 invoke() 会按顺序消耗下一个排队的响应:
工具调用响应
.respond() 支持通过传递带有 tool_calls 的 AIMessage 来模拟工具调用:
.respondWithTools() 是相同功能的简写形式。无需构造完整的 AIMessage,只需提供工具名称和参数:
id 字段是可选的。如果省略,将自动生成一个唯一 ID。
模拟错误
在特定轮次抛出错误
将Error 传递给 .respond() 会使模型在该特定调用时抛出错误。错误可以出现在序列中的任何位置:
每次调用都抛出错误
.alwaysThrow() 使每次调用都抛出错误,无论队列如何。这对于测试错误处理和重试逻辑很有用:
使用工厂函数实现动态响应
.respond() 也接受一个函数,该函数根据输入消息计算响应。该函数接收完整的消息数组,并返回一个 BaseMessage 或一个 Error:
每个函数都是一个单独的队列条目,只消耗一次。要在多个轮次中重用相同的动态逻辑,请排队多个
respond 函数调用。结构化输出
对于使用.withStructuredOutput() 的代码,可以使用 .structuredResponse() 配置模拟返回值:
.withStructuredOutput() 的模式会被忽略。模型始终返回通过 .structuredResponse() 配置的值。这使测试专注于应用逻辑而非解析。
断言模型接收到的内容
fakeModel 会记录每次调用,包括传递给模型的消息和选项。这类似于传统测试框架中的间谍或模拟:
与 bindTools 一起使用
像 LangChain 智能体和 LangGraph 这样的智能体框架会在内部调用 model.bindTools(tools)。fakeModel 会自动处理这一点。绑定后的模型与原始模型共享相同的响应队列和调用记录,因此无需特殊设置:
完整示例:使用 vitest 测试工具调用智能体
完整示例:使用 vitest 测试工具调用智能体
后续步骤
了解如何在集成测试中使用真实的模型提供商 API 测试您的智能体。Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

