旧教程在 LangChain v1 跑不通?新旧写法对照与报错速查
网上的 LangChain 教程大多写于 0.1 到 0.3 时期。照着它们在 v1 上敲代码,往往第一行就报错。本页是“拿着旧教程来排错”的入口:先判断你遇到的是哪一类问题,再按旧写法逐条查到新写法,每一条结果都在 0.3.27 和 1.4.7 两套环境里真实运行过,不是凭文档推断。
读完你可以得到三样东西:旧教程里常见的 12 组 import 现在该写成什么、需要先安装哪个包;model(...)、predict、chain.run 这类调用方式在新版里的下场;以及按报错原文查原因的速查表。需要完整的迁移步骤和回滚方案,请接着读迁移 Runbook。
适用版本与验证信息
| 环境 | 已安装的关键包 | 本页的用途 |
|---|---|---|
| 0.3.27(旧环境) | langchain==0.3.27、langchain-core==0.3.86、langchain-community==0.3.31、langchain-text-splitters==0.3.11 | 还原旧教程当年的运行结果 |
| 1.4.7(仅 langchain) | langchain==1.4.7、langchain-core==1.7.0、langchain-openai==1.7.2、langgraph==1.2.17 | 只升级主包、没装任何兼容包时会看到什么 |
| 1.4.7 + 兼容层 | 在上一行基础上增加 langchain-classic==1.0.8、langchain-community==0.4.2、langchain-text-splitters==1.1.3 | 按迁移指南装好兼容包后的状态 |
- 验证日期:2026-10-26;Python 3.12.12;
- 官方来源:LangChain v1 migration guide (opens in a new tab);
- 实验代码:站点仓库
labs/old-tutorial-patterns/,环境依赖锁定在labs/requirements/;脚本不联网、不需要任何 API Key。
先判断:你遇到的是哪一类问题
旧教程在新版上出问题,原因只有四类,处理方式完全不同。先对号入座,再去对应小节:
| 你看到的现象 | 属于哪一类 | 去哪一节 |
|---|---|---|
程序启动或导入阶段就抛出 ModuleNotFoundError、ImportError: cannot import name | 符号换了位置或换了包 | 一、import 对照 |
TypeError: ... object is not callable,或 AttributeError: ... has no attribute 'predict' | 旧的调用方式已被移除 | 二、调用方式 |
OpenAIError: Missing credentials | 和版本无关,是密钥没有配置 | 三、参数名与密钥 |
| 没有报错,但回答不对、一直卡住、记不住上下文 | 行为变了,旧写法悄悄失效 | 五、不报错但行为变了 |
如果你手上是线上报错日志而不是一段教程代码,直接去生产故障诊断中心,那里按报错原文收录了 13 种真实故障。
一、import:旧写法对应的新位置
旧教程几乎都从 langchain 主包里导入一切。v1 把主包精简到只保留智能体相关的接口,其余的分别搬到了 langchain-core、langchain-classic、langchain-community、langchain-text-splitters 和各家模型的独立包里。
下表每一行都来自 old_imports.py 的实际运行:旧写法在 1.4.7 里的报错取自“仅 langchain”环境,新写法在装好兼容包的环境里逐条导入验证通过。
| 旧教程里的写法 | 在 1.4.7 里的报错 | 新写法 | 需要先安装 |
|---|---|---|---|
from langchain.chains import LLMChain(RetrievalQA、ConversationChain 同理) | ModuleNotFoundError: No module named 'langchain.chains' | from langchain_classic.chains import LLMChain | langchain-classic |
from langchain.agents import initialize_agent, AgentType;AgentExecutor | ImportError: cannot import name 'initialize_agent' from 'langchain.agents' | from langchain_classic.agents import initialize_agent, AgentType | langchain-classic |
from langchain.memory import ConversationBufferMemory | ModuleNotFoundError: No module named 'langchain.memory' | from langchain_classic.memory import ConversationBufferMemory | langchain-classic |
from langchain.prompts import PromptTemplate | ModuleNotFoundError: No module named 'langchain.prompts' | from langchain_core.prompts import PromptTemplate | 无,随 langchain 安装 |
from langchain.schema import HumanMessage;StrOutputParser | ModuleNotFoundError: No module named 'langchain.schema' | from langchain_core.messages import HumanMessage;from langchain_core.output_parsers import StrOutputParser | 无 |
from langchain.chat_models import ChatOpenAI | ImportError: cannot import name 'ChatOpenAI' from 'langchain.chat_models' | from langchain_openai import ChatOpenAI | langchain-openai |
from langchain.llms import OpenAI | ModuleNotFoundError: No module named 'langchain.llms' | from langchain_openai import OpenAI | langchain-openai |
from langchain.embeddings import OpenAIEmbeddings | ImportError: cannot import name 'OpenAIEmbeddings' from 'langchain.embeddings' | from langchain_openai import OpenAIEmbeddings | langchain-openai |
from langchain.vectorstores import FAISS | ModuleNotFoundError: No module named 'langchain.vectorstores' | from langchain_community.vectorstores import FAISS | langchain-community |
from langchain.document_loaders import TextLoader | ModuleNotFoundError: No module named 'langchain.document_loaders' | from langchain_community.document_loaders import TextLoader | langchain-community |
from langchain.text_splitter import RecursiveCharacterTextSplitter | ModuleNotFoundError: No module named 'langchain.text_splitter' | from langchain_text_splitters import RecursiveCharacterTextSplitter | langchain-text-splitters |
from langchain.callbacks import StdOutCallbackHandler | ModuleNotFoundError: No module named 'langchain.callbacks' | from langchain_core.callbacks import StdOutCallbackHandler | 无 |
实测中有几处值得注意:
- 旧写法在 1.4.7 里一条都导入不了。 脚本里的 16 条旧 import,在 0.3.27 里全部成功,在 1.4.7(无论是否装了兼容包)里全部失败;
- 旧版的警告并不总是在提醒你。 0.3.27 里只有 5 条旧写法会打印弃用警告,另外 11 条悄无声息地通过。如果你的旧项目日志里没有警告,不代表升级后没有问题;
- 旧警告给出的新位置,在 v1 里不一定适用。 0.3.27 对
ChatOpenAI、OpenAI、OpenAIEmbeddings的警告建议改从langchain_community导入;在 v1 环境里,应当改用langchain_openai,本页已逐条验证可以导入; - “新写法能用”取决于装了什么。 在只升级了主包的环境里,16 条新写法只有 7 条能直接导入,其余 9 条需要先安装对应的包,报错是
No module named 'langchain_classic'这一类。
要看更完整的符号可用性,包括旧位置在三种环境里的结果,请查导入兼容矩阵。
二、调用方式:旧写法还能不能用
修好 import 之后,下一个坑是调用方式。old_calls.py 用一个只会回答 pong 的最小聊天模型(类名 Pong,继承 BaseChatModel)逐个尝试旧写法,所以下表报错里的类名是 Pong;在你自己的代码里,它会是 ChatOpenAI 之类的实际类名。
| 旧教程里的写法 | 0.3.27 | 1.4.7 | 新写法 |
|---|---|---|---|
model([HumanMessage(content="hi")]) | 能运行,打印弃用警告,提示将在 1.0 移除 | TypeError: 'Pong' object is not callable | model.invoke("hi") |
model.predict("hi") | 能运行,同样的弃用警告 | AttributeError: 'Pong' object has no attribute 'predict' | model.invoke("hi") |
model.predict_messages([...]) | 能运行,同样的弃用警告 | AttributeError: 'Pong' object has no attribute 'predict_messages' | model.invoke([...]) |
LLMChain(...).run("ping") | 能运行,LLMChain 与 Chain.run 各有一条弃用警告 | 主包没有 LLMChain;装了 langchain-classic 后仍能运行,警告改为“将在 2.0.0 移除” | chain.invoke({"word": "ping"}) |
chain({"word": "ping"}) | 能运行,Chain.__call__ 弃用警告 | 兼容包里仍能运行,同样是 2.0.0 移除警告 | chain.invoke({"word": "ping"}) |
chain.predict(word="ping") | 能运行,没有警告 | 兼容包里能运行 | chain.invoke({"word": "ping"}) |
读这张表时抓住两点:
- 模型对象本身的旧调用方式已经被删除。
model(...)、predict、predict_messages在 0.3.x 里就已经标为弃用,v1 里直接没有了,所以报的是TypeError和AttributeError,而不是 import 错误。统一改成invoke; - 链对象的旧方法还活在兼容包里,但那是缓冲期。
langchain-classic里的LLMChain和run、__call__、predict全都还能用,只是警告已经写明将在 2.0.0 移除。这给了你“先换 import、保持行为不变,再逐步迁移”的余地,具体做法见旧链迁移到 LCEL和对话记忆迁移。
三、参数名与密钥
旧教程里创建模型的写法通常是 ChatOpenAI(model_name="gpt-4o-mini", openai_api_key="sk-...", temperature=0, max_tokens=64)。old_calls.py 的后半段在 1.4.7 环境里验证了它:
- 旧参数名仍然被接受。
model_name、openai_api_key都能正常创建对象,读回来model_name是gpt-4o-mini、temperature是0.0、max_tokens是64。所以这类代码不会因为参数名而报错; - 新代码建议直接使用
model=、api_key=。 脚本里ChatOpenAI(model="gpt-4o-mini", api_key="sk-demo")同样验证通过,写成这种形式可以避免依赖别名; - 没有配置密钥,构造对象时就会报错。 报错原文是
OpenAIError: Missing credentials. Please pass an api_key, workload_identity, admin_api_key, or set the OPENAI_API_KEY or OPENAI_ADMIN_KEY environment variable.,不需要等到发出请求。这与 LangChain 版本无关,设置环境变量OPENAI_API_KEY或显式传入api_key即可。
脚本里的密钥是占位的 sk-demo,从不联网;请不要把真实密钥写进代码或提交到仓库。
四、报错速查:按原文找原因
下表只收录本页实测过的报错,按你在终端里看到的第一行文字查找。
| 报错原文(节选) | 原因 | 处理 |
|---|---|---|
No module named 'langchain.chains'、'langchain.memory' | 链和记忆已不在主包里 | 装 langchain-classic,改从 langchain_classic 导入,见第一节 |
No module named 'langchain.prompts'、'langchain.schema'、'langchain.callbacks' | 这些符号已经拆到 langchain-core | 改从 langchain_core.prompts、langchain_core.messages、langchain_core.callbacks 导入 |
No module named 'langchain.llms'、'langchain.vectorstores'、'langchain.document_loaders'、'langchain.text_splitter' | 模型、向量库、加载器、切分器都已拆分到独立的包 | 按第一节的表安装并改写 |
cannot import name 'AgentExecutor' from 'langchain.agents'、'initialize_agent' | 旧的智能体入口已从主包移除 | 先用 langchain_classic.agents 保持行为,再迁到 create_agent |
cannot import name 'ChatOpenAI' from 'langchain.chat_models'、'OpenAIEmbeddings' from 'langchain.embeddings' | OpenAI 相关类已移到 langchain-openai | from langchain_openai import ChatOpenAI, OpenAIEmbeddings |
No module named 'langchain_classic'、'langchain_community'、'langchain_openai'、'langchain_text_splitters' | 新位置对应的包还没安装 | 用 pip install 安装缺的那个包,见第六节 |
TypeError: '...' object is not callable(对模型对象) | 旧的 model(...) 调用方式已被移除 | 改用 model.invoke(...) |
AttributeError: '...' object has no attribute 'predict' 或 'predict_messages' | 旧的便捷方法已被移除 | 改用 model.invoke(...) |
OpenAIError: Missing credentials | 没有密钥,与版本无关 | 设置 OPENAI_API_KEY 或传入 api_key |
五、不报错但行为变了
最难排查的是不报错的情况。下面几种是旧教程迁移到 v1 时最容易遇到的,每一种在对应的详细页里都有实测输出:
| 你看到的现象 | 常见原因 | 详细指南 |
|---|---|---|
TypeError: create_agent() got an unexpected keyword argument 'prompt' | 从 create_react_agent 迁移时,prompt= 改名为 system_prompt= | 迁移 Runbook |
| 没有报错,但回答像是没看到你的问题 | invoke 的输入不是 {"messages": [...]};旧写法 {"input": ...} 不会报错,内容却没有送达模型 | 入门:invoke 的输入 |
GraphRecursionError: Recursion limit of … reached without hitting a stop condition | 循环步数超过 recursion_limit;旧版超限时返回文本,v1 抛出异常 | 迁移 Runbook |
ValueError: Checkpointer requires one or more of the following 'configurable' keys: thread_id, … | 配了 checkpointer,调用时没有传 thread_id | checkpoint 与故障恢复 |
ToolMessage(status=error),内容里有 Field required | 模型生成的参数不满足工具的参数模式,校验错误被反馈给了模型 | 工具调用 schema 排障 |
| 调用一直卡着,没有任何报错 | ChatOpenAI() 默认没有超时;设置了 timeout 也不是整次调用的总时长上限 | 模型调用的延迟预算 |
六、一次迁移的推荐顺序
照着下面的顺序做,每一步都可以单独验证,也可以单独退回:
-
先留回滚点。 升级前把当前环境的依赖清单(例如
pip freeze的结果)和代码一起提交,出问题时可以整体回到升级前; -
安装新位置需要的包。 一次装齐,避免逐个撞上
No module named:pip install -U langchain langchain-openai langchain-classic langchain-community langchain-text-splitters; -
按第一节的表替换 import。 先只改位置,不改逻辑;链、智能体、记忆都先指向
langchain_classic; -
把模型对象的旧调用改成
invoke。model(...)、predict在 v1 里没有兼容层,必须直接改写; -
运行你的测试,再用本页脚本检查环境。 在你自己的虚拟环境里运行
old_imports.py,看每一行的old和new状态; -
之后再逐步迁移。 把
LLMChain改成 LCEL、把AgentExecutor改成create_agent、把记忆交给 checkpointer,每次只动一类,参见迁移 Runbook。
失败、回滚与排障
| 现象 | 常见原因 | 处理 |
|---|---|---|
你的环境里新写法报 No module named ...,本页显示通过 | 本页的“新写法”结果来自装好兼容包的环境,你的环境少装了包 | 用 pip list 对照第一节“需要先安装”那一列,补装缺的包 |
| 你的环境里旧写法居然能导入,本页显示失败 | 环境里仍是 0.x 版本,或同时装了多个版本 | 用 pip show langchain 核对版本,确认虚拟环境没有串用 |
| 导入成功但打印了弃用警告,与本页不一致 | 你的 langchain 小版本与本页的 0.3.27 不同,警告内容可能不同 | 以你环境里的警告文字为准,再对照第一节的新位置 |
| 升级后线上出问题,需要退回 | 升级与业务改动混在了同一次发布里 | 按第六节第一步留下的依赖清单整体还原,业务改动单独再发 |
升级任何一个相关包之后,都建议重新运行一次 old_imports.py 和 old_calls.py:它们只依赖已安装的包,不联网,也不会修改环境。
复现脚本
下面是本页全部结果的来源。old_imports.py 依次执行每条旧写法和对应的新写法并打印状态:
"""Try the import lines old tutorials use, and the new lines that replace them, in the installed environment."""
import re
import warnings
# (old import, new import) pairs. Every statement is executed for real in each environment.
PAIRS = [
("from langchain.chains import LLMChain", "from langchain_classic.chains import LLMChain"),
("from langchain.chains import RetrievalQA", "from langchain_classic.chains import RetrievalQA"),
("from langchain.chains import ConversationChain", "from langchain_classic.chains import ConversationChain"),
("from langchain.agents import initialize_agent, AgentType", "from langchain_classic.agents import initialize_agent, AgentType"),
("from langchain.agents import AgentExecutor", "from langchain_classic.agents import AgentExecutor"),
("from langchain.memory import ConversationBufferMemory", "from langchain_classic.memory import ConversationBufferMemory"),
("from langchain.prompts import PromptTemplate", "from langchain_core.prompts import PromptTemplate"),
("from langchain.schema import HumanMessage", "from langchain_core.messages import HumanMessage"),
("from langchain.schema import StrOutputParser", "from langchain_core.output_parsers import StrOutputParser"),
("from langchain.chat_models import ChatOpenAI", "from langchain_openai import ChatOpenAI"),
("from langchain.llms import OpenAI", "from langchain_openai import OpenAI"),
("from langchain.embeddings import OpenAIEmbeddings", "from langchain_openai import OpenAIEmbeddings"),
("from langchain.vectorstores import FAISS", "from langchain_community.vectorstores import FAISS"),
("from langchain.document_loaders import TextLoader", "from langchain_community.document_loaders import TextLoader"),
("from langchain.text_splitter import RecursiveCharacterTextSplitter", "from langchain_text_splitters import RecursiveCharacterTextSplitter"),
("from langchain.callbacks import StdOutCallbackHandler", "from langchain_core.callbacks import StdOutCallbackHandler"),
]
def clean(text: str, lines: int = 1) -> str:
kept = [re.sub(r" \(/[^)]*\)", " (<path>)", s.strip()) for s in text.strip().splitlines() if s.strip()]
return " / ".join(kept[:lines])[:240]
def attempt(statement: str):
"""Return (status, deprecation hints) for one import statement."""
with warnings.catch_warnings(record=True) as caught:
warnings.simplefilter("always")
try:
exec(statement, {})
status = "OK"
except BaseException as exc: # noqa: BLE001 - the point is to show any failure
status = f"{type(exc).__name__}: {clean(str(exc))}"
hints = []
for w in caught:
# Old releases name the replacement import inside the deprecation message; keep only that.
suggestion = re.search(r"from langchain_community[\w.]* import \w+", str(w.message))
text = f"{w.category.__name__}, suggests: {suggestion.group(0)}" if suggestion else w.category.__name__
if text not in hints:
hints.append(text)
return status, hints
for old, new in PAIRS:
print(old)
status, hints = attempt(old)
print(f" old: {status}")
for hint in hints:
print(f" old warning: {hint}")
status, _ = attempt(new)
print(f" new: {status} <- {new.split(' import ')[0].replace('from ', '')}")在 0.3.27 里运行的输出:旧写法全部成功,其中 5 条会提示弃用,新写法因为没有安装对应的包而大多失败:
from langchain.chains import LLMChain
old: OK
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.chains
from langchain.chains import RetrievalQA
old: OK
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.chains
from langchain.chains import ConversationChain
old: OK
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.chains
from langchain.agents import initialize_agent, AgentType
old: OK
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.agents
from langchain.agents import AgentExecutor
old: OK
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.agents
from langchain.memory import ConversationBufferMemory
old: OK
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.memory
from langchain.prompts import PromptTemplate
old: OK
new: OK <- langchain_core.prompts
from langchain.schema import HumanMessage
old: OK
new: OK <- langchain_core.messages
from langchain.schema import StrOutputParser
old: OK
new: OK <- langchain_core.output_parsers
from langchain.chat_models import ChatOpenAI
old: OK
old warning: LangChainDeprecationWarning, suggests: from langchain_community.chat_models import ChatOpenAI
new: ModuleNotFoundError: No module named 'langchain_openai' <- langchain_openai
from langchain.llms import OpenAI
old: OK
old warning: LangChainDeprecationWarning, suggests: from langchain_community.llms import OpenAI
new: ModuleNotFoundError: No module named 'langchain_openai' <- langchain_openai
from langchain.embeddings import OpenAIEmbeddings
old: OK
old warning: LangChainDeprecationWarning, suggests: from langchain_community.embeddings import OpenAIEmbeddings
new: ModuleNotFoundError: No module named 'langchain_openai' <- langchain_openai
from langchain.vectorstores import FAISS
old: OK
old warning: LangChainDeprecationWarning, suggests: from langchain_community.vectorstores import FAISS
new: OK <- langchain_community.vectorstores
from langchain.document_loaders import TextLoader
old: OK
old warning: LangChainDeprecationWarning, suggests: from langchain_community.document_loaders import TextLoader
new: OK <- langchain_community.document_loaders
from langchain.text_splitter import RecursiveCharacterTextSplitter
old: OK
new: OK <- langchain_text_splitters
from langchain.callbacks import StdOutCallbackHandler
old: OK
new: OK <- langchain_core.callbacks在只升级了主包的 1.4.7 里运行的输出:旧写法全部失败,新写法有 7 条可以直接导入:
from langchain.chains import LLMChain
old: ModuleNotFoundError: No module named 'langchain.chains'
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.chains
from langchain.chains import RetrievalQA
old: ModuleNotFoundError: No module named 'langchain.chains'
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.chains
from langchain.chains import ConversationChain
old: ModuleNotFoundError: No module named 'langchain.chains'
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.chains
from langchain.agents import initialize_agent, AgentType
old: ImportError: cannot import name 'initialize_agent' from 'langchain.agents' (<path>)
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.agents
from langchain.agents import AgentExecutor
old: ImportError: cannot import name 'AgentExecutor' from 'langchain.agents' (<path>)
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.agents
from langchain.memory import ConversationBufferMemory
old: ModuleNotFoundError: No module named 'langchain.memory'
new: ModuleNotFoundError: No module named 'langchain_classic' <- langchain_classic.memory
from langchain.prompts import PromptTemplate
old: ModuleNotFoundError: No module named 'langchain.prompts'
new: OK <- langchain_core.prompts
from langchain.schema import HumanMessage
old: ModuleNotFoundError: No module named 'langchain.schema'
new: OK <- langchain_core.messages
from langchain.schema import StrOutputParser
old: ModuleNotFoundError: No module named 'langchain.schema'
new: OK <- langchain_core.output_parsers
from langchain.chat_models import ChatOpenAI
old: ImportError: cannot import name 'ChatOpenAI' from 'langchain.chat_models' (<path>)
new: OK <- langchain_openai
from langchain.llms import OpenAI
old: ModuleNotFoundError: No module named 'langchain.llms'
new: OK <- langchain_openai
from langchain.embeddings import OpenAIEmbeddings
old: ImportError: cannot import name 'OpenAIEmbeddings' from 'langchain.embeddings' (<path>)
new: OK <- langchain_openai
from langchain.vectorstores import FAISS
old: ModuleNotFoundError: No module named 'langchain.vectorstores'
new: ModuleNotFoundError: No module named 'langchain_community' <- langchain_community.vectorstores
from langchain.document_loaders import TextLoader
old: ModuleNotFoundError: No module named 'langchain.document_loaders'
new: ModuleNotFoundError: No module named 'langchain_community' <- langchain_community.document_loaders
from langchain.text_splitter import RecursiveCharacterTextSplitter
old: ModuleNotFoundError: No module named 'langchain.text_splitter'
new: ModuleNotFoundError: No module named 'langchain_text_splitters' <- langchain_text_splitters
from langchain.callbacks import StdOutCallbackHandler
old: ModuleNotFoundError: No module named 'langchain.callbacks'
new: OK <- langchain_core.callbacksold_calls.py 逐个尝试旧的调用方式和参数名:
"""Run the call styles old tutorials use against a minimal chat model and report what each one does."""
import re
import warnings
from langchain_core.language_models.chat_models import BaseChatModel
from langchain_core.messages import AIMessage, HumanMessage
from langchain_core.outputs import ChatGeneration, ChatResult
from langchain_core.prompts import PromptTemplate
class Pong(BaseChatModel):
"""A chat model that always answers 'pong'; no network, no API key."""
@property
def _llm_type(self) -> str:
return "pong"
def _generate(self, messages, stop=None, run_manager=None, **kwargs):
return ChatResult(generations=[ChatGeneration(message=AIMessage(content="pong"))])
def clean(text: str, lines: int = 1) -> str:
kept = [re.sub(r" \(/[^)]*\)", " (<path>)", s.strip()) for s in text.strip().splitlines() if s.strip()]
return " / ".join(kept[:lines])[:240]
def case(label: str, fn) -> None:
print(label)
with warnings.catch_warnings(record=True) as caught:
warnings.simplefilter("always")
try:
out = fn()
print(f" result: {out.content if isinstance(out, AIMessage) else out!r}")
except BaseException as exc: # noqa: BLE001 - the point is to show any failure
print(f" {type(exc).__name__}: {clean(str(exc))}")
seen = []
for w in caught:
text = f"{w.category.__name__}: {clean(str(w.message))}"
if text not in seen:
seen.append(text)
print(f" warning {text}")
model = Pong()
case('model([HumanMessage("hi")])', lambda: model([HumanMessage(content="hi")]))
case('model.predict("hi")', lambda: model.predict("hi"))
case('model.predict_messages([HumanMessage("hi")])', lambda: model.predict_messages([HumanMessage(content="hi")]))
case('model.invoke("hi")', lambda: model.invoke("hi"))
try:
from langchain.chains import LLMChain
source = "langchain.chains"
except ImportError:
try:
from langchain_classic.chains import LLMChain
source = "langchain_classic.chains"
except ImportError:
LLMChain = None
source = "not installed"
print(f"LLMChain comes from: {source}")
if LLMChain is not None:
prompt = PromptTemplate.from_template("Say {word}")
chain = lambda: LLMChain(llm=model, prompt=prompt) # noqa: E731 - a fresh chain per case
case('chain.run("ping")', lambda: chain().run("ping"))
case('chain({"word": "ping"})', lambda: chain()({"word": "ping"}))
case('chain.predict(word="ping")', lambda: chain().predict(word="ping"))
case('chain.invoke({"word": "ping"})', lambda: chain().invoke({"word": "ping"}))
try:
from langchain_openai import ChatOpenAI
except ImportError as exc:
print(f"langchain_openai: {type(exc).__name__}")
else:
def old_style():
llm = ChatOpenAI(model_name="gpt-4o-mini", openai_api_key="sk-demo", temperature=0, max_tokens=64)
return (llm.model_name, llm.temperature, llm.max_tokens)
case('ChatOpenAI(model_name=..., openai_api_key=..., temperature=0, max_tokens=64)', old_style)
case('ChatOpenAI(model="gpt-4o-mini", api_key="sk-demo")', lambda: ChatOpenAI(model="gpt-4o-mini", api_key="sk-demo").model_name)
case('ChatOpenAI(model="gpt-4o-mini") without any key', lambda: ChatOpenAI(model="gpt-4o-mini"))在 0.3.27 里运行的输出:旧的调用方式都能用,同时打印弃用警告:
model([HumanMessage("hi")])
result: 'pong'
warning LangChainDeprecationWarning: The method `BaseChatModel.__call__` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
model.predict("hi")
result: 'pong'
warning LangChainDeprecationWarning: The method `BaseChatModel.predict` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
model.predict_messages([HumanMessage("hi")])
result: 'pong'
warning LangChainDeprecationWarning: The method `BaseChatModel.predict_messages` was deprecated in langchain-core 0.1.7 and will be removed in 1.0. Use :meth:`~invoke` instead.
model.invoke("hi")
result: 'pong'
LLMChain comes from: langchain.chains
chain.run("ping")
result: 'pong'
warning LangChainDeprecationWarning: The class `LLMChain` was deprecated in LangChain 0.1.17 and will be removed in 1.0. Use :meth:`~RunnableSequence, e.g., `prompt | llm`` instead.
warning LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~invoke` instead.
chain({"word": "ping"})
result: {'word': 'ping', 'text': 'pong'}
warning LangChainDeprecationWarning: The method `Chain.__call__` was deprecated in langchain 0.1.0 and will be removed in 1.0. Use :meth:`~invoke` instead.
chain.predict(word="ping")
result: 'pong'
chain.invoke({"word": "ping"})
result: {'word': 'ping', 'text': 'pong'}
langchain_openai: ModuleNotFoundError在 1.4.7 加兼容层里运行的输出:模型对象的旧调用已被移除,链的旧方法仍可用,旧参数名仍被接受:
model([HumanMessage("hi")])
TypeError: 'Pong' object is not callable
model.predict("hi")
AttributeError: 'Pong' object has no attribute 'predict'
model.predict_messages([HumanMessage("hi")])
AttributeError: 'Pong' object has no attribute 'predict_messages'
model.invoke("hi")
result: 'pong'
LLMChain comes from: langchain_classic.chains
chain.run("ping")
result: 'pong'
warning LangChainDeprecationWarning: The class `LLMChain` was deprecated in LangChain 0.1.17 and will be removed in 2.0.0. Use `RunnableSequence, e.g., `prompt | llm`` instead.
warning LangChainDeprecationWarning: The method `Chain.run` was deprecated in langchain-classic 0.1.0 and will be removed in 2.0.0. Use `invoke` instead.
chain({"word": "ping"})
result: {'word': 'ping', 'text': 'pong'}
warning LangChainDeprecationWarning: The method `Chain.__call__` was deprecated in langchain-classic 0.1.0 and will be removed in 2.0.0. Use `invoke` instead.
chain.predict(word="ping")
result: 'pong'
chain.invoke({"word": "ping"})
result: {'word': 'ping', 'text': 'pong'}
ChatOpenAI(model_name=..., openai_api_key=..., temperature=0, max_tokens=64)
result: ('gpt-4o-mini', 0.0, 64)
ChatOpenAI(model="gpt-4o-mini", api_key="sk-demo")
result: 'gpt-4o-mini'
ChatOpenAI(model="gpt-4o-mini") without any key
OpenAIError: Missing credentials. Please pass an `api_key`, `workload_identity`, `admin_api_key`, or set the `OPENAI_API_KEY` or `OPENAI_ADMIN_KEY` environment variable.相关阅读
- 要按步骤迁移并保留回滚点,读LangChain v1 迁移 Runbook;
- 要查更多符号的可用性,读导入兼容矩阵;
- 要从零开始写第一个智能体,读LangChain v1 入门。
来源
- LangChain v1 migration guide (opens in a new tab):包精简、
langchain-classic与迁移步骤; - langchain(PyPI) (opens in a new tab)、langchain-classic(PyPI) (opens in a new tab)、langchain-openai(PyPI) (opens in a new tab):包与版本信息。
以上来源均于 2026-10-26 核对。表中的结果来自站点仓库 labs/old-tutorial-patterns/ 的实际运行,第五节的现象来自站内各详细页的实测。