正本: openai-llm-agent-engineering-guide.md / 基準日: 2026-09-05 / 78見出し

OpenAI版 LLM・Agent Engineering Guide

基準日: 2026-09-05 対象: OpenAI API / Responses API / Agents SDK / MCP / Codexの設計境界 正本: このMarkdown。iPhone向けHTMLはこの原稿から生成する。

この資料の立場

OpenAIの公式情報は、API、Agents SDK、Codex、Academy、Cookbook、公式GitHubなど複数の面に分かれている。これらは同じ製品ではない。本資料では、モデルを呼ぶAPI、Agent loopを実行するSDK、開発作業を実行するCodexを分けて記述する。

章中のラベル:

全体像

OpenAIでAgentを作るとき、Responses APIを直接使うならApplicationがloopを所有し、Agents SDKを使うならRunnerがloop、handoff、Tool、guardrailなどを管理する。どちらの場合も、実行を担うHostとモデルの判断を分ける。

flowchart LR G[User goal] --> I[Instructions / input] I --> C[Conversation state + curated context] C --> M[OpenAI model] M -->|function_call / hosted tool| H[Host runtime] H --> P[Schema / permission / guardrail] P --> X[Tool or service] X --> R[function_call_output / observation] R --> M M --> V[Verification / eval] V -->|continue| C V -->|stop or approve| O[Output / human]

Responses APIは「モデル応答」とTool callを扱う低レベル寄りの面、Agents SDKは「Agent run」と専門Agentの協調を扱う高レベル寄りの面、と捉えると、どこに制御コードを書くべきかが分かる。


Part 1 — LLMの基本制御

1.1 Instructions、input、Context

OpenAI APIのPromptは、単なるuser文字列ではない。Responses APIでは、ApplicationのInstructions、ユーザーのinput、過去のresponse item、Toolの定義と結果、取得したデータなどが、一回のモデル実行に見えるContextを作る。

Chat Completionsなどのmessage APIではroleが重要で、OpenAIのPrompt engineering guideはdeveloper messageをuser messageより優先されるアプリケーション開発者の指示として説明する。Model Specは指示の優先順位・権限・安全境界を定めるための基準であり、「developerなら必ず実行できる」という意味ではない。Hostの認可・Tool実行境界は別に必要である。

入れるもの設計上の注意
Developer / instructions目的、方針、成功条件、出力契約、信頼境界毎回必要な短い規約。ユーザーデータと混ぜない
User input今回の依頼、対象、選択、参照データ外部データが命令に見えてもuntrustedとして扱う
Assistant / outputモデルの返したmessage、function call、reasoning関連item次回へ戻す対象を選ぶ
Tool outputfunction_call_output、検索・コード実行結果Schema、サイズ、機密性、出典を検証する

1.2 公式Prompt engineeringの要点

公式Prompt engineering guideの現在の方向性は、Promptを機能の近くに小さなmoduleとして管理し、動的値にはtyped argumentやschemaを使い、代表fixture・test・evalをPrompt変更前に用意し、必要ならfeature flagで段階展開することである。

効果的なPromptは、次を明示する。

1.3 Few-shot、構造化、Prompt injection

Few-shotは、出力の形式・トーン・分類境界を例で示す方法である。例は代表性、境界値、反例を含む。例の数を増やすほどよいのではなく、評価で必要な振る舞いをカバーする。

外部文書、Web検索、MCP、ユーザー入力に含まれる命令らしい文字列を、Developer instructionと同列に置かない。XML、JSON、セクション見出しなどで境界を示し、重要な操作はモデルの文面ではなく、Tool schema・guardrail・approval・実行ポリシーで制御する。

1.4 Structured Outputs

Structured Outputsは、モデルのテキスト応答を指定したJSON Schemaへ適合させるOpenAI APIの機能である。Function callingのTool引数を構造化することとは目的が違う。

