ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

OmniRoute Search Tools Studio:统一 Web 搜索、网页抓取与多 Provider 对比的工作台

OmniRoute Search Tools Studio:统一 Web 搜索、网页抓取与多 Provider 对比的工作台 OmniRoute Search Tools Studio统一 Web 搜索、网页抓取与多 Provider 对比的工作台【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRouteOmniRoute 的 Search Tools Studio 把/dashboard/search-tools页面从单一搜索试验场改造为一个三标签页的统一工作区覆盖 Web 搜索/v1/search、URL 内容抓取/v1/web/fetch以及最多 4 个 Provider 的并行对比。本文基于docs/frameworks/SEARCH_TOOLS_STUDIO.md与仓库源码展开讲清每个标签页的交互流程、共享配置面板、Provider 目录 APIGET /api/search/providers的状态推导逻辑以及抓取端点的配额感知回退机制——读完后你可以独立理解该模块的前后端协作方式并在排查Provider 显示 missing / 内容被截断 / 对比页只出两列等问题时有据可依。页面整体结构Studio 的外壳是 SearchToolsClient.tsx/dashboard/search-tools/SearchToolsClient.tsx)页面入口在 page.tsx/dashboard/search-tools/page.tsx)。整体布局与文档中的线框图一致┌ Search Tools ──────────────────────────────────────────────────────────┐ │ [ Search] [ Scrape] [⚖ Compare] 142ms · $0.001 / │ │ ⓘ [Modalities guide] │ ├──────────────────────────────────────────┬─────────────────────────────┤ │ {active tab content} │ ─ Config │ │ │ Provider [auto ∨] │ │ │ Serper $0.001 │ │ │ Tavily $0.008 │ │ │ Firecrawl (fetch) │ │ │ Type [web | news] │ │ │ Full page [ ] (scrape) │ │ │ Format [md|text|html] │ │ │ Rerank model [∨] │ └──────────────────────────────────────────┴─────────────────────────────┘从源码结构看这个外壳承担了三件事标签页编排SearchTab/ScrapeTab/CompareTab三个标签页均通过next/dynamic以ssr: false动态导入切换时才加载对应组件避免初始包体膨胀全局指标状态每个标签页通过onMetrics(latencyMs, costUsd)回调把本次调用的耗时与花费上抛TopBar 据此显示顶部的142ms · $0.001指标目录数据预取挂载时请求GET /api/search/providers拿到SearchProviderCatalogItem[]后一方面原样交给配置面板与对比页另一方面过滤出kind search的条目映射成SearchForm兼容的旧形状status: active | no_credentials、cost_per_query供搜索表单做徽章展示。默认配置状态在客户端内硬编码为const DEFAULT_CONFIG: ConfigState { provider: auto, // 自动选择最便宜的可用 Provider searchType: web, // web 或 news fetchFormat: markdown, // markdown / text / html fullPage: false, // 抓取时是否取整页 rerankModel: , // 可选的 rerank 模型 };Search 标签页查询、结果与 RerankSearch 标签页由 SearchTab.tsx/dashboard/search-tools/components/tabs/SearchTab.tsx) 组装既有组件SearchForm表单、ResultsPanel结果列表、RerankPanel重排序、SearchHistory历史四者同样以动态导入挂载。文档列出的能力在源码中均有对应查询到结果提交后向/api/v1/search即 API 端点POST /v1/search路由实现在 route.ts发请求响应包含results[]title、url、snippet、score、usage.search_cost_usd、metrics.response_time_ms/upstream_latency_ms等字段由SearchResponse接口完整描述15 秒前端超时每次搜索都创建AbortController并设置setTimeout(abort, 15_000)超时后向用户展示requestTimedOut错误防止上游挂起时页面假死Rerank 区在配置面板选择 rerank 模型后RerankPanel对结果重排并展示每条结果的positionDelta前后名次变化空状态未配置任何搜索 Provider 时给出带 CTA 的空状态引导跳转/dashboard/providers搜索历史SearchHistory.tsx以可折叠形式挂在配置面板内。一次搜索成功后标签页把metrics.response_time_ms与usage.search_cost_usd上报给外壳TopBar 的指标随即刷新——这也是文档中Provider 元数据cost、quota、status显示在 Config 面板的来源之一。Scrape 标签页URL 抓取与 256 KB 截断Scrape 标签页是 Studio 新增的核心能力链路为 ScrapeTab.tsx/dashboard/search-tools/components/tabs/ScrapeTab.tsx) → useScrapeFetch.ts/dashboard/search-tools/hooks/useScrapeFetch.ts) → ScrapeResult.tsx/dashboard/search-tools/components/ScrapeResult.tsx)。前端行为输入为 URL Full page 开关 格式选择器markdown/text/html格式与整页选项由共享配置面板下发URL 先经new URL()校验必须是http:/https:协议Provider 为auto时请求体不带provider字段由后端自动选择显式指定则原样传递useScrapeFetch封装了请求生命周期记录latencyMs、归一化响应为{ provider, url, content, links, metadata, screenshot_url }结构并对error/loading状态做受控管理ScrapeResult提供 Markdown 预览与 raw 原文两种视图。文档中的截断上限D21 决策在源码中落实为常量CONTENT_CAP_BYTES 256 * 1024内容超过256 KB时预览区只渲染前 256 KB并出现(truncated, view raw)黄色警告条点击后用只读大文本框90vw × 80vh 的模态层查看完整内容避免大响应卡死渲染进程元数据栏展示 provider、latency、response size按 B/KB/MB 格式化、links 数量以及上游返回的metadata.title/description。后端实现route.ts比文档描述更值得注意因为这里体现了 OmniRoute 一贯的配额感知回退策略请求体支持{ url, provider?, format?, depth?, wait_for_selector?, include_metadata? }由 Zod schemav1WebFetchSchema校验响应形状为{ provider, url, content, links, metadata, screenshot_url }自动选择走固定优先级池不指定 provider 时按WEB_FETCH_PROVIDERS的固定顺序遍历fill-first遇到整体处于限速态的 Provider 会跳过并记住第一个限速者继续向后找而不是让整个请求短路失败只有全部池耗尽才返回 429 All configured web-fetch providers are rate limited or quota-exhausted显式指定不回退明确指定某 provider 时不做静默降级——该 provider 限速就返回其自身的 429未配置返回 400 并提示去 dashboard 添加密钥避免以为在测 A 实际用了 B的歧义可重试状态白名单429 恒可重试402/403 只对firecrawl、tavily-search、tinyfish视为配额耗尽信号QUOTA_STATUS_PROVIDERS对jina-reader这类上游没有配额状态语义的 provider 则视为真正的鉴权/参数错误不再回退匿名降级部分 provider 上游提供无需 key 的匿名层这些 provider 的限速/缺 key 会降级为匿名尝试而非直接报错。Compare 标签页并行跑同一条查询CompareTab.tsx/dashboard/search-tools/components/tabs/CompareTab.tsx) 实现文档 D22 决策同一条 query 最多并行打到 4 个搜索 ProviderMAX_COMPARE_PROVIDERS 4仅列出kind search且status configured的条目其余灰置禁用并提示已达上限。执行细节从源码看用Promise.allSettled并行向/api/v1/search发起max_results: 10的请求单列失败不影响其他列失败列展示各自的错误信息每列记录四个指标latency优先取metrics.response_time_ms回退到本地计时、costusage.search_cost_usd、result count、response size响应 JSON 序列化后的字符数按 B/KB 显示表头对最优 latency 与最低 cost 的 provider 做高亮绿字URL 重叠计算底部摘要区以第一列为基准用computeOverlap计算共享URL数/该列结果数形如3/10的重叠率结果列表中凡是出现在 2 个及以上 provider 结果里的 URL 会加 ⭐ 标记帮助判断各索引源的覆盖差异运行结束后向外壳上报有效列中的最小 latency 各列 cost 总和作为顶部指标。共享配置面板Config PaneSearchToolsConfigPane.tsx/dashboard/search-tools/components/SearchToolsConfigPane.tsx) 常驻右侧、可折叠字段与文档表格一致字段说明结合源码取值Provider下拉框 状态徽章configured/missing/rate_limited默认auto搜索表单按costPerQuery展示各 provider 单价Typeweb或news仅搜索生效提交时以search_type覆盖表单值Full page抓取开关——抓取整页 vs 仅首屏可见内容Formatmarkdown/text/html仅抓取生效Rerank model可选对搜索结果做 LLM 重排History可折叠的搜索历史区配置变化通过onConfigChange(patch)以部分更新方式合并进ConfigState对当前激活标签页即时生效Scrape 页会在输入区下方实时回显当前 Format / Full page / Provider 取值方便核对。SearchConceptCard 概念卡片SearchConceptCard.tsx/dashboard/search-tools/components/SearchConceptCard.tsx) 是常驻、可折叠的说明性手风琴文档中定义的五个概念原样保留概念一句话解释Search获取一组网页结果title、URL、snippet、relevance scoreScrape抽取某个 URL 的完整内容markdown、text 或 HTMLCompare把同一条 query 在 N 个 provider 上并排运行Rerank通过 LLM 重排结果以提升与 query 的相关性Auto (cheapest)自动挑选当前可用的最便宜 providerProvider 目录GET /api/search/providers的扩展这一节是文档所述唯一后端改动。route.ts 的行为从源码看可以分为五步鉴权先经isAuthenticated校验未认证返回 401搜索 provider 列表以 searchRegistry.ts 的SEARCH_PROVIDERS为唯一事实源并发解析每个 provider 的凭据状态抓取 provider 列表抓取类没有注册表直接在路由内以FETCH_PROVIDERS常量硬编码 6 个条目firecrawl、jina-reader、tavily-search、tinyfish、nimble-search、anysearch-search各自携带costPerQuery、freeMonthlyQuota、fetchFormats如 firecrawl 支持markdown/html/links/screenshotjina-reader 支持markdown/text合并 防御性校验kind: search条目在前、kind: fetch在后整体过一遍SearchProviderCatalogResponseSchema.safeParse校验失败只打 warn 日志不中断返回向后兼容响应同时携带旧形状的data数组{ id, object: search_provider, created, name, search_types }既有消费方不受影响。每个条目的status是请求时实时推导的resolveProviderStatus的推导逻辑值得展开存在至少一个非限速 key →configured所有 key 均处于冷却/限速 → 先查凭据回退链getSearchCredentialFallbacks例如perplexity-search复用perplexity聊天 provider 的凭据回退可用则仍报configured否则rate_limited完全无凭据 → 同样先试回退链均无 →missing搜索 provider 启用回退解析useCredentialFallback true抓取 provider 传false直接按自身凭据判定。注册表中的每个搜索 provider 都带有完整的元数据例如serper-searchbaseUrl: https://google.serper.dev、costPerQuery: 0.001、freeMonthlyQuota: 2500、searchTypes: [web,news]、timeoutMs: 10_000、cacheTTLMs: 5minbrave-search则用x-subscription-token头、单 query $0.005、月上限 1000 次。字段中还有一个关键开关fallbackOnly被标记的 provider 会被排除在最便宜自动选择之外只有当没有任何已配置 provider 可用或被显式指定时才启用避免 cost 为 0 的免费源覆盖已付费源。代码导出与 Playground Studio 共用Studio 右上角的/按钮打开ExportCodeModal由 codeExport.ts 根据当前状态生成curl/Python/TypeScript三种片段的调用示例覆盖POST /v1/search与POST /v1/web/fetch两个端点。从 SearchToolsClient.tsx/dashboard/search-tools/SearchToolsClient.tsx) 可以看到导出状态的构造endpoint随当前标签页在search/web.fetch间切换baseUrl取window.location.origin并带上当前searchProvider/searchType/fetchFormat。API key 占位符固定为$OMNIROUTE_API_KEYD11 决策与 Playground Studio 共用一套导出逻辑详见 PLAYGROUND_STUDIO.md。一个可运行的抓取调用形态基于路由的入参 schema 归纳curl -X POST https://your-omniroute/v1/web/fetch \ -H Authorization: Bearer $OMNIROUTE_API_KEY \ -H Content-Type: application/json \ -d { url: https://example.com/article, format: markdown, depth: 0, wait_for_selector: null, include_metadata: true }搜索调用则形如{query: ..., provider: serper-search, search_type: web, max_results: 10}。具体字段以 v1WebFetchSchema 与src/app/api/v1/search/route.ts的校验为准。排障速查文档 Troubleshooting 表完整保留并结合源码补充了定位点现象原因处理Scrape 页提示 endpoint not available/v1/web/fetch未接线确认 src/app/api/v1/web/fetch/route.ts 存在且已部署Provider 目录全部显示missing凭据未配置到/dashboard/providers添加对应 provider 的 API key抓取内容被截断响应超过 256 KB 上限预期行为D21用 view raw 按钮查看全文Compare 页只有 2 个 provider触发限速冷却在 Config 面板查看各 provider 状态等待冷却或更换凭据表格里 Size 显示为原始 keyi18n 键缺失检查 locale 文件中search.size是否存在并重新构建 i18n补充两点从源码可验证的细节Compare 页在没有任何configured搜索 provider 时整体显示空状态与配置引导compare-no-providers不会发出请求Scrape 的错误信息取自响应的error.message网络异常则回退为 Network error排查上游 429/402 时可直接对照 rateLimit.ts 中rateLimitedProviderResponse生成的响应体。关键文件清单路径职责SearchToolsClient.tsx/dashboard/search-tools/SearchToolsClient.tsx)Studio 外壳、标签页编排、目录预取、指标聚合SearchToolsTopBar.tsx/dashboard/search-tools/components/SearchToolsTopBar.tsx)标签页 指标 导出按钮SearchToolsConfigPane.tsx/dashboard/search-tools/components/SearchToolsConfigPane.tsx)共享配置面板SearchConceptCard.tsx/dashboard/search-tools/components/SearchConceptCard.tsx)常驻概念说明卡ProviderCatalog.tsx/dashboard/search-tools/components/ProviderCatalog.tsx)带元数据的 provider 列表ScrapeResult.tsx/dashboard/search-tools/components/ScrapeResult.tsx)Markdown 预览 raw 切换 256KB 截断处理SearchTab.tsx/dashboard/search-tools/components/tabs/SearchTab.tsx) / ScrapeTab.tsx/dashboard/search-tools/components/tabs/ScrapeTab.tsx) / CompareTab.tsx/dashboard/search-tools/components/tabs/CompareTab.tsx)三个标签页useScrapeFetch.ts/dashboard/search-tools/hooks/useScrapeFetch.ts)抓取请求 hooksrc/app/api/search/providers/route.ts目录 API扩展kindstatus 抓取 providersrc/app/api/v1/web/fetch/route.ts抓取端点与配额感知回退searchRegistry.ts搜索 provider 元数据唯一事实源codeExport.tscurl / Python / TypeScript 片段生成与 Playground Studio 共用【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 352 providers (150 free), 1200 models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline Copilot. Quota-aware auto-fallback, RTKCaveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 550 contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表