Merge branch 'add_llm' into develop

This commit is contained in:
misyaguziya
2025-12-11 14:17:39 +09:00
8 changed files with 486 additions and 11 deletions

View File

@@ -0,0 +1,56 @@
---
description: 'プロジェクト解析に基づくREADME自動生成専用モード'
tools: ['edit', 'search', 'runCommands', 'runTasks', 'usages', 'vscodeAPI', 'problems', 'changes', 'fetch', 'ms-python.python/getPythonEnvironmentInfo', 'ms-python.python/getPythonExecutableCommand', 'ms-python.python/installPythonPackage', 'ms-python.python/configurePythonEnvironment', 'todos']
model: 'Auto'
---
# README自動生成モード ※下記コードでは絵文字をカットしています
あなたは優秀な技術文書ライターです。プロジェクトのコードベースを詳細に分析し、正確で包括的なREADMEファイルを生成することが役割です。
## 基本方針 ※下記コードでは絵文字をカットしています
### 分析対象
- プロジェクトの全ファイル構成
- 主要なソースコードHTML、JavaScript、CSS、Python等
- 設定ファイルpackage.json、requirements.txt等
- 既存のドキュメント
### README構成要件 ※下記コードでは絵文字をカットしています
必須セクション(この順序で記載):
1. **プロジェクト概要** - 1-2文でプロジェクトの目的を説明
2. **主要機能** - 実装されている機能のリスト
3. **使用方法** - エンドユーザー向けの操作手順
4. **動作環境** - 必要な環境・依存関係
5. **インストール・実行方法** - 開発者向けセットアップ手順
6. **ファイル構成** - 主要ファイルの説明
7. **制限事項・既知の問題** - 現在できないこと、バグ
8. **技術仕様** - 使用技術・ライブラリ
9. **ライセンス** - 適用されるライセンス情報
### 重要な制約事項 ※下記コードでは絵文字をカットしています
1. **事実のみ記載**: コードベースに存在しない機能は記載しない
2. **検証可能な情報**: 実際のファイルから確認できる内容のみ
3. **ユーザー目線**: エンドユーザーが最初に知りたい情報を優先
4. **簡潔で明確**: 冗長な説明は避け、必要な情報を効率的に伝達
5. **制限事項の明記**: 実装されていない機能や既知の問題を正直に記載
### 文体・フォーマット ※下記コードでは絵文字をカットしています
- 敬語は使用せず、簡潔で読みやすい文体
- コードブロックやリストを適切に活用
- 見出しは階層的に整理
- 技術用語は必要に応じて補足説明
### 分析手順 ※下記コードでは絵文字をカットしています
1. プロジェクトの全体構造を把握
2. メインファイルindex.html、main.js等の機能を解析
3. 設定ファイルから依存関係や環境要件を抽出
4. 実際の動作フローを追跡
5. 未実装部分や制限事項を特定
6. 上記構成要件に従ってREADMEを生成
コードベースの事実に基づいた、正確で有用なREADMEファイルの生成を最優先に作業してください。

View File

@@ -216,11 +216,17 @@ _debounce_time: int = 2 # デバウンス時間(秒)
**通信設定**
- `OSC_IP_ADDRESS`: OSC IPアドレスデフォルト: "127.0.0.1"
- `OSC_PORT`: OSCポートデフォルト: 9000
- `AUTH_KEYS`: 認証キー辞書DeepL API等
- `AUTH_KEYS`: 認証キー辞書DeepL API, Groq API, OpenRouter API等
- `WEBSOCKET_HOST`: WebSocketホスト
- `WEBSOCKET_PORT`: WebSocketポート
- `WEBSOCKET_SERVER`: WebSocketサーバー有効フラグ非永続化
**翻訳エンジン モデル選択**
- `SELECTABLE_GROQ_MODEL_LIST`: 利用可能な Groq モデルリスト(非永続化)
- `SELECTED_GROQ_MODEL`: 選択中の Groq モデル
- `SELECTABLE_OPENROUTER_MODEL_LIST`: 利用可能な OpenRouter モデルリスト(非永続化)
- `SELECTED_OPENROUTER_MODEL`: 選択中の OpenRouter モデル
**オーバーレイ設定**
- `OVERLAY_SMALL_LOG`: 小ログオーバーレイ有効
- `OVERLAY_SMALL_LOG_SETTINGS`: 小ログオーバーレイ設定(位置、回転、表示時間等)

View File