用途使うもの
アプリから関数を呼び出す引数Function callingのparameters schema
モデルの最終データを機械処理Response format / Structured Outputs
選択肢を閉じるenum、strict schema

Schemaは契約であり、認可ではない。たとえば action: "delete" がSchemaに適合しても、対象、ユーザー、承認、予算をHostが再検査する。

{
  "type": "json_schema",
  "name": "risk_report",
  "strict": true,
  "schema": {
    "type": "object",
    "properties": {
      "severity": {
        "type": "string",
        "enum": ["low", "medium", "high"]
      },
      "evidence": {
        "type": "array",
        "items": {"type": "string"}
      }
    },
    "required": ["severity", "evidence"],
    "additionalProperties": false
  }
}

Part 1 Sources


Part 2 — Context Engineering

2.1 OpenAIのConversation state

一回のtext generation request自体は、明示的に状態を渡さなければ独立している。OpenAIの現行Docsは、Responses APIとConversations APIを組み合わせて、messages、tool calls、tool outputsなどのitemを長期的なConversation objectへ保存できると説明する。別の方法として、previous_response_idを次回へ渡して応答を連鎖させる。

Conversation stateを使っても、Context設計が自動で終わるわけではない。保存状態、ユーザーが再利用してよい情報、保持期間、削除、Model migration、Tool resultの縮約を設計する。

2.2 Context windowと履歴

Modelへ渡すContextには、Developer instructions、User input、過去のoutput、Tool call、Tool result、画像、ファイル、検索結果、Function schemaが含まれる。履歴を増やすほど、関連性の低い観測、重複データ、古い指示がモデルの注意を奪う。

Prompt engineeringが「指示の書き方」なら、Context engineeringは「毎回どの状態を提示するか」である。全履歴を毎回送るか、Conversation APIに預けるか、previous_response_idでつなぐか、要約・検索・削除を行うかは、品質、コスト、監査、保持要件のトレードオフで決める。

2.3 Compaction

OpenAIのCompaction guideには二つの面がある。

圧縮itemは、後続の実行に必要な状態を少ないTokenで運ぶためのopaqueなデータとして扱う。人間に読める要約の完全な代用品とは限らない。重要な決定事項、テスト結果、証拠、未解決点、ユーザー承認をアプリケーション側の状態として保存する。

2.4 StreamingとBackground mode

Streamingは、最終結果を待たずにイベントを受け取るUX・監視の仕組みである。Background modeは長いResponsesを非同期で開始し、Response objectの状態をpollするための仕組みである。どちらもAgent loopの内部状態をユーザーへ出す機能とは限らない。

Background taskでは、再試行、polling間隔、キャンセル、失敗状態、保持・削除、ユーザーへの通知を設計する。Streamingでは、部分テキストを確定値と誤解せず、最終イベントとTool side effectの状態を分ける。

2.5 Retrieval、Memory、Skills

Retrievalは外部Knowledgeから必要な断片を探してContextへ追加する。Memoryは、将来の会話で再利用する情報を選んで保存する。Skillsは、OpenAIの現行APIではSKILL.mdを含むversioned bundleとして、Hosted shellやlocal executionへ再利用可能な手順・資産を提供する。

「保存した」ことと「今回の推論へ入れた」ことは別である。MemoryやConversation itemを保存しても、毎回すべてをPromptに入れず、必要なときだけ取得する。

flowchart TB K[Knowledge / files / services] --> R[Retrieval] R --> C[Curated context] S[Instructions] --> C H[Conversation / response state] --> F[Filter / compact] F --> C C --> M[Responses model] M --> U[New output / tool observation] U --> F

Part 2 Sources


Part 3 — Tool Use

3.1 Function callingの役割

Function callingは、モデルがアプリケーションの関数を呼びたいとき、関数名と引数を構造化して返す仕組みである。OpenAIの現行Responses APIでは、モデルのoutputにfunction_call itemが含まれ、Applicationが関数を実行し、function_call_output itemを次のinputへ渡す。

