サムネイル

OpenAI Agents SDK v0.14.0の新機能を解説 — Sandbox・メモリ・ハーネスで変わるエージェント開発

  • 0

コードを書かないAIエンジニア@もるふぉです。
シニアソフトウェアエンジニアとして10年以上開発してきましたが、今はAI駆動開発で「設計して指示する」スタイルに完全移行しています。

「エージェントを本番で動かしたいけど、ホスト環境を壊されるのが怖い」「長時間動かしたら途中でクラッシュして、また最初からやり直し」「SDKのデフォルト動作が自分のユースケースに合わなくて詰んだ」── そんな悩み、ありませんか?

OpenAI Agents SDK v0.14.0は、まさにその3つの壁を正面から壊しにきたリリースです。

2026年4月15日にリリースされたこのバージョンでは、Sandbox Agentsメモリシステムの強化Codexハーネスのオープンソース化という3つの柱が追加されました。

この記事では、それぞれの新機能を実装コード付きで解説していきます。

OpenAI Agents SDK v0.14.0で何が変わったのか

v0.13からv0.14.0への進化ポイント

v0.13系まではマルチエージェントのハンドオフやツール連携、ガードレールといった「エージェントの基本動作」に注力していました。

v0.14.0では、フォーカスが明確に「長期実行エージェント」へシフトしています。

主な変更点を整理するとこうなります。

領域
v0.13系
v0.14.0
実行環境
ホスト上で直接実行
サンドボックスで隔離実行
記憶
セッションベースの短期記憶
ライフサイクル管理付きメモリ
カスタマイズ性
SDK APIの範囲内
ハーネスレベルで拡張可能
状態管理
実行ごとにリセット
スナップショットで中断・再開

これ何が嬉しいかっていうと、「数分で終わるタスク」だけでなく「数時間〜数日かけて動くエージェント」を現実的に構築できるようになったということです。

今まで「本番に投入するのはまだ怖い」と感じていた理由が、このアップデートで1つずつ消えていく感覚があります。

3つの新機能が解決する課題

長期実行エージェントを本番環境で動かそうとすると、3つの壁にぶつかります。

1. セキュリティの壁 ── エージェントにシェルアクセスやファイル操作を許可すると、ホスト環境を破壊するリスクがある。

Sandbox Agentsが、OSレベルの隔離でこれを解決します。

2. 状態管理の壁 ── 長時間動くエージェントは途中でクラッシュする可能性がある。

メモリシステムのスナップショット機能が、実行状態の永続化と再開を実現します。

3. カスタマイズ性の壁 ── SDKのデフォルト動作が自分のユースケースに合わない場合、手の打ちようがなかった。

Codexハーネスのオープンソース化で、エージェントループそのものを書き換えられるようになります。

ここからは、この3つを順番に掘り下げていきます。

Sandbox Agentsで実現する安全なエージェント実行

記事の画像

SandboxAgentの基本的な使い方

Sandbox Agentsはv0.14.0でベータとして追加された機能です。

核となるのはSandboxAgentクラスで、通常のAgentと同じように定義しつつ、実行環境を隔離できます。

from agents.sandbox import SandboxAgent, Manifest, SandboxRunConfig
from agents.sandbox.sandboxes.unix_local import UnixLocalSandboxClient

# サンドボックスエージェントの定義
agent = SandboxAgent(
    name="code-reviewer",
    model="gpt-5.2",
    instructions="与えられたコードをレビューし、改善点を提案してください。",
    default_manifest=Manifest(
        root="/workspace/project",
    ),
)

# ローカルサンドボックスで実行
config = SandboxRunConfig(
    client=UnixLocalSandboxClient(),
)
result = await agent.run("src/main.pyのパフォーマンスを改善して", run_config=config)

SandboxAgentは通常のAgentを継承しているので、既存のハンドオフやツール連携もそのまま使えます。

違いはdefault_manifestSandboxRunConfigで実行環境を定義する点です。

つまり、今まで「エージェントにシェルを触らせるの怖いな」と思って躊躇していたことが、数行の設定を追加するだけで安全に実現できるようになった、ということです。

Manifestでワークスペースを定義する

Manifestはエージェントが操作できるワークスペースの範囲を宣言的に定義するクラスです。

from agents.sandbox import Manifest

# Manifestの主なパラメータ
# root: エージェントの作業ルートディレクトリ
# entries: エントリーポイントの設定
# environment: 環境変数などの実行環境設定
manifest = Manifest(
    root="/workspace/my-project",
)

