VercelのAI SDKを使った処理の記事を書いたばかりですが、なんかまた新しいインターフェースが増えているようです。積極的に開発されているライブラリーを使い、かつexperimentalな機能を使うと更新が多くて大変ですが、他の人も苦労していると信じて、別記事として記載します。
結論として、タイトルに書いた各ベンダーのモデルについて、こんな感じで呼び出せるようになります。めちゃめちゃシンプルですね。
const aiChatModel:LanguageModelV1 = aiChatModelFactory(modelData)
const result = await experimental_streamText({
model: aiChatModel,
messages: messages as ExperimentalMessage[],
})
return new StreamingTextResponse(result.toAIStream())
MaxTokens
などを指定する場合はexperimental_streamText
の引数に設定します。
ここで、aiChatModelFactory
は下記のように記述しています。
function aiChatModelFactory(model: ChatModel):LanguageModelV1 {
// key is actually ModelProvider
const providerMap:{[key:string]:LanguageModelV1} = {
'openai': openai.chat(model.sdkModelValue),
'google': google.chat(model.sdkModelValue),
'fireworksai': fireworks.chat(model.sdkModelValue),
'groq': groq.chat(model.sdkModelValue),
'perplexity': perplexity.chat(model.sdkModelValue),
'anthropic': anthropic.chat(model.sdkModelValue),
'mistral': mistral.chat(model.sdkModelValue),
}
const aiChatModel = providerMap[model.provider as string]
if (!aiChatModel) {
console.error('unexpected model', model)
throw new Error('unexpected request')
}
return aiChatModel
}
それぞれのモデルは、下記のように定義されています。見ての通り、Fireworks.ai、Groq、PerplexityについてはOpenAIの互換インターフェースを使っています。それぞれ定められた環境変数を設定しておくことで、openai
、google
などはショートハンドなオブジェクトを利用することもできますが、ここではすべて明示的に初期化しています。
import { createOpenAI } from '@ai-sdk/openai';
import { createMistral } from '@ai-sdk/mistral';
import { createGoogleGenerativeAI } from '@ai-sdk/google';
import { createAnthropic } from '@ai-sdk/anthropic';
const openai = createOpenAI({
apiKey: process.env.OPENAI_API_KEY,
});
const fireworks = createOpenAI({
apiKey: process.env.FIREWORKS_API_KEY,
baseURL: 'https://api.fireworks.ai/inference/v1',
});
const groq = createOpenAI({
apiKey: process.env.GROQ_API_KEY,
baseURL: 'https://api.groq.com/openai/v1',
});
const perplexity = createOpenAI({
apiKey: process.env.PERPLEXITY_API_KEY,
baseURL: 'https://api.perplexity.ai/',
});
const anthropic = createAnthropic({
apiKey: process.env.ANTHROPIC_API_KEY,
});
const google = createGoogleGenerativeAI({
apiKey: process.env.GOOGLE_API_KEY,
});
const mistral = createMistral({
apiKey: process.env.MISTRAL_API_KEY,
});
ちなみに追加のプロバイダーを定義する方法も用意されています。今書こうとしていますが、ちょっと記述量が多くなりそうな雰囲気です。