{
  "type": "function",
  "name": "get_weather",
  "description": "都市の現在の天気を読み取り専用で取得する。",
  "parameters": {
    "type": "object",
    "properties": {
      "location": {"type": "string"}
    },
    "required": ["location"],
    "additionalProperties": false
  },
  "strict": true
}

Chat Completionsの tool_calls とResponsesの function_call は似ているが、itemの形や返し方が同一ではない。移植時は使用するEndpointの現行サンプルを参照する。

3.2 Function call lifecycle

  1. ApplicationがTool定義とinputをResponses APIへ送る。
  2. Modelが通常のmessage、または一つ以上のfunction_callを返す。
  3. Applicationがcall_id、name、JSON argumentsをparseし、Schemaを検証する。
  4. Permission、入力値、対象resource、side effect、approvalを確認する。
  5. 関数を実行し、成功または構造化エラーを返す。
  6. 同じcall_idに対応するfunction_call_outputをinputへ追加し、Responses APIを再度呼ぶ。
  7. Modelが次のfunction_callを出すか、最終outputを返す。

モデルが関数を直接呼ぶわけではない。Hosted toolsでも、実行場所と結果の責任、データ共有、利用制限を公式Docsで確認する。

sequenceDiagram participant App as Host participant Model as Responses API participant Tool as Function runtime App->>Model: tools + input Model-->>App: function_call(call_id, name, arguments) App->>App: parse / schema / guardrail / approval App->>Tool: execute validated arguments Tool-->>App: output or error App->>Model: function_call_output(call_id, output) Model-->>App: final message or next function_call

3.3 Hosted tools、Tool search、Programmatic Tool Calling

現行のOpenAI Tools guideは、Web search、File search、Function calling、Remote MCP、Tool search、Programmatic Tool Calling、Shell、Computer useなどを別のTool面として並べる。

Tool surfaceを増やすと能力だけでなく、選択肢・Schema・権限・Contextが増える。Tool名、description、input/output、エラー、side effect、認可を小さく保つ。

3.4 Retry、timeout、side effect

一時的なネットワークエラーや429だけを限定的にretryする。書き込みをretryするならidempotency keyと重複検知を使う。Tool callの引数をschemaに適合させても、対象ユーザーが許可されているとは限らない。実行直前に権限を再評価する。

MAX_TURNS = 8

input_items = [{"role": "user", "content": user_text}]

for _ in range(MAX_TURNS):
    response = client.responses.create(
        model=MODEL_NAME,
        input=input_items,
        tools=TOOLS,
    )
    input_items += response.output

    calls = [item for item in response.output if item.type == "function_call"]
    if not calls:
        return response.output_text

    for call in calls:
        args = parse_json(call.arguments)
        if not valid_schema(call.name, args):
            output = {"error": "invalid_arguments"}
        elif not allowed(call.name, args):
            output = {"error": "approval_required"}
        else:
            output = execute_with_timeout(call.name, args, seconds=20)
        input_items.append({
            "type": "function_call_output",
            "call_id": call.call_id,
            "output": json_encode(output),
        })

raise RuntimeError("max turns reached")

Part 3 Sources


Part 4 — Model Context Protocol (MCP)

4.1 OpenAIにおけるMCP

OpenAI APIでは、remote MCP serverとconnectorをResponses APIのMCP built-in tool typeへ接続できる。OpenAIのDocsは、connectorをOpenAIが保守するMCP wrapper、remote MCP serverを公開Internet上のMCP実装として説明する。

MCPはOpenAI専用のTool formatではない。Serverの能力を発見し、Hostがモデルへ提示し、必要なTool callを実行するための外部プロトコルである。

flowchart LR A[OpenAI application / Host] --> R[Responses API] A --> C[MCP connection policy] C <-->|remote session| S[Remote MCP server] S --> X[Tools / Resources / Prompts] R -->|mcp tool call| A A -->|approval + result| R