これマジですごいです。

「このエージェントは何ができて、何にアクセスできるか」がコードで宣言的に定義されるので、セキュリティの境界が暗黙的ではなく明示的になります。

PRレビューで「このエージェント、どこまで触れるの?」と聞かれたとき、Manifestをそのまま見せれば済む。チーム開発では特に重要なポイントです。

実行環境の選択肢: Unix / Docker / ホステッドプロバイダー

サンドボックスのバックエンドは用途に応じて選べます。

ここが設計判断のポイントになるので、選定の軸を整理しておきます。

UnixLocalSandboxClient ── ローカル開発向け。

macOSではSeatbelt、LinuxではbubblewrapによるOSネイティブな隔離を使います。

追加のインフラ不要で、最も手軽に始められる選択肢です。

from agents.sandbox.sandboxes.unix_local import UnixLocalSandboxClient
from agents.sandbox import SandboxRunConfig

config = SandboxRunConfig(
    client=UnixLocalSandboxClient(),
)

DockerSandboxClient ── チーム開発・CI/CD向け。

コンテナベースの隔離で、環境の再現性が高いのが特徴です。

from agents.sandbox import SandboxRunConfig
from agents.sandbox.sandboxes.docker import DockerSandboxClient

config = SandboxRunConfig(
    client=DockerSandboxClient(
        image="python:3.12-slim",
    ),
)

ホステッドプロバイダー ── 本番運用向け。

E2BBlaxel、Cloudflare、Modalといったサードパーティのサンドボックスプロバイダーと連携できます。

それぞれの特徴を比較すると以下のとおりです。

プロバイダー
起動速度
特徴
向いているケース
UnixLocal
即時
OSネイティブ隔離
ローカル開発・プロトタイプ
Docker
数秒
コンテナベース
CI/CD・チーム開発
E2B
約80ms
Firecracker MicroVM
軽量な本番ワークロード
Blaxel
約25ms
永続サンドボックス
中断・再開が多いケース
Modal
1秒未満
GPU対応のコンテナベース隔離
ML/GPUワークロード

「まずローカルで試す→チームに展開するときDockerに切り替える→本番はホステッドプロバイダーに移す」という段階的な移行が、クライアントの差し替えだけでできる設計になっています。

次はもう1つのオープンソース化された重要な要素、Codexハーネスについて見ていきます。

オープンソースのCodexハーネスを検査・カスタマイズする

記事の画像

ハーネスとは何か: エージェントループの司令塔

「ハーネス」という言葉、聞き慣れないかもしれません。

OpenAIが2026年2月に公開したブログ記事で提唱した概念で、エージェントが正しく動作するための「足場」全体を指します。

具体的には、ハーネスは以下の6つの基盤能力を持っています。

  1. コード生成 ── エージェントがアプリケーションロジックを自律的に書く
  2. テスト・検証 ── 自動テストの作成と実行
  3. オブザーバビリティ ── ログ、メトリクス、トレースの収集・監視
  4. バグ再現 ── 環境横断での問題の特定と再現
  5. ドキュメント管理 ── 構造化されたドキュメントを信頼できる情報源として維持
  6. アーキテクチャ制約の強制 ── 依存関係のルールをメカニカルに検証

意外だったのが、このハーネスはOpenAIが自社で実際に使い込んできた実戦仕様だという点です。

OpenAIはこのハーネスを使って、5か月間で約100万行のプロダクションコードを「手書きのソースコード無し」で構築する実験を行い、その成果をCodex製品として出荷しています。

v0.14.0で何が変わったかというと、この実戦仕様のハーネスアーキテクチャがオープンソースとして公開され、エンジニアが自分のプロジェクトに合わせて検査・カスタマイズできるようになったことです。

カスタマイズの実装パターン

ハーネスのカスタマイズは、Codexのconfig.tomlを通じて行います。

# ~/.codex/config.toml

# サンドボックスモード: read-only / workspace-write / danger-full-access
sandbox_mode = "workspace-write"

# 承認ポリシー: untrusted / on-request / never
approval_policy = "on-request"

# 書き込み可能なディレクトリを指定
[sandbox_workspace_write]
writable_roots = ["/workspace/src", "/workspace/tests"]

サンドボックスモードの選択

  • read-only: ファイルの読み取りのみ許可。

コードの分析やレビューに使います。

  • workspace-write: ワークスペース内の読み書きとコマンド実行を許可。

日常的な開発作業のデフォルトです。

  • danger-full-access: すべての制限を解除。

