3.9 KiB
3.9 KiB
translation_openrouter.py - OpenRouter 翻訳クライアント
概要
OpenRouter API を用いた統合 LLM 翻訳クライアントラッパー。OpenAI 互換エンドポイント (https://openrouter.ai/api/v1) を利用し、複数の LLM プロバイダーへの統一アクセスを提供する。
最近の更新 (2025-12-29)
- OpenRouter API 認証チェック方法を変更
- 以前:
client.models.list()を呼び出して認証確認 - 現在:
https://openrouter.ai/api/v1/auth/keyエンドポイントに GET リクエスト送信して確認 - 理由: より信頼性の高い専用認証エンドポイントを使用し、高速かつ確実に API キー有効性を検証
- 以前:
- 認証失敗時の sensitive data 処理
- API キー検証失敗時はレスポンス
dataフィールドにNoneを設定(API キーを露出させない) - エラーメッセージのみを返却し、具体的なキー情報は隠蔽
- API キー検証失敗時はレスポンス
影響
| 項目 | 内容 |
|---|---|
| 柔軟性 | 複数 LLM プロバイダーを単一インターフェースで利用 |
| 互換性 | OpenAI 互換 API で既存実装との一貫性維持 |
| 拡張性 | 新規モデル追加時も API キー再設定不要 |
責務
- OpenRouter API Key (20文字以上) を用いた認証確認
https://openrouter.ai/api/v1/auth/keyエンドポイントへの HTTP GET リクエストで検証(タイムアウト10秒)- ステータスコード 200 で有効と判定
- 利用可能モデルのフィルタリングとソート
- 選択モデルの検証と内部保持
- LangChain
ChatOpenAIインスタンス生成(base_url に OpenRouter エンドポイント指定) - システムプロンプトによる翻訳実行
公開API (メソッド)
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呼び出し→レスポンス正規化
使用例
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.mddetails/translation_languages.mddetails/translation_openai.md(類似実装)details/translation_groq.md(類似実装)