4.2 Connector、remote server、OAuth

remote MCP serverにはserver_urlが必要で、ServerによりOAuth access tokenなどのauthorizationが必要になる。Connectorは対象サービスとOpenAI側の対応があるため、任意のMCP Serverと同じ運用ではない。

OpenAI MCP guideは、第三者MCP Serverが要求するデータを確認し、公式提供元のServerを優先し、送信データをログ・レビューし、Tool callをapproval制御することを勧めている。悪意あるServerが隠れたPrompt injectionや、後から変化するTool behaviorを含み得る点にも注意する。

4.3 MCPとFunction callingの対応

概念OpenAI APIMCP
モデルの呼び出し表現Responsesのmcp item / function callJSON-RPCのtools/call等
外部機能の定義toolsパラメータServerのtools/listとinputSchema
実行責任Hosted toolはOpenAI、FunctionはApplicationMCP Serverは機能提供、Hostは接続・認可・Context
認証API key、OAuth、アプリ認証MCP Authorization、Server固有認証、HostのPolicy
同意require approvalなどHost UI / PolicyでTool callをdeny可能

MCP Serverはユーザーの全会話を持つ前提ではない。MCP仕様のHost–Client–Server境界と、OpenAI APIのMCP connectorの実装・approval設定を別々に読む。

Part 4 Sources


Part 5 — Agent

5.1 Responses APIとAgents SDK

OpenAIの現行Agents guideは、Responses APIを使う場合はApplicationがmodel interaction、output item、Tool、state、orchestration、custom loopを直接所有し、Agents SDKを使う場合はSDKがAgent loop、repeated Tool call、branching、handoff、session、tracing、guardrailなどを支援すると整理している。

選択向く場面所有するもの
Responses API独自のloop、細かいstate、特殊な分岐、低レベル制御Application
Agents SDK型付きAgent定義、繰り返すTool loop、handoff、session、tracingApplication + SDK Runner

これは「Responses APIにAgentは作れない」という意味ではない。Responses APIのfunction-calling round tripを自分で繰り返せばAgent loopになる。SDKはその共通構造を抽象化する。

5.2 Agent、Run、Runner

Agents SDKの最小モデルは、Agentへname、instructions、toolsなどを定義し、Runnerで入力を実行し、resultからfinal outputを読む形である。SDKを使うと、Agentの定義と一回のRunを分けて、Handoff、Agent as tool、Guardrail、State、Tracingを積み上げられる。

flowchart TD D[Agent definition: instructions / tools / policy] --> R[Runner] U[User input] --> R R --> M[Model call] M --> T[Tool or handoff] T --> R R --> G[Guardrail / approval] G -->|continue| M G -->|done| O[Run result / final output]

Part 5 Sources


Part 6 — Agentic Patterns

6.1 Handoffs

Handoffは、専門Agentがそのbranchの会話と次の応答を引き継ぐ構成である。TriageがBilling Agentへ渡した後、Billing Agentがユーザー向けの答えを所有する。

6.2 Agents as tools

Agents as toolsは、Manager Agentが専門Agentをbounded capabilityとして呼び出し、最終回答の所有権をManagerに残す構成である。OpenAIのOrchestration guideは、Handoffsはcontrolが専門Agentへ移り、Agents as toolsはmanagerがreplyの所有権を保つと説明する。

6.3 Prompt chaining、Routing、Parallelization

OpenAI固有のAPIを超えて、Prompt chaining、Routing、Parallelization、Evaluator-optimizer、Orchestrator-workerは一般的なAgentパターンとして利用できる。並列処理にはSDKの複数Agent、async Tool、アプリケーションのtask queueなど複数の実装がある。

Pattern使うとき主な検証
Chaining固定順序の抽出→変換→生成中間Schema、エラー伝播
Routing専門Agent・Model・Toolへ分岐誤routing、権限の行き先
Parallelization独立した調査・判定race、rate limit、統合品質
Orchestrator-worker親が分解・統合delegationの十分性、子結果
Evaluator-optimizer明示的な品質基準evaluatorの独立性、停止