フルアクセスが必要な場合のみ使用し、通常は避けるべきモードです。

承認ポリシー

  • untrusted: 信頼リスト外のコマンド実行時に確認を求める
  • on-request: サンドボックス境界を超える操作のみ確認
  • never: 確認なしで自律実行

このハーネスのアーキテクチャは、依存関係が Types -> Config -> Repo -> Service -> Runtime -> UI という方向に流れるレイヤー構造を採用しています。

エージェントはこのレイヤー内で動作するよう制約されるので、大規模プロジェクトでもアーキテクチャの一貫性が保たれます。

ハーネスを理解したところで、もう1つの大きな追加機能であるメモリシステムに進みます。

ここからが、長期実行エージェントにとって本当に重要な話です。

メモリシステムでエージェントの記憶を制御する

記事の画像

メモリの作成タイミングを設計する

v0.14.0のメモリシステムで最も重要な概念は「メモリのライフサイクル」です。

「エージェントって、セッションをまたいだら全部忘れてしまう」問題、ありますよね。

v0.14.0のメモリシステムはそこを根本から設計し直していて、記憶は以下の5つのフェーズを経て管理されます。

  1. インジェクション ── 実行開始時に、保存済みの記憶をコンテキストに注入
  2. ディスティレーション ── 実行中に、重要な情報をリアルタイムでキャプチャ
  3. セッションストレージ ── キャプチャした情報をセッション単位で保存
  4. コンテキストトリミング ── コンテキストウィンドウに収まるよう情報を圧縮
  5. コンソリデーション ── 実行終了時に、セッション記憶をグローバル記憶に統合

ディスティレーション(リアルタイムキャプチャ)はsave_memory_noteツールを通じて行います。

from agents import function_tool
from dataclasses import dataclass
from typing import List

@dataclass
class MemoryNote:
    text: str
    last_update_date: str
    keywords: List[str]

@function_tool
def save_memory_note(ctx, text: str, keywords: List[str]) -> dict:
    """重要な情報をメモリに保存する。
    高シグナルで再利用可能な情報のみを保存すること。
    """
    note = MemoryNote(
        text=text,
        last_update_date="2026-04-16",
        keywords=keywords,
    )
    ctx.state.session_memory["notes"].append(vars(note))
    return {"status": "saved", "keywords": keywords}

面白いのは、保存のタイミングをエージェント自身が判断する点です。

すべてを記録するのではなく、本当に重要な情報だけをフィルタリングして残す。いわば「高品質なメモを自分で取るアシスタント」が内蔵されたようなイメージです。

保存先の選び方: SQLite / S3 / Redis

メモリの保存先は、デプロイ環境に応じて複数の選択肢があります。

SQLiteSession ── ローカル開発やシングルサーバー向け。

from agents import SQLiteSession

session = SQLiteSession(
    "user_123",
    "conversations.db",
)

ファイルベースなのでインフラ不要です。

WAL(Write-Ahead Logging)が有効なので、読み書きの並行性能も確保されています。

RedisSession ── 分散環境向け。

複数のワーカーやサービス間でセッションを共有したい場合に使います。

from agents.extensions.memory import RedisSession

session = RedisSession.from_url(
    "user_123",
    url="redis://localhost:6379",
)

SQLAlchemySession ── 本番環境向け。

PostgreSQL、MySQL、その他SQLAlchemy対応のデータベースをバックエンドにできます。

from agents.extensions.memory import SQLAlchemySession

session = SQLAlchemySession.from_url(
    "user_123",
    url="postgresql://user:pass@localhost/agents_db",
    create_tables=True,
)

さらに、EncryptedSessionで任意のセッションをラップすれば、透過的な暗号化とTTL(自動有効期限)を追加できます。

from agents.extensions.memory import EncryptedSession

encrypted = EncryptedSession(
    session_id="user_123",
    underlying_session=session,  # 上記いずれかのセッション
    encryption_key="your-secret-key",
    ttl=3600,  # 1時間で自動失効
)

設計判断の軸としては、ローカル開発はSQLiteSession、分散環境はRedisSession、本番の永続化はSQLAlchemySession、という使い分けが基本形になります。

スナップショットで実行を中断・再開する

長期実行エージェントにとって欠かせないのが、実行状態のスナップショット機能です。

「数時間かけて動いていたエージェントがクラッシュして、また最初から」── そのストレス、これで終わりにできます。

Sandbox Agentsでは、ワークスペースの状態をスナップショットとして保存し、任意のタイミングで別のサンドボックスインスタンスから再開できます。

