feat(search): 结果条数上限 5 → 10,并让「上限」真的是上限
主人原话:「返回五条结果会不会太少了?」。裁定:**上限抬高到 10,且它是真上限**
(模型要 50 也只给 10);模型要更少(3)时**尊重模型**;缺省/非法(≤0/非数)⇒ 上限。
- plugins/tools/io/web_search.go:`n := resultLimit(s.maxResults, m)` 一处收口
(原来是 `if count>0 { n = count }` ⇒ 模型的 count 能顶掉配置上限,与
.env.example 写的「条数上限」不符 —— 那是一条真口径缺陷,本次一并修正)。
- internal/config/websearch.go:`WEB_SEARCH_MAX_RESULTS` 代码默认值 5 → 10
(三处口径现已一致:env 默认 10 / io 包 defaultMaxResults 10 / 各家发给上游的
请求区间是另一回事,未动)。
- 生产:`data/config/plugins/web-search.json` 的 `maxResults` 5 → 10 + 一次
saveProvider 触发**热重载**(applied+registered),盘上已生效。
验收(主会话复跑 + 亲自打两个变异):
- io 包 / internal/config / cmd/cyrene 相关用例全绿;
- 变异 A(拆掉上限、恒取 50)⇒ **4 条用例变红**(含「默认上限 10」「count 非数值
⇒ 上限」「count=0 ⇒ 上限」「既有 MaxResultsOption」);
- 变异 B(默认值退回 5)⇒ internal/config 的默认值断言变红。
🔴 顺带挖出一条真缺陷(**本片只报不修,等派**):`maxResults` **在面板 UI 上
根本改不了** —— ① `search/panel.go` 的字段表里没有这个字段(输入框不显示);
② `saveProvider` 只并 provider/apiKey/baseUrl/enabled;③ `mergeSelectionPatch`
只处理 primary/fallback ⇒ **手工塞进 values 也会被静默丢弃**(「我改了它却没变」
成立)。修它要给面板加一个数字字段 + 三态落 `f.MaxResults`,属**管理面板对外契约
变更**(须同步 Docs/api-client.md),留给主会话。
This commit is contained in:
1 parent
7f63c5bec4
commit
bff57bd1ae
5 files changed
+298
-9
No files matched your search
@@ -160,10 +160,7 @@ func (s *webSearchTool) Execute(ctx context.Context, args any) (any, error) {
|
||||
if query == "" {
|
||||
return nil, fmt.Errorf("io: web-search: query is required")
|
||||
}
|
||||
n := s.maxResults
|
||||
if v, ok := argInt(m, "count"); ok && v > 0 {
|
||||
n = v
|
||||
}
|
||||
n := resultLimit(s.maxResults, m)
|
||||
|
||||
raw, provider, err := s.dispatch(ctx, query, n)
|
||||
if err != nil {
|
||||
@@ -189,6 +186,30 @@ func (s *webSearchTool) Execute(ctx context.Context, args any) (any, error) {
|
||||
}, nil
|
||||
}
|
||||
|
||||
// resultLimit 把模型的 `count` 收进配置上限(主人 2026-10-07 裁定:上限抬高到 10,
|
||||
// 并且它是**真上限**):
|
||||
//
|
||||
// - `count` **缺省 / 非法**(≤0、非数值)⇒ 用上限;
|
||||
// - `count` **小于上限** ⇒ 尊重模型 —— 「只要 3 条」是合理需求,不该被抬到 10;
|
||||
// - `count` **大于上限** ⇒ **只给上限**(模型要 50、配了 10 ⇒ 10)。
|
||||
//
|
||||
// 上限本身是**运维配置**给的(`WEB_SEARCH_MAX_RESULTS` / 面板文件 `maxResults`),
|
||||
// 模型顶不掉它。旧口径 `n = count`(`if ok && v > 0 { n = v }`)让模型直接越过配置,
|
||||
// 与 `.env.example` 写的「条数上限」语义不符 —— 那是一条已登记的口径缺陷。
|
||||
//
|
||||
// 上限 ≤0 时取 1(不该发生:两条构造路径的默认值都 ≥1):它是「一条都别给」与
|
||||
// 「截断关掉」之间唯一说得通的那个,避免 `Limit ≤ 0` 退化成**不截断**。
|
||||
func resultLimit(limit int, args map[string]any) int {
|
||||
if limit < 1 {
|
||||
limit = 1
|
||||
}
|
||||
n, ok := argInt(args, "count")
|
||||
if !ok || n < 1 || n > limit {
|
||||
return limit
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
// dispatch 按 主 provider → 降级链 依次尝试,返回结果与**实际应答的 provider 名**。
|
||||
//
|
||||
// 只有「该家不可用」才前进一格(unavailable:无 key / 鉴权失败 / 限流 / 额度 / 网络 /
|
||||
|
||||
Reference in new issue
Block a user