6.4 Subagentとの関係

Handoff / Agents as toolsはSDKのOrchestration APIに近い。CodexのSubagent workflowは、開発作業の別thread・並列worker・Context分離に近い。名前が似ていても、会話所有権、Tool、state、filesystem、approvalを同じものとみなさない。

Part 6 Sources


Part 7 — Codex Architecture

7.1 CodexはOpenAI APIと別の製品面

Codexはコードベースを探索し、ファイルを編集し、shellを実行し、テストやレビューを行うCoding Agentの製品面である。APIのResponses loopやAgents SDKと同じ設計原則を持ち得るが、CodexのCLI、IDE、Cloud、ChatGPT連携の設定・権限・SandboxはOpenAI APIの自作Hostへ自動移植されない。

flowchart LR U[Developer] --> C[Codex client] C --> M[OpenAI model] C --> CTX[AGENTS.md / project context] M --> TOOLS[read / search / patch / shell / MCP] TOOLS --> P[Permissions / sandbox / approval] P --> FS[Workspace / git / services] FS --> V[Tests / diff / review] V --> C

Codexの最小Mental Modelは、Modelが「次の作業」を提案し、Codex harnessがworkspace、Tool、Permission、Sandbox、実行結果、ユーザーの承認を管理する、というものだ。

7.2 Explore、Plan、Implement、Verify

Coding Agentの作業は、要求を受けたらまずRepositoryと指示ファイルを探索し、計画を作り、編集・実行し、diffとテストで検証するループになる。探索ログを全部最終回答へ貼る必要はないが、決定に必要な証拠と検証結果は残す。

Git操作は段階的に扱う。ファイル編集、commit、branch、push、PR、merge、本番deployは同じ「コード変更」ではない。Sandboxやpermissionが許しても、外部反映の許可があるとは限らない。

7.3 AGENTS.md、Skills、MCP

AGENTS.mdはCodexのPersistent project instructionである。Skillsは再利用可能な知識・手順・資産、MCPは外部サービスへの接続、SubagentはContextや専門性を分ける仕組み、permission/sandboxは実行境界である。

Part 7 Sources


Part 8 — AGENTS.md

8.1 Discovery hierarchy

現行のCodex Docsは、global scopeではCodex homeのAGENTS.override.mdがあればそれを使い、なければAGENTS.mdを使う。Project scopeではproject rootからcurrent working directoryまで各ディレクトリを調べ、各場所でoverride、AGENTS.md、設定されたfallback filenameを最大一つ読み、rootからcurrent directoryへ連結する。

下位のファイルが後に現れるため、より近いルールが広いルールを補足・具体化できる。ただし、これは自然言語のinstruction chainであり、権限設定のhard denyとは別である。

現行Docsでは、combined instructionのbyte limitは32 KiB defaultと説明される。大きすぎるAGENTS.mdは切り分け、nested directoryやfallback設定を使う。

8.2 Claudeとの違い

Claude CodeはCLAUDE.mdを読み、OpenAI CodexはAGENTS.mdを読み込む。プロジェクトが両方を使う場合、別ファイルを重複管理するか、一方から他方をimportするかをチームで決める。両者の指示が矛盾すると、どのモデルがどちらを優先するかを推測せず、共有規約と製品固有規約を分ける。

# AGENTS.md: project-level and verifiable
- Use pnpm for package management.
- Run pnpm test and pnpm lint after JavaScript changes.
- Keep API handlers under src/api/handlers/.
- Ask before pushing, deploying, or changing secrets.
- Report the exact verification command and result.

AGENTS.mdへ全API仕様や大量ログを貼るのは、Context costと更新負担を増やす。詳細な手順はSkill、path-specific rule、リポジトリ内のreferenceへ分ける。

Part 8 Sources


Part 9 — Skills

