用 AI 写代码时,有一类错误很难一眼看出来:代码语法没问题,但用的 API 在新版本里已经被弃用或删除了。这篇文章记录我用元宝搜索搭的一个小流程:先发现可能过时的调用,再用元宝去官方文档查证,最后把查到的原文交回给 AI,让它自己修好。除了自己写脚本调用 API,第六节还演示了不写代码的用法:在 Claude 里接官方元宝搜索 MCP、在 WorkBuddy 里装官方元宝搜索 Skill,完全可以根据教程一步步完成接入。
图1按变更发生的年份分组,统计本批题目里模型写错的情况;OpenAI 条目按弃用公告的年份计。每组只有 6–9 题,样本很小;而且 pandas 3.0 删除的 API 多数早在 2.1/2.2 就已标记弃用。这张图只描述本次样本,不能外推为所有模型和 API 的一般规律。
一、需求从哪里来:AI 记得的是旧版本
用大模型写 Python 脚本,最隐蔽的一类错误不是语法错误,而是写法本身在某个版本之后已经被删除或弃用。比如:
- pandas 3.0 更新说明列出了
DataFrame.applymap、fillna(method=...)和旧频率别名的移除; - Python 3.13 更新说明列出了
telnetlib、cgi、imghdr等模块的移除; - Python 3.14 的策略文档写明,
set_event_loop_policy()已弃用,并将在 3.16 删除。
这类代码在旧环境里能跑,升级之后才开始告警或报错。我原来的做法是:出问题以后自己定位是哪个库、哪个版本改的,再去翻 What’s New。一段 AI 生成的代码里可能有十几个调用,逐个查一遍很费时间,所以平时通常不查。
这次的服务对象是用 AI 辅助写 Python 的开发者,我自己就是其中之一。被测模型是我手边一个内网部署的 Qwen3.8-27B-FP8(vLLM 部署,推理强度 medium)。
二、为什么需要搜索:越新的变更,越只能靠外部资料
模型的知识停在训练结束的那一天。训练之后才发生的变更,它不可能知道;就算问它“这个 API 过时了吗”,它也只能用同一份旧记忆来回答。能当判断依据的,只有各库当前的官方文档和更新日志。
所以在这个流程里,元宝搜索是运行时调用:拿到一段代码后,针对其中的 API 实时去官方文档里查。调用参数如下:
Site:把结果限定在该库的官方域名,如docs.python.org、pandas.pydata.org、numpy.org。社区帖子和博客不作为证据。Cnt=10:每次取 10 条结果。Mode=0:只要自然网页结果。本任务需要的是 API 文档,不需要天气、行情这类垂直结果。- 不设置
Freshness:原因见第七节,实测加了时间限制反而查不到官方文档。
整个流程分三步,各步的分工如下:
| 步骤 | 负责方 | 做什么 |
|---|---|---|
| 发现 | Pythonast静态分析 | 找出代码用到的模块、属性、方法和关键字参数,并记录变量由哪个库创建 |
| 查证 | 元宝搜索 SearchPro | 按Site限定在官方域名内检索,结果原样缓存,附 RequestId |
| 修好 | 大模型(本文为本地 Qwen) | 读元宝返回的官方原文,改成当前推荐的写法 |
| 确认 | 人工,或在目标环境中运行 | 核对替代写法是否正确,必要时实际运行一遍 |
图2用set_event_loop_policy这一个调用把流程串起来:从代码里抽出符号,用元宝搜到官方原文,再据此判断它已弃用。完整的状态和适用版本,以 Python 3.14 策略文档为准。
三、第一步:发现——AI 写的代码,哪些可能过时
1. 一套有标准答案的测试题
我从 Python 3.12/3.13/3.14、pandas 2.0/3.0、NumPy 2.0、LangGraph 1.0 和 OpenAI 的官方变更说明中,挑出28 项真实的 API 变更,每一项都记录了官方原文链接作为标准答案。另外加了 4 道对照题(读 JSON、用 pathlib 遍历目录、pandas 分组求平均、requests 发 POST),用来观察误报。完整的旧写法、新写法和官方出处见配套的 API 变更与来源。
题目用自然语言描述需求,不提示 API 名称,例如“pandas 用前一个有效值向下填充缺失值。只给代码。”。需要说明的是,这 28 题是有意挑出来的、确实发生过变更的 API,不是随机抽取的日常任务,所以下面的比例只描述这批样本。
2. 结果:28 道变更题里有 9 道写成了过时写法
Qwen 回答 32 题共用时 30 秒。9 份回答用了过时写法:telnetlib、set_event_loop_policy、sqlite3.version、df.applymap、fillna(method='ffill')、freq='H'、groupby(..., axis=1)、np.trapz、create_react_agent。
统计方法是:每道题预先写好匹配过时写法的正则,再人工逐份阅读确认。初版正则漏掉了groupby([...], axis=1),因为列表推导式里的括号把匹配截断了;人工抽查时发现后修正,结果从 8 份变为 9 份。
2023 年前后的老变更,模型基本都写对了:datetime.now(timezone.utc)、pd.concat、np.nan、ast.Constant用的都是新写法。OpenAI 那道题也直接用了 Responses API(官方弃用说明列出的 Assistants API 停用日期为 2026 年 8 月 26 日)。
3. 从代码里自动抽出要查的调用
用ast解析代码,处理三种情况:
- 由别名能确定所属库的调用:
np.trapz→numpy.trapz; - 接收者是变量的方法调用:
df = pd.read_csv(...)之后的df.applymap,根据赋值关系把df归到 pandas; - 关键字参数:
fillna(method=...)。
一开始没有记录“变量由哪个库创建”,导致df.append在 numpy 和 pandas 下各查了一次。加上赋值追踪后,同一段示例代码的查询次数从 17 降到了 12。
四、第二步:查证——用元宝去官方文档里找证据
1. 调用方式
查询词由“库名 + 符号 + deprecated removed”组成,控制在 64 个字符以内(接口会截断更长的 Query)。调用代码只用标准库:
importgetpassimportosfromresearch_clientimportcollect,decode_pages api_key=os.environ.get("YUANBAO_API_KEY","").strip()ifnotapi_key:api_key=getpass.getpass("Yuanbao API Key: ").strip()ifnotapi_key:raiseSystemExit("需要提供服务 API KEY")query="pandas applymap deprecated removed"params={"Query":query,"Mode":0,"Cnt":10,"Site":"pandas.pydata.org"}record=collect({"id":"applymap-demo","label":query,"request":params},api_key)ifrecord["status"]!=200:raiseRuntimeError(f"SearchPro HTTP{record['status']}")pages=decode_pages(record["response"])# 有业务错误时抛出异常root=record["response"].get("Response",record["response"])print({"RequestId":root.get("RequestId"),"results":len(pages)})这段代码需要在配套代码的根目录运行,会直接发起一次请求,可能消耗额度。research_client.py把请求发到POST https://api.wsa.cloud.tencent.com/SearchPro,鉴权使用Authorization: Bearer <API KEY>。密钥通过环境变量或隐藏输入读取,不写进正文,也不写进证据文件。开通与鉴权步骤见腾讯云官方接入说明。
实验脚本另有一层缓存:每次调用都把请求体、HTTP 状态、耗时、RequestId 和原始响应保存成 JSON,不保存鉴权头。请求参数相同就直接读缓存,不再调用接口。
2. 元宝找得到吗:28 次定向查询,次次都返回官方文档
每项变更用一条设计好的查询。28 次查询全部返回了 10 条官方域名内的结果,Site约束在这批样本里完全有效。186 次调用全部返回 HTTP 200,端到端耗时中位数 493 ms(范围 268–896 ms)。
图3中,①圈出的是单次查询的official=10,②圈出的是统计行“命中官方文档 28/28,检出变更 20/28”。纸面里嵌的是data/logs/probe.txt的真实终端回放截图。
3. 能不能自动读懂这些证据:这一步的瓶颈在我的规则
为了自动给出结论,我写了一套句子级规则:在包含目标符号的句子里找removed、deprecated、弃用等状态词。用这套规则判断,28 项里检出了 20 项。
但回头翻没检出的那几项,我发现元宝返回的内容里其实就有证据,只是我的规则没认出来:
sqlite3.version:返回的简体中文 3.12 文档里写着“sqlite3.version¶ 此模块字符串形式的版本号……Deprecated since version 3.12, will be removed in version 3.14”。规则按句号切句,把符号和状态词切到了两句里。fillna(method=):返回的 2.1/2.2 文档里写着“Deprecated since version 2.1.0: Use ffill or bfill instead”,但这句话写在method参数的说明里,和fillna不在同一个句子。
当然,也有真的没拿到关键句的情况。比如'H'、'ME'这类频率别名的变更,写在 What’s New 长页面的中后部,没有出现在返回的摘要里。
所以这里得到的教训是:判断这一步,与其自己写规则,不如把元宝返回的原文直接交给模型去读。下一节的实验就是这么做的。
五、第三步:修好——把元宝查到的原文交回给 AI
1. 实验设计
拿 Qwen 写错的 9 份代码,让它自己修。每份分两种条件,各修 3 次:
- A 组:只提醒。“请检查这段代码是否用了已弃用或已删除的 API(以各库截至 2026 年的最新版本为准),如果有,请改成当前推荐的写法。”
- B 组:提醒 + 元宝原文。同样的提醒,再附上这个 API 的元宝搜索结果里排名前 3 的官方页面摘要(标题、链接、
passage),原样粘贴,不经过我的规则筛选。
B 组给模型的内容大致是这样:
下面这段代码是针对这个需求写的:<原题> <原代码> 以下是用元宝搜索在官方文档中检索到的资料(查询:python asyncio set_event_loop_policy deprecated): [1] 策略 来源:https://docs.python.org/zh-cn/3.14/library/asyncio-policy.html 摘要:……自 3.14 版本弃用: set_event_loop_policy() 函数已弃用,并将在 Python 3.16 中删除。…… [2] …… [3] …… 请检查这段代码是否用了已弃用或已删除的 API……输出修正后的完整代码。评分方法:去掉注释后,旧 API 不再出现、没有引入其他用例里的过时写法、代码能被ast解析,就算“改成了新写法”。另外,我人工逐条核对了每一次的替代写法是否正确。注释要先去掉,是因为有一次模型已经改用socket,只是在注释里写了一句“telnetlib 在 Python 3.13 中已移除,改用 socket”;第一版评分把它误判成没改,修正后 A 组从 17 更正为 18。
2. 结果
| 用例 | 变更时间 | A:只提醒 | B:提醒 + 元宝原文 | B 组改成的写法 |
|---|---|---|---|---|
set_event_loop_policy | Python 3.14(2025-10) | 0/3 | 3/3 | asyncio.run(main(), loop_factory=...)或asyncio.Runner |
sqlite3.version | Python 3.14(2025-10) | 0/3 | 3/3 | sqlite3.sqlite_version |
create_react_agent | LangGraph 1.0(2025-10) | 0/3 | 3/3 | from langchain.agents import create_agent |
telnetlib | Python 3.13 | 3/3 | 3/3 | telnetlib3 |
df.applymap | pandas 3.0 | 3/3 | 3/3 | df.map |
fillna(method=) | pandas 3.0 | 3/3 | 3/3 | .ffill() |
freq='H' | pandas 3.0 | 3/3 | 3/3 | freq="h" |
groupby(axis=1) | pandas 3.0 | 3/3 | 3/3 | df.T.groupby(...).sum().T |
np.trapz | NumPy 2.0 | 3/3 | 3/3 | np.trapezoid |
| 合计 | 18/27 | 27/27 | 两组都没有引入新的过时写法 |
3. 这组结果说明了什么
只提醒就能修好的,是模型其实知道的变更。pandas 3.0 删掉的applymap、fillna(method=),早在 2.1 版就已标记弃用。提醒一句,模型马上就改对了,说明它记得这些变更,只是第一遍写代码时没想起来。
只提醒修不好的,正好是最新的变更。Python 3.14 和 LangGraph 1.0 都是 2025 年 10 月发布的。这三处只提醒时 0/3,模型每次都保留了旧写法。把元宝查到的官方原文给它之后,3/3 都改对了。比如sqlite3.version,只提醒时模型保留了它,只是在旁边多打印一行sqlite_version;看到元宝返回的那句“will be removed in version 3.14”后,才把旧常量删掉。
这正是接入搜索的价值所在:模型记忆里没有的新变更,只能靠检索把官方原文带进来。
4. 修好之后,再实际跑一遍
静态检查只能说明“旧写法不见了”。要确认“改对了”,最终还得在目标环境里运行。下面以pd-applymap这题为例走一遍:原回答在注释里已经提到map,实际调用的却仍是df.applymap(lambda x: x * 2),输入是回答自带的三行 DataFrame(A=[1,2,3]、B=[4,5,6])。
在 Python3.12.3、pandas3.0.0环境中运行原回答,实际报错:
AttributeError: 'DataFrame' object has no attribute 'applymap'只把.applymap(换成.map(,输入和lambda x: x * 2都保持不变:
importpandasaspd df=pd.DataFrame({"A":[1,2,3],"B":[4,5,6]})result=df.map(lambdax:x*2)print(result)再次运行成功,实际输出为:
A B 0 2 8 1 4 10 2 6 12迁移复现脚本直接读取保存的原回答,实测 JSON 和日志保留了原代码、唯一的替换点、运行环境和输出。
六、不写代码也能用:在 Claude 和 WorkBuddy 里接入元宝搜索
前面的实验都是我写 Python 脚本直接调用 API 完成的。元宝搜索官方还提供了MCP和Skill两种接入方式:日常写代码时不用自己写脚本,在常用的 AI 工具里配置一次就能用。我把同一份 Qwen 写错的代码放进 Claude 和 WorkBuddy 里各走了一遍。代码里有set_event_loop_policy和sqlite3.version两处,正是第五节里“只提醒修不好”的两项。
1. Claude:配置官方元宝搜索 MCP
官方 MCP 的地址是https://api.wsa.cloud.tencent.com/Mcp(Streamable HTTP,见官方说明),提供一个SearchPro工具,参数和 API 相同。在 Claude Code 里,一条命令就能加上:
claude mcpadd--scopeuser--transporthttp yuanbao-search https://api.wsa.cloud.tencent.com/Mcp--header"Authorization: Bearer <你的 API Key>"用claude mcp list确认状态,看到Connected就配好了(图5)。Claude 桌面应用和命令行共用这份配置,之后新开的会话会自动加载它。
接着在 Claude 桌面应用里新开一个会话,让它检查这份代码。提问的核心要求有三条:
- 只用元宝搜索查证,不让模型凭记忆下结论;
Site设为docs.python.org,证据只取官方文档,理由见第四节;- 每条结论附官方链接和原文,查证完直接把代码改成推荐写法。
Claude 调用了yuanbao-search的SearchPro,并引用了元宝返回的官方原文(图6)。
sqlite3.version这一项,元宝返回的前 3 条结果都来自docs.python.org,原文写明“3.12 弃用、3.14 删除”(图7)。这里有个细节:排在前面的是 3.12 版文档,只写了“将在 3.14 删除”;明确写“已删除”的 3.15 版文档排在第 9 条。这正是第七节查询词技巧第 5 条提醒的:给结论前,先看清页面对应的版本。
最后,Claude 给出结论并直接改了代码(图8):删掉sqlite3.version,把事件循环策略改成asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)。它也如实说明了验证范围:本机没有 Python 3.14,只在 3.12 上用-W error::DeprecationWarning把弃用警告当作报错,跑通了修改后的代码。
改动前后的关键部分(完整文件见仓库的 examples/hands-on/):
-if sys.platform == "win32": - asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) - -print(f"sqlite3 module version: {sqlite3.version}") +# sqlite3.version 已在 3.14 移除(它是 pysqlite 的版本号,不是 SQLite 库版本) print(f"SQLite library version: {sqlite3.sqlite_version}") @@ - asyncio.run(main()) + # 事件循环策略在 3.14 弃用,改用 asyncio.run() 的 loop_factory 指定循环实现 + if sys.platform == "win32": + asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop) + else: + asyncio.run(main())2. WorkBuddy:安装官方元宝搜索 Skill
元宝搜索在 SkillHub 上有官方 Skill,页面标明支持 WorkBuddy。安装只需要把页面给出的这句话发给 WorkBuddy:
请根据 https://skillhub.cn/install/skillhub.md,安装 `@user_f26e0ccb/tencent-yuanbao-standard-search`。WorkBuddy 会先安装 skillhub 命令行工具,再安装 Skill。在我这台 Windows 电脑上,安装脚本第一次失败了:临时目录路径C:\里的冒号被 tar 当成了远程主机。WorkBuddy 自己改用 POSIX 风格的临时目录重试成功,整个过程大约 4 分钟(图9)。
这个 Skill 从环境变量TENCENTCLOUD_WSA_APIKEY读取 Key。在 Windows 里把它设为用户环境变量,然后重启 WorkBuddy:
[Environment]::SetEnvironmentVariable("TENCENTCLOUD_WSA_APIKEY","<你的 API Key>","User")配置好以后,用“帮我搜索……”“联网搜索”这类说法就能触发。Skill 的脚本scripts/websearch.py调用的也是 SearchPro 接口,同样支持--site参数,所以下一节的查询词技巧在这里一样适用。
3. 三种接入方式怎么选
| 方式 | 适合谁 | 怎么配置 | 本文用在哪里 |
|---|---|---|---|
| API | 要批量运行、需要缓存和统计 | 自己写 HTTP 请求,Bearer 鉴权 | 第三到五节的全部实验 |
| MCP | 用 Claude、Cursor 等支持 MCP 的工具写代码 | 一条命令或一段 JSON | 本节的 Claude 演示 |
| Skill | 用 WorkBuddy 等 Agent 产品 | 一句安装提示,加一个环境变量 | 本节的 WorkBuddy 演示 |
三种方式背后都是同一个 SearchPro 接口,所以“用Site锁定官方域名”“查文档不加Freshness”这些技巧都通用。截图里的 Windows 用户名、账号邮箱和本机路径都已打码。
七、拿去就能用:速查表与查询词技巧
1. 本次实测中 AI 写错的 API 速查表
| AI 写的旧写法 | 现在的写法 | 从哪个版本开始 | 只提醒能改对吗 |
|---|---|---|---|
asyncio.set_event_loop_policy(...) | asyncio.run(main(), loop_factory=...) | Python 3.14 弃用 | ❌ 需要查文档 |
sqlite3.version | sqlite3.sqlite_version(注意两者含义不同) | Python 3.14 删除 | ❌ 需要查文档 |
from langgraph.prebuilt import create_react_agent | from langchain.agents import create_agent | LangGraph 1.0 弃用 | ❌ 需要查文档 |
import telnetlib | 第三方库,如telnetlib3 | Python 3.13 删除 | ✅ |
df.applymap(f) | df.map(f) | pandas 3.0 删除 | ✅ |
df.fillna(method="ffill") | df.ffill() | pandas 3.0 删除 | ✅ |
freq="H" | freq="h" | pandas 3.0 删除 | ✅ |
df.groupby(keys, axis=1) | df.T.groupby(keys).sum().T(按业务语义检查) | pandas 3.0 删除 | ✅ |
np.trapz(y, x) | np.trapezoid(y, x) | NumPy 2.0 弃用 | ✅ |
另外 19 项变更,本批模型都写对了,完整清单见 API 变更与来源。
2. 用元宝查版本变更的查询词技巧
下面每一条都有本次的调用记录支撑:
- 一定要用
Site锁定官方域名。28 次定向查询,次次返回 10 条官方页面。 - 查询写成“库名 + 版本号 + whatsnew + API 名 + removed”。
groupby(axis=1)用普通写法只搜到函数签名,改成pandas 3.0 whatsnew groupby axis removed后,2.1.0 的 What’s New 里那句“Deprecated axis=1 in DataFrame.groupby() … do frame.T.groupby(…) instead”就排进了前面。 - 查文档不要加
Freshness。同样的查询加上Freshness=y1,官方页面从 10 条降到 0–3 条。更新日志和 API 文档往往不是近期发布的,时间限制会把它们过滤掉。 - API 名用英文原名,返回的中文文档可以直接用。在 4 个补查的用例里,中文查询词的命中都不比英文好;但返回结果里中文官方文档很多,在 1117 条 Python 文档结果中,简体和繁体中文共 530 条。这些官方中文原文可以直接给读者看,也可以直接贴给模型。
- 注意 URL 里的版本号。1117 条 Python 文档结果中,有 357 条(32%)来自 3.11 及更早版本。旧版文档里写的“Deprecated since 2.1”,在 3.0 里可能已经删除,给结论前要看清页面版本。
- 判断交给模型,别自己写死规则。我的规则漏判了
sqlite3.version、fillna的证据,但把同样的摘要原样贴给模型后,这两项都改对了。
图10用书套的隐喻表达翻译版占绝大多数,英文原版约 95 条。蓝色的 32% 是全部 Python 文档结果中 3.11 及更早版本的占比,不是只在翻译版内部计算的;书堆面积不作为比例尺。
八、实际效果与局限
1. 可以用在哪
- 新变更的查证和修复:这是元宝在这个流程里最不可替代的一环。模型训练之后才发生的变更,只提醒时 0/3,附上元宝原文后 3/3。
- 给迁移找依据:每条结论都带官方链接和 RequestId,方便团队复核。
2. 还做不好的地方
- 全自动扫描的告警噪音大。让规则自己从代码里找问题,27 条告警中只有 5 条成立(18.5%,AI 初审、作者复核)。误报主要有三类:同名陷阱(被删除的是
ssl.wrap_socket(),代码里用的是SSLContext.wrap_socket());模块里只是个别成员有变更,却把整个模块标记了;旧版文档页顶部的“不再受支持”横幅被当成了变更说明。这些都是我的规则读证据时出的错,下一步打算把判断交给模型来做。规则一共迭代了四版,告警数从 48 降到 36,再降到 27,各版结果都保留在配套材料里。 - 少数关键句不在摘要里。写在长页面中后部的变更(如
'H'、'ME'频率别名),返回的摘要没有覆盖到。这类情况需要再抓取原页面全文。
3. 统计与测量方法
- 样本:28 道变更题是有意挑出来的,另有 4 道对照题;修复实验只针对写错的 9 份代码,每种条件各 3 次,只测了一个模型。
- 修复评分:去掉注释后做正则和
ast检查,再人工逐条核对替代写法。完整运行验证只做了applymap一例。telnetlib 有一次 B 组改成了from telnetlib3 import Telnet,这个写法没有实际执行,是否可用未验证。 - 规则迭代:四版规则都在同一批记录上调试,数字偏乐观;用独立新题验证列入下一步。
- 耗时:元宝端到端耗时为本机实测,包含网络往返,每个查询只采样一次;修复实验中本地模型单次 0.5–11 秒。
4. 下一步
- 判断环节交给模型:把元宝原文和代码一起交给模型,由它判断“被删除的是不是代码里用的那个东西”,替代现在的规则;
- 摘要里找不到关键句时,再抓取原页面全文;
- 按目标环境的版本挑选证据,旧版文档单独标注;
- 换更多模型、更多新题,在目标环境中批量运行修复后的代码。
九、复现与配套材料
配套代码已开源在 GitHub:https://github.com/ngadminq/yuanbao-version-guard,本文对应v1.0版本。代码只用 Python 标准库,要求Python 3.10+:
gitclone https://github.com/ngadminq/yuanbao-version-guard.gitcdyuanbao-version-guard仓库包含:
cases.json:32 道测试题,附官方链接;API 变更与来源:28 项变更的基准、迁移建议与官方出处;version_guard.py:核验工具;evaluate.py:发现与查证实验;fix_experiment.py:修复实验;data/cache/:发现与查证实验的 186 份元宝原始调用记录(不含密钥);data/cache_query_variants/与data/query_variants.json:查询词对照的 12 份记录;data/fix_qwen3.8-27b.json:54 次修复试验的全文与评分;data/review_qwen3.8-27b.csv:告警复核表;viewer/index.html:只读结果查看页,不会发出任何请求;- 24 个离线单元测试;README:环境、目录、离线复算、在线调用与错误处理;
examples/hands-on/:第六节实操用的代码,修改前后各一份(ai_code_before.py、ai_code_after.py),截图在images/hands-on/;examples/migrate_applymap.py与validation/migration/:迁移验证的脚本,以及报错与输出记录。
缓存已随仓库提供,在仓库根目录依次执行即可离线复算,不需要密钥:
python-munittest-vtest_version_guard python evaluate.py probe python evaluate.py run--nameqwen3.8-27b python render_report.py修复实验需要一个兼容 OpenAI 接口的模型服务,请换成你自己的服务地址和模型名。已保存的 54 次试验不会重跑,只会补齐缺少的部分:
python fix_experiment.py --base-url http://<你的模型服务>/v1--model<模型名>如果机器配置了 HTTP 代理,记得把模型服务的地址加进NO_PROXY。我第一次运行时,内网请求被代理拦截,返回的是 502。
图12以事件循环策略py-loop-policy的一次历史请求为例,演示如何追溯:图中的 RequestId 可以和data/cache/13e13f10880b73a1.json对照。