Python: typing.Protocol を継ぎ目にしてLLMプロバイダを1行で差し替え可能にする
アプリをベンダーSDK(OpenAI/Anthropic等)ではなく自前の Protocol に対して型付けすれば、本番プロバイダ・別プロバイダ・テスト用フェイクを同じスロットに差し込める。
コード例
python
from typing import Protocol
class LLMClient(Protocol):
def complete(self, prompt: str) -> str: ...
class AnthropicClient:
def complete(self, prompt: str) -> str:
... # anthropic SDK を呼ぶ
class OpenAIClient:
def complete(self, prompt: str) -> str:
... # openai SDK を呼ぶ
class FakeClient:
def __init__(self, reply: str) -> None:
self.reply = reply
def complete(self, prompt: str) -> str:
return self.reply
def summarize(text: str, llm: LLMClient) -> str:
return llm.complete(f"要約して:\n{text}")
# 差し替えは1行
llm: LLMClient = AnthropicClient() # or OpenAIClient() / FakeClient("ok")Protocolは構造的部分型なので、各クラスが継承しなくてもメソッドの形が合えばOK(mypy/pyright がチェック)。
注意点
- Python 3.8+。実行時に
isinstanceで判定したい場合は@runtime_checkableを付ける(メソッドの有無しか見ない)。 - ストリーミングやツール呼び出しなどプロバイダ差の大きい機能は、Protocol を小さく分けて定義する。