99 lines
4.0 KiB
Markdown
99 lines
4.0 KiB
Markdown
# translation_lmstudio.py - LMStudio ローカル LLM 翻訳クライアント
|
|
|
|
## 概要
|
|
|
|
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) を翻訳エンジン群へ統合
|
|
- `getModelList()` により現在起動中インスタンスから利用可能モデルを取得
|
|
- `setModel()` 成功時に `updateClient()` を呼ぶことで LangChain `ChatOpenAI` を再構築
|
|
- YAML (`prompt/translation_lmstudio.yml`) からシステムプロンプト (`system_prompt`) と対応言語をロード
|
|
|
|
### 影響
|
|
|
|
| 項目 | 内容 |
|
|
|------|------|
|
|
| 拡張性 | ネットワーク不要のローカル推論を利用可能 |
|
|
| 一貫性 | 他 API クライアント (OpenAI/Plamo/Gemini/Ollama) と同一メソッド構成 |
|
|
| 保守性 | 翻訳ロジックを共通フォーマットへ集約 |
|
|
|
|
## 責務
|
|
|
|
- LMStudio エンドポイントへの疎通確認 (認証代替)
|
|
- 利用可能モデル一覧の収集とソート
|
|
- 選択モデルの検証と内部保持
|
|
- LangChain ラッパーインスタンス生成
|
|
- システムプロンプトによる指示付き翻訳実行
|
|
|
|
## 公開API (メソッド)
|
|
|
|
```python
|
|
class LMStudioClient:
|
|
def __init__(base_url: str | None = None, root_path: str = None)
|
|
def getBaseURL() -> str | None
|
|
def setBaseURL(base_url: str | None) -> bool
|
|
def getModelList() -> list[str]
|
|
def getModel() -> str | None
|
|
def setModel(model: str) -> bool
|
|
def updateClient() -> None
|
|
def translate(text: str, input_lang: str, output_lang: str) -> str
|
|
```
|
|
|
|
### メソッド詳細
|
|
|
|
- `setBaseURL`: 疎通確認 (_authentication_check) に成功した場合のみ内部更新
|
|
- `getModelList`: `OpenAI` クライアントで `/models` を列挙し id を抽出
|
|
- `setModel`: `getModelList` 内のモデル名のみ受理
|
|
- `updateClient`: `ChatOpenAI` インスタンスを最新モデルで再生成
|
|
- `translate`: システム / ユーザメッセージで LLM へ問い合わせし文字列レスポンスを正規化
|
|
|
|
## 使用例
|
|
|
|
```python
|
|
client = LMStudioClient(base_url="http://localhost:1234/v1")
|
|
models = client.getModelList()
|
|
if models:
|
|
client.setModel(models[0])
|
|
client.updateClient()
|
|
translated = client.translate("こんにちは世界", "Japanese", "English")
|
|
print(translated)
|
|
```
|
|
|
|
## 依存関係
|
|
|
|
- `openai.OpenAI`: LMStudio OpenAI 互換 API 呼び出し
|
|
- `langchain_openai.ChatOpenAI`: LangChain 抽象化
|
|
- `translation_languages.translation_lang`: 対応言語集合
|
|
- `translation_utils.loadPromptConfig`: プロンプト YAML ロード
|
|
|
|
## 注意事項
|
|
|
|
- `api_key` は固定文字列 "lmstudio" (LMStudio 側で不要のため) を利用
|
|
- モデル一覧取得はエンドポイントの互換性に依存 (古いバージョン非対応の可能性)
|
|
- `updateClient()` 呼び出し前は `translate()` を利用できない
|
|
- **接続失敗時の自動処理:**
|
|
- URL への疎通確認(接続テスト)が失敗すると、自動的にモデルリストと選択モデルがクリアされる
|
|
- `SELECTABLE_TRANSLATION_ENGINE_STATUS["LMStudio"]` が False に設定され、エンジンが使用不可状態になる
|
|
- Controller が自動的にフロントエンドに状態変化を通知
|
|
|
|
## 制限事項
|
|
|
|
- ストリーミング未対応 (streaming=False)
|
|
- エラーハンドリングは包括的ではなく詳細原因は上位層で処理必要
|
|
|
|
## 関連ドキュメント
|
|
|
|
- `details/translation_translator.md`
|
|
- `details/translation_languages.md`
|
|
|