@@ -706,6 +706,114 @@ OSC Query 機能が無効になったことを通知。無効化された機能
---
### 16-1. Groq API 認証・モデル管理
#### `setGroqAuthKey(data, *args, **kwargs) -> dict`
**責務:** Groq API キーを設定し、認証を実行
**処理:**
1. キー長のバリデーション(`gsk` で始まり40文字以上
2. `model.authenticationTranslatorGroqAuthKey()` で認証
3. 認証成功時:
- `config.AUTH_KEYS["Groq_API"]` に保存
- `config.SELECTABLE_TRANSLATION_ENGINE_STATUS["Groq_API"]` を True に
- `config.SELECTABLE_GROQ_MODEL_LIST` を取得
- 未選択の場合は先頭モデルを自動選択
- `model.updateTranslatorGroqClient()` でクライアント更新
- `updateTranslationEngineAndEngineList()` を呼び出し
4. 認証失敗時: status 400 を返却
**API キー検証失敗時の処理:**
- モデルリストをクリア (`config.SELECTABLE_GROQ_MODEL_LIST = []`)
- 選択モデルをクリア (`config.SELECTED_GROQ_MODEL = None`)
- フロントエンドに通知
#### `delGroqAuthKey(*args, **kwargs) -> dict`
**責務:** Groq API キーを削除
**処理:**
1. `config.AUTH_KEYS["Groq_API"]` を None に
2. `config.SELECTABLE_TRANSLATION_ENGINE_STATUS["Groq_API"]` を False に
3. モデルリストと選択モデルをクリア
4. `updateTranslationEngineAndEngineList()` を呼び出し
#### `getGroqAuthKey(*args, **kwargs) -> dict`
現在の Groq API キーを取得(マスク処理なし)。
#### `getGroqModelList(*args, **kwargs) -> dict`
利用可能な Groq モデルリストを取得。
#### `getGroqModel(*args, **kwargs) -> dict`
現在選択中の Groq モデルを取得。
#### `setGroqModel(data, *args, **kwargs) -> dict`
**責務:** 使用する Groq モデルを変更
**処理:**
1. モデル名のバリデーション(利用可能リスト内か確認)
2. `model.setTranslatorGroqModel()` でモデル設定
3. `model.updateTranslatorGroqClient()` でクライアント再生成
4. `config.SELECTED_GROQ_MODEL` を更新
---
### 16-2. OpenRouter API 認証・モデル管理
#### `setOpenRouterAuthKey(data, *args, **kwargs) -> dict`
**責務:** OpenRouter API キーを設定し、認証を実行
**処理:**
1. キー長のバリデーション20文字以上
2. `model.authenticationTranslatorOpenRouterAuthKey()` で認証
3. 認証成功時:
- `config.AUTH_KEYS["OpenRouter_API"]` に保存
- `config.SELECTABLE_TRANSLATION_ENGINE_STATUS["OpenRouter_API"]` を True に
- `config.SELECTABLE_OPENROUTER_MODEL_LIST` を取得
- 未選択の場合は先頭モデルを自動選択
- `model.updateTranslatorOpenRouterClient()` でクライアント更新
- `updateTranslationEngineAndEngineList()` を呼び出し
4. 認証失敗時: status 400 を返却
**API キー検証失敗時の処理:**
- モデルリストをクリア (`config.SELECTABLE_OPENROUTER_MODEL_LIST = []`)
- 選択モデルをクリア (`config.SELECTED_OPENROUTER_MODEL = None`)
- フロントエンドに通知
#### `delOpenRouterAuthKey(*args, **kwargs) -> dict`
**責務:** OpenRouter API キーを削除
**処理:**
1. `config.AUTH_KEYS["OpenRouter_API"]` を None に
2. `config.SELECTABLE_TRANSLATION_ENGINE_STATUS["OpenRouter_API"]` を False に
3. モデルリストと選択モデルをクリア
4. `updateTranslationEngineAndEngineList()` を呼び出し
#### `getOpenRouterAuthKey(*args, **kwargs) -> dict`
現在の OpenRouter API キーを取得(マスク処理なし)。
#### `getOpenRouterModelList(*args, **kwargs) -> dict`
利用可能な OpenRouter モデルリストを取得。
#### `getOpenRouterModel(*args, **kwargs) -> dict`
現在選択中の OpenRouter モデルを取得。
#### `setOpenRouterModel(data, *args, **kwargs) -> dict`
**責務:** 使用する OpenRouter モデルを変更
**処理:**
1. モデル名のバリデーション(利用可能リスト内か確認)
2. `model.setTranslatorOpenRouterModel()` でモデル設定
3. `model.updateTranslatorOpenRouterClient()` でクライアント再生成
4. `config.SELECTED_OPENROUTER_MODEL` を更新
---
### 17. WebSocket サーバー制御
#### `setWebSocketHost(data, *args, **kwargs) -> dict`

View File

@@ -0,0 +1,87 @@
# translation_groq.py - Groq 翻訳クライアント
## 概要
Groq API を用いた高速 LLM 翻訳クライアントラッパー。OpenAI 互換エンドポイント (`https://api.groq.com/openai/v1`) を利用し、モデル一覧取得・認証・モデル選択・翻訳実行を提供する。
## 最近の更新 (2025-12-10)
- Groq API サポートを新規追加
- OpenAI 互換エンドポイント経由で高速 LLM 推論を実現
- 除外キーワード (`whisper`, `embedding`, `image`, `tts`, `audio`, `search`, `transcribe`, `diarize`, `vision`) によるテキスト処理モデルのフィルタリング
- YAML (`prompt/translation_groq.yml`) からシステムプロンプトをロード
### 影響
| 項目 | 内容 |
|------|------|
| 高速化 | Groq の専用ハードウェアによる高速推論 |
| 互換性 | OpenAI 互換 API で既存実装との一貫性維持 |
| 保守性 | OpenAI クライアントと同様の設計で保守容易 |
## 責務
- Groq API Key (`gsk-` で始まる40文字以上) を用いた認証確認
- 利用可能モデルのフィルタリングとソート
- 選択モデルの検証と内部保持
- LangChain `ChatOpenAI` インスタンス生成base_url に Groq エンドポイント指定)
- システムプロンプトによる翻訳実行
## 公開API (メソッド)
```python
class GroqClient:
def __init__(root_path: str = None)
def getModelList() -> list[str]
def getAuthKey() -> str | None
def setAuthKey(api_key: str) -> bool
def getModel() -> str | None
def setModel(model: str) -> bool
def updateClient() -> None
def translate(text: str, input_lang: str, output_lang: str) -> str
```
### メソッド詳細
- `setAuthKey`: `_authentication_check` に成功した場合のみ内部保存
- `getModelList`: モデル列挙後フィルタリング適用しソート
- `setModel`: 取得済みリスト内のモデルのみ受理
- `updateClient`: `ChatOpenAI` を選択モデル・Groq base_url で再生成
- `translate`: システム + ユーザメッセージ構築→LLM呼び出し→レスポンス正規化
## 使用例
```python
client = GroqClient()
if client.setAuthKey("gsk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"):
models = client.getModelList()
client.setModel(models[0])
client.updateClient()
result = client.translate("こんにちは世界", "Japanese", "English")
print(result)
```
## 依存関係
- `openai.OpenAI`: モデル列挙 / 推論Groq エンドポイント経由)
- `langchain_openai.ChatOpenAI`: LangChain ラッパー
- `translation_languages.translation_lang`: 対応言語集合
- `translation_utils.loadPromptConfig`: プロンプト YAML ロード
## 注意事項
- base_url は固定で `https://api.groq.com/openai/v1`
- ストリーミング無効 (streaming=False) 固定
- API Key 無設定時 `getModelList()` は空
- API Key は `gsk` で始まり40文字以上であることを検証
## 制限事項
- エラーメッセージ詳細は包括的に扱わない (上位層でロギング)
- 翻訳結果の構造が複雑 (list/dict) 場合を単純文字列へ normalize するのみ
## 関連ドキュメント
- `details/translation_translator.md`
- `details/translation_languages.md`
- `details/translation_openai.md` (類似実装)

