1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AI SDKのstreamTextを用いたOpenAI, Anthropic, Google, Fireworks.ai, Groq, Perplexity, Mistralの統合処理

Last updated at Posted at 2024-04-23

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の互換インターフェースを使っています。それぞれ定められた環境変数を設定しておくことで、openaigoogleなどはショートハンドなオブジェクトを利用することもできますが、ここではすべて明示的に初期化しています。

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,
});

ちなみに追加のプロバイダーを定義する方法も用意されています。今書こうとしていますが、ちょっと記述量が多くなりそうな雰囲気です。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?