テック技報最新号へ →
コード

Python: typing.Protocol を継ぎ目にしてLLMプロバイダを1行で差し替え可能にする

アプリをベンダーSDK(OpenAI/Anthropic等)ではなく自前の Protocol に対して型付けすれば、本番プロバイダ・別プロバイダ・テスト用フェイクを同じスロットに差し込める。

@bbelderbos · 投稿 2026-10-07
#python#ai-coding#設計#テスト

コード例

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 を小さく分けて定義する。

出典

X の元の投稿を開く