# 機能設計書 81-言語モデルプロバイダ取得

## 概要

本ドキュメントは、Giselleプラットフォームにおける言語モデルプロバイダ取得機能の設計を定義する。この機能は、利用可能なAI言語モデルプロバイダ（Anthropic、Google、OpenAI、Perplexity等）の一覧を取得し、ワークフローエディタでのモデル選択を可能にする。

### 本機能の処理概要

**業務上の目的・背景**：AIワークフローを構築する際、ユーザーは様々な言語モデルプロバイダから適切なモデルを選択する必要がある。この機能は、システムで利用可能なすべての言語モデルプロバイダ情報を一元的に提供し、ユーザーがテキスト生成ノードや画像生成ノードで使用するモデルを選択できるようにする。

**機能の利用シーン**：
- ワークフローエディタでテキスト生成ノードを追加・編集する際のモデル選択
- 画像生成ノードで使用するAIモデルの選択
- システム管理者が利用可能なプロバイダを確認する場合

**主要な処理内容**：
1. Giselleコンテキストから設定済みの言語モデルプロバイダ一覧を取得
2. プロバイダ情報（プロバイダ名、利用可能なモデルID、設定情報）を返却
3. HTTPルーター経由でクライアントに提供

**関連システム・外部連携**：
- Anthropic API（Claude系モデル）
- Google AI API（Gemini系モデル）
- OpenAI API（GPT系モデル）
- Perplexity API

**権限による制御**：この機能は認証されたユーザーであれば誰でも利用可能。プロバイダの実際の利用可否は、チームのサブスクリプションや使用量制限によって制御される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 17 | ワークフローエディタ画面 | API連携 | 利用可能な言語モデルプロバイダの一覧取得 |

## 機能種別

データ取得（Read）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| なし | - | - | この機能は入力パラメータを必要としない | - |

### 入力データソース

- GiselleContext.llmProviders: システム初期化時に設定された言語モデルプロバイダ配列

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| providers | LanguageModelProvider[] | 利用可能な言語モデルプロバイダの配列 |
| providers[].provider | string | プロバイダ識別子（"anthropic", "google", "openai", "perplexity"） |
| providers[].models | object[] | 利用可能なモデルの配列 |
| providers[].models[].id | string | モデルID |
| providers[].models[].configurations | object | モデル固有の設定情報 |

### 出力先

- HTTP JSON Response: クライアントアプリケーションへ返却

## 処理フロー

### 処理シーケンス

```
1. HTTPリクエスト受信
   └─ /api/giselle/getLanguageModelProviders エンドポイントへのPOSTリクエスト
2. ルーター処理
   └─ jsonRoutes.getLanguageModelProviders ハンドラーが呼び出される
3. コンテキスト参照
   └─ giselle.getLanguageModelProviders() を実行
4. プロバイダ取得
   └─ context.llmProviders から設定済みプロバイダを取得
5. レスポンス返却
   └─ JSON形式でプロバイダ一覧を返却
```

### フローチャート

```mermaid
flowchart TD
    A[HTTPリクエスト受信] --> B[ルーター処理]
    B --> C[getLanguageModelProviders呼び出し]
    C --> D[context.llmProvidersを参照]
    D --> E[プロバイダ一覧を取得]
    E --> F[JSONレスポンス返却]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-81-01 | デフォルト値 | llmProvidersが未設定の場合は空配列を返却 | config.llmProvidersがundefinedの場合 |
| BR-81-02 | プロバイダ順序 | 設定された順序でプロバイダを返却 | 常時 |

### 計算ロジック

特になし。単純なデータ参照のみ。

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| なし | - | - | データベースアクセスなし（インメモリ設定の参照のみ） |

### テーブル別操作詳細

データベースアクセスは発生しない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| 500 | Internal Server Error | 予期しないエラー発生時 | エラーログを確認し、システム設定を見直す |

### リトライ仕様

リトライ不要（同期的な設定参照のみ）

## トランザクション仕様

データベースアクセスがないため、トランザクション管理は不要。

## パフォーマンス要件

- レスポンス時間: < 10ms（インメモリ参照のため高速）
- スループット: 制限なし

## セキュリティ考慮事項

- 認証: 認証済みユーザーのみアクセス可能
- 機密情報: プロバイダのAPIキー等の機密情報は含まれない
- 監査ログ: 通常の参照処理のため監査ログは不要

## 備考

- この機能はシステム起動時に設定されたプロバイダ情報を返却するのみで、動的な変更は反映されない
- 新しいプロバイダを追加する場合は、language-model-registryパッケージの更新が必要

---

## コードリーディングガイド

本機能を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: データ構造を理解する

言語モデルプロバイダの型定義を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | language-model/index.ts | `packages/language-model/src/index.ts` | LanguageModelProvider型の定義 |
| 1-2 | context.ts | `packages/giselle/src/types/context.ts` | GiselleContext.llmProvidersの型定義 |

**読解のコツ**: Zod v4を使用した型定義パターンを理解すること。`z.infer`で型を抽出している。

#### Step 2: エントリーポイントを理解する

HTTP APIエンドポイントの処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | router.ts | `packages/http/src/router.ts` | getLanguageModelProvidersルートの定義（61-67行目） |

**主要処理フロー**:
1. **61-67行目**: jsonRoutes.getLanguageModelProvidersハンドラー定義
2. **63行目**: giselle.getLanguageModelProviders()の呼び出し
3. **65行目**: JsonResponse.jsonでレスポンス返却

#### Step 3: コア実装を理解する

実際のプロバイダ取得処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | get-language-model-providers.ts | `packages/giselle/src/configurations/get-language-model-providers.ts` | プロバイダ取得の実装（3-5行目） |
| 3-2 | giselle.ts | `packages/giselle/src/giselle.ts` | Giselleファクトリでのメソッド公開（149行目） |

**主要処理フロー**:
- **3-5行目**: context.llmProvidersを直接返却するシンプルな実装

### プログラム呼び出し階層図

```
NextGiselle (HTTP Handler)
    │
    ├─ jsonRoutes.getLanguageModelProviders
    │      │
    │      └─ giselle.getLanguageModelProviders()
    │             │
    │             └─ getLanguageModelProviders({ context })
    │                    │
    │                    └─ context.llmProviders (直接参照)
    │
    └─ JsonResponse.json(providers)
```

### データフロー図

```
[入力]               [処理]                    [出力]

HTTPリクエスト ───▶ router.ts ───▶ JSON Response
    │                   │
    │                   ▼
    │              giselle.ts
    │                   │
    │                   ▼
    │     get-language-model-providers.ts
    │                   │
    │                   ▼
    │         GiselleContext.llmProviders
    │
    └─────────────────────────────────────▶ LanguageModelProvider[]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| get-language-model-providers.ts | `packages/giselle/src/configurations/get-language-model-providers.ts` | ソース | コア実装 |
| giselle.ts | `packages/giselle/src/giselle.ts` | ソース | Giselleファクトリ、メソッド公開 |
| router.ts | `packages/http/src/router.ts` | ソース | HTTPルーティング定義 |
| context.ts | `packages/giselle/src/types/context.ts` | ソース | GiselleContext型定義 |
| next-giselle-engine.ts | `packages/nextjs/src/next-giselle-engine.ts` | ソース | Next.js統合HTTPハンドラー |
