> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fim.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# 環境変数

> FIM One の完全な設定リファレンス。

すべての設定は `.env` を使用して行われます。`example.env` をコピーして値を入力してください：

```bash theme={null}
cp example.env .env
```

## 設定レベル

各統合には、その重要度を示す設定レベルがあります：

| レベル             | 意味        | 設定されていない場合の動作                                     |
| --------------- | --------- | ------------------------------------------------- |
| **Required**    | コアシステム依存  | システムがエラーになります — チャットと主要機能は動作しません                  |
| **Recommended** | 重要な機能の有効化 | グレースフルデグラデーション — 機能は目に見える形で利用不可になりますが、システムは実行されます |
| **Optional**    | 拡張機能      | 透過的デグラデーション — システムは正常に動作し、機能は単に存在しません             |

> **注**: 管理者が設定したモデル（Admin → Models ページ）は、LLM 環境変数の代わりになります。ヘルスチェックは両方のソースを考慮します。

***

## フロントエンド（ローカル開発のみ）

フロントエンドには**ローカル開発のみ**の別の環境ファイルがあります：`frontend/.env.local`。

> **このファイルは Docker では使用されません。** Docker コンテナ内では、Next.js が `/api/*` を Python バックエンドに内部的にプロキシします（ポート 8000 はコンテナ内部）ため、フロントエンド環境ファイルは不要です。

ローカル開発では、デフォルト設定がそのまま機能します — バックエンドがデフォルトポートで実行されている場合、`frontend/.env.local` を作成する**必要はありません**。

オーバーライドが必要な場合は、`frontend/.env.local` を手動で作成してください：

```bash theme={null}
echo 'NEXT_PUBLIC_API_URL=http://localhost:9000' > frontend/.env.local
```

| 変数                    | デフォルト                          | 説明                                                                                                                                            |
| --------------------- | ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `NEXT_PUBLIC_API_URL` | `http://localhost:8000` *(自動)* | **ブラウザ**が直接 API 呼び出し（OAuth リダイレクト、ストリーミング）に使用するバックエンド URL。未設定の場合は `window.location` から自動検出されます — ローカルでバックエンドが非標準ポートで実行されている場合のみオーバーライドしてください。 |

> **ビルド時の注意**：`NEXT_PUBLIC_*` 変数は `pnpm build` 時に JS バンドルに埋め込まれます。実行時に変更する場合（例：ルート `.env` 経由）は効果がありません — これが、ローカル開発のみで `frontend/.env.local` に配置される理由です。

## LLM (必須)

| 変数                                | 必須     | デフォルト                                      | 説明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| --------------------------------- | ------ | ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `LLM_API_KEY`                     | **はい** | —                                          | LLM プロバイダーの API キー                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
| `LLM_BASE_URL`                    | いいえ    | `https://api.openai.com/v1`                | OpenAI 互換 API のベース URL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
| `LLM_MODEL`                       | いいえ    | `gpt-4o`                                   | メインモデル — 計画、分析、ReAct 智能体に使用                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
| `FAST_LLM_MODEL`                  | いいえ    | *(`LLM_MODEL` にフォールバック)*                   | 高速モデル — DAG ステップ実行に使用 (低コスト、高速)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
| `LLM_TEMPERATURE`                 | いいえ    | `0.7`                                      | デフォルトサンプリング温度                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `LLM_CONTEXT_SIZE`                | いいえ    | `128000`                                   | メイン LLM の上下文窓口サイズ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `LLM_MAX_OUTPUT_TOKENS`           | いいえ    | `64000`                                    | メイン LLM の呼び出しあたりの最大出力 token 数                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
| `FAST_LLM_API_KEY`                | いいえ    | *(`LLM_API_KEY` にフォールバック)*                 | 高速モデルプロバイダーの API キー。高速モデルがメインモデルと異なるプロバイダーでホストされている場合に使用                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
| `FAST_LLM_BASE_URL`               | いいえ    | *(`LLM_BASE_URL` にフォールバック)*                | 高速モデルプロバイダーのベース URL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `FAST_LLM_TEMPERATURE`            | いいえ    | *(`LLM_TEMPERATURE` にフォールバック)*             | 高速モデルのサンプリング温度                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `FAST_LLM_CONTEXT_SIZE`           | いいえ    | *(`LLM_CONTEXT_SIZE` にフォールバック)*            | 高速 LLM の上下文窓口サイズ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
| `FAST_LLM_MAX_OUTPUT_TOKENS`      | いいえ    | *(`LLM_MAX_OUTPUT_TOKENS` にフォールバック)*       | 高速 LLM の呼び出しあたりの最大出力 token 数                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| `LLM_REASONING_EFFORT`            | いいえ    | *(無効)*                                     | サポートされているモデルの拡張思考レベル (OpenAI o シリーズ、Gemini 2.5+、Claude)。値: `low`、`medium`、`high`。LiteLLM は各プロバイダーのネイティブ形式に自動的に変換します。モデルの思考プロセスは UI の「thinking」ステップに表示されます。                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `LLM_REASONING_BUDGET_TOKENS`     | いいえ    | *(努力レベルから自動)*                              | Anthropic 思考の明示的な token 予算 (最小 1024)。OpenAI/Gemini の場合、努力レベルが直接使用されます。`LLM_REASONING_EFFORT` が設定されている場合のみ有効です。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `LLM_JSON_MODE_ENABLED`           | いいえ    | `true`                                     | `response_format=json_object` のグローバルトグル。プロバイダーが LiteLLM のアシスタントプリフィル注入を拒否する場合は `false` に設定します (例: AWS Bedrock リレー → 2 回目以降の智能体反復で `ValidationException`)。無効にすると、構造化呼び出しは JSON モードをスキップし、プレーンテキスト正規表現抽出にフォールバックします — 品質低下なし。すべてのモデル (ENV 設定および Admin 設定) に適用されます。                                                                                                                                                                                                                                                                                                                                                                |
| `LLM_TOOL_CHOICE_ENABLED`         | いいえ    | `true`                                     | 構造化出力抽出での強制 `tool_choice` のグローバルトグル (レベル 1 — ネイティブ関数呼び出し)。モデルが強制ツール選択でエラーを返す場合は `false` に設定します (例: `tool_choice='specified'` を拒否する思考モードモデル)。無効にすると、構造化呼び出しはネイティブ FC をスキップし、JSON モードから開始します。モデルごとのオーバーライドは Settings → Models → Advanced で利用可能です。                                                                                                                                                                                                                                                                                                                                                                                 |
| `REASONING_LLM_MODEL`             | いいえ    | *(`LLM_MODEL` にフォールバック)*                   | 推理層のモデル名。深い分析が必要なタスク (例: DAG 計画、計画分析) に使用                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
| `REASONING_LLM_API_KEY`           | いいえ    | *(`LLM_API_KEY` にフォールバック)*                 | 推理モデルプロバイダーの API キー                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `REASONING_LLM_BASE_URL`          | いいえ    | *(`LLM_BASE_URL` にフォールバック)*                | 推理モデルプロバイダーのベース URL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             |
| `REASONING_LLM_TEMPERATURE`       | いいえ    | *(`LLM_TEMPERATURE` にフォールバック)*             | 推理モデルのサンプリング温度                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `REASONING_LLM_CONTEXT_SIZE`      | いいえ    | *(`LLM_CONTEXT_SIZE` にフォールバック)*            | 推理モデルの上下文窓口サイズ                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
| `REASONING_LLM_MAX_OUTPUT_TOKENS` | いいえ    | *(`LLM_MAX_OUTPUT_TOKENS` にフォールバック)*       | 推理モデルの呼び出しあたりの最大出力 token 数                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      |
| `REASONING_LLM_EFFORT`            | いいえ    | *(`LLM_REASONING_EFFORT` にフォールバック)*        | 推理モデル層の推理努力レベル。値: `low`、`medium`、`high`                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| `REASONING_LLM_BUDGET`            | いいえ    | *(`LLM_REASONING_BUDGET_TOKENS` にフォールバック)* | 推理の token 予算 (主に Anthropic)。推理層の自動計算予算をオーバーライドします                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
| `LLM_SUPPORTS_VISION`             | いいえ    | `true` *(楽観的)*                             | ENV モードドキュメント OCR (MarkItDown + `markitdown-ocr` 経由) を試みるかどうかを制御します。**Admin → Models で有効なモデルグループが設定されていない場合のみ適用** (純粋な ENV モード)。デフォルトの `true` が有効な場合、`convert_to_markdown` と RAG 取り込みは `LLM_MODEL` がビジョンをサポートしていると想定し、画像 OCR のために呼び出します — これはすべての一般的な選択肢 (`gpt-4o`、`claude-3-5-sonnet`、`gemini-1.5-pro/flash`) に対して正しい動作です。ENV 設定の `LLM_MODEL` がビジョンをサポート**していない**場合 (例: `deepseek-v3`、`qwen-chat`、`llama-3.1`、`gpt-3.5-turbo`、`o1-mini`)、このフラグを `false` に設定して失敗するビジョン呼び出しをスキップし、テキストのみの抽出に直接進みます。Admin → Models パネルに有効なモデルグループが存在する場合、このフラグは無視され、グループの `supports_vision` フラグが優先されます — admin がキュレーションした選択は常に DB モードの信頼できるソースです。 |

