From 1b88d23f21e12f28307e7aa86f3fcd2759c7a3c1 Mon Sep 17 00:00:00 2001 From: zukki259 Date: Sun, 23 Aug 2026 23:12:34 +0900 Subject: [PATCH] Set the OpenAI-compatible endpoint from the settings panel MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Pointing OPENAI_BASE_URL at a local llama-server or Ollama sends every gpt-* call there instead of to OpenAI, and litellm reports that as a bare "Connection Error" — which reads like a network problem even though the host can reach api.openai.com fine. Deploying a .env that still carries the local endpoint reproduces it on the server, with nothing in the message naming the culprit. Add OPENAI_BASE_URL and OPENAI_API_BASE to the settings allowlist so the endpoint can be corrected without editing .env and recreating the container. Both are listed because litellm reads OPENAI_API_BASE while the OpenAI SDK reads OPENAI_BASE_URL, so fixing one can leave the other in effect. Neither is a secret, so the panel shows the current value. No cache invalidation is needed alongside this: litellm keys its client cache on the endpoint, so a changed value takes effect on the next call. Document the trap where it will be read — a commented template in .env.example and a note in the Lightsail deploy guide about carrying a local .env over. Co-Authored-By: Claude Opus 5 --- CLAUDE.md | 1 + backend/.env.example | 6 ++++++ backend/app/core/settings_store.py | 7 +++++++ docs/deploy-lightsail.md | 5 +++++ docs/features.md | 8 ++++++-- frontend/src/components/SettingsPanel.vue | 2 ++ 6 files changed, 27 insertions(+), 2 deletions(-) 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',