接入位表六家扩到八家,端点形状与错误码一字未改(契约 v0.87,仅两处名单)。 - tencent_wsa:POST {base}/SearchPro + Authorization Bearer,零签名。 两条官方口径决定实现:HTTP 状态码恒 200(判失败只能读 Response.Error.Code); Pages 是「JSON 字符串数组」需二次解析。错误码按官方表分类 (UnauthorizedOperation/AuthFailure.* = 凭据、ResourceUnavailable = 欠费、 RequestLimitExceeded* = 限流),文案只带 code 不带上游 Message。 - metaso:POST {base}/api/v1/search,响应 schema 仅第三方来源且互相打架, 实现走宽松解析(数组候选与字段名回退),逐处标「未实测」。 - 零新 env 键:两家只走 $DATA_DIR/config/plugins/web-search.json, .env / .env.example 未动;组合根 websearch_providers.go 零功能改动。 - 契约 v0.87:values.provider 合法闭集与 plugin.providers 候选各加两条, 计数不变(14 + 25 + 40 = 79)。
动因:`.env` 已冻结(基础键不加/不改/不删),而「加一家 provider」原本会逼出 新的 env 键(一家一个 struct 字段 + searchProviderVector 逐家读 + 逐家写死的 switch)⇒ 想接腾讯云元宝/秘塔就只能破红线。面板本来就该是插件配置的一等来源 ($DATA_DIR/config/plugins/web-search.json),故让**文件成为权威**。 - plugins/tools/io/search/registry.go:接入位表加 defaultBaseURL(「没配 baseUrl 回落代码默认值」从此只有一个出处);新增 Descriptor(s)/DefaultBaseURL。 - cmd/cyrene/websearch_providers.go(新):按接入位表逐家算出生效投影 —— 加一家时这里**零改动**,这正是本片的核心;顺手把 wire_io_tools.go 从 430 行 降到 342(它逼近 §10 的 500 行上限)。 - cmd/cyrene/wire_plugin_actions.go / websearch_action_data.go / websearch_selection.go:基地址判定统一走「文件值 → 接入位默认值」的进位链; checkPrimaryUsable 判据不放松(真没配齐仍 400 primary_not_configured)。 🔴 **一处对我任务书的纠正(子代理提出、我采纳)**:我要求「既有 6 家在文件里 没有该条目时仍回落 .env」。仓库现状**没有**这层回落,且有回归用例把它钉死 (TestWireIOTools_PanelConfigClearedProviderDoesNotReviveFromEnv:「文件里没有 的家不得从 .env 复活」)。本片按「不改变既有行为」实现 —— 我的要求才是错的: 文件一旦存在就是权威,env 只在文件缺失/为空时播种。 验收(主会话复跑 + 亲自变异):go build ./... + 两包 vet 绿;search 包与 cmd/cyrene 全绿;我用 -overlay 让文件里的 apiKey 被忽略 ⇒ 4 条用例变红 (含「无 env 字段的家只认文件也能进注册表」这条核心判据)。 ⚠️ 新家仍未接:腾讯云元宝(tencent_wsa)/ 秘塔(metaso)两片随后串行落地。