9.1 OpenAI API Skills

OpenAIの現行Skills guideは、SkillをSKILL.md manifestと複数ファイルからなるversioned bundleと説明する。front matterにname、descriptionなどを置き、本文に手順・規約を置き、Python等のscriptやreferenceを同梱できる。Hosted container-based executionとlocal shell executionの両方がある。

SkillはToolそのものではない。Toolに実行させる知識・手順・資産を遅延ロードするpackageに近い。モデルがSkillを使っても、side effectの認可、scriptの隔離、入力検証は実行Hostの責任である。

flowchart TD C[Skill catalog: name + description] --> Q{Relevant?} Q -->|no| N[Do not load full bundle] Q -->|yes| L[Load SKILL.md] L --> R[Load scripts / references] R --> T[Use shell / tools] T --> V[Validate and verify]

9.2 Codex / ClaudeのSkillとの対応

OpenAI APIのSkillsはHosted environmentへのupload・attachというAPI面を持つ。CodexやClaude CodeでのSkillは、各製品のlocal/project/plugin discovery、slash invocation、permission、Context loadingを持ち得る。同じSKILL.mdという名前でも、runtime、frontmatter fields、distribution、実行権限を現行Docsで確認する。

Part 9 Sources


Part 10 — Hooks

10.1 OpenAI APIのHook相当

OpenAI APIのResponses APIやFunction callingには、Claude Codeのlifecycle hookと同じ製品機能が必ず付くわけではない。自作Hostでは、middleware、Tool wrapper、guardrail、queue worker、CI、監査ログを組み合わせて、PreToolUse / PostToolUse相当の境界を作る。

Agents SDKにはInput guardrails、Output guardrails、Tool guardrails、Human reviewがある。これは「毎回決まったscriptをlifecycleで起動するHook」と同じではないが、Model判断とPolicy実行を分けるための主要な制御面である。

10.2 Deterministic処理の置き場所

処理API / SDKでの置き場所
入力の禁止要求検出Input guardrail / application middleware
Tool引数の検査Tool wrapper / tool guardrail / JSON Schema
実行前承認Human review / approval queue
結果の検証Tool wrapper / output guardrail
formatter / test / typecheckApplication worker / CI
操作・データ共有の記録Host audit log / trace
常に同じ拒否Runtime policy / sandbox / API gateway

「モデルに毎回テストを頼む」は、検証をモデルの判断へ置く。必ず行うテスト、秘密へのアクセス拒否、deploy前のApprovalは、deterministicな実行層へ置く。

Part 10 Sources


Part 11 — Subagents

11.1 CodexのSubagent workflow

Codex / ChatGPT Learnの現行Docsは、Subagent workflowを、複数の専門Agentを並列に起動し結果を一つに集約する仕組みとして説明する。各Subagentは自分のModelとTool作業を行うため、同じ作業を単一Agentで行うよりTokenを多く消費し得る。

Subagentを使う価値は、作業者を増やすことだけではない。親のContextから、探索ログ、stack trace、大量テスト結果を分離し、要約・証拠・未解決点だけ返せる。read-heavyな探索・triage・test reviewは向くが、複数Agentが同じファイルを同時編集するwrite-heavy作業は競合しやすい。

flowchart TD P[Parent: requirements / decisions] --> D[Bounded delegation] D --> A[Explorer] D --> B[Test reviewer] D --> C[Security reviewer] A --> RA[Summary + references] B --> RB[Summary + failures] C --> RC[Summary + risks] RA --> P RB --> P RC --> P P --> V[Integrate and verify]

11.2 Agents SDKとの違い

Agents SDKのHandoffは、Agentが会話のcontrolを別Agentへ渡す。Agents as toolsはManagerが専門Agentの結果を使う。Codex Subagentは、開発作業を別thread・別Contextへ委譲し、親へ返す製品ワークフローである。いずれも「子の結果を親が検証する」境界を残す。

Part 11 Sources


