简化包
在 v1 中,langchain 包的命名空间已大幅缩减,专注于代理的基本构建块。简化后的包让发现和使用核心功能变得更容易。
命名空间
| 模块 | 可用内容 | 备注 |
|---|---|---|
langchain.agents | create_agent, AgentState | 核心代理创建功能 |
langchain.messages | 消息类型,内容块,trim_messages | 从 langchain-core 重新导出 |
langchain.tools | @tool, BaseTool, 注入帮助器 | 从 langchain-core 重新导出 |
langchain.chat_models | init_chat_model, BaseChatModel | 统一的模型初始化 |
langchain.embeddings | init_embeddings, Embeddings | 嵌入模型 |
langchain-classic
如果你之前在 langchain 包中使用了以下任何功能,则需要安装 langchain-classic 并更新你的导入:
- 旧的链(
LLMChain、ConversationChain等) - 检索器(例如
MultiQueryRetriever或之前langchain.retrievers模块中的任何内容) - 索引 API
- hub 模块(用于以编程方式管理提示模板)
- 嵌入模型模块(例如
CacheBackedEmbeddings和社区嵌入) langchain-community重新导出- 其他已弃用的功能
迁移到 create_agent
在 v1.0 之前,我们推荐使用 langgraph.prebuilt.create_react_agent 来构建代理。现在,我们推荐你使用 langchain.agents.create_agent 来构建代理。
下表概述了从 create_react_agent 迁移到 create_agent 时发生改变的功能:
| 章节 | TL;DR - 变化了什么 |
|---|---|
| 导入路径 | 从 langgraph.prebuilt 移动到 langchain.agents |
| 提示词 | 参数重命名为 system_prompt,动态提示词使用中间件 |
| 模型前钩子 | 替换为具有 before_model 方法的中间件 |
| 模型后钩子 | 替换为具有 after_model 方法的中间件 |
| 自定义状态 | 仅支持 TypedDict,可以通过 state_schema 或中间件定义 |
| 模型 | 通过中间件进行动态选择,不支持预绑定模型 |
| 工具 | 工具错误处理移到了中间件,使用 wrap_tool_call |
| 结构化输出 | 移除了提示性输出,使用 ToolStrategy/ProviderStrategy |
| 流式传输节点名 | 节点名从 "agent" 改为 "model" |
| 运行时上下文 | 通过 context 参数进行依赖注入,而不是 config["configurable"] |
| 命名空间 | 精简以专注于代理构建块,旧代码移到 langchain-classic |
导入路径
代理预构建的导入路径从langgraph.prebuilt 更改为 langchain.agents。
函数名从 create_react_agent 更改为 create_agent:
提示词
静态提示词重命名
prompt 参数重命名为 system_prompt:
SystemMessage 转换为字符串
如果在系统提示词中使用了 SystemMessage 对象,提取字符串内容:
动态提示词
动态提示词是一种核心的上下文工程模式——它根据当前对话状态调整告诉模型的内容。使用@dynamic_prompt 装饰器可以实现:
模型前钩子
模型前钩子现在通过中间件实现,使用before_model 方法。
这种新模式更具扩展性——你可以定义多个中间件在调用模型之前运行,
在不同的代理之间重用常见的模式。
常见用例包括:
- 总结对话历史
- 修剪消息
- 输入护栏,如 PII 脱敏
模型后钩子
模型后钩子现在通过中间件实现,使用after_model 方法。
这种新模式更具扩展性——你可以定义多个中间件在调用模型之后运行,
在不同的代理之间重用常见的模式。
常见用例包括:
- 人在回路
- 输出护栏
自定义状态
自定义状态通过附加字段扩展默认的代理状态。你可以通过两种方式定义自定义状态:- 通过
state_schema在create_agent上 - 最适合在工具中使用的状态 - 通过中间件 - 最适合由特定中间件钩子和关联到该中间件的工具管理的状态
通过中间件定义自定义状态优于通过
state_schema 在 create_agent 上定义,因为它允许你将状态扩展在概念上限定到相关的中间件和工具中。state_schema 仍然在 create_agent 上支持以保持向后兼容性。通过 state_schema 定义状态
当你的自定义状态需要被工具访问时,使用 state_schema 参数:
通过中间件定义状态
中间件还可以通过设置state_schema 属性来定义自定义状态。
这有助于将状态扩展在概念上限定到相关的中间件和工具中。
状态类型限制
create_agent 仅支持 TypedDict 作为状态架构。不再支持 Pydantic 模型和数据类。
langchain.agents.AgentState 继承,而不是从 BaseModel 或使用 dataclass 装饰。
如果需要进行验证,请在中间件钩子中处理。
模型
动态模型选择允许你根据运行时上下文(例如任务复杂度、成本限制或用户偏好)选择不同的模型。在 v0.6 版本的langgraph-prebuilt 中发布的 create_react_agent 支持通过传递给 model 参数的可调用对象进行动态模型和工具选择。
此功能已移植到 v1 中的中间件接口。
动态模型选择
预绑定模型
为了更好地支持结构化输出,create_agent 不再接受预绑定了工具或配置的模型:
如果不使用结构化输出,动态模型函数可以返回预绑定模型。
工具
create_agent 的 tools 参数接受以下列表:
该参数将不再接受 ToolNode 实例。
处理工具错误
现在,你可以通过实现wrap_tool_call 方法的中间件来配置工具错误的处理方式。
结构化输出
节点变更
以前,结构化输出是在主代理之外的单独节点中生成的。现在不再这样了。 我们在主循环中生成结构化输出,从而降低成本和延迟。工具和提供者策略
在 v1 中,有两种新的结构化输出策略:ToolStrategy使用人工工具调用来生成结构化输出ProviderStrategy使用提供者原生的结构化输出生成
移除了提示性输出
提示性输出 不再通过response_format 参数支持。与人工工具调用和提供者原生结构化输出等策略相比,提示性输出已被证明不够可靠。
流式传输节点名重命名
从代理流式传输事件时,节点名从"agent" 改为 "model",以更好地反映节点的目的。
运行时上下文
当你调用一个代理时,通常需要传递两种类型的数据:- 在对话过程中变化的动态状态(例如,消息历史)
- 在对话过程中不变的静态上下文(例如,用户元数据)
context 参数给 invoke 和 stream 来支持静态上下文。
旧的
config["configurable"] 模式仍然有效以实现向后兼容,但对于新应用或迁移到 v1 的应用,建议使用新的 context 参数。标准内容
在 v1 中,消息获得了与提供者无关的标准内容块。通过message.content_blocks 访问它们,以便在不同提供者之间获得一致的类型化视图。现有的 message.content 字段用于字符串或提供者原生结构,保持不变。
变更内容
- 消息上新增
content_blocks属性,用于标准化内容 - 标准化的块形状,在 Messages 中记录
- 通过
LC_OUTPUT_VERSION=v1或output_version="v1"可选择将标准块序列化到content中
读取标准化内容
创建多模态消息
块形状示例
序列化标准内容
默认情况下,标准内容块不会序列化到content 属性中。如果你需要在 content 属性中访问标准内容块(例如,向客户端发送消息时),可以选择将它们序列化到 content 中。
简化包
langchain 包的命名空间在 v1 中已大幅缩减,专注于代理的基本构建块。简化后的包让发现和使用核心功能变得更容易。
命名空间
| 模块 | 可用内容 | 备注 |
|---|---|---|
langchain.agents | create_agent, AgentState | 核心代理创建功能 |
langchain.messages | 消息类型,内容块,trim_messages | 从 langchain-core 重新导出 |
langchain.tools | @tool, BaseTool, 注入帮助器 | 从 langchain-core 重新导出 |
langchain.chat_models | init_chat_model, BaseChatModel | 统一的模型初始化 |
langchain.embeddings | init_embeddings, Embeddings | 嵌入模型 |
langchain-classic
如果你之前在 langchain 包中使用了以下任何功能,则需要安装 langchain-classic 并更新你的导入:
- 旧的链(
LLMChain、ConversationChain等) - 检索器(例如
MultiQueryRetriever或之前langchain.retrievers模块中的任何内容) - 索引 API
- hub 模块(用于以编程方式管理提示模板)
- 嵌入模型模块(例如
CacheBackedEmbeddings和社区嵌入) langchain-community重新导出- 其他已弃用的功能
破坏性变更
移除 Python 3.9 支持
所有 LangChain 包现在需要 Python 3.10 或更高版本。Python 3.9 将于 2025 年 10 月生命终结。聊天模型的返回类型更新
聊天模型调用的返回类型签名已从BaseMessage 修正为 AIMessage。实现了 bind_tools 的自定义聊天模型应更新其返回签名:
OpenAI 响应 API 的默认消息格式
当与响应 API 交互时,langchain-openai 现在默认将响应项存储在消息 content 中。要恢复以前的行为,请将 LC_OUTPUT_VERSION 环境变量设置为 v0,或者在实例化 ChatOpenAI 时指定 output_version="v0"。
langchain-anthropic 中的默认 max_tokens
langchain-anthropic 中的 max_tokens 参数现在根据所选模型默认为更高的值,而不是之前的 1024。如果你依赖旧的默认值,请明确设置 max_tokens=1024。
旧代码移至 langchain-classic
不在标准接口和代理重点范围内的现有功能已移至 langchain-classic 包。关于核心 langchain 包中可用内容以及移至 langchain-classic 的内容,请参阅简化命名空间部分。
移除已弃用的 API
已弃用并计划在 1.0 中移除的方法、函数和其他对象已被删除。请查看先前版本的弃用通知,了解替代 API。Text 属性
对消息对象使用.text() 方法应去掉括号,因为它现在是一个属性:
.text())将继续有效,但现在会发出警告。方法形式将在 v2 中移除。
从 AIMessage 中移除 example 参数
AIMessage 对象中的 example 参数已被移除。我们建议迁移到使用 additional_kwargs 来传递所需的额外元数据。
微小变更
AIMessageChunk对象现在包含一个chunk_position属性,位置为'last',表示流中的最后一个块。这使得对流式消息的处理更加清晰。如果块不是最后一个,则chunk_position将为None。LanguageModelOutputVar现在类型化为AIMessage而不是BaseMessage。- 消息块合并逻辑(
AIMessageChunk.add)已更新,对合并块的最终 ID 具有更复杂的选择处理。它优先使用提供者分配的 ID 而不是 LangChain 生成的 ID。 - 我们现在默认使用
utf-8编码打开文件。 - 标准测试现在使用多模态内容块。
存档文档
旧版文档已存档以供参考:Connect these docs to Claude, VSCode, and more via MCP for real-time answers.

