尧图精选

Scira 开源 AI 搜索引擎:用 Vercel AI SDK 搭一套可复现的检索问答链路

🕒 发布时间:2026/10/1 7:17:31 📁 来源:尧图网络
1. Scira 开源 AI 搜索引擎到底解决了什么问题Scira 是一个用 Vercel AI SDK 搭起来的开源 AI 搜索引擎核心能力是把「用户提问 → 模型判断要不要搜 → 调用搜索工具 → 聚合结果 → 流式返回带引用的答案」这条链路完整跑通。它适合谁适合想自己搭一套检索问答系统、又不想从零写工具编排的开发者也适合想研究 Vercel AI SDK 流式工具调用tool calling streaming怎么落地的人。我第一次看 Scira 的代码时最直观的感受是它没有把「搜索」当成一个黑盒 API而是把搜索拆成了多个可插拔的工具——网页搜索、学术论文、社交平台、视频、航班、电影等。模型根据问题自己决定调哪个工具这就是典型的 agentic search 结构。excerpt 里提到它目前主要绑定 xAI 的 Grok但因为底层是 Vercel AI SDK换成 DeepSeek 这类兼容 OpenAI 协议的服务其实改动很小。这里有个关键点Vercel AI SDK 的streamText支持tools参数工具执行完会把结果回灌给模型模型再生成最终答案。Scira 的「引用来源」就是工具返回的结构化数据里带的 URL前端渲染时把它们列出来。理解这一点你就能明白为什么它「可复现」——整条链路没有私有魔法全是标准接口。我实测下来本地跑通 Scira 的最小结构需要三样东西一个能流式输出的模型服务、一组搜索工具的实现、一个把两者串起来的路由。下面我会按这个顺序拆重点放在你能直接复制粘贴的部分。如果你只是想先看看模型对话效果可以先用模型对话页面验证接口通不通再回来搭工具链。需要提前说明的是Scira 的搜索工具本身依赖外部搜索 API比如 Tavily、Exa 之类这些需要你自己申请 key。模型服务这块我用 TaoToken 做统一入口因为它兼容 OpenAI 协议Vercel AI SDK 里换个 baseURL 就能接。这样你就不用为了换模型去改一堆代码。2. 用 TaoToken 做模型入口的前置准备在动手改 Scira 之前先把模型入口理顺。Vercel AI SDK 默认走 OpenAI 的https://api.openai.com/v1我们要做的是把它指向自己的兼容端点。TaoToken 的 API 地址是https://taotoken.net/api注意这里不带任何查询参数直接作为 baseURL 用。第一步是拿 Key。打开 API Keys 页面https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite创建一个新 key复制出来。这个 key 后面会写进.env.local格式是sk-开头的一串字符。别把它提交到 gitScira 的.gitignore默认已经忽略了.env.local但你自己新建文件时留意一下。第二步是确认模型 ID。Vercel AI SDK 里调用模型时用的是模型标识符比如gpt-4o-mini、deepseek-chat这类。你可以在模型对话页面https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel_chatutm_campaignrewrite里先手动发一条消息确认这个模型 ID 能正常返回再写进代码。这一步能帮你排除掉「模型名写错」这种低级但高频的问题。第三步是理解 Scira 的模型配置位置。Scira 通常在lib/ai/providers.ts或类似文件里用createOpenAI创建 provider 实例。你要改的就是这个实例的baseURL和apiKey。如果你用的是ai-sdk/openai包写法是import { createOpenAI } from ai-sdk/openai; export const myProvider createOpenAI({ baseURL: process.env.OPENAI_BASE_URL, apiKey: process.env.OPENAI_API_KEY, });然后把OPENAI_BASE_URLhttps://taotoken.net/api和OPENAI_API_KEYsk-你的key写进.env.local。这样 Scira 里所有通过这个 provider 发起的请求都会走 TaoToken。如果你后面想接 Claude Code 那类编码场景可以另外看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite但那是另一条线本文聚焦搜索链路。这里有个容易踩的坑有些教程会让你把 baseURL 写成带/v1的完整路径。Vercel AI SDK 的 OpenAI provider 内部会自己拼/chat/completions所以你只需要给到/api这一层。多写或少写/v1都可能导致 404。我建议你先用 curl 测一下端点确认返回结构再改代码。3. 可复制的环境变量与路由配置片段这一节是全文最核心的部分给你能直接落地的配置。先看环境变量在项目根目录建.env.local# 模型入口 OPENAI_BASE_URLhttps://taotoken.net/api OPENAI_API_KEYsk-你的key OPENAI_MODELdeepseek-chat # 搜索工具以 Tavily 为例按你实际申请的服务填 TAVILY_API_KEYtvly-你的key # 应用自身 NEXT_PUBLIC_APP_URLhttp://localhost:3000注意OPENAI_MODEL这个变量Scira 有些版本是硬编码模型名的你需要找到调用处把它替换成process.env.OPENAI_MODEL。如果懒得改直接把硬编码那行的字符串换成你的模型 ID 也行。接下来是路由配置。Scira 的问答接口一般在app/api/search/route.ts或app/api/chat/route.ts。核心逻辑是用streamText把模型和工具串起来。下面是一个精简但可运行的版本import { streamText } from ai; import { myProvider } from /lib/ai/providers; import { webSearchTool } from /lib/tools/web-search; export const maxDuration 60; export async function POST(req: Request) { const { messages } await req.json(); const result streamText({ model: myProvider(process.env.OPENAI_MODEL!), messages, tools: { webSearch: webSearchTool, }, maxSteps: 5, }); return result.toDataStreamResponse(); }这里几个参数值得说清楚。tools里注册的工具模型会在需要时自动调用maxSteps: 5限制最多几轮「模型思考 → 调工具 → 再思考」防止无限循环toDataStreamResponse()是 Vercel AI SDK 提供的流式响应封装前端用useChat就能接。工具本身的实现长这样import { tool } from ai; import { z } from zod; export const webSearchTool tool({ description: 搜索网页获取实时信息当问题涉及最新事件或需要外部资料时使用, parameters: z.object({ query: z.string().describe(搜索关键词), }), execute: async ({ query }) { const res await fetch(https://api.tavily.com/search, { method: POST, headers: { Content-Type: application/json }, body: JSON.stringify({ api_key: process.env.TAVILY_API_KEY, query, max_results: 5, }), }); const data await res.json(); return data.results.map((r: any) ({ title: r.title, url: r.url, content: r.content, })); }, });工具返回的数组里带url这就是前端渲染引用来源的数据源。Scira 前端会把toolInvocations里的结果提取出来展示。你只要保证工具返回结构里有 URL 字段引用就能显示。如果你用的是 Cline MCP 或类似工具链配置逻辑是一样的三件套Base URL 填https://taotoken.net/apiKey 填你的sk-Model ID 填你验证过的模型名。Codex 的auth.json也是同样三个字段别漏了 Model ID否则会报模型不存在。4. 验证一次从提问到引用返回的完整请求配置写完启动npm run dev打开http://localhost:3000。现在做一次完整验证在输入框里问一个需要实时信息的问题比如「最近有什么新的开源 AI 搜索项目」。预期行为是这样的前端先显示模型正在思考然后你会看到它触发了一次webSearch工具调用界面上可能显示「正在搜索…」接着流式吐出答案答案末尾或侧边列出几条带链接的来源。打开浏览器开发者工具的 Network 面板找到那个流式请求Response 里应该能看到tool-invocations和text-delta交替出现的数据块。如果你想用命令行验证可以直接 curl 你的路由curl -X POST http://localhost:3000/api/search \ -H Content-Type: application/json \ -d {messages:[{role:user,content:介绍一下 Vercel AI SDK 的 tool calling}]}返回的是一串 SSE 格式的流你会看到类似0:...的文本增量和9:{...}的工具调用记录。如果只看到文本没有工具调用说明模型判断这个问题不需要搜索换个明确需要实时信息的问题再试。成功的关键标志有三个一是模型确实调用了工具不是直接编答案二是工具返回的数据被模型引用进了回答三是前端能渲染出可点击的来源链接。三个都满足说明你的检索问答链路通了。我试过把maxSteps设成 1结果模型调完工具就没机会生成最终答案了返回的是工具原始数据。所以这个值至少给 2给 5 比较稳妥。另外maxDuration在 Vercel 部署时要注意免费版有执行时长限制本地开发无所谓。5. 本篇常见报错与排查对照跑这条链路报错基本集中在几个地方。下面按真实错误信息对照排查。401 Unauthorized / invalid api key最常见。先检查.env.local里的OPENAI_API_KEY有没有多余空格或换行再确认 baseURL 是不是https://taotoken.net/api而不是带/v1的版本。如果 key 本身没问题去 API Keys 页面确认这个 key 没有被删除或过期。改完环境变量一定要重启 dev serverNext.js 不会热加载.env.local。local proxy failed / fetch failed这个通常出现在工具执行阶段不是模型阶段。检查你的搜索 API key 是否有效以及execute函数里的 fetch 地址能不能通。如果你在容器里跑注意容器网络是否能访问外网。这个错误和模型入口无关别去改 baseURL。reading choices / Cannot read properties of undefined说明返回结构不是预期的 OpenAI 格式。可能是 baseURL 指错了端点或者模型 ID 不存在导致服务端返回了错误对象。先用 curl 直接打https://taotoken.net/api/chat/completions看返回确认结构里有choices字段再回来查代码。OAuth / authentication_error如果你在 Claude Code 或类似工具里看到这个通常是认证方式没配对。这类工具要用 API Key 模式而不是 OAuth 模式配置里找ANTHROPIC_BASE_URL或对应字段填https://taotoken.net/apiKey 填sk-开头的那串。具体接入方式可以看接入文档https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite里面有各客户端的字段对照。模型不调用工具直接编答案不是报错但很常见。检查工具的description写得够不够明确模型靠这段描述判断何时调用。把「搜索网页」改成「当问题涉及最新事件、实时数据或需要外部资料时搜索网页获取信息」触发率会明显提高。引用来源不显示前端拿不到 URL。检查工具返回的数组里每个对象是否有url字段以及前端提取逻辑是否匹配这个字段名。字段名对不上数据在但渲染不出来。排查顺序建议从模型入口开始先用模型对话页面确认 key 和模型 ID 可用再查工具最后查前端渲染。这样能把问题范围快速缩小到一层。6. 把这条链路用起来链路跑通之后你可以按自己的需求替换工具。Scira 原版有学术、社交、视频等多个工具你完全可以只保留网页搜索或者加一个查数据库的工具。Vercel AI SDK 的tool函数是通用的只要execute返回结构化数据模型就能用。如果你打算长期跑编码类或 agent 类任务可以了解下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite它和搜索链路是互补的。日常调试模型输出用模型对话页面最快。所有接入相关的字段和示例接入文档里都有遇到配置问题先翻那里。最后留一个实用技巧把maxSteps和工具的description当成两个调优旋钮。前者控制搜索深度后者控制搜索触发率。大部分「答得不好」的问题调这两个比换模型更有效。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →