diff --git a/CLAUDE.md b/CLAUDE.md index 302635e..55381d4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -146,6 +146,7 @@ LLM に渡すコンテキストは `app/core/memory_kb/memory.py` の `get_conte | `CORS_ORIGINS` | `http://localhost:5173` | 許可する CORS オリジン | | `DEBUG` | `false` | LiteLLM デバッグログの有効化 | | `OPENAI_API_KEY` | — | OpenAI API キー | +| `OPENAI_API_BASE` / `OPENAI_BASE_URL` | — | OpenAI 互換エンドポイントの接続先(ローカルの llama-server / Ollama 用)。設定したままだと `gpt-*` を選んでも本家 OpenAI に繋がらない。GUI 設定画面から実行時変更可 | | `ANTHROPIC_API_KEY` | — | Anthropic API キー | | `OLLAMA_API_BASE` | `http://localhost:11434` | Ollama エンドポイント | | `NOTES_TOOL_CONTENT_LIMIT` | `4000` | `read_note` が 1 回に返す本文の最大文字数 | diff --git a/backend/.env.example b/backend/.env.example index ffdec00..f3ecf73 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -2,6 +2,12 @@ DEFAULT_MODEL=gpt-5.4 # OpenAI OPENAI_API_KEY=sk-... +# OpenAI互換エンドポイントに向ける場合だけ設定する(ローカルの llama-server / Ollama など)。 +# 設定したままにすると、gpt-* のモデルを選んでも接続先がそちらのままになり、 +# 本家OpenAIには繋がらない(litellm は OPENAI_API_BASE、OpenAI SDK は OPENAI_BASE_URL を見る)。 +# サーバーにデプロイする際はこの2行を消し忘れないこと。GUIの設定画面からも変更できる。 +# OPENAI_API_BASE=http://localhost:11434/v1 +# OPENAI_BASE_URL=http://localhost:11434/v1 # Anthropic ANTHROPIC_API_KEY=sk-ant-... # Ollama (ローカル) — APIキー不要、モデル名は ollama/llama3 形式で指定 diff --git a/backend/app/core/settings_store.py b/backend/app/core/settings_store.py index 86c1db2..931900a 100644 --- a/backend/app/core/settings_store.py +++ b/backend/app/core/settings_store.py @@ -7,6 +7,11 @@ from app.db.models import AppSetting # GUIから編集可能な環境変数の許可リスト。ここに無いキーは save()/clear() で拒否する。 CONFIGURABLE_KEYS = [ "OPENAI_API_KEY", + # OpenAI 互換エンドポイント。ローカルの llama-server / Ollama を向けたまま忘れると、 + # OpenAI のモデルを選んでも接続先がそちらのままになる(litellm は OPENAI_API_BASE、 + # OpenAI SDK は OPENAI_BASE_URL を見るので両方を出しておく)。 + "OPENAI_BASE_URL", + "OPENAI_API_BASE", "ANTHROPIC_API_KEY", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", @@ -22,6 +27,8 @@ CONFIGURABLE_KEYS = [ # 秘匿情報ではないキー。値をマスクせずそのまま返し、GUIでも通常のテキスト入力として扱う。 # モデル名やURLは「今どれが効いているか」が見えないと設定しづらいため。 NON_SECRET_KEYS = { + "OPENAI_BASE_URL", + "OPENAI_API_BASE", "AWS_REGION_NAME", "OLLAMA_API_BASE", "LOCAL_KB_EMBEDDING_MODEL", diff --git a/docs/deploy-lightsail.md b/docs/deploy-lightsail.md index 5fae3ca..6406e4c 100644 --- a/docs/deploy-lightsail.md +++ b/docs/deploy-lightsail.md @@ -113,6 +113,11 @@ nano backend/.env # APIキーやモデル名など本番用の値を設定 `backend/.env` はコンテナに `env_file` として渡され、Git 管理対象外(`.gitignore` 済み)なので直接編集してよい。 +**ローカルの `.env` をそのまま持ち込むときの注意:** `OPENAI_BASE_URL` / `OPENAI_API_BASE` を +ローカルの llama-server や Ollama に向けていると、サーバー上では存在しない宛先に接続しに行くため、 +`gpt-*` のモデルを選んでも litellm が「Connection Error」になる。サーバーの `.env` からは消しておくこと +(設定画面の「OpenAI 互換エンドポイント」からも上書きできる)。 + ### GUIからのAPIキー管理 初回起動後は、`OPENAI_API_KEY` / `ANTHROPIC_API_KEY` / AWS認証情報などをSSHで`.env`を編集し直さなくても、 diff --git a/docs/features.md b/docs/features.md index a45af80..90b136e 100644 --- a/docs/features.md +++ b/docs/features.md @@ -164,8 +164,12 @@ Discord 連携は [discord-bot.md](discord-bot.md)、ノートの操作方法は - モデルのプルダウンは `model_presets` テーブル由来で、初回起動時に既定の一覧がシードされる。 設定画面からラベル/モデル文字列を追加・編集・削除できる(重複は 400 で弾く)。 - 設定画面では API キー類を**再起動なしで**変更できる。 - - 変更できるのは許可リストにあるキーだけ(`OPENAI_API_KEY` / `ANTHROPIC_API_KEY` / AWS 系 / - `OLLAMA_API_BASE` / `TAVILY_API_KEY` / `LOCAL_KB_EMBEDDING_MODEL` / `SEARCH_SUMMARY_MODEL`) + - 変更できるのは許可リストにあるキーだけ(`OPENAI_API_KEY` / `OPENAI_BASE_URL` / `OPENAI_API_BASE` / + `ANTHROPIC_API_KEY` / AWS 系 / `OLLAMA_API_BASE` / `TAVILY_API_KEY` / + `LOCAL_KB_EMBEDDING_MODEL` / `SEARCH_SUMMARY_MODEL`) + - `OPENAI_BASE_URL` / `OPENAI_API_BASE` は OpenAI 互換エンドポイント(ローカルの llama-server や Ollama) + に向けるためのもの。向けたままだと `gpt-*` のモデルを選んでも本家 OpenAI には繋がらず、 + litellm からは「Connection Error」に見える - API キー類は末尾 4 文字だけを見せるマスク表示。モデル名や URL(`settings_store.NON_SECRET_KEYS`)は 現在値をそのまま表示し、入力欄も伏せ字にしない(今どれが効いているか分からないと設定しづらいため) - 空欄で保存すると「変更なし」扱い diff --git a/frontend/src/components/SettingsPanel.vue b/frontend/src/components/SettingsPanel.vue index 870a49d..eb13b99 100644 --- a/frontend/src/components/SettingsPanel.vue +++ b/frontend/src/components/SettingsPanel.vue @@ -37,6 +37,8 @@ async function addModelPreset() { const KEY_LABELS: Record = { OPENAI_API_KEY: 'OpenAI APIキー', + OPENAI_BASE_URL: 'OpenAI 互換エンドポイント (OPENAI_BASE_URL)', + OPENAI_API_BASE: 'OpenAI 互換エンドポイント (OPENAI_API_BASE)', ANTHROPIC_API_KEY: 'Anthropic APIキー', AWS_ACCESS_KEY_ID: 'AWS Access Key ID', AWS_SECRET_ACCESS_KEY: 'AWS Secret Access Key',