← ソースコード説明書

packages/ai-gateway - LLM クライアント抽象化

概要

複数の LLM プロバイダ(OpenAI, Anthropic, Google Vertex AI, Google Gemini)を統一インターフェースで利用するための抽象化レイヤー。テキスト生成とベクトル埋め込みの両方をサポート。

ディレクトリ構成

packages/ai-gateway/
├── src/
│   ├── types.ts                      # インターフェース定義
│   ├── factory.ts                    # プロバイダファクトリ
│   ├── providers/
│   │   ├── openai.ts                 # OpenAI API クライアント
│   │   ├── anthropic.ts              # Anthropic API クライアント
│   │   ├── google.ts                 # Google Vertex AI
│   │   ├── google-ai.ts             # Google AI Gemini
│   │   ├── mock.ts                   # テスト用モック
│   │   ├── openai-embeddings.ts     # OpenAI 埋め込み
│   │   ├── google-ai-embeddings.ts  # Google 埋め込み
│   │   └── mock-embeddings.ts       # モック埋め込み
│   └── index.ts                      # 公開 API (18行)
├── __tests__/
│   ├── factory.test.ts
│   ├── mock.test.ts
│   ├── embedding-factory.test.ts
│   └── mock-embeddings.test.ts
├── package.json
├── tsconfig.json
└── vitest.config.ts

主要インターフェース

LLMClient

interface LLMClient {
  generate(params: GenerateParams): Promise<GenerateResult>;
}

interface GenerateParams {
  model: string;
  messages: Message[];
  temperature?: number;
  maxTokens?: number;
  responseFormat?: 'json' | 'text';
}

interface GenerateResult {
  text: string;
  tokensIn: number;
  tokensOut: number;
  model: string;
}

EmbeddingClient

interface EmbeddingClient {
  embed(params: EmbedParams): Promise<EmbedResult>;
}

interface EmbedParams {
  model: string;
  input: string | string[];
}

interface EmbedResult {
  embeddings: number[][];
  model: string;
  tokensUsed: number;
}

プロバイダ一覧

プロバイダファイル用途
OpenAIopenai.tsGPT-4o, GPT-4o-mini 等
Anthropicanthropic.tsClaude Sonnet, Claude Opus 等
Google Vertex AIgoogle.tsGemini (GCP 経由)
Google AIgoogle-ai.tsGemini (API キー経由)
Mockmock.tsテスト用

埋め込みプロバイダ

プロバイダファイルモデル
OpenAIopenai-embeddings.tstext-embedding-3-small 等
Google AIgoogle-ai-embeddings.tsembedding-001 等
Mockmock-embeddings.tsテスト用

ファクトリ

// テキスト生成
const client = createLLMClient('openai', { apiKey: '...' });
const result = await client.generate({ model: 'gpt-4o-mini', messages: [...] });

// 埋め込み
const embedder = createEmbeddingClient('openai', { apiKey: '...' });
const result = await embedder.embed({ model: 'text-embedding-3-small', input: '...' });

依存関係

外部ライブラリ

  • @google-cloud/vertexai — Google Vertex AI
  • @google/generative-ai — Google AI Gemini
  • @google-genai — Google GenAI

被依存

  • apps/hono (AI 執筆支援、RAG)

使用箇所

  • apps/hono/src/routes/assist.ts — 4段階 AI 執筆支援パイプライン
    • Stage 1 (章プロット): gpt-4o-mini
    • Stage 2 (話プロット): gpt-4o-mini
    • Stage 3 (本文生成): claude-sonnet
    • Stage 4 (.ks 変換): TypeScript テンプレート(LLM 不要)
  • apps/hono/src/lib/assist/hybrid-rag.ts — RAG ベクトル検索

テスト

  • factory.test.ts — プロバイダ生成テスト
  • mock.test.ts — モッククライアントテスト
  • embedding-factory.test.ts — 埋め込みファクトリテスト
  • mock-embeddings.test.ts — モック埋め込みテスト
Ad: stickyBottom (728x90)
kaedevn - ノベルゲームを作れるプラットフォーム