Vercel AI SDK
諸々のAIサービスと連携した機能を簡易に実装できるようにするlibrary
Next.jsやReact以外もサポートしてる
npmのpackage名はai
$ npm i ai
空いてたんだmrsekut.icon
Vercel Inc.製
website
playground
普通にすごい
この辺をサポートしてる
OpenAI
Azure OpenAI
Amazon Bedrock
Anthropic
Cohere
Fireworks.ai
Google
Hugging Face
Inkeep
LangChain
replicate.com
Mistral
Perplexity.ai
#WIP
SSEとかを簡易にしてくれるやつ?
現在サポートされてるのは、Chatと生成UIがほぼほぼって感じだmrsekut.icon
whisper周りはまだなさそう
ai/rscとは
https://sdk.vercel.ai/docs/concepts/ai-rsc
「rsc」ってなに
react server componentsか
useCompletion
2つのStateに分けて考える
https://sdk.vercel.ai/docs/concepts/ai-rsc#ai-and-ui-state
AIState
AIStateは、LLMが読み取る必要のあるすべてのコンテキストのJSON表現である。チャットアプリの場合、AIStateは一般的にユーザーとアシスタントの間のテキストの会話履歴を保存します。実際には、各メッセージのcreatedAtのような他の値やメタ情報を格納するために使用することもできます。デフォルトのAIStateは、サーバーとクライアントの両方でアクセス/変更することができます。DeepL.icon
UIState
UIStateは、アプリケーションがUIを表示するために使うものだ。これは完全にクライアントサイドのステートで(useStateに非常に似ている)、LLMから返されたデータやUIエレメントを保持することができる。このステートはどのようなものでも良いが、サーバーからアクセスすることはできない。DeepL.icon
例
例えばこんな感じでOpenAIStream()を呼べばStreamで返してくれて
code:app/api/chat/route.ts
import { OpenAIStream, StreamingTextResponse } from 'ai';
export async function POST(req: Request) {
const { messages } = await req.json();
const response = await openai.chat.completions.create({
model: 'gpt-3.5-turbo',
stream: true,
messages,
});
const stream = OpenAIStream(response);
return new StreamingTextResponse(stream);
}
clientではuseChatでそれを受け取れる
https://sdk.vercel.ai/docs/api-reference/use-chat
code:ts
import { useChat } from 'ai/react';
export default function Chat() {
const { messages, input, handleInputChange, handleSubmit } = useChat();
return (
<div className="flex flex-col w-full max-w-md py-24 mx-auto stretch">
{messages.map(m => (
<div key={m.id} className="whitespace-pre-wrap">
{m.role === 'user' ? 'User: ' : 'AI: '}
{m.content}
</div>
))}
</div>
);
}
streamText()
https://ai-sdk.dev/docs/reference/ai-sdk-core/stream-text
convertToModelMessages
experimental_createMCPClient
tool()
https://ai-sdk.dev/docs/ai-sdk-core/tools-and-tool-calling
https://ai-sdk.dev/docs/foundations/tools
https://ai-sdk.dev/docs/reference/ai-sdk-core/tool
Schema Discovery
MCP サーバーが提供するツールのスキーマを自動的に取得してツールを作成する。実装が簡単で、MCP サーバーの変更を自動で同期できる。一方で TypeScript の型安全性が得られない、使用したいツールを選択できないというデメリットがある ref
Schema Definition
Zod を使用してツールのスキーマを手動で定義する。型安全性が得られ、明示的に使用するツールを選択できる。一方で MCP サーバーの変更を手動で同期する必要があり保守すべきコードが増えるというデメリットがある ref