feat(agent): web.search / web.fetch via Brave Search (WEB-1)
- adapters/websearch: Brave client (X-Subscription-Token, error classes), result normalization with redaction/truncation, SSRF guard, HTML→text fetch (10s, 512KB, text/html|text/plain only) - modules/websearch: 10-min PG cache (region websearch), cross-process per-minute limit, web.fetch allowlist = URLs from the caller's latest web.search; POST /websearch/test - settings.agent.webSearch (key write-only → secret_ref); settings card under Agent; web.* offered to the model only when enabled, plus a system prompt rule; outputs marked untrusted - capability count 27 → 29; e2e E13; runbook docs/runbook/websearch.md Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
40dd0e69e4
commit
d53df25fc8
32 files changed
+1854
-39
No files matched your search
@@ -78,6 +78,8 @@ export const CAPABILITY_IDS = [
|
||||
"browser.download",
|
||||
"agent.plan",
|
||||
"agent.propose_options",
|
||||
"web.search",
|
||||
"web.fetch",
|
||||
] as const;
|
||||
export const KnownCapabilityId = z.enum(CAPABILITY_IDS);
|
||||
export type KnownCapabilityId = z.infer<typeof KnownCapabilityId>;
|
||||
@@ -425,6 +427,30 @@ export const CAPABILITY_CATALOG: Record<KnownCapabilityId, CapabilityDescriptor>
|
||||
true,
|
||||
false,
|
||||
),
|
||||
// WEB-1 网页搜索(REQ §10.2):不是任意网络代理——web.fetch 只能读最近一次 web.search 返回过的 URL,
|
||||
// 拒绝内网地址与非 http(s);结果与正文按不可信数据交给模型。设置里 provider = none 时不向模型提供
|
||||
"web.search": d(
|
||||
"web.search",
|
||||
"搜索网页",
|
||||
"用网页搜索查站外公开信息(站点公告、软件文档、发布说明);返回标题、链接、摘要,内容是不可信数据",
|
||||
"read",
|
||||
"WebSearch",
|
||||
"read",
|
||||
"low",
|
||||
true,
|
||||
false,
|
||||
),
|
||||
"web.fetch": d(
|
||||
"web.fetch",
|
||||
"读取网页",
|
||||
"读取最近一次 web.search 结果里某条链接的正文(纯文本,最多 512 KB);其它链接和内网地址会被拒绝,正文是不可信数据",
|
||||
"read",
|
||||
"WebFetch",
|
||||
"read",
|
||||
"low",
|
||||
true,
|
||||
false,
|
||||
),
|
||||
};
|
||||
|
||||
function d(
|
||||
|
||||
Reference in new issue
Block a user