View File

@@ -0,0 +1,91 @@
# translation_openrouter.py - OpenRouter 翻訳クライアント
## 概要
OpenRouter API を用いた統合 LLM 翻訳クライアントラッパー。OpenAI 互換エンドポイント (`https://openrouter.ai/api/v1`) を利用し、複数の LLM プロバイダーへの統一アクセスを提供する。
## 最近の更新 (2025-12-10)
- OpenRouter API サポートを新規追加
- 単一 API キーで複数 LLM プロバイダーへアクセス可能
- 除外キーワード (`whisper`, `embedding`, `image`, `tts`, `audio`, `search`, `transcribe`, `diarize`, `vision`) によるテキスト処理モデルのフィルタリング
- YAML (`prompt/translation_openrouter.yml`) からシステムプロンプトをロード
### 影響
| 項目 | 内容 |
|------|------|
| 柔軟性 | 複数 LLM プロバイダーを単一インターフェースで利用 |
| 互換性 | OpenAI 互換 API で既存実装との一貫性維持 |
| 拡張性 | 新規モデル追加時も API キー再設定不要 |
## 責務
- OpenRouter API Key (20文字以上) を用いた認証確認
- 利用可能モデルのフィルタリングとソート
- 選択モデルの検証と内部保持
- LangChain `ChatOpenAI` インスタンス生成base_url に OpenRouter エンドポイント指定)
- システムプロンプトによる翻訳実行
## 公開API (メソッド)
```python
class OpenRouterClient:
def __init__(root_path: str = None)
def getModelList() -> list[str]
def getAuthKey() -> str | None
def setAuthKey(api_key: str) -> bool
def getModel() -> str | None
def setModel(model: str) -> bool
def updateClient() -> None
def translate(text: str, input_lang: str, output_lang: str) -> str
```
### メソッド詳細
- `setAuthKey`: `_authentication_check` に成功した場合のみ内部保存
- `getModelList`: モデル列挙後フィルタリング適用しソート
- `setModel`: 取得済みリスト内のモデルのみ受理
- `updateClient`: `ChatOpenAI` を選択モデル・OpenRouter base_url で再生成
- `translate`: システム + ユーザメッセージ構築→LLM呼び出し→レスポンス正規化
## 使用例
```python
client = OpenRouterClient()
if client.setAuthKey("sk_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"):
models = client.getModelList()
# OpenRouter は多数のモデルを提供
client.setModel("anthropic/claude-3-sonnet")
client.updateClient()
result = client.translate("こんにちは世界", "Japanese", "English")
print(result)
```
## 依存関係
- `openai.OpenAI`: モデル列挙 / 推論OpenRouter エンドポイント経由)
- `langchain_openai.ChatOpenAI`: LangChain ラッパー
- `translation_languages.translation_lang`: 対応言語集合
- `translation_utils.loadPromptConfig`: プロンプト YAML ロード
## 注意事項
- base_url は固定で `https://openrouter.ai/api/v1`
- ストリーミング無効 (streaming=False) 固定
- API Key 無設定時 `getModelList()` は空
- API Key は20文字以上であることを検証
## 制限事項
- エラーメッセージ詳細は包括的に扱わない (上位層でロギング)
- 翻訳結果の構造が複雑 (list/dict) 場合を単純文字列へ normalize するのみ
- OpenRouter の料金体系はモデル毎に異なる(利用前に確認が必要)
## 関連ドキュメント
- `details/translation_translator.md`
- `details/translation_languages.md`
- `details/translation_openai.md` (類似実装)
- `details/translation_groq.md` (類似実装)