> **解決順序**: ユーザー設定 → Admin モデル (DB) → ENV フォールバック。Admin → Models で「General」ロールのモデルが設定されている場合、これらの ENV 変数はフォールバックのみとして機能します。ヘルスチェックは両方のソースを考慮します。

### MarkItDown OCR 解像度

`convert_to_markdown` 組み込みツールと RAG 取り込みパイプラインは、Microsoft の [MarkItDown](https://github.com/microsoft/markitdown) と公式の [`markitdown-ocr`](https://github.com/microsoft/markitdown/tree/main/packages/markitdown-ocr) プラグインを使用して、ドキュメントからテキストを抽出します。ビジョン対応 LLM が利用可能な場合、埋め込み画像とスキャン PDF ページの OCR も含まれます。

**Vision LLM 解像度順序**（最初にマッチしたものが優先）:

| # | ソース                                                              | 優先度の根拠                                                                                              |
| - | ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| 1 | エージェントの**プライマリ LLM**（`supports_vision=True` の場合）                 | 一貫性：同じ API キー、同じ課金バケット、会話と同じレート制限プール。                                                               |
| 2 | アクティブな**ModelGroup → Fast Model**（`supports_vision=True` の場合）    | Fast モデル（`gpt-4o-mini`、`claude-haiku`、`gemini-1.5-flash`）は理想的な OCR ワークホース — 低コスト、低レイテンシ、通常はマルチモーダル。 |
| 3 | アクティブな**ModelGroup → General Model**（`supports_vision=True` の場合） | プライマリがグループに含まれていない場合の品質フォールバック。                                                                     |
| 4 | **ENV プライマリ LLM**（`LLM_MODEL`）                                   | 純粋な ENV モード用の楽観的フォールバック。アクティブな ModelGroup が存在しない場合のみ使用。`LLM_SUPPORTS_VISION` でゲート制御。                |

**推理モデルは OCR に優先されません。** 推理層（`o1`、`o3-mini`、`DeepSeek-R1`）は歴史的にビジョンサポートが不足しており、OCR には不適切なツールです — OCR は知覚タスクであり、熟考ではありません。ワークスペースに `supports_vision=True` の推理モデルのみがある場合、プライマリ LLM パスを介して選択されますが、リゾルバーは fast/general より上にランク付けしません。

**ゼロリグレッション フォールバック**：どのレベルでもビジョン対応モデルが見つからない場合、OCR は静かに無効化され、MarkItDown はテキストのみモードで実行されます。Word/PowerPoint/Excel 埋め込み画像 OCR は利用不可になります（この機能がリリースされる前と同じ）が、その他すべてのテキスト抽出（見出し、表、段落テキスト）は変わらず機能し続けます。**この機能を追加することで、抽出が以前の動作より悪くなるケースは決してありません。**

**非 OpenAI プロバイダー（Anthropic、Google Gemini など）** は透過的にサポートされます：解像度された LLM は `LiteLLMOpenAIShim` でラップされ、`chat.completions.create(...)` 呼び出しを `litellm.completion()` 経由でルーティングします。これはプロバイダー固有のメッセージ形式変換（例：Anthropic の `source.type="base64"` 画像ブロック）を処理します。1 つのシムが LiteLLM がサポートするすべてのプロバイダーをカバーします — 新しいプロバイダーを追加するのに FIM One でのコード変更はゼロです。

### 拡張思考（推論）

`LLM_REASONING_EFFORT` が設定されると、FIM One はモデルの拡張思考機能を有効にし、内部の思考の連鎖を UI の「thinking」ステップで表示します。FIM One は [LiteLLM](https://github.com/BerriAI/litellm) を使用して、推論努力パラメータを各プロバイダーのネイティブ形式に自動的に変換します。

#### サポートされているプロバイダー

| プロバイダー                         | `LLM_BASE_URL`                                             | 動作方法                                                         | 推論コンテンツが返されるか? |
| ------------------------------ | ---------------------------------------------------------- | ------------------------------------------------------------ | -------------- |
| **OpenAI** (o1 / o3 / o4-mini) | `https://api.openai.com/v1`                                | `reasoning_effort` がネイティブで送信される                              | はい             |
| **Anthropic** (Claude 3.7+)    | `https://api.anthropic.com/v1/`                            | LiteLLM が `thinking` パラメータを使用してネイティブ Anthropic API 経由でルーティング | はい             |
| **Google Gemini** (2.5+)       | `https://generativelanguage.googleapis.com/v1beta/openai/` | `reasoning_effort` が互換エンドポイントで送信される                          | はい             |

LiteLLM は `LLM_BASE_URL` からプロバイダーを自動検出し、正しい API 形式にマッピングします。不明な URL は OpenAI 互換として扱われます。

#### 重要な注意事項

<Warning>
  **サードパーティプロキシ / カスタムエンドポイントは保証されません。**
  `LLM_BASE_URL` がサードパーティ API プロキシ (例: OpenRouter、one-api、カスタムゲートウェイ) を指している場合、LiteLLM は URL に基づいて正しくルーティングしようとします。ただし、プロキシが非標準形式を期待している場合、推論が期待どおりに機能しない可能性があります。プロキシのドキュメントで、期待されるパラメータ形式を確認してください。
</Warning>

#### 推論を伴う温度制約

推論がアクティブな場合、一部のプロバイダーは温度制限を課します：

* **Anthropic**: 拡張思考が有効な場合、`temperature=1` が必須です。Anthropic と拡張思考を使用する場合、`LLM_TEMPERATURE=1` を設定する**必要があります** — 思考が有効な場合、Anthropic は他の値を拒否します。
* **OpenAI GPT-5.x**: すべての場合において `temperature=1` のみをサポートしています。LiteLLM の `drop_params` フィルタリングはこれを自動的に処理します — サポートされていない温度値は自動的にドロップされます。GPT-5.x の場合、ユーザーアクションは不要です。

#### `LLM_REASONING_BUDGET_TOKENS` の動作方法

この変数は**主にAnthropicパスで意味があります**。設定されると、自動計算されたバジェットをオーバーライドし、LiteLLM経由で`thinking`パラメータ内の`budget_tokens`として送信されます。設定されない場合、バジェットは`LLM_MAX_OUTPUT_TOKENS` x努力比率から導出されます：

| `LLM_REASONING_EFFORT` | バジェット比率 | 例（max\_tokens = 64000） |
| ---------------------- | ------- | ---------------------- |
| `low`                  | 20%     | 12,800トークン             |
| `medium`               | 50%     | 32,000トークン             |
| `high`                 | 80%     | 51,200トークン             |

最小バジェットは1,024トークンです（Anthropicのハード最小値）。

OpenAIとGeminiの場合、プロバイダーは`reasoning_effort`レベルに基づいてトークン割り当てを内部的に処理します — `LLM_REASONING_BUDGET_TOKENS`は効果がありません。

## エージェント実行

### ReAct エージェント

| 変数                                  | 必須  | デフォルト   | 説明                                                                                                                                                                                                                                                                                              |
| ----------------------------------- | --- | ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `REACT_MAX_ITERATIONS`              | いいえ | `20`    | ReAct リクエストあたりの最大ツール呼び出し反復回数。高いほど徹底的ですが、遅く、コストがかかります                                                                                                                                                                                                                                            |
| `REACT_MAX_TURN_TOKENS`             | いいえ | `0`     | 緊急遮断装置：単一の ReAct ターンあたりの最大累積トークン数（すべての反復にわたるプロンプト + 完了）。デフォルト `0` = 無制限。**これは日次トークン制御用ではありません** — そのためには per-user `token_quota` を使用してください。これは、エージェントが無限ツール呼び出しループに陥るなどの極端なシナリオに対する最後の手段の安全弁です。この制限に達すると、タスクは実行途中で中止され、消費されたすべてのトークンが無駄になり、不完全な結果が返されます。暴走エージェント問題を抑制する必要がある場合を除き、`0` のままにしてください |
| `REACT_TOOL_SELECTION_THRESHOLD`    | いいえ | `12`    | 登録されたツールの総数がこのしきい値を超える場合、軽量な LLM 呼び出しが各リクエストの前に最も関連性の高いサブセットを選択します                                                                                                                                                                                                                              |
| `REACT_TOOL_SELECTION_MAX`          | いいえ | `6`     | スマート選択後に保持する最大ツール数（ツール数が `REACT_TOOL_SELECTION_THRESHOLD` を超える場合のみ有効）                                                                                                                                                                                                                           |
| `REACT_SELF_REFLECTION_INTERVAL`    | いいえ | `6`     | N 回のツール呼び出しごとに自己反省プロンプトを挿入して、エージェントが軌道修正し、ループを回避するのに役立ちます                                                                                                                                                                                                                                       |
| `REACT_TOOL_OBS_TRUNCATION`         | いいえ | `8000`  | 最終回答を合成する際のツール観測あたりの最大文字数。値が高いほど、より多くの構造化データ（JSON、テーブル）が保持されますが、トークンコストが増加します                                                                                                                                                                                                                   |
| `REACT_TOOL_RESULT_BUDGET`          | いいえ | `40000` | 単一セッション内のすべてのツール結果の集計トークン予算。ツール結果トークンの合計がこの上限を超える場合、新しい結果は通知付きで切り詰められます。大規模な API レスポンス（例：5 つのコネクタ呼び出しが各 8K を返す）からのコンテキスト肥大化を防ぎます。`0` に設定して上限を無効にします                                                                                                                                             |
| `REACT_COMPLETION_CHECK_SKIP_CHARS` | いいえ | `800`   | エージェントの最終回答がこの文字数を超える場合、事後完了チェック LLM 呼び出しをスキップします。長い詳細な回答は「何か見落としたか？」検証ラウンドトリップを必要としません。より積極的にスキップするには低く設定し、常にチェックを実行するには非常に大きな値に設定します                                                                                                                                                          |
| `REACT_CYCLE_DETECTION_THRESHOLD`   | いいえ | `2`     | 同じツールが同じ引数で連続してこの回数呼び出される場合、エージェントに別のアプローチを試すよう指示する決定論的警告が挿入されます。自己反省（LLM がループに気付くことに依存）とは異なり、これはバイパスできないハッシュベースのチェックです。DAG ステップにも適用されます                                                                                                                                                        |
| `REACT_COMPLETION_CHECK_MIN_TOOLS`  | いいえ | `3`     | 完了チェックリストが発火する前の最小ツール呼び出し数。シンプルなタスク（1～2 ツール呼び出し）は不要なレイテンシを回避するため検証をスキップします。常時検証を行うには `1` に設定します。DAG ステップにも適用されます                                                                                                                                                                                |
| `REACT_TURN_PROFILE_ENABLED`        | いいえ | `true`  | ターンあたりのフェーズレベルのタイミングログ（`memory_load`、`compact`、`tool_schema_build`、`llm_first_token`、`llm_total`、`tool_exec`）を出力します。ターンあたり 1 行の構造化ログ。プロファイリング全体を無効にするには `false` に設定します（ゼロオーバーヘッド）                                                                                                               |
| `REACT_PLAN_TOOL_ENABLED`           | いいえ | `true`  | `update_plan` todo ツールを登録して、エージェントが複数ステップのタスク中に計画チェックリストを書き込み、維持できるようにします。DAG ステップエージェントとツールなしのエージェントでは自動的にスキップされます                                                                                                                                                                             |
| `REACT_PLAN_REMINDER_INTERVAL`      | いいえ | `3`     | `update_plan` 呼び出しなしのツールラウンド数。その後、古い計画リマインダー（完全なチェックリストを埋め込む）が会話に再挿入されるため、計画はコンテキスト圧縮を生き残ります                                                                                                                                                                                                    |
| `REACT_MAX_CONTINUATIONS`           | いいえ | `3`     | モデルの回答がプロバイダーの出力トークン制限（`finish_reason=length`）で切り詰められる場合の最大継続ラウンド数。切り詰められたセグメントは、エージェントループとストリーム合成の両方で 1 つのシームレスな回答に結合されます                                                                                                                                                                      |
| `REACT_BACKGROUND_TOOLS_ENABLED`    | いいえ | `true`  | 遅いツール（サンドボックス化された python/shell/node 実行）に `run_in_background` オプションを提供します。エージェントはタスク ID をすぐに取得して作業を続行し、ツールが完了すると結果が `<task_notification>` メッセージとして到着します                                                                                                                                          |
| `REACT_BG_WAIT_TIMEOUT`             | いいえ | `300`   | エージェントが回答を最終化したいときに、まだ実行中のバックグラウンドツールを待機する最大秒数。ウィンドウ内に完了しないタスクは、明示的なタイムアウト通知でキャンセルされます                                                                                                                                                                                                          |
| `DAG_CHECKPOINT_EVIDENCE_CHARS`     | いいえ | `4000`  | DAG クラッシュ再開チェックポイントファイル（`data/dag_checkpoints/`）内のステップあたりの証拠上限。ステップサマリーは完全に保存されます                                                                                                                                                                                                               |
| `DAG_CHECKPOINT_MAX_AGE_HOURS`      | いいえ | `24`    | このより古い DAG チェックポイントは読み込み時に無視されるため、古いクラッシュ残骸は新しい実行に再開されません                                                                                                                                                                                                                                       |
| `LLM_RATE_LIMIT_PER_USER`           | いいえ | `true`  | 単一のプロセスグローバルバケットの代わりに、per-user キー付きレート制限バケットを使用します。1 つのうるさいユーザーが同じワーカー上の他のすべてのユーザーを飢えさせるのを防ぎます。基盤となるレートはバケットあたり 60 リクエスト/分および 100K トークン/分でハードコードされています — この設定は、バケットが共有（グローバル）か分割（per-user）かのみを制御します。レガシーグローバルバケットに戻すには `false` に設定します（推奨されません）                                                  |

### DAG Planner

| Variable                         | Required | Default | Description                                                                                                                                                                                                                                                   |
| -------------------------------- | -------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `MAX_CONCURRENCY`                | No       | `5`     | DAG エグゼキューターにおける最大並列ステップ数                                                                                                                                                                                                                                     |
| `DAG_STEP_MAX_ITERATIONS`        | No       | `15`    | 各 DAG ステップ内での最大ツール呼び出し反復回数                                                                                                                                                                                                                                    |
| `DAG_STEP_TIMEOUT`               | No       | `600`   | ステップ実行タイムアウト（秒単位）。このタイムアウトを超過したステップは失敗とマークされ、依存するステップはカスケードスキップされます                                                                                                                                                                                           |
| `DAG_MAX_REPLAN_ROUNDS`          | No       | `3`     | 目標が達成されない場合の最大自律再計画試行回数。ユーザーの割り込み（インジェクト）は無制限で、この予算にはカウントされません                                                                                                                                                                                                |
| `DAG_REPLAN_STOP_CONFIDENCE`     | No       | `0.8`   | 目標が達成不可能であるというエージェントの確信度がこのしきい値を超えた場合に再試行を停止します（`0.0` = 早期停止しない、`1.0` = 任意の失敗で停止）                                                                                                                                                                             |
| `DAG_VERIFY_TRUNCATION`          | No       | `2000`  | ステップ品質判定のためにステップ検証器 LLM に送信されるステップ出力の最大文字数                                                                                                                                                                                                                    |
| `DAG_ANALYZER_TRUNCATION`        | No       | `10000` | 実行後アナライザーのフォーマット時における、ステップ結果あたりの最大文字数                                                                                                                                                                                                                         |
| `DAG_STEP_EVIDENCE_CHARS`        | No       | `16000` | ステップごとに保持される生のツール出力（ウェブ取得、検索結果、ファイル読み込み）の最大文字数。これは権威的な「ソース証拠」として、ステップの要約とともにアナライザーと最終合成に提供されるため、回答の事実的主張（合計、列挙、重大度）は要約が無言で項目を削除または誤ラベル付けした可能性があるのではなく、ソースに対して検証できます。`0` に設定すると証拠キャプチャを無効にします                                                                  |
| `DAG_REPLAN_RECENT_TRUNCATION`   | No       | `500`   | 再計画コンテキスト構築時における最新ラウンドからのステップ結果あたりの最大文字数                                                                                                                                                                                                                      |
| `DAG_REPLAN_OLDER_TRUNCATION`    | No       | `200`   | 再計画コンテキスト構築時における古いラウンドからのステップ結果あたりの最大文字数。古いラウンドはコンテキスト節約のためより積極的に切り詰められます                                                                                                                                                                                     |
| `DAG_TOOL_CACHE`                 | No       | `true`  | 単一 DAG 実行内での同一ツール呼び出しをキャッシュします。`cacheable` として明示的にマークされたツール（検索、知識検索などの読み取り専用ツール）のみがキャッシュされます。キャッシュを完全に無効にするには `false` に設定します                                                                                                                                  |
| `DAG_STEP_VERIFICATION`          | No       | `false` | 各 DAG ステップ後の汎用 LLM ベースの品質チェック。失敗時、ステップはフィードバック付きで 1 回再試行されます。**デフォルトはオフ** — すべてのステップに遅延を追加し、ほとんど必要ありません。ステップ出力の大部分は再チェックなしで許容可能です。ステップ結果の品質が低いことが頻繁に観察される場合にのみ使用してください                                                                                        |
| `DAG_CITATION_VERIFICATION`      | No       | `true`  | 専門分野ステップの引用精度チェック。**前提条件**：クエリは最初に LLM ドメイン分類器によって専門分野として分類される必要があります（`ESCALATION_DOMAINS` を参照）。ドメインが検出され、このフラグが `true` の場合、完了した各ステップは法律・医療・金融の引用についてスキャンされ、精度が検証されます — 幻覚の記事番号、捏造された判例参照、および不正な規制引用を検出します。ドメイン分類が `null`（一般的なクエリ）を返す場合、この設定に関わらず引用検証は実行されません |
| `DAG_CITATION_VERIFY_TRUNCATION` | No       | `6000`  | 引用検証プロンプトに送信されるステップ結果の最大文字数                                                                                                                                                                                                                                   |

### ドメイン分類

ReAct と DAG 実行の**前に**実行される独立した LLM ベースのドメイン検出レイヤーを制御します。クエリが専門ドメインとして分類されると、システムはドメイン対応機能をアクティブ化します：モデルのエスカレーション、ドメイン固有の SOP 指示、および引用検証（DAG のみ）。

| 変数                   | 必須  | デフォルト                                           | 説明                                                                                                                                                                                                                    |
| -------------------- | --- | ----------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `ESCALATION_DOMAINS` | いいえ | `legal,medical,financial,tax,compliance,patent` | 専門ドメインのカンマ区切りリスト。高速 LLM が各クエリをこのリストに対して分類します。マッチした場合、システムは以下を実行します：(1) より高い精度を得るために推論モデルにアップグレード、(2) ドメイン固有の SOP 指示を注入（例：書き込み前に検索で引用を検証）、(3) DAG ステップの引用検証を有効化。必要に応じてカスタムドメインを追加します（例：`legal,education,construction`） |

### Context Guard

会話がモデルの制限を超えるのを防ぐ自動コンテキストウィンドウ管理を制御します。

| Variable                       | Required | Default | Description                                         |
| ------------------------------ | -------- | ------- | --------------------------------------------------- |
| `CONTEXT_GUARD_DEFAULT_BUDGET` | No       | `32000` | コンテキストウィンドウ管理のデフォルトトークン予算。会話がこれを超えると、古いメッセージが圧縮されます |
| `CONTEXT_GUARD_MAX_MSG_CHARS`  | No       | `50000` | 単一メッセージの厳密な文字制限。この制限を超えるメッセージは安全ネットとして切り詰められます      |
| `CONTEXT_GUARD_KEEP_RECENT`    | No       | `4`     | 会話履歴を圧縮する際に保持する最新メッセージの数                            |

### コンテンツガードレール

入力または出力の*コンテンツ*を検査するガードレールのコンマ区切り名。ツール許可ゲート（`core/hooks/*`）およびセキュリティレイヤー（`core/security/*`）とは独立しています。全体像については[コンテンツガードレール](/configuration/guardrails)を参照してください。

| 変数                               | 必須  | デフォルト       | 説明                                                                                                                                 |
| -------------------------------- | --- | ----------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `FIM_GUARDRAILS_INPUT`           | いいえ | `jailbreak` | アクティブな入力ガードレール。デフォルトの`jailbreak`正規表現検出器は、既知のプロンプトオーバーライドフレーズが検出されたときにLLMトークンが消費される前にターンを中止します。無効にするには空に設定します。未知の名前はログに記録されスキップされます |
| `FIM_GUARDRAILS_OUTPUT`          | いいえ | （空）         | アクティブな出力ガードレール。現在提供されているもの：`max_length`（回答の文字数を制限）。エージェントが最終回答を生成した後に実行されます                                                        |
| `FIM_GUARDRAIL_MAX_OUTPUT_CHARS` | いいえ | `50000`     | `max_length`出力ガードレールで使用される文字数制限。`max_length`が`FIM_GUARDRAILS_OUTPUT`にリストされている場合のみ有効です                                              |

### エージェント ワークスペース

| 変数                            | 必須  | デフォルト  | 説明                                                               |
| ----------------------------- | --- | ------ | ---------------------------------------------------------------- |
| `WORKSPACE_OFFLOAD_THRESHOLD` | いいえ | `8000` | ツール出力がこの文字数を超える場合、ワークスペース ファイルに保存され、切り詰められたプレビューが会話コンテキストに挿入されます |
| `WORKSPACE_PREVIEW_CHARS`     | いいえ | `2000` | 切り詰められたワークスペース参照に含めるプレビュー文字数                                     |
| `WORKSPACE_CLEANUP_MAX_HOURS` | いいえ | `72`   | この時間数より古いワークスペース ファイルは自動クリーンアップの対象になります                          |

### システム

| 変数                          | 必須 | デフォルト | 説明                                                                                                                                                                                                     |
| --------------------------- | -- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| ~~`SYSTEM_PROMPT_RESERVE`~~ | —  | —     | **削除されました。** 以前はコンテキスト予算からシステムプロンプト用に固定の4K予約を差し引いていました。ContextGuardはメッセージリストトークンを推定する際にシステムプロンプトを既に含めているため、二重計算が発生していました。予算計算式は現在単純に `context_size - max_output_tokens` となり、システムプロンプトの実際のサイズは動的に考慮されます |

***

## Webツール（オプション）

| 変数                    | 必須  | デフォルト                             | 説明                                                                                                                |
| --------------------- | --- | --------------------------------- | ----------------------------------------------------------------------------------------------------------------- |
| `JINA_API_KEY`        | いいえ | —                                 | Jina APIキー。**検索、フェッチ、埋め込み、リランカー**のための共有フォールバックとして機能します（サービス固有のキーが設定されていない場合）。[jina.ai](https://jina.ai/)で取得してください |
| `TAVILY_API_KEY`      | いいえ | —                                 | Tavily Search APIキー（設定されており`WEB_SEARCH_PROVIDER`が未設定の場合は自動選択）                                                     |
| `BRAVE_API_KEY`       | いいえ | —                                 | Brave Search APIキー（設定されており`WEB_SEARCH_PROVIDER`が未設定の場合は自動選択）                                                      |
| `EXA_API_KEY`         | いいえ | —                                 | Exa Search APIキー（設定されており`WEB_SEARCH_PROVIDER`が未設定の場合は自動選択）。[exa.ai](https://exa.ai/)で取得してください                     |
| `WEB_SEARCH_PROVIDER` | いいえ | `jina`                            | 検索プロバイダーセレクター：`jina` / `tavily` / `brave` / `exa`                                                                 |
| `WEB_FETCH_PROVIDER`  | いいえ | `jina`（キーが設定されている場合、それ以外は`httpx`） | フェッチプロバイダー：`jina`（Jina Reader APIを使用） / `httpx`（直接HTTPリクエスト、APIキー不要）                                              |

> **クイックスタートのヒント**：`JINA_API_KEY`を設定するだけで、Web検索、Webフェッチ、埋め込み、リランキングがすべて一度に有効になります — 1つのキーで4つのサービスが利用できます。以下の変数で各サービスを個別にオーバーライドできます。

***

## RAG & ナレッジベース（推奨）

### 埋め込み

埋め込みはテキストをベクトルに変換し、ナレッジベース検索に使用します。FIM One は標準的な **OpenAI互換の `/v1/embeddings` エンドポイント**を使用するため、Jina だけでなく、このインターフェースを公開しているあらゆるプロバイダーで動作します。

| 変数                    | 必須  | デフォルト                       | 説明                 |
| --------------------- | --- | --------------------------- | ------------------ |
| `EMBEDDING_API_KEY`   | いいえ | *(`JINA_API_KEY` にフォールバック)* | 埋め込みプロバイダーの API キー |
| `EMBEDDING_BASE_URL`  | いいえ | `https://api.jina.ai/v1`    | 埋め込みプロバイダーのベース URL |
| `EMBEDDING_MODEL`     | いいえ | `jina-embeddings-v3`        | モデル識別子             |
| `EMBEDDING_DIMENSION` | いいえ | `1024`                      | ベクトル次元             |

**プロバイダーの例** — 3 つの変数を設定するだけで切り替えられます:

| プロバイダー              | `EMBEDDING_BASE_URL`          | `EMBEDDING_MODEL`        | `EMBEDDING_DIMENSION` |
| ------------------- | ----------------------------- | ------------------------ | --------------------- |
| **Jina** *(デフォルト)*  | `https://api.jina.ai/v1`      | `jina-embeddings-v3`     | `1024`                |
| **OpenAI**          | `https://api.openai.com/v1`   | `text-embedding-3-small` | `1536`                |
| **Voyage**          | `https://api.voyageai.com/v1` | `voyage-3`               | `1024`                |
| **Ollama** *(ローカル)* | `http://localhost:11434/v1`   | `nomic-embed-text`       | `768`                 |

<Warning>
  **埋め込みモデルまたは次元を変更すると、既存のすべてのナレッジベースベクトルが無効になります。** 古いベクトルは異なる埋め込み空間で計算されているため、検索精度が静かに低下します。切り替え後は、**すべてのナレッジベースインデックスを再構築する**必要があります。
</Warning>

### 検索

| 変数               | 必須  | デフォルト       | 説明                                                        |
| ---------------- | --- | ----------- | --------------------------------------------------------- |
| `RETRIEVAL_MODE` | いいえ | `grounding` | `grounding`（引用と信頼度スコアリング付きの完全なパイプライン）または`simple`（基本的なRAG） |

### Reranker

Rerankerは取得したドキュメントを再スコアリングして関連性を向上させます。3つのプロバイダーがサポートされており、`RERANKER_PROVIDER`で選択するか、利用可能なAPIキーからシステムに自動検出させることができます。

| 変数                      | 必須  | デフォルト                                | 説明                                                                                  |
| ----------------------- | --- | ------------------------------------ | ----------------------------------------------------------------------------------- |
| `RERANKER_PROVIDER`     | いいえ | *(自動検出)*                             | `jina` / `cohere` / `openai`。未設定の場合：`COHERE_API_KEY`が設定されていればCohereを使用、それ以外はJinaを使用 |
| `RERANKER_MODEL`        | いいえ | `jina-reranker-v2-base-multilingual` | モデル識別子（JinaおよびOpenAIプロバイダーに適用）                                                      |
| `COHERE_API_KEY`        | いいえ | —                                    | Cohere APIキー（設定されており`RERANKER_PROVIDER`が未設定の場合、Cohere rerankerを自動選択）                |
| `COHERE_RERANKER_MODEL` | いいえ | `rerank-multilingual-v3.0`           | Cohere固有のrerankerモデル                                                                |

> **Jina**は`JINA_API_KEY`を使用します（上記のWeb Toolsから）。**OpenAI**は`LLM_API_KEY` / `LLM_BASE_URL`を再利用します — 追加キーは不要です。**Cohere**は独自の`COHERE_API_KEY`が必要です。

> Rerankerは**オプション**です — ナレッジベース検索はフュージョンスコアリングを使用して、これなしで機能します。埋め込みはナレッジベース機能に**推奨**されます。

### ベクトルストア

| 変数                 | 必須  | デフォルト                 | 説明                                          |
| ------------------ | --- | --------------------- | ------------------------------------------- |
| `VECTOR_STORE_DIR` | いいえ | `./data/vector_store` | LanceDB ベクトルストアデータ用ディレクトリ（ファイルベース、外部サービス不要） |

***

## コード実行

| 変数                     | 必須  | デフォルト              | 説明                                                                                                                |
| ---------------------- | --- | ------------------ | ----------------------------------------------------------------------------------------------------------------- |
| `CODE_EXEC_BACKEND`    | いいえ | `local`            | `local`（ホスト上での直接実行）または`docker`（隔離されたコンテナ）                                                                         |
| `DOCKER_PYTHON_IMAGE`  | いいえ | `python:3.11-slim` | Python実行用のDockerイメージ                                                                                              |
| `DOCKER_NODE_IMAGE`    | いいえ | `node:20-slim`     | Node.js実行用のDockerイメージ                                                                                             |
| `DOCKER_SHELL_IMAGE`   | いいえ | `python:3.11-slim` | シェル実行用のDockerイメージ                                                                                                 |
| `DOCKER_MEMORY`        | いいえ | *（Dockerのデフォルト）*   | コンテナあたりのRAM上限（例：`256m`、`512m`、`1g`）                                                                               |
| `DOCKER_CPUS`          | いいえ | *（Dockerのデフォルト）*   | コンテナあたりのCPUクォータ（例：`0.5`、`1.0`）                                                                                    |
| `SANDBOX_TIMEOUT`      | いいえ | `120`              | デフォルト実行タイムアウト（秒）                                                                                                  |
| `DOCKER_HOST_DATA_DIR` | いいえ | *（未設定）*            | `./data`ボリュームマウントのホスト側絶対パス。DooD（Docker-outside-of-Docker）デプロイメントに必須。`docker-compose.yml`は`${PWD}/data`経由で自動設定します。 |

> **セキュリティ**：`local`モードはAIが生成したコードをホスト上で直接実行します。インターネット公開またはマルチユーザーデプロイメントの場合は、常に`CODE_EXEC_BACKEND=docker`を設定してください。

***

## ツール成果物

ツール実行（コード実行、テンプレートレンダリング、画像生成）によって生成されたファイルのサイズ制限。

| 変数                    | 必須  | デフォルト              | 説明                        |
| --------------------- | --- | ------------------ | ------------------------- |
| `MAX_ARTIFACT_SIZE`   | いいえ | `10485760` (10 MB) | 単一成果物ファイルの最大サイズ（バイト）      |
| `MAX_ARTIFACTS_TOTAL` | いいえ | `52428800` (50 MB) | セッションあたりの成果物の最大合計サイズ（バイト） |

***

## ドキュメント処理（オプション）

アップロードされたPDF/DOCXファイルがLLM消費用にどのように処理されるかを制御します。ビジョン対応モデル（GPT-4o、Claude 3/4、Gemini）は、より高い忠実度のためにレンダリングされたPDFページを画像として受け取ることができます。

| 変数                          | 必須  | デフォルト  | 説明                                                                     |
| --------------------------- | --- | ------ | ---------------------------------------------------------------------- |
| `DOCUMENT_PROCESSING_MODE`  | いいえ | `auto` | `auto`（モデルがサポートしている場合はビジョン）、`vision`（常にページをレンダリング）、`text`（常にテキストのみを抽出） |
| `DOCUMENT_VISION_DPI`       | いいえ | `150`  | PDFページレンダリングのDPI。高いほど品質が良く、トークンが増加                                     |
| `DOCUMENT_VISION_MAX_PAGES` | いいえ | `20`   | PDFごとに画像としてレンダリングする最大ページ数                                              |

> **注**: モデルごとのビジョンサポートは、Admin → Modelsの`supports_vision`トグルで設定されます。明示的に設定されていない場合、システムはモデル名からビジョン機能を自動検出します。

***

## 画像生成（オプション）

| 変数                   | 必須  | デフォルト                            | 説明                                                                                              |
| -------------------- | --- | -------------------------------- | ----------------------------------------------------------------------------------------------- |
| `IMAGE_GEN_PROVIDER` | いいえ | `google`                         | `google`（Gemini ネイティブ API）または `openai`（OpenAI 互換 `/v1/images/generations`）                      |
| `IMAGE_GEN_API_KEY`  | いいえ | —                                | Google AI Studio キー（`google`）またはプロキシ/OpenAI API キー（`openai`）                                    |
| `IMAGE_GEN_MODEL`    | いいえ | `gemini-3.1-flash-image-preview` | 画像生成モデル（例：`dall-e-3`、`gemini-nano-banana-2`）                                                    |
| `IMAGE_GEN_BASE_URL` | いいえ | *(プロバイダーごと)*                     | Google: `https://generativelanguage.googleapis.com/v1beta`; OpenAI: `https://api.openai.com/v1` |

***

## Email (SMTP) (推奨)

`SMTP_HOST`、`SMTP_USER`、`SMTP_PASS` がすべて設定されている場合、`email_send` ビルトインツールが自動的に登録されます。

| Variable                 | Required | Default              | Description                                                                                                                        |
| ------------------------ | -------- | -------------------- | ---------------------------------------------------------------------------------------------------------------------------------- |
| `SMTP_HOST`              | Cond.    | —                    | SMTP サーバーホスト名                                                                                                                      |
| `SMTP_PORT`              | No       | `465`                | SMTP ポート                                                                                                                           |
| `SMTP_SSL`               | No       | `ssl`                | TLS モード: `ssl` (ポート 465) / `tls` (STARTTLS、ポート 587) / `none` または `""` (プレーン、認証情報が平文で送信される)。その他の値は拒否され、プレーンモードへの暗黙的なフォールバックは行われません。 |
| `SMTP_USER`              | Cond.    | —                    | SMTP ログインユーザー名                                                                                                                     |
| `SMTP_PASS`              | Cond.    | —                    | SMTP ログインパスワード                                                                                                                     |
| `SMTP_FROM`              | No       | *(uses `SMTP_USER`)* | From ヘッダーに表示される送信者アドレス                                                                                                             |
| `SMTP_FROM_NAME`         | No       | —                    | From ヘッダーに表示される表示名                                                                                                                 |
| `SMTP_REPLY_TO`          | No       | —                    | Reply-To アドレス。返信はここに送信されます (`SMTP_FROM` の代わりに)                                                                                     |
| `SMTP_ALLOWED_DOMAINS`   | No       | —                    | カンマ区切りのドメイン許可リスト (例: `example.com,corp.io`)。リストに含まれていないドメインの受信者をブロックします                                                            |
| `SMTP_ALLOWED_ADDRESSES` | No       | —                    | カンマ区切りの完全一致アドレス許可リスト。`SMTP_ALLOWED_DOMAINS` と組み合わせて使用されます。両方を未設定のままにすると、すべての受信者を許可します (共有メールボックスの場合は推奨されません)                       |

***

## コネクタ

| 変数                             | 必須  | デフォルト         | 説明                                                                                                                                                         |
| ------------------------------ | --- | ------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CONNECTOR_RESPONSE_MAX_CHARS` | いいえ | `50000`       | 非配列JSON/プレーンテキストコネクタレスポンスの最大文字数                                                                                                                            |
| `CONNECTOR_RESPONSE_MAX_ITEMS` | いいえ | `10`          | コネクタレスポンスがJSON配列の場合に保持する最大配列項目数                                                                                                                            |
| `CREDENTIAL_ENCRYPTION_KEY`    | いいえ | *(未設定)*       | コネクタ認証情報ブロブのFernet暗号化キー。設定時、`connector_credentials`に保存された認証トークンは保存時に暗号化されます。未設定の場合、認証情報はプレーンテキストJSON（後方互換性あり）として保存されます。このキーを変更すると、既存のすべての暗号化認証情報が無効になります。  |
| `CONNECTOR_TOOL_MODE`          | いいえ | `progressive` | コネクタツールがエージェントに公開される方法。`progressive`: `discover`/`execute`サブコマンド付きの単一`ConnectorMetaTool`（コネクタあたり約30トークン）。`classic`: アクションごとに1つのツール（レガシー、アクションあたり約250トークン）。 |
| `DATABASE_TOOL_MODE`           | いいえ | `progressive` | データベースコネクタツールがエージェントに公開される方法。`progressive`: `list_tables`/`discover`/`query`サブコマンド付きの単一`DatabaseMetaTool`。`legacy`: データベースコネクタごとにアクションごとに1つのツール（各3つのツール）。  |
| `MCP_TOOL_MODE`                | いいえ | `progressive` | MCPサーバーツールがエージェントに公開される方法。`progressive`: `discover`/`call`サブコマンド付きの単一`MCPServerMetaTool`。`legacy`: MCPサーバーアクションごとに1つのツール（元の個別ツール）。                         |

***

## プラットフォーム

| 変数                               | 必須  | デフォルト                                   | 説明                                                                                                                                                                                                        |
| -------------------------------- | --- | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `DATABASE_URL`                   | いいえ | `sqlite+aiosqlite:///./data/fim_one.db` | データベース接続文字列。**SQLite**（ゼロコンフィグ）: `sqlite+aiosqlite:///./data/fim_one.db`。**PostgreSQL**（本番環境）: `postgresql+asyncpg://user:pass@localhost:5432/fim_one`。Docker Composeは自動的にPostgreSQLを設定します。               |
| `JWT_SECRET_KEY`                 | いいえ | `CHANGE_ME`                             | JWTトークン署名用の秘密鍵。プレースホルダー値`CHANGE_ME`（またはその他のレガシーデフォルト）は、初回起動時にセキュアな256ビットランダムキーの自動生成をトリガーし、`.env`に書き込まれます。本番環境では明示的に設定して、再起動とレプリカ間でトークンを有効に保ちます。                                                           |
| `FIM_BCRYPT_COST`                | いいえ | `12`                                    | パスワードハッシング用のbcryptワークファクター、4～31の範囲に制限されます。デフォルト12は最新のCPUで約200msのコストがかかります。弱いハードウェアでは低くし、セキュリティ強化デプロイメントでは高くしてください。                                                                                        |
| `CORS_ORIGINS`                   | いいえ | —                                       | デフォルトのlocalhostエントリを超えて許可する追加のCORSオリジンのカンマ区切りリスト。フロントエンドが非localhostドメイン（例：`https://app.example.com`）で実行される場合に必須です。                                                                                        |
| `UPLOADS_DIR`                    | いいえ | `./uploads`                             | アップロードされたファイルのディレクトリ                                                                                                                                                                                      |
| `MAX_UPLOAD_SIZE_MB`             | いいえ | `50`                                    | 最大ファイルアップロードサイズ（メガバイト単位、バックエンド強制）                                                                                                                                                                         |
| `NEXT_PUBLIC_MAX_UPLOAD_SIZE_MB` | いいえ | `50`                                    | フロントエンドUIに表示される最大ファイルアップロードサイズ。**ビルド時変数** — `MAX_UPLOAD_SIZE_MB`と一致する必要があります。                                                                                                                             |
| `MCP_SERVERS`                    | いいえ | —                                       | MCPサーバー設定のJSONアレイ（`uv sync --extra mcp`が必要）                                                                                                                                                               |
| `ALLOW_STDIO_MCP`                | いいえ | `false`                                 | stdio MCPサーバーを許可します。信頼できるローカルデプロイメントの場合のみ`true`に設定してください                                                                                                                                                  |
| `ALLOWED_STDIO_COMMANDS`         | いいえ | `npx,uvx,node,python,python3,deno,bun`  | stdio MCPサーバーで許可する基本コマンドのカンマ区切りリスト。`ALLOW_STDIO_MCP=true`の場合のみ有効です                                                                                                                                        |
| `LOG_LEVEL`                      | いいえ | `INFO`                                  | ログレベル：`DEBUG` / `INFO` / `WARNING` / `ERROR` / `CRITICAL`                                                                                                                                                 |
| `REDIS_URL`                      | いいえ | —                                       | ワーカー間割り込みリレー用のRedis接続URL。**`WORKERS>1`の場合は必須** — これがないと、ストリーム中の割り込み/注入リクエストが別のワーカーにヒットして、サイレントに失敗する可能性があります。Docker Composeで自動設定されます。                                                                      |
| `WORKERS`                        | いいえ | `1`                                     | Uvicornワーカープロセス。`1`は安全で外部サービスは不要です。本番環境のマルチワーカーの場合、PostgreSQLを使用してください（SQLiteはシングルライター）。SQLiteはライト負荷下でのローカル開発に適しています。認証、OAuth、ファイル操作は完全にマルチワーカー対応です（JWTベース）。Docker Composeは自動的にPostgreSQLとRedisの両方を設定します。 |

<Warning>
  **マルチワーカーチェックリスト**（`WORKERS>1`）：

  * **停止（ストリーミング中止）** — 常に機能し、追加設定は不要です（シグナルは同じTCP接続上を移動します）。
  * **注入（ストリーム中のフォローアップ）** — **`REDIS_URL`が必須**。Redisがないと、注入リクエストが実行中の知識を持たない別のワーカーにランディングし、サイレント失敗を引き起こす可能性があります。
  * **本番環境**：PostgreSQL（`DATABASE_URL`）を使用してください。SQLiteのシングルライターロックは、同時書き込み時に競合を引き起こす可能性があります。
  * **ローカル開発**：SQLite+マルチワーカーはライト使用で問題ありません。注入機能を使用する場合は`REDIS_URL`を追加してください。
</Warning>

## ワークフロー実行の保持

古いワークフロー実行を自動的に削除するバックグラウンドクリーンアップタスク。ワークフロー単位のオーバーライド（ワークフロー設定UIで設定）がこれらのグローバルデフォルトより優先されます。

| 変数                                    | 必須  | デフォルト | 説明                           |
| ------------------------------------- | --- | ----- | ---------------------------- |
| `WORKFLOW_RUN_MAX_AGE_DAYS`           | いいえ | `30`  | この日数より古いワークフロー実行を削除          |
| `WORKFLOW_RUN_MAX_PER_WORKFLOW`       | いいえ | `100` | ワークフローあたり最大この数の実行を保持（古い順に削除） |
| `WORKFLOW_RUN_CLEANUP_INTERVAL_HOURS` | いいえ | `24`  | バックグラウンドクリーンアップタスクの実行間隔（時間）  |

### チャネル確認リクエスト有効期限

古い保留中の承認リクエスト（`FeishuGateHook` などのチャネルフックまたは Approval Playground によって生成される）を期限切れとしてマークするバックグラウンドスイーパー。忘れられたカードを数日後にクリックしても、既に破棄されたエージェント状態が反転しないようにします。

| 変数                                            | 必須  | デフォルト  | 説明                                       |
| --------------------------------------------- | --- | ------ | ---------------------------------------- |
| `CHANNEL_CONFIRMATION_TTL_MINUTES`            | いいえ | `1440` | この時間より古い保留中の確認は自動的に期限切れになります（デフォルト：24時間） |
| `CHANNEL_CONFIRMATION_SWEEP_INTERVAL_SECONDS` | いいえ | `600`  | 有効期限スイーパーが実行される頻度（デフォルト：10分ごと）           |

## OAuth（オプション）

プロバイダーに対して `CLIENT_ID` と `CLIENT_SECRET` の両方が設定されている場合、ログインページに対応する OAuth ボタンが自動的に表示されます。

| 変数                      | 必須       | デフォルト                         | 説明                                                                                                                                                                                 |
| ----------------------- | -------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `GITHUB_CLIENT_ID`      | いいえ      | —                             | GitHub OAuth App クライアント ID。[github.com/settings/developers](https://github.com/settings/developers) → OAuth Apps で作成                                                               |
| `GITHUB_CLIENT_SECRET`  | いいえ      | —                             | GitHub OAuth App クライアント シークレット                                                                                                                                                     |
| `GOOGLE_CLIENT_ID`      | いいえ      | —                             | Google OAuth クライアント ID。[console.cloud.google.com/apis/credentials](https://console.cloud.google.com/apis/credentials) で作成                                                          |
| `GOOGLE_CLIENT_SECRET`  | いいえ      | —                             | Google OAuth クライアント シークレット                                                                                                                                                         |
| `DISCORD_CLIENT_ID`     | いいえ      | —                             | Discord OAuth2 クライアント ID。[discord.com/developers](https://discord.com/developers/applications) で作成                                                                                 |
| `DISCORD_CLIENT_SECRET` | いいえ      | —                             | Discord OAuth2 クライアント シークレット                                                                                                                                                       |
| `FEISHU_APP_ID`         | いいえ      | —                             | Feishu（Lark）App ID。[open.feishu.cn](https://open.feishu.cn/app) で作成。`contact:user.email:readonly` 権限が必要                                                                            |
| `FEISHU_APP_SECRET`     | いいえ      | —                             | Feishu（Lark）App シークレット                                                                                                                                                             |
| `FRONTEND_URL`          | **本番環境** | `http://localhost:3000`       | OAuth 完了後にブラウザが遷移する先。本番環境では必須（例：`https://yourdomain.com`）                                                                                                                          |
| `API_BASE_URL`          | **本番環境** | `http://localhost:8000`       | 外部からアクセス可能なバックエンド URL。OAuth コールバック URL の構築に使用。本番環境では必須                                                                                                                             |
| `NEXT_PUBLIC_API_URL`   | **本番環境** | *（`<hostname>:8000` として自動検出）* | OAuth リダイレクト用のブラウザ側 API ベース URL。**これはフロントエンド ビルド時変数です** — ローカル開発では `frontend/.env.local` で設定するか、カスタム本番環境デプロイメントの場合は Docker ビルド引数として渡してください。標準的なリバースプロキシ設定（ポート 80/443）では自動検出が機能します。 |

> **本番環境** = ローカルではオプション（デフォルト値が機能します）ですが、インターネット公開デプロイメントでは**必須**です。

### 各プロバイダーに登録するOAuth コールバックURL

バックエンドは、コールバックURLを以下のように構成します: `{API_BASE_URL}/api/auth/oauth/{provider}/callback`

| プロバイダー  | 登録するコールバックURL                                            |
| ------- | -------------------------------------------------------- |
| GitHub  | `https://yourdomain.com/api/auth/oauth/github/callback`  |
| Google  | `https://yourdomain.com/api/auth/oauth/google/callback`  |
| Discord | `https://yourdomain.com/api/auth/oauth/discord/callback` |

***

## Cloudflare Tunnel（オプション）

Cloudflareのネットワークを通じてすべてのトラフィックをルーティングし、ポートを直接公開しません。Nginx、SSLサーティフィケート、ファイアウォールルールを開く必要がなくなります。セットアップ手順については、[本番環境デプロイメント](/quickstart#cloudflare-tunnel)セクションを参照してください。

<Warning>
  **中国本土ユーザー**: Cloudflare Free/Pro/Businessプランは中国本土にPoP（Point of Presence）がありません。トラフィックは海外のエッジにルーティングされ、502エラーが頻繁に発生します。中国本土が主なユーザーである場合、Cloudflare Enterprise with China Networkを持っていない限り、このオプションを使用しないでください。
</Warning>

| 変数                        | 必須                    | デフォルト | 説明                                                                                                                                                 |
| ------------------------- | --------------------- | ----- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| `CLOUDFLARE_TUNNEL_TOKEN` | **はい**（Tunnelを使用する場合） | —     | Cloudflare Zero Trust → Networks → Tunnels → your tunnel → Configureから取得したトークン。`eyJ...`で始まります。`docker-compose.tunnel.yml`の`cloudflared`サイドカーに必要です。 |

***

## Analytics (Optional)

すべての分析プロバイダーはオプションです。任意の組み合わせを設定できます — すべてのアクティブなプロバイダーが同時に読み込まれます。すべてを空白のままにすると、分析は完全に無効になります（ローカル開発では推奨）。

| Variable                           | Required | Default                             | Description                                                                                                    |
| ---------------------------------- | -------- | ----------------------------------- | -------------------------------------------------------------------------------------------------------------- |
| `NEXT_PUBLIC_GA_MEASUREMENT_ID`    | No       | —                                   | Google Analytics 4 測定 ID（例：`G-XXXXXXXXXX`）。[analytics.google.com](https://analytics.google.com) で取得できます        |
| `NEXT_PUBLIC_UMAMI_SCRIPT_URL`     | No       | —                                   | Umami 分析スクリプト URL（例：`https://your-umami.com/script.js`）。自己ホスト型のプライバシーフレンドリーな代替案 — [umami.is](https://umami.is) |
| `NEXT_PUBLIC_UMAMI_WEBSITE_ID`     | No       | —                                   | Umami ウェブサイト ID。`NEXT_PUBLIC_UMAMI_SCRIPT_URL` が設定されている場合は必須                                                   |
| `NEXT_PUBLIC_PLAUSIBLE_DOMAIN`     | No       | —                                   | Plausible 分析ドメイン（例：`yourdomain.com`）。軽量でプライバシーフレンドリー — [plausible.io](https://plausible.io)                    |
| `NEXT_PUBLIC_PLAUSIBLE_SCRIPT_URL` | No       | `https://plausible.io/js/script.js` | 自己ホスト型インスタンス用のカスタム Plausible スクリプト URL                                                                         |

> すべての `NEXT_PUBLIC_*` 分析変数は**ビルド時**です — 変更を反映させるにはフロントエンドの再ビルドが必要です。

## Stripe Billing（オプション）

Stripe は Pro サブスクリプションを提供します。3つの変数をすべて空白のままにすると、課金が無効になります——FIM One の残りの機能は変わりません。**`STRIPE_SECRET_KEY`** **と** `STRIPE_WEBHOOK_SECRET` の両方を一緒に設定する必要があります。部分的な設定は最初の使用時にエラーが発生します。

| 変数                          | 必須  | デフォルト                                        | 説明                                                                                                                                                                                   |
| --------------------------- | --- | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `STRIPE_SECRET_KEY`         | いいえ | —                                            | Stripe API シークレットキー。`sk_test_` / `sk_live_`（フルアクセス）または `rk_test_` / `rk_live_`（制限付きキー）で始まる必要があります。Stripe ダッシュボード → Developers → API keys から取得してください。`sk_live_*` キーをソースにコミットしないでください。 |
| `STRIPE_WEBHOOK_SECRET`     | いいえ | —                                            | Stripe ウェブフック署名シークレット（`whsec_*`）。Stripe ダッシュボード → Developers → Webhooks → Add endpoint でウェブフックエンドポイントを登録するときに作成されます。受信ウェブフックペイロードを検証するために必要です。                                       |
| `STRIPE_BILLING_RETURN_URL` | いいえ | `http://localhost:3000/settings?tab=billing` | Checkout / Customer Portal セッション後に Stripe がユーザーをリダイレクトする URL。これを本番環境の課金設定ページに設定してください（例：`https://your-domain.com/settings?tab=billing`）。                                             |
