feat(search): 原生 provider 层(searxng/智谱/阿里IQS/博查/火山/百度)+ 降级链(契约无改动)
主人定调「先把原生的做进插件,MCP 路线等后端 MCP 完善后再接」。 - 新包 plugins/tools/io/search/:一 provider 一文件 + 共享 http/提取器 + 归一化 Result;域名过滤/去重/排序**归一化后统一做一次** - 配置 15 键:WEB_SEARCH_PROVIDER(默认 searxng)/_FALLBACK/_MAX_RESULTS + 五家 ×(API_KEY/BASE_URL);WEB_SEARCH_TIMEOUT 语义改为「**每次上游尝试**」(降级链才有意义) - 硬语义:未注册/未配置的主 provider ⇒ **启动期报错**(不许静默回落);off ⇒ 不注册工具;缺 key 的家不进可用清单;降级链**如实标实际应答的 provider**(变异:拿主力冒充 ⇒ 测试红「provider = zhipu, want bocha」) - 密钥绝不进日志/响应(有断言);错误分类(鉴权/限流/额度/网络)+ **空结果 ≠ 成功**(变异暴露过一个死分支⇒下移到 searchWith 修掉) - searxng 真机 e2e 通过(provider=searxng 5 条);**其余五家无 key ⇒ 如实标未实测**;契约无改动(无新端点、工具 schema 不变) - 注册表留好 B 档接入位(tavily/exa/firecrawl/serper/serpapi),并有「未登记⇒启动报错」的防回归断言
This commit is contained in:
1 parent
236b202fda
commit
69a3b73777
24 files changed
+3251
-171
No files matched your search
@@ -328,16 +328,19 @@ func TestWireIOTools_RealSearXNG_EndToEnd(t *testing.T) {
|
||||
}
|
||||
|
||||
// TestWireIOTools_SeamsAndEnvTemplate 是防回归补充:组合根那两个接缝还在,
|
||||
// 两个 env 键与 `.env.example` 逐字一致(AGENTS §10 的 E6 固定动作)。
|
||||
// env 键与 `.env.example` 逐字一致(AGENTS §10 的 E6 固定动作)。
|
||||
func TestWireIOTools_SeamsAndEnvTemplate(t *testing.T) {
|
||||
t.Parallel()
|
||||
seams := map[string][]string{
|
||||
"wire_runtime.go": {
|
||||
// io 工具集必须经这一个入口构造,否则端点裁决会被绕过。
|
||||
// io 工具集必须经这一个入口构造,否则端点/后端裁决会被绕过。
|
||||
"iotools.New(a.cfg, a.ioToolOptions()...)",
|
||||
},
|
||||
"wire_io_tools.go": {
|
||||
"iotools.WithSearchEndpoint(decision.URL)",
|
||||
// WS1-B:各家接线 + 主 provider/降级链选定,是 web-search 后端唯一来源。
|
||||
"iotools.WithSearchProviders(specs...)",
|
||||
"iotools.WithSearchSelection(ws.Provider, ws.Fallback)",
|
||||
"iotools.WithSearchMaxResults(ws.MaxResults)",
|
||||
"iotools.WithoutSearch()",
|
||||
},
|
||||
}
|
||||
@@ -359,10 +362,15 @@ func TestWireIOTools_SeamsAndEnvTemplate(t *testing.T) {
|
||||
}
|
||||
template := string(raw)
|
||||
for _, line := range []string{
|
||||
webSearchProviderEnv + "=",
|
||||
webSearchEndpointEnv + "=",
|
||||
webSearchTimeoutEnv + "=",
|
||||
// 默认值必须在模板里如实写出(本机兜底),否则照模板部署的人看不出它接的是什么。
|
||||
webSearchMaxResultsEnv + "=",
|
||||
webSearchFallbackEnv + "=",
|
||||
// 默认值必须在模板里如实写出(本机兜底 + searxng 主后端),否则照模板部署的人
|
||||
// 看不出它接的是什么。
|
||||
webSearchEndpointEnv + "=http://127.0.0.1:38471",
|
||||
webSearchProviderEnv + "=searxng",
|
||||
} {
|
||||
if !strings.Contains(template, line) {
|
||||
t.Fatalf(".env.example 里找不到 %q(新 env 键必须同步模板,AGENTS §10)", line)
|
||||
|
||||
Reference in new issue
Block a user