Part 12 — Permissions / Security

12.1 GuardrailとHuman review

OpenAIのAgents guideは、Guardrailを自動検証、Human reviewを承認判断として区別する。Input guardrailはMain model前、Output guardrailは最終出力、Tool guardrailは関数Toolの引数・結果周辺、Human reviewは取消、編集、shell、敏感なMCP操作などのside effect前に使う。

Agent-level guardrailの範囲には注意が必要で、現行DocsはInput guardrailがchainの最初のAgent、Output guardrailが最終出力Agent、Tool guardrailが付与されたFunction toolで実行されると説明する。すべてのTool callをチェックしたいなら、side effectを起こすToolの近くへ検査を置く。

12.2 CodexのPermission、Sandbox

Codexのpermission / sandboxは、Modelの指示ではなく、filesystem、shell、network、workspace、approvalの実行境界である。権限が広いほど、Prompt injection、悪意あるリポジトリ、誤ったshell引数、秘密の読み取り、外部サービスの副作用を評価する。

read source files         -> allow in scoped workspace
edit source               -> show diff and run checks
read secrets              -> deny unless explicitly required
shell in sandbox          -> allow bounded commands
network / external MCP    -> host allowlist + data review
delete / publish / send   -> human approval
push / merge / deploy     -> separate authorization

12.3 MCPのSecurity

MCP Serverが返すTool definition、Resource、Prompt、Tool resultは、すべてApplicationが信頼できるとは限らない。公式提供元のServerを優先し、送信するデータを確認し、approvalをデフォルトで要求し、Tool変更やPrompt injectionを監視する。OAuth tokenを静的サイトやPromptへ出さない。

Part 12 Sources


Part 13 — Verification / Evals

13.1 OpenAIのAgent eval surface

OpenAIのAgent eval guideは、Traces、Graders、Datasets、Eval runsを用いてAgent qualityを改善する流れを示す。Traceは一回のWorkflowについてModel call、Tool call、Guardrail、Handoffを含むend-to-end recordで、Trace graderはTool選択、handoff、Policy違反、Prompt変更の影響を評価する。

評価は最終回答の正しさだけでは足りない。

13.2 Evaluation loop

flowchart LR R[Representative dataset] --> W[Agent workflow] W --> T[Trace: model / tool / guardrail / handoff] T --> G[Grader / assertions] G --> D[Failure diagnosis] D --> P[Prompt / tool / routing / policy change] P --> W G -->|pass| S[Release with monitoring]

Automated test、Schema validation、trace grading、Human reviewを使い分ける。EvaluatorがModelと同じ誤りを持つ場合、評価が高くても実際の品質は上がらない。

Part 13 Sources


Part 14 — OpenAI APIでAgentを自作する場合

14.1 Responses APIを直接使う

Applicationがloopを持つなら、Responses APIのTool callを受け、検証し、実行し、output itemを次のinputへ返す。Stateは明示的なinput array、previous_response_id、Conversation object、Application DBのいずれかを選ぶ。

def run_responses_agent(client, user_text, max_turns=8):
    input_items = [{"role": "user", "content": user_text}]

    for _ in range(max_turns):
        response = client.responses.create(
            model=MODEL_NAME,
            instructions=DEVELOPER_INSTRUCTIONS,
            input=input_items,
            tools=TOOLS,
        )
        input_items.extend(response.output)

        calls = [
            item for item in response.output
            if item.type == "function_call"
        ]
        if not calls:
            return response.output_text

        for call in calls:
            args = decode_json(call.arguments)
            if not schema_valid(call.name, args):
                result = {"error": "invalid_arguments"}
            elif not policy_allows(call.name, args):
                result = {"error": "approval_required"}
            else:
                result = execute(call.name, args, timeout=20)
            input_items.append({
                "type": "function_call_output",
                "call_id": call.call_id,
                "output": encode_json(result),
            })

    return {"status": "incomplete", "reason": "max_turns"}

