🚀

OpenAI Agent SDKのためのコンテキストエンジニアリング

に公開

OpenAI Agent SDKやGoogle Agent Development KitのようなReActライクなAgentフレームワークを使う際にネックになるのはLLMに渡すコンテキストの管理だと思う。
LangGraphのようなグラフ構造を用いたAgentフレームワークでは利用者がノード内で明示的にコンテキストの管理をしなくてはならない一方で、ReActライクなAgentフレームワークでは一見するとコンテキスト管理の仕組みがカプセル化されているように見える。
これらのフレームワークは、デフォルトではすべての会話、すべてのツール実行履歴をコンテキストに積んでいるため、PlaywrightMCPのようなTool Outputが巨大なツールを使っているとあっという間にコンテキストを使い果たしてしまう。
この記事ではOpenAI Agent SDKにおいていかにしてLLMのAPIに渡す生のコンテキストを扱い、柔軟なコンテキストエンジニアリングを実現するかについて解説する。

Runconfigを使う

Runconfig.call_model_input_filterを使うことで、生の入力コンテキストを上書きできる。call_model_input_filterはLLMのAPIコール直前に呼ばれる。下記の例ではもともとのLLMの会話やツール履歴original_inputとsystemプロンプトoriginal_instructionsをmy_inputとmy_instructionsに書き換えている。ここで、好きなようにコンテキストの圧縮を行うと良い。

from agents import Agent, RunConfig, Runner
from agents.items import TResponseInputItem
from agents.run import CallModelData, ModelInputData
class CustomCompressor:
    """RunConfig.call_model_input_filter向けの履歴圧縮ロジック。"""

    def __init__(self):
        pass

    async def __call__(self, payload: CallModelData[Any]) -> ModelInputData:
        """モデル呼び出し直前に履歴を整形する。"""
        original_input: list[TResponseInputItem] = payload.model_data.input
        original_instructions:str = payload.model_data.instructions
        my_input=[
            {
                'content': 'こんにちは',
                'role': 'user'
            }
        ]
        my_instructions="上書きしたいシステムプロンプト"
        return ModelInputData(
            input=my_input,
            instructions=my_instructions,
        )

agent = Agent(
    name="MyAgent",
    instructions="常に簡潔に回答してください。",
)

compressor = CustomCompressor()
run_config = RunConfig(call_model_input_filter=compressor)

result = await Runner.run(
    agent,
    run_config=run_config,
)

おすすめのコンテキストエンジニアリングを以下に示す。これらはMenusやClaudeCode, DeepAgentなどの一線級のAgentで用いられているコンテキスト圧縮手法だ。これにACEによる知見の学習を組み合わせると良いと思う。また、巨大な成果物を作らせるにはTTD-DRを応用するといいだろう(こちらはコンテキスト圧縮ではないが)。
https://www.notion.so/Context-Engineering-for-Agents-2a1808527b17803ba221c2ced7eef508?source=copy_link
https://rlancemartin.github.io/2025/10/15/manus/

RunHooksとの違い

OpenAI Agent SDKにはRunHooksと呼ばれるAgentの特定のイベントに対してフックをつける機能がある。しかし、これはAgentの内部の状態を書き換えることができない、ログ用の機能である。

SessionABCとの違い

また、SessionABCという機能もある。これは、Agentの永続化記憶(session)をカスタムできる抽象クラスで、session.get_itemsなどでAgentがsessionから過去のチャット、ツール履歴を取得するタイミングで取得するデータのカスタマイズができる。しかしこれはRunner.run(上記のコードにも書かれているAgent実行用の関数)が呼ばれたときにsessionから一時的な記憶領域に履歴をロードするために1度だけよばれるため、人間の介入を必要とせず、長期間ツールコールループを行うAgentのためのコンテキスト圧縮には使えない。

まとめ

RunHooksSessionABCなどほかにもカスタマイズを提供する機能があるため紛らわしいが、OpenAI Agent SDKのコンテキストエンジニアリングにはRunconfig.call_model_input_filterを使おう。

https://openai.github.io/openai-agents-python/ref/run/#agents.run.RunConfig.call_model_input_filter

Discussion