From 588b95eebece2e6d57e099ec90acbf0cd1bf0f59 Mon Sep 17 00:00:00 2001 From: misyaguziya <53165965+misyaguziya@users.noreply.github.com> Date: Tue, 30 Dec 2025 06:44:15 +0900 Subject: [PATCH] [Fix] Error Handling: Update setter methods to allow None values for type checks and enhance sensitive data handling in authentication failures. --- src-python/docs/config.md | 12 +++++++++++- src-python/docs/controller.md | 12 ++++++++---- src-python/docs/details/translation_lmstudio.md | 12 ++++++++++++ src-python/docs/details/translation_ollama.md | 12 ++++++++++++ src-python/docs/details/translation_openrouter.md | 15 ++++++++++----- 5 files changed, 53 insertions(+), 10 deletions(-) diff --git a/src-python/docs/config.md b/src-python/docs/config.md index 6fd78305..2051c5c7 100644 --- a/src-python/docs/config.md +++ b/src-python/docs/config.md @@ -279,11 +279,21 @@ def SELECTED_TAB_NO(self, value): ``` 各setterは以下のパターンを実装: -1. 型チェック (`isinstance`) +1. 型チェック (`isinstance`):**`None` 値は常に許可される** (値をクリアしたい場合への対応) 2. 値の範囲・有効性チェック 3. 内部変数への代入 4. `saveConfig` 呼び出し(永続化対象の場合) +#### 型チェックの詳細(v3.3.0+) + +```python +# 型チェック実装:Noneは常に許可 +if self.type_ is not None and value is not None and not isinstance(value, self.type_): + return # 無視する +``` + +この変更により、設定値をクリア(None に設定)する用途に対応。例えば認証失敗時に API キーを `None` に設定する場合に有効。 + ### メッセージフォーマット構造 ```python diff --git a/src-python/docs/controller.md b/src-python/docs/controller.md index e86cfa98..30e371f9 100644 --- a/src-python/docs/controller.md +++ b/src-python/docs/controller.md @@ -722,12 +722,14 @@ OSC Query 機能が無効になったことを通知。無効化された機能 - 未選択の場合は先頭モデルを自動選択 - `model.updateTranslatorGroqClient()` でクライアント更新 - `updateTranslationEngineAndEngineList()` を呼び出し -4. 認証失敗時: status 400 を返却 +4. 認証失敗時 (status 400): + - レスポンス `data` フィールドを **None に設定** (sensitive data を隠す) + - `delGroqAuthKey()` を呼び出してクリーンアップ **API キー検証失敗時の処理:** - モデルリストをクリア (`config.SELECTABLE_GROQ_MODEL_LIST = []`) - 選択モデルをクリア (`config.SELECTED_GROQ_MODEL = None`) -- フロントエンドに通知 +- フロントエンドに通知(レスポンス `data` は None) #### `delGroqAuthKey(*args, **kwargs) -> dict` @@ -776,12 +778,14 @@ OSC Query 機能が無効になったことを通知。無効化された機能 - 未選択の場合は先頭モデルを自動選択 - `model.updateTranslatorOpenRouterClient()` でクライアント更新 - `updateTranslationEngineAndEngineList()` を呼び出し -4. 認証失敗時: status 400 を返却 +4. 認証失敗時 (status 400): + - レスポンス `data` フィールドを **None に設定** (sensitive data を隠す) + - `delOpenRouterAuthKey()` を呼び出してクリーンアップ **API キー検証失敗時の処理:** - モデルリストをクリア (`config.SELECTABLE_OPENROUTER_MODEL_LIST = []`) - 選択モデルをクリア (`config.SELECTED_OPENROUTER_MODEL = None`) -- フロントエンドに通知 +- フロントエンドに通知(レスポンス `data` は None) #### `delOpenRouterAuthKey(*args, **kwargs) -> dict` diff --git a/src-python/docs/details/translation_lmstudio.md b/src-python/docs/details/translation_lmstudio.md index b54d46a8..01516a91 100644 --- a/src-python/docs/details/translation_lmstudio.md +++ b/src-python/docs/details/translation_lmstudio.md @@ -4,6 +4,14 @@ LMStudio 互換 OpenAI API を利用したローカル LLM 翻訳クライアントラッパー。モデル一覧取得・モデル選択・翻訳処理を統一インターフェースで提供する。 +## 最近の更新 (2025-12-30) + +- 接続失敗時のエラーハンドリング改善 + - URL への疎通確認失敗時にモデルリストをクリア (`SELECTABLE_LMSTUDIO_MODEL_LIST = []`) + - 選択モデルをクリア (`SELECTED_LMSTUDIO_MODEL = None`) + - `SELECTABLE_TRANSLATION_ENGINE_STATUS["LMStudio"]` を False に設定 + - フロントエンドに通知して UI を同期 + ## 最近の更新 (2025-10-20) - 新規追加: ローカル LLM (LMStudio) を翻訳エンジン群へ統合 @@ -73,6 +81,10 @@ if models: - `api_key` は固定文字列 "lmstudio" (LMStudio 側で不要のため) を利用 - モデル一覧取得はエンドポイントの互換性に依存 (古いバージョン非対応の可能性) - `updateClient()` 呼び出し前は `translate()` を利用できない +- **接続失敗時の自動処理:** + - URL への疎通確認(接続テスト)が失敗すると、自動的にモデルリストと選択モデルがクリアされる + - `SELECTABLE_TRANSLATION_ENGINE_STATUS["LMStudio"]` が False に設定され、エンジンが使用不可状態になる + - Controller が自動的にフロントエンドに状態変化を通知 ## 制限事項 diff --git a/src-python/docs/details/translation_ollama.md b/src-python/docs/details/translation_ollama.md index d176644e..93d8dc88 100644 --- a/src-python/docs/details/translation_ollama.md +++ b/src-python/docs/details/translation_ollama.md @@ -4,6 +4,14 @@ Ollama サーバー上で稼働するローカル LLM を翻訳エンジンとして扱うためのクライアントラッパー。モデル一覧取得・モデル選択・翻訳実行を統一パターンで提供する。 +## 最近の更新 (2025-12-30) + +- 接続失敗時のエラーハンドリング改善 + - `/api/ping` への疎通確認失敗時にモデルリストをクリア (`SELECTABLE_OLLAMA_MODEL_LIST = []`) + - 選択モデルをクリア (`SELECTED_OLLAMA_MODEL = None`) + - `SELECTABLE_TRANSLATION_ENGINE_STATUS["Ollama"]` を False に設定 + - フロントエンドに通知して UI を同期 + ## 最近の更新 (2025-10-20) - 新規追加: Ollama を翻訳エンジン群へ統合 @@ -73,6 +81,10 @@ if client.authenticationCheck(): - サーバー既定 URL: `http://localhost:11434` - モデル一覧取得は起動しているローカルサーバー状態に依存 - `updateClient()` 呼び出し前は `translate()` を利用不可 +- **接続失敗時の自動処理:** + - `/api/ping` への疎通確認が失敗すると、自動的にモデルリストと選択モデルがクリアされる + - `SELECTABLE_TRANSLATION_ENGINE_STATUS["Ollama"]` が False に設定され、エンジンが使用不可状態になる + - Controller が自動的にフロントエンドに状態変化を通知 ## 制限事項 diff --git a/src-python/docs/details/translation_openrouter.md b/src-python/docs/details/translation_openrouter.md index 7a15398c..3936b19a 100644 --- a/src-python/docs/details/translation_openrouter.md +++ b/src-python/docs/details/translation_openrouter.md @@ -4,12 +4,15 @@ OpenRouter API を用いた統合 LLM 翻訳クライアントラッパー。OpenAI 互換エンドポイント (`https://openrouter.ai/api/v1`) を利用し、複数の LLM プロバイダーへの統一アクセスを提供する。 -## 最近の更新 (2025-12-10) +## 最近の更新 (2025-12-29) -- OpenRouter API サポートを新規追加 -- 単一 API キーで複数 LLM プロバイダーへアクセス可能 -- 除外キーワード (`whisper`, `embedding`, `image`, `tts`, `audio`, `search`, `transcribe`, `diarize`, `vision`) によるテキスト処理モデルのフィルタリング -- YAML (`prompt/translation_openrouter.yml`) からシステムプロンプトをロード +- OpenRouter API 認証チェック方法を変更 + - **以前:** `client.models.list()` を呼び出して認証確認 + - **現在:** `https://openrouter.ai/api/v1/auth/key` エンドポイントに GET リクエスト送信して確認 + - **理由:** より信頼性の高い専用認証エンドポイントを使用し、高速かつ確実に API キー有効性を検証 +- 認証失敗時の sensitive data 処理 + - API キー検証失敗時はレスポンス `data` フィールドに `None` を設定(API キーを露出させない) + - エラーメッセージのみを返却し、具体的なキー情報は隠蔽 ### 影響 @@ -22,6 +25,8 @@ OpenRouter API を用いた統合 LLM 翻訳クライアントラッパー。Ope ## 責務 - OpenRouter API Key (20文字以上) を用いた認証確認 + - `https://openrouter.ai/api/v1/auth/key` エンドポイントへの HTTP GET リクエストで検証(タイムアウト10秒) + - ステータスコード 200 で有効と判定 - 利用可能モデルのフィルタリングとソート - 選択モデルの検証と内部保持 - LangChain `ChatOpenAI` インスタンス生成(base_url に OpenRouter エンドポイント指定)