Skip to content

Commit 3d16230

Browse files
author
SqlRush
committed
Parse more WebSearch JSON URL aliases
1 parent cfed395 commit 3d16230

4 files changed

Lines changed: 15 additions & 4 deletions

File tree

docs/cc-100-roadmap.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -957,7 +957,7 @@ M7 补充:prompt history `LogEntry` 读取现在接受 `sessionID`/`session`/`
957957

958958
本轮补充:`WebSearch` JSON parser 现在会递归解包 `web``response``search``hits``documents``records``entries` 等常见搜索后端 wrapper,并继续保留 URL 去重和 allowed/blocked domain filter。
959959

960-
本轮补充:`WebSearch` JSON result parser 现在支持 `pageUrl`/`targetUrl`/`source_url`/`formattedUrl` 等 URL aliases、`htmlTitle`/`htmlSnippet` 等 HTML 标记字段清理、嵌套 URL object,以及 `deepLinks`/`siteLinks` 子结果递归解析。
960+
本轮补充:`WebSearch` JSON result parser 现在支持 `pageUrl`/`targetUrl`/`source_url`/`canonicalUrl`/`linkUrl`/`resultUrl`/`formattedUrl` 等 URL aliases、`htmlTitle`/`htmlSnippet` 等 HTML 标记字段清理、嵌套 URL object,以及 `deepLinks`/`siteLinks` 子结果递归解析。
961961

962962
本轮补充:`Grep` 现在支持 whole-word 搜索参数 `word_regexp`/`wordRegexp`/`word-regexp`/`-w`,在 regex 和 fixed-string 模式下都会按词边界过滤匹配,并兼容 quoted boolean 输入。
963963

docs/claude-code-go-rewrite-plan.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ test/parity/ # golden tests against TS/official behavior
207207
- 本轮补充:WebSearch HTML snippet 提取现在识别 Bing 风格 `b_caption`/`b_snippet` 以及常见搜索摘要 class,标题 anchor 后的可见摘要会进入文本输出和 structured result。
208208
- 本轮补充:WebSearch HTML 结果 anchor 现在会识别 `data-href`/`data-url` 等常见 data 属性中的真实结果 URL,并跳过 `href="#"`/`javascript:` 占位链接,覆盖搜索页用 JS 事件承载跳转地址的形态。
209209
- 本轮补充:WebSearch JSON parser 现在会递归解包 `web``response``search``hits``documents``records``entries` 等常见后端 wrapper,保留 URL 去重和 domain filter。
210-
- 本轮补充:WebSearch JSON result parser 现在支持 `pageUrl`/`targetUrl`/`source_url`/`formattedUrl` 等 URL aliases、`htmlTitle`/`htmlSnippet` 等 HTML 标记字段清理、嵌套 URL object,以及 `deepLinks`/`siteLinks` 子结果递归解析。
210+
- 本轮补充:WebSearch JSON result parser 现在支持 `pageUrl`/`targetUrl`/`source_url`/`canonicalUrl`/`linkUrl`/`resultUrl`/`formattedUrl` 等 URL aliases、`htmlTitle`/`htmlSnippet` 等 HTML 标记字段清理、嵌套 URL object,以及 `deepLinks`/`siteLinks` 子结果递归解析。
211211
- 本轮补充:WebSearch JSON parser 现在继续覆盖 `answerBox`/`answer_box``knowledgeGraph`/`knowledge_graph``news`/`news_results``topStories``peopleAlsoAsk``related_questions` 等常见搜索后端 wrapper,并识别 `website`/`sourceLink` URL alias、`question` title alias、`answer`/`excerpt` snippet alias。
212212
- 本轮补充:WebSearch `query` schema 现在按官方 `min(2)` 约束拒绝单字符查询,通用 tool schema validator 同步支持 `minLength`,让工具定义可直接表达字符串最小长度契约。
213213
- 本轮补充:WebSearch domain filters 现在会 canonicalize 为小写、去尾点、去 `*.` 前缀并去重;过滤匹配和 structured content 暴露同一域名口径。

internal/tools/web/web_search.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,9 @@ func jsonSearchURLField(obj map[string]any) string {
373373
"targetUrl", "targetURL", "target_url",
374374
"webUrl", "webURL", "web_url",
375375
"sourceUrl", "sourceURL", "source_url",
376+
"canonicalUrl", "canonicalURL", "canonical_url",
377+
"linkUrl", "linkURL", "link_url",
378+
"resultUrl", "resultURL", "result_url",
376379
"sourceLink", "source_link",
377380
"website", "site",
378381
); raw != "" {

internal/tools/web/web_search_test.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,8 @@ func TestWebSearchParsesAlternateJSONFieldAliases(t *testing.T) {
494494
},
495495
{"name": "Source Result", "source_url": "https://example.com/source", "abstract": "Source abstract"},
496496
{"headline": "Formatted Result", "formattedUrl": "https://example.com/formatted", "caption": "Formatted caption"},
497+
{"title": "Canonical Result", "canonicalUrl": "https://example.com/canonical", "snippet": "Canonical snippet"},
498+
{"title": "Link URL Result", "linkUrl": {"value": "https://docs.example.com/link-url"}, "text": "Link URL snippet"},
497499
{"title": "Display Only", "displayUrl": "example.com/not-a-real-url", "snippet": "ignored"}
498500
]
499501
}
@@ -509,13 +511,13 @@ func TestWebSearchParsesAlternateJSONFieldAliases(t *testing.T) {
509511
}, contracts.ToolUse{
510512
ID: "toolu_search_alias_json",
511513
Name: "WebSearch",
512-
Input: json.RawMessage(`{"query":"alias json","max_results":5}`),
514+
Input: json.RawMessage(`{"query":"alias json","max_results":6}`),
513515
}, nil)
514516
if err != nil {
515517
t.Fatal(err)
516518
}
517519
results, ok := result.StructuredContent["results"].([]map[string]any)
518-
if !ok || len(results) != 4 {
520+
if !ok || len(results) != 6 {
519521
t.Fatalf("structured results = %#v", result.StructuredContent["results"])
520522
}
521523
if results[0]["title"] != "Alias Result" || results[0]["url"] != "https://example.com/alias" || results[0]["snippet"] != "Alias snippet" {
@@ -530,6 +532,12 @@ func TestWebSearchParsesAlternateJSONFieldAliases(t *testing.T) {
530532
if results[3]["title"] != "Formatted Result" || results[3]["url"] != "https://example.com/formatted" || results[3]["snippet"] != "Formatted caption" {
531533
t.Fatalf("formatted result = %#v", results[3])
532534
}
535+
if results[4]["title"] != "Canonical Result" || results[4]["url"] != "https://example.com/canonical" || results[4]["snippet"] != "Canonical snippet" {
536+
t.Fatalf("canonical result = %#v", results[4])
537+
}
538+
if results[5]["title"] != "Link URL Result" || results[5]["url"] != "https://docs.example.com/link-url" || results[5]["snippet"] != "Link URL snippet" {
539+
t.Fatalf("link url result = %#v", results[5])
540+
}
533541
content := result.Content.(string)
534542
if strings.Contains(content, "Display Only") || strings.Contains(content, "<b>") {
535543
t.Fatalf("content = %#v", content)

0 commit comments

Comments
 (0)