これにより、以下のようなシナリオが実現可能になります。

  • エージェントが数時間のタスクを実行中にクラッシュしても、最後のスナップショットから再開できる
  • 夜間バッチで途中まで進めたタスクを、翌朝の別インスタンスで続行できる
  • 複数のブランチをスナップショットとして保存し、最も良い結果を採用できる

スナップショットはシリアライゼーション可能な形式で保存されるため、S3やGCSなどのオブジェクトストレージに永続化して、チーム内で共有することもできます。

メモリの仕組みが分かったところで、ここまでの3機能を組み合わせるとどうなるか見てみます。

SandboxAgent×メモリシステムの統合実装パターン

サンドボックス+メモリでコーディングエージェントを作る

Sandbox Agents、Codexハーネス、メモリシステムの3つを統合すると、こんなコーディングエージェントが構築できます。

from agents.sandbox import SandboxAgent, Manifest, SandboxRunConfig
from agents.sandbox.sandboxes.docker import DockerSandboxClient
from agents import SQLiteSession

# 1. セッション(メモリ)の設定
session = SQLiteSession(
    "project-alpha",
    "agent_memory.db",
)

# 2. ワークスペースの定義
manifest = Manifest(
    root="/workspace/project-alpha",
)

# 3. サンドボックスエージェントの定義
agent = SandboxAgent(
    name="dev-agent",
    model="gpt-5.2",
    instructions="""あなたはシニアエンジニアです。
    以下のルールに従って作業してください:
    - テストを書いてからコードを修正する
    - 変更後は必ずテストを実行する
    - 重要な設計判断はメモリに保存する
    """,
    default_manifest=manifest,
    tools=[save_memory_note],
)

# 4. Docker サンドボックスで実行
config = SandboxRunConfig(
    client=DockerSandboxClient(image="ruby:3.4"),
    session=session,
)

result = await agent.run(
    "User モデルにメールアドレスのバリデーションを追加して",
    run_config=config,
)

このパターンのポイントは3つあります。

  1. 隔離実行: Dockerコンテナ内でコード変更とテスト実行が行われるので、ホスト環境は一切影響を受けない
  2. 記憶の永続化: SQLiteSessionにより、過去の設計判断や修正履歴がセッション横断で保持される
  3. ワークスペース制御: Manifestでルートディレクトリを宣言的に管理

たとえば「昨日のセッションでAPIの認証方式をJWTに決めた」という設計判断がsave_memory_noteで保存されていれば、今日のセッションでもエージェントはそれを踏まえて一貫した実装を行えます。

「セッションをまたいでも文脈が続く」というのは、地味ですが開発体験が根本から変わるポイントだと思っています。

まとめ: v0.14.0で変わるAIエージェント開発

OpenAI Agents SDK v0.14.0は、AIエージェント開発のフェーズを「短期タスク」から「長期実行エージェント」へ明確にシフトさせるリリースです。

  • Sandbox Agents: サンドボックスで隔離された安全な実行環境を提供。

Unix、Docker、E2B/Blaxel/Modalなどのホステッドプロバイダーから用途に合わせて選択できます。

  • Codexハーネス: エージェントループの基盤をオープンソース化。

config.tomlでサンドボックスモードや承認ポリシーをカスタマイズできます。

  • メモリシステム: メモリのライフサイクル管理により、記憶の作成タイミングと保存先を制御。

SQLite、Redis、SQLAlchemyなど複数のバックエンドに対応しています。

なお、v0.14.0と同日にv0.14.1もリリースされており、トレーシングエクスポートや入力ガードレール違反後のストリームツール実行停止といったバグ修正が含まれています。

現時点ではSandbox Agentsはベータ版で、Python SDKのみの提供です。

TypeScript対応は今後のリリースで予定されています。

まずはpip install openai-agentsでインストールして、UnixLocalSandboxClientを使ったローカル環境での検証から始めてみてください。

追加インフラ不要、コード数行で試せます。「本番に投入するのはまだ怖い」という感覚を、ローカルで実際に動かすことで一度リセットしてみるのが、v0.14.0との最初の良い付き合い方になるはずです。

なお、Codexは2026年4月時点で週間300万以上のアクティブユーザーに達しており、この規模の本番エージェント基盤を支えているのが、今回オープンソース化されたハーネスアーキテクチャです。

会員登録して機能を使おう

この機能を利用するには、無料の会員登録が必要です。
お気に入りの記事を保存して、あとで読み返しましょう!