createAgent
在 v1 中,react 代理预构建现在位于 langchain 包中。下表概述了哪些功能已更改
| 部分 | 发生了什么变化 |
|---|---|
| 导入路径 | 包已从 @langchain/langgraph/prebuilts 移至 langchain |
| 提示 | 参数重命名为 systemPrompt,动态提示使用中间件 |
| 模型前置钩子 | 由带有 beforeModel 方法的中间件取代 |
| 模型后置钩子 | 由带有 afterModel 方法的中间件取代 |
| 自定义状态 | 在中间件中定义,仅限 zod 对象 |
| 模型 | 通过中间件进行动态选择,不支持预绑定模型 |
| 工具 | 工具错误处理已移至带有 wrapToolCall 的中间件 |
| 结构化输出 | 移除提示输出,使用 toolStrategy/providerStrategy |
| 流式节点名称 | 节点名称从 "agent" 更改为 "model" |
| 运行时上下文 | context 属性而不是 config.configurable |
| 命名空间 | 简化为专注于代理构建块,旧代码已移至 @langchain/classic |
导入路径
react 代理预构建的导入路径已从@langchain/langgraph/prebuilts 更改为 langchain。函数名称已从 createReactAgent 更改为 createAgent
提示
静态提示重命名
prompt 参数已重命名为 systemPrompt
SystemMessage
如果在系统提示中使用 SystemMessage 对象,现在直接使用字符串内容
动态提示
动态提示是一种核心上下文工程模式——它们根据当前的对话状态调整您告诉模型的内容。为此,请使用dynamicSystemPromptMiddleware
模型前置钩子
模型前置钩子现在通过带有beforeModel 方法的中间件实现。这种模式更具可扩展性——您可以定义多个中间件在模型调用之前运行,并在代理之间重用它们。 常见用例包括:- 总结对话历史
- 修剪消息
- 输入防护,如 PII 匿名化
模型后置钩子
模型后置钩子现在通过带有afterModel 方法的中间件实现。这允许您在模型响应后组合多个处理程序。 常见用例包括:- 人工审批
- 输出防护
自定义状态
自定义状态现在在中间件中使用stateSchema 属性定义。使用 Zod 声明在代理运行中携带的附加状态字段。
模型
动态模型选择现在通过中间件进行。使用wrapModelCall 根据状态或运行时上下文交换模型(和工具)。在 createReactAgent 中,这是通过传递给 model 参数的函数完成的。 此功能已在 v1 中移植到中间件接口。动态模型选择
预绑定模型
为了更好地支持结构化输出,createAgent 应该接收一个纯模型(字符串或实例)和一个单独的 tools 列表。使用结构化输出时,避免传递预绑定工具的模型。
工具
createAgent 的 tools 参数接受
- 使用
tool创建的函数 - LangChain 工具实例
- 表示内置提供者工具的对象
wrapToolCall 集中处理工具的错误处理和日志记录。
结构化输出
节点更改
结构化输出以前在主代理之外的单独节点中生成。现在不再如此。结构化输出在主循环中生成(无需额外的 LLM 调用),从而降低了成本和延迟。工具和提供者策略
在 v1 中,有两种策略toolStrategy使用人工工具调用生成结构化输出providerStrategy使用提供者原生的结构化输出生成
移除提示输出
通过responseFormat 中的自定义指令进行提示输出已移除,转而采用上述策略。
流式节点名称重命名
从代理流式传输事件时,节点名称从"agent" 更改为 "model",以更好地反映节点的用途。
运行时上下文
调用代理时,通过context 配置参数传递静态的只读配置。这取代了使用 config.configurable 的模式。
旧的
config.configurable 模式仍然向后兼容,但建议新应用程序或迁移到 v1 的应用程序使用新的 context 参数。标准内容
在 v1 中,消息获得了与提供者无关的标准内容块。通过message.contentBlocks 访问它们,以在不同提供者之间获得一致的类型化视图。现有 message.content 字段对于字符串或提供者原生结构保持不变。
发生了什么变化
- 消息上新增
contentBlocks属性,用于标准化内容。 ContentBlock下的新 TypeScript 类型,用于强类型。- 通过
LC_OUTPUT_VERSION=v1或outputVersion: "v1"可选择将标准块序列化为content。
读取标准化内容
创建多模态消息
示例块类型
序列化标准内容
标准内容块默认情况下不会序列化到content 属性中。如果您需要在 content 属性中访问标准内容块(例如,向客户端发送消息时),您可以选择将其序列化到 content 中。
简化包
langchain 包命名空间经过简化,专注于代理构建块。旧功能已移至 @langchain/classic。新包仅暴露最有用和最相关的功能。
导出
v1 包包括| 模块 | 可用内容 | 备注 |
|---|---|---|
| 代理 | createAgent, AgentState | 核心代理创建功能 |
| 消息 | 消息类型、内容块、trimMessages | 从 @langchain/core 重新导出 |
| 工具 | tool、工具类 | 从 @langchain/core 重新导出 |
| 聊天模型 | initChatModel, BaseChatModel | 统一模型初始化 |
@langchain/classic
如果您使用旧的链、索引 API 或以前从 @langchain/community 重新导出的功能,请安装 @langchain/classic 并更新导入
重大变更
放弃对 Node 18 的支持
所有 LangChain 包现在都要求 Node.js 20 或更高版本。Node.js 18 已于 2025 年 3 月达到生命周期结束。新的构建输出
所有 langchain 包的构建现在都使用基于打包器的方法,而不是使用原始 TypeScript 输出。如果您从dist/ 目录导入文件(不推荐),您需要更新您的导入以使用新的模块系统。
旧代码已移至 @langchain/classic
不符合标准接口和代理重点的旧功能已移至@langchain/classic 包。有关核心 langchain 包中可用的内容以及已移至 @langchain/classic 的内容,请参阅简化包部分。
删除已弃用的 API
在 1.0 版本中已经弃用并计划移除的方法、函数和其他对象已被删除。查看已移除的弃用 API
查看已移除的弃用 API
以下弃用 API 已在 v1 中移除
核心功能
TraceGroup- 改用 LangSmith 追踪BaseDocumentLoader.loadAndSplit- 改用.load()后接文本分割器RemoteRunnable- 不再支持
提示
BasePromptTemplate.serialize和.deserialize- 直接使用 JSON 序列化ChatPromptTemplate.fromPromptMessages- 改用ChatPromptTemplate.fromMessages
检索器
BaseRetrieverInterface.getRelevantDocuments- 改用.invoke()
可运行对象
Runnable.bind- 改用.bindTools()或其他特定绑定方法Runnable.map- 改用.batch()RunnableBatchOptions.maxConcurrency- 改用 config 对象中的maxConcurrency
聊天模型
BaseChatModel.predictMessages- 改用.invoke()BaseChatModel.predict- 改用.invoke()BaseChatModel.serialize- 直接使用 JSON 序列化BaseChatModel.callPrompt- 改用.invoke()BaseChatModel.call- 改用.invoke()
LLMs
BaseLLMParams.concurrency- 改用 config 对象中的maxConcurrencyBaseLLM.call- 改用.invoke()BaseLLM.predict- 改用.invoke()BaseLLM.predictMessages- 改用.invoke()BaseLLM.serialize- 直接使用 JSON 序列化
流式处理
createChatMessageChunkEncoderStream- 直接使用.stream()方法
追踪
BaseTracer.runMap- 改用 LangSmith 追踪 APIgetTracingCallbackHandler- 改用 LangSmith 追踪getTracingV2CallbackHandler- 改用 LangSmith 追踪LangChainTracerV1- 改用 LangSmith 追踪
内存和存储
BaseListChatMessageHistory.addAIChatMessage- 改用.addMessage()搭配AIMessageBaseStoreInterface- 改用特定的存储实现
实用程序
getRuntimeEnvironmentSync- 改用异步getRuntimeEnvironment()
以编程方式连接这些文档到 Claude、VSCode 等,通过 MCP 获取实时答案。