十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OpenRouter 的 base_url 多了 /v1?TaoToken 这样改 LangChain 翻译链

OpenRouter 的 base_url 多了 /v1?TaoToken 这样改 LangChain 翻译链 照着 OpenRouter 文档把 ChatOpenAI 的base_url写成https://openrouter.ai/api/v1LangChain 翻译链本来能跑换成 TaoToken 统一接入时最容易把地址顺手写成https://taotoken.net/api/v1然后在第一次chain.invoke(messages)时收到 404。TaoToken 的接口 Base URL 只有https://taotoken.net/api末尾不带/v1Key 和模型 ID 到 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 创建和查看。这篇从排障视角把ChatOpenAI的base_url、api_key、model三处替换讲清楚翻译任务仍然由 LangChain 的SystemMessage、HumanMessage、StrOutputParser完成不重写业务链。1. OpenRouter 的 /api/v1 照抄进 LangChain 后为什么 404 先来OpenRouter 示例里的地址是https://openrouter.ai/api/v1这个地址本身已经把/api/v1作为前缀带上了。你在旧代码里看到ChatOpenAI(base_urlhttps://openrouter.ai/api/v1, ...)迁移时眼睛容易只盯着域名把openrouter.ai换成新的接口地址却把后面的/v1留下。结果就是ChatOpenAI在base_url后面继续拼聊天补全路径整个请求路径多出一段服务端返回 404。这个错误不玄学基本是地址拼接问题。1.1 报错现场ChatOpenAI 第一次 invoke 就打不通如果你把迁移后的地址写成https://taotoken.net/api/v1跑下面这种最小调用最先看到的通常不是翻译结果而是openai.NotFoundError。错误信息可能长这样openai.NotFoundError: Error code: 404 - {error: {message: Not Found}}有时候响应体里只有Not Found有时候会带上网关返回的路径提示。重点不是那行英文而是它发生在网络层请求已经发出去了但打到了不存在的路径。很多读者第一反应是 Key 错了其实 Key 错常见的是 401404 更像门牌号写错。你可以在本地把base_url打印出来或者直接检查配置字符串确认结尾是不是多了/v1。1.2 把两个 base_url 拆开看/api/v1 与 /api 的区别OpenRouter 的base_url是https://openrouter.ai/api/v1TaoToken 的接口 Base URL 是https://taotoken.net/api。这两者不能按“同一种后缀习惯”照搬。前者把版本段写进了 base后者没有。写作时可以把它们当成两家餐厅的门牌一家门牌是“某某路 1 号 3 楼”另一家门牌是“某某路 1 号”你如果按第一家的习惯在第二家门牌后面再加“3 楼”就会跑到不存在的楼层。配置里唯一正确的是base_urlhttps://taotoken.net/api不要再补/v1也不要补 UTM 参数。UTM 是给官网落地页看的不是填进 SDK 的。把https://taotoken.net/api写进ChatOpenAI之后api_key用YOUR_API_KEY占位真实 Key 从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 创建model不要沿用 OpenRouter 示例里的qwen/qwen-2-7b-instruct:free而是换成模型广场里可用的模型 ID。1.3 本文只改三处不重写翻译链原文第 2 节的核心是用ChatOpenAI调免费模型配合SystemMessage指定英翻中HumanMessage传hi!最后用StrOutputParser取回复。迁移到 TaoToken 时翻译逻辑一行都不用动只改三处base_url改成https://taotoken.net/apiapi_key改成从控制台创建的YOUR_API_KEYmodel改成模型广场里当时可用的模型 ID。其余像消息列表、解析器、链路组合都保留。这样排障范围会小很多不会出现“到底是翻译提示词问题还是通道配置问题”的混战。2. 去模型广场创建 Key 并挑一个翻译模型原文里“申请 API Key、复制模型名”的步骤迁移后统一到 TaoToken 官网完成。打开 TaoToken注册登录后进控制台创建 API Key再到模型广场看当前可用的模型 ID。不要从旧教程里直接复制 OpenRouter 的免费模型名那是 OpenRouter 的列表TaoToken 通道里有哪些模型、叫什么名字以模型广场当时列表为准。Key 和模型名都拿到后再回到 Python 文件里替换。2.1 打开官网创建 API Key创建 Key 的入口在控制台里落地页是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 。进去之后按页面提示新建一个 Key复制出来先放到本地环境变量里不要直接提交到 Git。Key 的占位符统一写成YOUR_API_KEY这样文章里的代码可以直接复制你只需要把占位符替换成真实值。注意一个细节Key 是在官网控制台创建的但填进ChatOpenAI的api_key参数时只填 Key 本身不要带Bearer也不要带引号以外的空格。2.2 模型广场里挑一个适合英翻中的模型翻译任务对模型的要求和写代码不同它更看重语言理解和输出稳定性。你可以在模型广场里找支持对话补全、上下文够用、回答风格可控的模型。原文示例里的qwen/qwen-2-7b-instruct:free是 OpenRouter 的免费模型 ID不适合直接拿来当 TaoToken 的配置。正确做法是打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 的模型广场复制当前列表里的模型 ID填到modelYOUR_MODEL_ID的位置。如果今天列表里有多个候选先用一个跑通hi!再去调翻译提示词不要一开始就同时换模型和改提示词。2.3 环境变量与 .env 写法把 Key 放环境变量里比硬编码在脚本里安全也方便你在不同项目里复用同一把 Key。最简单的方式是在终端里导出export TAOTOKEN_API_KEYYOUR_API_KEY如果你习惯用.env可以在项目根目录建一个不提交的文件TAOTOKEN_API_KEYYOUR_API_KEYPython 侧用os.getenv(TAOTOKEN_API_KEY, YOUR_API_KEY)读取。这样即使环境变量没加载代码也会退回到占位符而不是直接报变量不存在。注意不要把https://taotoken.net/api和官网地址混在一起环境变量只存 KeyBase URL 写在代码或配置文件里固定为https://taotoken.net/api。3. 改写 ChatOpenAIbase_url、api_key、model 三处对应替换现在进入代码改动。原代码的形式是ChatOpenAI(base_urlhttps://openrouter.ai/api/v1, api_key你的 api key, modelqwen/qwen-2-7b-instruct:free)。迁移后不要保留/api/v1也不要把 OpenRouter 的模型名带过来。你只改构造参数和模型名消息部分照旧SystemMessage负责告诉模型“英译中”HumanMessage负责把hi!送进去StrOutputParser负责把AIMessage变成字符串。这样链路结构没变排障时更容易定位。3.1 安装依赖如果本地还没装 LangChain 和 OpenAI 兼容适配包先装最小依赖pip install langchain langchain-openai python-dotenvlangchain-openai提供ChatOpenAIlangchain-core里的消息类型和解析器通常会随langchain一起装好。python-dotenv不是必须但如果你用.env管理 Key它会省事。装完后建议在虚拟环境里跑避免和系统 Python 里的旧版本冲突。版本不同response_metadata里的字段名可能略有差异后面验证时会说明兼容写法。3.2 最小可运行脚本SystemMessage 英翻中HumanMessage 传 hi!下面这份脚本可以直接复制改掉YOUR_API_KEY和YOUR_MODEL_ID即可。base_url固定为https://taotoken.net/api末尾没有/v1也没有任何 UTM 参数。模型 ID 请以 TaoToken 模型广场当时列表为准不要自行编造日期后缀或版本号。import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI from langchain_core.messages import SystemMessage, HumanMessage from langchain_core.output_parsers import StrOutputParser load_dotenv() model ChatOpenAI( base_urlhttps://taotoken.net/api, api_keyos.getenv(TAOTOKEN_API_KEY, YOUR_API_KEY), modelYOUR_MODEL_ID, # 以 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 模型广场当时列表为准 temperature0, ) messages [ SystemMessage(content你是英译中助手只输出中文翻译不要解释不要保留英文原文。), HumanMessage(contenthi!), ] parser StrOutputParser() chain model | parser print(chain.invoke(messages))这段代码里TaoToken 只负责给 Key 和 Base URL翻译这件事仍然由 LangChain 的model.invoke(messages)完成。如果你之前把base_url写成了https://taotoken.net/api/v1现在改成https://taotoken.net/api再跑一遍404 大概率就消失了。3.3 先调用 model.invoke 看 AIMessage再走 chain直接跑chain.invoke虽然方便但排障时最好先看原始返回。把最后几行改成response model.invoke(messages) print(type(response)) print(response.content) print(response.response_metadata) chain model | parser print(chain.invoke(messages))第一次model.invoke(messages)返回的是AIMessage你能看到模型实际输出的内容和元数据第二次chain.invoke(messages)返回的是解析后的字符串。如果第一次就报 404问题在地址如果第一次返回英文问题在提示词或模型如果第二次报解析错误问题在StrOutputParser和返回格式的匹配。按这个顺序排查比一上来就盯整条链清楚得多。4. 跑通后检查 AIMessage、token_usage 与请求是否走 TaoToken返回正常不代表配置一定走对了通道。你还需要确认这次调用确实经过 TaoToken而不是本地还留着旧环境变量或者某个缓存配置把请求带到了 OpenRouter。最直接的证据有两个一是AIMessage里的token_usage或usage_metadata有没有正常计数二是控制台调用记录里能不能看到这次请求。原文最后看返回的AIMessage和用量迁移后同样要做只是把“看用量”的入口换成 TaoToken 控制台。4.1 从 AIMessage.response_metadata 里看 usage不同版本的 LangChain 字段名不完全一样可以用兼容方式读取usage response.response_metadata.get(token_usage) or getattr(response, usage_metadata, None) print(usage)常见的情况是response_metadata里有token_usage里面包含 prompt tokens、completion tokens、total tokens新版本也可能把用量放在usage_metadata。如果这两个地方都是空不一定是请求失败可能只是当前模型或适配层没有回传用量。你可以先看response.content是否有中文结果再决定要不要继续查用量。只要内容正常、没有 404/401说明链路基本通了。4.2 去 TaoToken 控制台对一下这次调用打开 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 进控制台找调用记录或用量页面对照刚才运行脚本的时间点。如果能看到一次对话调用并且模型 ID 和你填写的YOUR_MODEL_ID对得上就说明请求确实走在这条统一接入通道上。如果控制台没有记录但本地有返回优先检查是不是.env里还有旧的OPENAI_API_KEY或旧base_url或者你的终端会话里残留了其他环境变量。4.3 日志里不再出现 openrouter.ai还有一个土办法在代码里把model.openai_api_base或你传入的base_url打印出来或者在异常堆栈里看请求域名。正确配置下请求域名应该是https://taotoken.net/api对应的主机而不是openrouter.ai。如果你在日志里仍然看到 OpenRouter 的旧域名说明改动没有生效可能是改错了文件也可能是环境变量优先级覆盖了代码参数。把这两个来源统一成一处再跑一次即可。5. 只属于这条 LangChain 翻译链的排障清单排障最怕把不相干的错误混在一起。这条链上真正高频的错就几个地址多/v1导致 404Key 没替换或没加载导致 401模型名从旧教程抄导致模型不存在以及提示词不够硬导致模型输出英文解释。下面按错误类型拆开不把无关的数据库、MCP、生产库问题写进来。你只需要围绕ChatOpenAI、SystemMessage、HumanMessage、StrOutputParser这几个对象查。5.1 404base_url 结尾多了 /v1 或 /v1/错误形态通常是openai.NotFoundError或Error code: 404 - {error: {message: Not Found}}。第一反应检查base_url字符串正确值必须是base_urlhttps://taotoken.net/api不是https://taotoken.net/api/v1不是https://taotoken.net/v1也不是带?utm_source...的官网地址。官网地址只用于注册、创建 Key、看模型广场、看用量填进 SDK 的 Base URL 是另一个东西。把地址改掉后重启 Python 进程避免旧配置留在内存里。5.2 401YOUR_API_KEY 没替换或环境变量没加载401 通常表现为openai.AuthenticationError或Invalid API key。先确认os.getenv(TAOTOKEN_API_KEY, YOUR_API_KEY)读到的不是占位符。如果你在终端export了变量检查当前终端窗口是不是运行脚本的那个如果你用.env检查文件是否在项目根目录、是否被load_dotenv()加载。Key 从 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_content 创建复制时不要带上多余空格也不要在前面手动加Bearer。5.3 模型不存在不要抄 OpenRouter 的 qwen/qwen-2-7b-instruct:free如果你保留了原文示例里的modelqwen/qwen-2-7b-instruct:free可能会看到模型不存在的 404 或类似提示。这个 ID 属于 OpenRouter 的列表不是 TaoToken 的正式配置。正确做法是打开模型广场复制当前可用的模型 ID替换YOUR_MODEL_ID。模型广场的列表会变动所以文章里不写死某个模型名你以当时页面为准。换模型后先跑hi!再跑长句翻译。5.4 翻译不生效SystemMessage 与 temperature 怎么调请求通了但返回英文解释或中英混杂通常不是通道问题而是提示词约束不够。把SystemMessage写得更硬一点例如“只输出中文翻译不要解释不要保留英文原文不要添加标点以外的内容”。temperature设为0能让输出更稳定。如果换了几个模型仍然不遵守可以在HumanMessage里再重复一次“请翻译成中文”。注意不要为了翻译任务去改base_url地址问题已经在 5.1 解决过了。6. 下一步用模型对话与 Coding Plan 继续验证翻译链跑通之后不要停在本地脚本里。你可以用同一把 Key 去模型对话里发一条hi!确认模型 ID 和 Base URL 没填错如果后面要长期跑批量翻译或写代码再去 Coding Plan 看套餐是否够用。创建 Key 和看文档也都在官网控制台和文档区完成。这样做的目的是把“本地偶然跑通”变成“多入口都能跑通”以后再换工具时只改 Base URL 和 Key 的存放位置。6.1 用模型对话快速确认同一把 Key打开 TaoToken 模型对话用刚才创建的那把 Key 发一条hi!。如果对话页能正常返回说明 Key 和模型 ID 至少在一个入口是可用的。再把同一组参数填回ChatOpenAI就能排除“Key 本身有问题”。这一步很快但能省掉很多在 Python 里反复改代码的时间。模型对话里也方便你试不同模型对英翻中的表现。6.2 长期跑翻译任务看 Coding Plan如果你不只是跑一次hi!而是要把大量英文文本批量翻成中文可以打开 Coding Plan 看当前套餐和用量规则。翻译任务通常调用频率不低提前看清楚额度、并发和计费方式比跑到一半被限流更省事。具体价格和额度以页面当时显示为准不要照着旧文章里的数字做预算。脚本侧仍然保持base_urlhttps://taotoken.net/api不要因为换套餐就去改地址。6.3 创建 Key 与 Claude Code 接入文档如果后续要把这套统一接入用到写代码场景Key 可以在 控制台 API Keys 创建和管理Claude Code 的环境变量写法可以参考 接入文档。不过这条 LangChain 翻译链不需要改造成 Claude Code 工程它只是同一个通道下的另一个客户端。你只要记住官网地址用于注册、创建 Key、看模型广场、看用量填进ChatOpenAI的 Base URL 只写https://taotoken.net/api末尾不要加/v1。把这行地址守住剩下的翻译任务交给chain model | parser和chain.invoke(messages)就行。
返回列表