@godai_dev/llm
v0.1.0
Published
GDI 共通 LLM 基盤(gdi-llm-proxy)クライアント SDK。gdi-auth auth_token を Bearer で転送し、Gemini 応答(stream/非stream)を数行で呼び出す
Readme
@godai_dev/llm
GDI 共通 LLM 基盤(gdi-llm-proxy Worker、llm.gdidatahub.net)を数行で呼び出すためのクライアント SDK です。
server-side 専用です(Cloudflare Workers / Pages Functions / Node.js 内でのみ動作を想定)。
AI SDK は SDK 内部に一切含みません(AI SDK は Worker 側で完結)。ブラウザから直接呼び出すことは想定していません
(token を明示的に渡す設計上、ブラウザに置くと token が露出します)。
インストール
npm install @godai_dev/llm使い方
token を明示的に渡す(正 API)
import { GodaiLLM } from '@godai_dev/llm';
const llm = new GodaiLLM({ token: authToken, appId: 'haikikanri' });
const res = await llm.chat([{ role: 'user', content: 'こんにちは' }]);
console.log(res.content);token: gdi-auth のauth_token(呼び出し元が明示的に渡す。SDK は検証しません — 検証は Worker 側の責務)appId: コスト按分用のアプリ識別子(自己申告・非シークレット・任意)。X-App-Idヘッダとして送出されますbaseURL: Worker のベース URL(デフォルト:https://llm.gdidatahub.net)
Cookie ベースの便宜ヘルパ
import { GodaiLLM } from '@godai_dev/llm';
const llm = GodaiLLM.fromRequest(request, { appId: 'haikikanri' });
return llm.stream(messages);Request の auth_token Cookie から token を取り出して構築します。Cookie が Worker に届かない構成
(gdi-app.jp 側アプリ等)では使えないため、その場合は token を別経路で取得し new GodaiLLM({ token }) に
明示的に渡してください。
非ストリーミング応答(chat)
const res = await llm.chat([{ role: 'user', content: 'こんにちは' }]);
// res.content / res.usage.promptTokens / res.usage.completionTokens / res.model短い回答・sync が必要な場面向け。Worker の JSON レスポンスをそのまま ChatResponse にマッピングします。
ストリーミング応答(stream)
export async function POST(request: Request) {
const llm = GodaiLLM.fromRequest(request);
return llm.stream(messages);
}Worker から返される AI SDK data stream protocol の Response をそのまま返します。useChat フック
(@ai-sdk/react)は Response を直接受け取れるため、Pages Functions / Worker で
return llm.stream(messages) と書くだけで動作します。
メッセージの制約
messages は 'user' / 'assistant' ロールのみ受け付けます。'system' ロールは Prompt Injection 防止
のため拒否されます(型レベルで制限した上に、SDK 内部でも runtime 検証しています)。空配列も拒否されます。
エラーハンドリング
chat() / stream() は失敗時に GodaiLLMError(Error のサブクラス)を throw します。
status / body / code(あれば)/ retryAfter(あれば)を保持します。
import { GodaiLLMError } from '@godai_dev/llm';
try {
const res = await llm.chat(messages);
} catch (err) {
if (err instanceof GodaiLLMError) {
switch (err.code) {
case 'TOKEN_MISSING':
case 'EXPIRED':
// 401: token が無い / 期限切れ。再ログインを促す
break;
case 'INVALID_TOKEN':
case 'FORBIDDEN':
// 403: token が不正、またはこのアプリ・ユーザーに権限がない
break;
case 'AUTH_UNAVAILABLE':
// 503: gdi-auth 側の障害。時間をおいて再試行
break;
case 'RATE_LIMITED':
// 429: レート制限。err.retryAfter(Retry-After ヘッダ値)を見て再試行間隔を決める
break;
case 'PAYLOAD_TOO_LARGE':
// 413: メッセージ件数・文字数が上限超過。入力を減らす
break;
default:
// 400(JSON不正・モデル不正・role不正等)/ 500/502/504(Worker・プロバイダ障害)は
// code が付かない場合がある。err.status で分岐する
break;
}
}
}セキュリティ上の注意:
GodaiLLMErrorのbody(Worker の生レスポンス)はログ出力用です。 クライアントへのレスポンスにはcodeのみを使用し、bodyをそのまま転送しないでください。
対応モデル
現時点では以下の 1 モデルのみ対応しています(ChatOptions.model 省略時のデフォルト)。
| ModelId | ラベル | プロバイダ |
| --- | --- | --- |
| gemini-3.1-flash-lite | Gemini 3.1 Flash Lite | google |
MODELS / SUPPORTED_MODEL_IDS / isModelId / getProvider を import することで、対応モデルの一覧・
判定に利用できます。
