はじめに
以下の記事にも書いていた「LM Studio の OpenAI互換の API + AI系の SDK を使ったローカルLLM」の話です。
●Vercel の AI SDK と LM Studio を使ったローカルLLM を組み合わせて試す【Node.js】 - Qiita
https://qiita.com/youtoy/items/7ec636b7086f107a9f5d
上記では Vercel の AI SDK を使っていましたが、今回は Mastra を使います。
※ API を扱う部分では、AI SDK の OpenAI Compatible Providers を使う形になります
さっそく試す
さっそく試していきます。
下準備
まずは下準備です。
LM Studio の準備
LM Studio側の下準備は、上で掲載していた記事の「LM Studio の準備」の部分をご参照ください。
ローカルサーバーとして動作させ、OpenAI互換の API を使える状態にできれば OK です。
Mastra のセットアップ
次に Mastra のセットアップです。以下のコマンドで @mastra/core
と、Vercel の AI SDK の OpenAI Compatible Providers( @ai-sdk/openai-compatible
)をインストールします。
npm i @mastra/core @ai-sdk/openai-compatible
記事執筆時点では、以下のバージョンのものがインストールされました。
Agent.streamVNext()/generateVNext() について
あとは、お試し用のコードを書いて、実行してみるだけです。
記事執筆時点では、Mastra の Agent.generate() を使うと、以下のエラーがでて「generateVNext()」を使うように促されます。
generateVNext() は、以下の記事に書いていたものです。
●Mastra の実験的機能「Agent.streamVNext()/generateVNext()」を Node.js で試す: V2モデル(AI SDK v5)対応の機能 - Qiita
https://qiita.com/youtoy/items/4e590ac1e9d7357d1401
ストリーミングの場合は「streamVNext()」というものを使う形になります。
お試し用のコードと実行結果
まずは、Agent.generate() を使ったコードを試します。モデルは google/gemma-3-270m-it を使いました。
import { Agent } from "@mastra/core/agent";
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
const lmstudio = createOpenAICompatible({
name: "lmstudio",
baseURL: "http://localhost:1234/v1",
apiKey: "lm-studio",
});
const agent = new Agent({
name: "LMStudio",
instructions: "日本語で簡潔に答えてください。",
model: lmstudio("gemma-3-270m-it"),
});
const res = await agent.generateVNext("あなたは誰?");
console.log(res.text);
上記を実行すると、以下のレスポンスを得られました。
この時、LM Studio のログを見てみると、以下が出ているのを確認できました。
お試し用のコードと実行結果【その2】
次に、ストリーミングも試してみます。モデルは google/gemma-3n-E4B を使い、コードは以下としました。
import { Agent } from "@mastra/core/agent";
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
const lmstudio = createOpenAICompatible({
name: "lmstudio",
baseURL: "http://localhost:1234/v1",
apiKey: "lm-studio",
});
const agent = new Agent({
name: "LMStudio",
instructions: "日本語で2文か3文で簡潔に答えてください。",
// model: lmstudio("gemma-3-270m-it"),
model: lmstudio("google/gemma-3n-e4b"),
});
(async () => {
const stream = await agent.streamVNext("生成AIについて説明して", {
format: "aisdk",
});
for await (const part of stream.fullStream) {
if (part.type === "text-delta") process.stdout.write(part.text);
}
process.stdout.write("\n");
})();
上記を実行した時の様子を動画にしてみました。以下のとおり、ストリーミングでのレスポンスが得られていることを確認できました。