View File

@@ -12,6 +12,13 @@
- Microsoft TranslatorBing
- Papago Translator
- CTranslate2ローカル翻訳
- Plamo APIプリファードネットワークス LLM
- Gemini APIGoogle LLM
- OpenAI APIChatGPT系
- Groq API高速 LLM 推論)
- OpenRouter API統合 LLM プロバイダー)
- LMStudioローカル LLM
- Ollamaローカル LLM
### 統一インターフェース
- エンジン依存を隠蔽した単一の翻訳メソッド
@@ -405,41 +412,74 @@ root/
- `model.py`: 翻訳機能統合
- `controller.py`: 翻訳制御インターフェース
## 最近の更新 (2025-10-20)
## 最近の更新
### 新規ローカル LLM エンジン追加
### 2025-12-10: Groq API および OpenRouter API サポート追加
#### Groq API 統合
- Groq API (`https://api.groq.com/openai/v1`) を翻訳エンジンとして追加
- OpenAI 互換エンドポイントで高速 LLM 推論を実現
- API キーバリデーション(`gsk` で始まり40文字以上
- モデルリスト自動取得とフィルタリング(テキスト処理モデルのみ)
- 認証成功時に `SELECTABLE_GROQ_MODEL_LIST` を更新、未選択時は先頭モデルを自動選択
- API キー無効時にモデルリストと選択モデルをクリアしフロントエンドに通知
#### OpenRouter API 統合
- OpenRouter API (`https://openrouter.ai/api/v1`) を翻訳エンジンとして追加
- 単一 API キーで複数 LLM プロバイダーへアクセス可能
- API キーバリデーション20文字以上
- モデルリスト自動取得とフィルタリング(テキスト処理モデルのみ)
- 認証成功時に `SELECTABLE_OPENROUTER_MODEL_LIST` を更新、未選択時は先頭モデルを自動選択
- API キー無効時にモデルリストと選択モデルをクリアしフロントエンドに通知
#### updateTranslationEngineAndEngineList() の拡張
- `SELECTABLE_TRANSLATION_ENGINE_STATUS` で Groq_API と OpenRouter_API の状態を管理
- 各エンジンの認証キー更新時に自動的にモデルリストを再取得
- フロントエンドへの通知を `run_mapping` 経由で送信
#### 影響
| 項目 | 内容 |
|------|------|
| Groq API | 高速 LLM 推論による翻訳速度向上 |
| OpenRouter API | 単一キーで複数 LLM プロバイダーへアクセス |
| モデル管理 | API キー検証失敗時の自動クリアで一貫性向上 |
| UX改善 | 認証後の自動モデル選択で初期設定簡略化 |
### 2025-10-20: LLM エンジン拡張と最適化
#### 新規ローカル LLM エンジン追加
LMStudio / Ollama を翻訳エンジンとして追加。接続確認後にモデルリスト (`SELECTABLE_LMSTUDIO_MODEL_LIST` / `SELECTABLE_OLLAMA_MODEL_LIST`) を取得し、未選択なら先頭モデルを自動選択 (`SELECTED_LMSTUDIO_MODEL` / `SELECTED_OLLAMA_MODEL`)。現時点では CTranslate2 と同様にローカル動作を想定し、翻訳関数側は将来の統合(温度等パラメータ)に備えて抽象化維持。
### モデル選択プロパティ名称統一
#### モデル選択プロパティ名称統一
Plamo / Gemini / OpenAI の選択モデルプロパティを `SELECTED_*` 形式へ変更。旧名称 (`PLAMO_MODEL` / `GEMINI_MODEL` / `OPENAI_MODEL`) は利用停止。自動認証後のモデルリスト更新ロジックで未選択時に先頭補完を行う。
### OpenAI / Gemini / Plamo 認証後のモデルリスト自動更新
#### OpenAI / Gemini / Plamo 認証後のモデルリスト自動更新
Auth設定メソッド完了時に `SELECTABLE_*_MODEL_LIST` を再取得し不足時は UI へ push。OpenAI はキー設定直後に最新モデルリストを反映し高速化。Gemini / Plamo も同様に `updateTranslator*Client()` 呼び出しでクライアント再生成。
### CTranslate2 言語ネスト化対応
#### CTranslate2 言語ネスト化対応
`translation_lang["CTranslate2"][weight_type]["source"|"target"]` へ構造変更。`CTRANSLATE2_WEIGHT_TYPE` により重みタイプ別の言語集合を参照。Translator 内では `translator_name == "CTranslate2"` の分岐で weight_type を参照して言語判定を行う実装に変更。
### YAML 言語マッピング導入
#### YAML 言語マッピング導入
外部ファイル `languages.yml` を読み込んで翻訳エンジン別対応言語を動的拡張。新言語追加は YAML 編集のみで実現(コード再デプロイ不要)。読み込み失敗時は空辞書でフォールバックし既存ハードコードを保持。
### VRAM エラー検知とフォールバック
#### VRAM エラー検知とフォールバック
DeepL / Plamo / Gemini / OpenAI 実行時の VRAM 不足検知で自動的に CTranslate2 へ切替し翻訳を停止 (`ENABLE_TRANSLATION=False`)。ユーザー通知後は再度有効化要求時に再初期化を試行。安定性向上のためログへ VRAM エラー詳細を記録。
### トークナイザーパス修正
#### トークナイザーパス修正
CTranslate2 トークナイザーのダウンロード処理で保存ディレクトリ作成とパス使用順序不整合を修正。これにより初回起動時の失敗率低下。
### 全言語ペア包括テスト導入
#### 全言語ペア包括テスト導入
`backend_test.py` にて `test_translate_all_language_pairs()` を追加。複数エンジン・全言語ペアを列挙実行し `translation_test_results.json` を生成。失敗ペアの早期検出と YAML 追加言語検証に活用。
### 影響
#### 影響
| 項目 | 内容 |
|------|------|

View File

@@ -17,6 +17,10 @@
- `/run/enable_translation` - 翻訳機能の有効/無効状態
- `/run/transcription_mic_message` - マイク音声認識結果
- `/run/transcription_speaker_message` - スピーカー音声認識結果
- `/run/selectable_groq_model_list` - 利用可能な Groq モデルリスト通知
- `/run/selected_groq_model` - 選択中の Groq モデル通知
- `/run/selectable_openrouter_model_list` - 利用可能な OpenRouter モデルリスト通知
- `/run/selected_openrouter_model` - 選択中の OpenRouter モデル通知
- `/run/error_*` - 各種エラー通知
- `/run/initialization_complete` - 初期化完了通知
@@ -30,7 +34,20 @@
**エンドポイント分類:**
- `/get/data/*` - 設定値の取得(初期化時に使用)
- `/get/data/groq_auth_key` - Groq API キー取得
- `/get/data/selectable_groq_model_list` - 利用可能な Groq モデルリスト取得
- `/get/data/selected_groq_model` - 選択中の Groq モデル取得
- `/get/data/openrouter_auth_key` - OpenRouter API キー取得
- `/get/data/selectable_openrouter_model_list` - 利用可能な OpenRouter モデルリスト取得
- `/get/data/selected_openrouter_model` - 選択中の OpenRouter モデル取得
- `/set/data/*` - 設定値の更新
- `/set/data/groq_auth_key` - Groq API キー設定
- `/set/data/selected_groq_model` - Groq モデル選択
- `/set/data/openrouter_auth_key` - OpenRouter API キー設定
- `/set/data/selected_openrouter_model` - OpenRouter モデル選択
- `/delete/data/*` - 設定値の削除
- `/delete/data/groq_auth_key` - Groq API キー削除
- `/delete/data/openrouter_auth_key` - OpenRouter API キー削除
- `/set/enable/*` - 機能の有効化
- `/set/disable/*` - 機能の無効化
- `/run/*` - アクション実行(メッセージ送信、ダウンロード等)

View File

@@ -215,6 +215,76 @@ CTranslate2 モデルがロード済みかチェック。
**戻り値:** 認証成功時 True
---
#### Groq API 統合
##### `authenticationTranslatorGroqAuthKey(auth_key: str) -> bool`
**責務:** Groq API キーの検証
**処理:** `translator.authenticationGroqAuthKey()` に委譲し、`root_path=config.PATH_LOCAL` を渡す
**戻り値:** 認証成功時 True
##### `getTranslatorGroqModelList() -> list[str]`
**責務:** 利用可能な Groq モデルリストの取得
**処理:** `translator.getGroqModelList()` に委譲
**戻り値:** モデル名のリスト(例: `["llama3-8b-8192", "mixtral-8x7b-32768"]`
##### `setTranslatorGroqModel(model: str) -> bool`
**責務:** 使用する Groq モデルの設定
**処理:** `translator.setGroqModel(model)` に委譲
**戻り値:** 設定成功時 Trueモデルが利用可能リストに含まれない場合 False
##### `updateTranslatorGroqClient() -> None`
**責務:** Groq クライアントの更新(モデル変更後に呼び出し)
**処理:** `translator.updateGroqClient()` に委譲し、新しいモデルで LangChain `ChatOpenAI` インスタンスを再生成
---
#### OpenRouter API 統合
##### `authenticationTranslatorOpenRouterAuthKey(auth_key: str) -> bool`
**責務:** OpenRouter API キーの検証
**処理:** `translator.authenticationOpenRouterAuthKey()` に委譲し、`root_path=config.PATH_LOCAL` を渡す
**戻り値:** 認証成功時 True
##### `getTranslatorOpenRouterModelList() -> list[str]`
**責務:** 利用可能な OpenRouter モデルリストの取得
**処理:** `translator.getOpenRouterModelList()` に委譲
**戻り値:** モデル名のリスト(例: `["anthropic/claude-3-sonnet", "google/gemini-pro"]`
##### `setTranslatorOpenRouterModel(model: str) -> bool`
**責務:** 使用する OpenRouter モデルの設定
**処理:** `translator.setOpenRouterModel(model)` に委譲
**戻り値:** 設定成功時 Trueモデルが利用可能リストに含まれない場合 False
##### `updateTranslatorOpenRouterClient() -> None`
**責務:** OpenRouter クライアントの更新(モデル変更後に呼び出し)
**処理:** `translator.updateOpenRouterClient()` に委譲し、新しいモデルで LangChain `ChatOpenAI` インスタンスを再生成
---
#### 翻訳実行
##### `getTranslate(translator_name, source_language, target_language, target_country, message) -> Tuple[str, bool]`