実際のSDKのmodel名、input item形、JSON schema、response statusは、使用する現行DocsとSDK versionに合わせる。この例は構造理解用で、API keyや実サービスの認証を含めない。

14.2 Agents SDKを使う

Agents SDKでは、Agent definitionへinstructions、tools、handoffs、guardrailsを登録し、Runnerで実行する。SDKがloopを持つ場合でも、Toolの実装、権限、実行時間、監査、データ保持、ApprovalのownerはApplicationである。

Part 14 Sources


Part 15 — Local LLMへ移植する際の考え方

15.1 一般化できる原則

OpenAIのAPI名ではなく、Hostの責任をローカルへ移植する。

原則Local implementation
Instructions / Prompt buildertyped Python / TypeScript module
Structured outputJSON Schema validator、parser、retry
Function callingTool registry、dispatcher、result protocol
Agent loopstate machine、turn budget、stop condition
Conversation stateSQLite / Postgres / durable event log
Compactionsummarizer、重要state、再取得可能なreferences
Retrievalkeyword / embedding / vector store
Guardrailinput/output/tool middleware
HITLapproval queue、UI、audit
Tracing / evalstructured trace、dataset、grader
Sandboxcontainer、VM、restricted subprocess

15.2 OpenAI固有で移植できないもの

Responsesのitem schema、previous_response_id、Conversations API、server-side compaction、Hosted tools、OpenAIのMCP connector、Agents SDK Runner、CodexのAGENTS.md discovery、Codexのsandbox UIは、OpenAIの実装である。ローカルLLMが同じ名のfieldを返すとは限らない。

MCPを使えばTool接続の一部を共有できるが、MCP Client、Host、認証、UI、approval、Model Tool formatのadapterは必要である。

15.3 Local architecture

flowchart TB UI[User / UI] --> API[Agent service] API --> PM[Prompt builder] PM --> CM[Context manager] CM --> MS[Local model server] MS --> TR[Tool registry] TR --> DV[Dispatcher] DV --> SV[Schema validation] SV --> GR[Guardrail / policy] GR --> AP[Human approval] AP --> EX[Sandboxed execution] EX --> CM CM --> MEM[Memory / retrieval] API --> ST[State store] API --> LOG[Trace / audit] LOG --> EV[Eval runner]

15.4 移植の順序

  1. 一回の生成とStructured outputを固定する。
  2. 読み取り専用Function toolを一つ追加し、call → execute → outputをテストする。
  3. timeout、retry、max turns、エラー、ログを入れる。
  4. permission、sandbox、HITLをside effectの前に追加する。
  5. Conversation state、Retrieval、Compactionを追加する。
  6. 必要な場合だけMCP、Skills、Subagents、background workerを足す。
  7. Datasetとregression evalで、モデル・Prompt・Toolの変更を監視する。

一般化した結論: Responses API、Agents SDK、Codexはいずれも、Modelの出力を信頼して直接実行するのではなく、HostがContext、Tool、Policy、State、Verificationを編成することでAgentになる。

Part 15 Sources


付録 — OpenAI版の更新チェック

  1. API Docs index とモデル・Deprecationsを確認する。
  2. Responses API、Conversation state、Compaction、Streaming、Background modeを確認する。
  3. Function calling、Structured Outputs、Using tools、MCP、SkillsのSchemaと利用可能Modelを確認する。
  4. Agents SDKのQuickstart、Orchestration、Guardrails、Results/state、Tracing、Evalsを確認する。
  5. CodexのAGENTS.md、Skills、Subagents、Permissions、Sandboxの製品Docsとchangelogを確認する。
  6. 公式Cookbook、公式GitHubの例が現行SDK import・API endpointと一致するか確認する。

過去のAssistants APIや古いAgent Builderの記述は、現行導線と混ぜない。新規設計ではResponses API / Agents SDKの現行Docsを優先し、移行記事は移行理由と差分の説明に限定する。