问答

Node.js 智能体(Vercel AI SDK)怎么把 TikTok、YouTube 数据做成工具?

简短回答

每个接口包成一个工具:zod 定义参数,execute 里发一次 fetch。模型选工具,你的代码调 okdata,再把精简后的 JSON 交回去。TikTok 搜索工具每次 $0.002,约 30 条视频;YouTube 字幕工具每个视频 $0.004。服务器上除了这次 HTTP 请求,什么都不用跑。

一个增长团队的 Next.js 后台里有个对话框,大家会问:这周 TikTok 上的创作者怎么聊我们这个品类?YouTube 上排名靠前的测评到底说了什么?要回答,智能体需要两个工具:一个搜 TikTok,一个读 YouTube 视频字幕。两个都只是一次 fetch,所以放在 Vercel 函数或任何 Node 18 以上的服务器里都能跑,不需要浏览器,也不需要抓取库。

工具代码

import { generateText, tool, stepCountIs } from 'ai';
import { openai } from '@ai-sdk/openai';
import { z } from 'zod';

const API = 'https://api.okdata.online';
const headers = { Authorization: `Bearer ${process.env.OKDATA_API_KEY}` };

async function call(path: string, params: Record<string, string>) {
  const res = await fetch(`${API}${path}?${new URLSearchParams(params)}`, { headers });
  const body = await res.json();
  if (body.code !== 'ok') return { error: body.code, message: body.message, retry: body.retry };
  return body.data;
}

const tools = {
  searchTikTok: tool({
    description: 'Search public TikTok videos. One call returns one page of videos and is billed once.',
    inputSchema: z.object({
      query: z.string(),
      sort: z.enum(['relevance', 'latest', 'most_liked']).optional(),
    }),
    execute: ({ query, sort }) =>
      call('/v1/tiktok/videos/search', {
        query,
        ...(sort ? { sort } : {}),
        fields: 'id,url,text,published_at,metrics.views,metrics.likes,author.username',
      }),
  }),
  youtubeTranscript: tool({
    description: 'Plain-text transcript of one YouTube video, by its 11-character ID.',
    inputSchema: z.object({ id: z.string().length(11), lang: z.string().optional() }),
    execute: ({ id, lang }) =>
      call('/v1/youtube/videos/transcript/get', { id, ...(lang ? { lang } : {}), fields: 'text' }),
  }),
};

const { text } = await generateText({
  model: openai(process.env.OPENAI_MODEL ?? 'gpt-4.1-mini'),
  tools,
  stopWhen: stepCountIs(8),
  prompt: '这周 TikTok 创作者怎么聊升降桌?再读一个 YouTube 上排名靠前的测评。',
});
console.log(text);

字幕工具里的 fields: 'text' 会去掉带时间戳的分段,只留全文,做总结用这个就够了。模型换成 DeepSeek、通义千问等,改用对应的 provider 包即可。背后的接口是 TikTok 视频搜索和 YouTube 视频字幕。

每个问题花多少

问题 调用次数 费用
TikTok 搜 2 次 2 $0.004
搜 2 次,再读 3 份字幕 5 {{cost:tiktok.videos.search2+youtube.videos.transcript.get3}}
上限:8 步全用来读字幕 8 $0.032

注意事项

  • 字幕接口要的是视频 ID,不是链接。告诉模型传 v= 或 youtu.be/ 后面那 11 位。
  • 部署在 Vercel 上的话,把这个路由的 maxDuration 调到 60 秒以上,别让平台偶尔的慢响应被你的函数先掐断。
  • 没有字幕的视频会返回错误,不扣费。模型看到错误会自己换一个视频。
  • 目前没有列出 TikTok 账号全部作品的接口,也没有 TikTok 热门话题标签的接口,用关键词或创作者名字去搜。
  • TikTok 和 YouTube 上的文字都是陌生人写的,只放在工具结果里,别拼进系统提示词。

其他做法

AI SDK 自带的 MCP 客户端也可以加载 https://api.okdata.online/mcp,请求头一样带 Authorization,智能体就能通过 find、describe、call 用上全部接口,不局限于这两个固定工具。如果只要 YouTube 的搜索元数据,官方 YouTube Data API 在谷歌每日配额内免费,已经有 Google Cloud 项目的话值得用。直接抓字幕的 npm 包也免费,只是在云服务器 IP 上经常被拦。重试和错误处理见错误码页。

更新于