What do you want? (你想要什么?)
希望把所用的搜索引擎做成用户可配置项,具体包含:
- 选择默认搜索引擎:可指定首选的搜索引擎(默认顺序第一项)。
- 自定义搜索引擎:允许新增自定义引擎,配置「名称 + 搜索 URL 模板(含
{query} 占位符)+ 结果区 CSS 选择器(或许可以让 agent 自动探测?)」;内置一批常见引擎预设(如 Kagi / Startpage / SearXNG / 必应国内 / 360 等)。
- 调整顺序 / 启用禁用:对现有 Bing / Brave / Google / DuckDuckGo / Baidu 可排序、可禁用。
- 确定性回退:当一个引擎不可用(无结果 / 命中验证码 / 抓取失败)时,按顺序自动切换到下一个。
Why? (为什么?)
当前搜索引擎列表(顺序 + URL 模板 + 结果区 selector)写死在 system-prompt.ts 的默认提示词 ### Searching the Web 段里。这带来几个问题:
- 用户无法使用自己偏好的引擎(Kagi、Startpage、自建 SearXNG、或所在地区可用的引擎)。
- 引擎顺序固定,无法按地区 / 网络环境调整(例如某地区 Google 不可用却排在 Brave 之前,每次都要多试几次才能轮换到可用的)。
- 引擎 URL 模板或结果页结构一旦变化,必须等发版才能更新,用户无法自行修正 selector。
- 回退逻辑目前只是 prompt 层的软约束(依赖 AI 自觉「captcha / blocked / no results 才换下一个」),不可靠。
How? (怎么做? — 可选)
- 在
lib/persistence/storage.ts 里新增一个存储项,数据结构大致为引擎数组:{ id, name, urlTemplate(含 {query}), resultSelector, enabled } + 顺序,内置现有 5 个引擎作为默认值(保证向后兼容、未配置时行为不变)。
- 在
system-prompt.ts 的 DEFAULT_SYSTEM_PROMPT 里把 ### Searching the Web 段的引擎列表改为 {{SEARCH_ENGINES}} 占位符。
- 在
prompt-composer.ts 的 composeSystemPrompt 里读该存储项、动态生成 {{SEARCH_ENGINES}} 段(复用现有的「读存储 → 生成变量 → 替换占位符」翻译层)。
- 设置页新增「搜索」配置区:默认引擎选择、引擎排序 / 启用禁用、自定义引擎表单(URL 模板 + selector,selector 选填并留「自动探测」兜底)。
- 回退从 prompt 软约束升级为代码层确定性遍历(
read_page 返回空 / 无结果 / 验证码时按序切下一个)。
Alternatives considered (考虑过的替代方案 — 可选)
让浏览器用默认引擎发起搜索 —— 部分可行,依赖 Chrome 专有 API chrome.search.query()。
它的行为是:让浏览器在当前默认搜索引擎上执行一次搜索,并打开结果页。但是:
- 不返回引擎名称、不返回 URL 模板、也不返回任何结果内容(
void)。
- 只做「打开一个结果页」这件事 —— 等价于「在一个新标签页里搜了一下」。
- 拿不到默认引擎 → 无法精确定位结果区。 原来写死的方案里每个引擎配了精确 selector(Bing
#b_results、Google #rso、DuckDuckGo .results),能只读结果、剥掉导航噪声。走 chrome.search.query() 后 agent 只能读整页,噪音大;而且 Google 结果页现在大量 JS 渲染 + 反爬,read_page 很可能抓不到有用内容。
- 需要新增
search 权限。 现在 wxt.config.ts:39-45 的 permissions 里没有 search。
- Chrome 专有、Firefox 不支持。 Cebian 有 Firefox 版(发行到 Firefox Add-ons)。
chrome.search 不是标准 WebExtension API,Firefox 没有等价物,会破坏 Firefox 兼容,必须做浏览器判断 + 降级。
What do you want? (你想要什么?)
希望把所用的搜索引擎做成用户可配置项,具体包含:
{query}占位符)+ 结果区 CSS 选择器(或许可以让 agent 自动探测?)」;内置一批常见引擎预设(如 Kagi / Startpage / SearXNG / 必应国内 / 360 等)。Why? (为什么?)
当前搜索引擎列表(顺序 + URL 模板 + 结果区 selector)写死在
system-prompt.ts的默认提示词### Searching the Web段里。这带来几个问题:How? (怎么做? — 可选)
lib/persistence/storage.ts里新增一个存储项,数据结构大致为引擎数组:{ id, name, urlTemplate(含 {query}), resultSelector, enabled }+ 顺序,内置现有 5 个引擎作为默认值(保证向后兼容、未配置时行为不变)。system-prompt.ts的DEFAULT_SYSTEM_PROMPT里把### Searching the Web段的引擎列表改为{{SEARCH_ENGINES}}占位符。prompt-composer.ts的composeSystemPrompt里读该存储项、动态生成{{SEARCH_ENGINES}}段(复用现有的「读存储 → 生成变量 → 替换占位符」翻译层)。read_page返回空 / 无结果 / 验证码时按序切下一个)。Alternatives considered (考虑过的替代方案 — 可选)
让浏览器用默认引擎发起搜索 —— 部分可行,依赖 Chrome 专有 API
chrome.search.query()。它的行为是:让浏览器在当前默认搜索引擎上执行一次搜索,并打开结果页。但是:
void)。#b_results、Google#rso、DuckDuckGo.results),能只读结果、剥掉导航噪声。走chrome.search.query()后 agent 只能读整页,噪音大;而且 Google 结果页现在大量 JS 渲染 + 反爬,read_page很可能抓不到有用内容。search权限。 现在wxt.config.ts:39-45的permissions里没有search。chrome.search不是标准 WebExtension API,Firefox 没有等价物,会破坏 Firefox 兼容,必须做浏览器判断 + 降级。