連携
Vercel AI SDK
Thunderbit を streamText / generateText エージェント用の TypeScript Tool としてラップ
Vercel AI SDK の tool() ヘルパーは、任意の TypeScript 関数を LLM が呼び出せるものに変えます。/distill をラップすれば、モデルは会話の途中でライブの Web ページを読めます。
インストール
npm install ai @ai-sdk/openai zodTool を定義
import { tool } from 'ai';
import { z } from 'zod';
const API = 'https://openapi.thunderbit.com/openapi/v1';
const H = { Authorization: `Bearer ${process.env.THUNDERBIT_API_KEY}` };
export const readUrl = tool({
description:
'Fetch a URL and return clean Markdown. Use for any web research task: docs, articles, product pages.',
parameters: z.object({
url: z.string().url(),
renderMode: z.enum(['basic', 'advanced']).default('basic'),
}),
execute: async ({ url, renderMode }) => {
const res = await fetch(`${API}/distill`, {
method: 'POST',
headers: { ...H, 'Content-Type': 'application/json' },
body: JSON.stringify({ url, renderMode }),
});
const json = await res.json();
return json.data.markdown;
},
});streamText で使う
import { openai } from '@ai-sdk/openai';
import { streamText } from 'ai';
const result = streamText({
model: openai('gpt-4o'),
tools: { readUrl },
maxSteps: 5,
prompt: 'Summarize the latest post on https://vercel.com/blog',
});
for await (const chunk of result.textStream) process.stdout.write(chunk);ヒント
executeから返す前に Markdown を ~8k トークンに制限 —— コンテキストの肥大化を防止- 複数 URL のファンアウトには、
/batch/distillを裏に持つ 2 つ目のreadUrlsTool を公開 renderMode: 'advanced'は JS 重めのページに限定 ——basicは 3-5 倍安い