数行のコードで本番品質の Agent を書く

Chris ChenChris Chen
5 分読む
Jun 10, 2026

エージェント開発の現状

初期のエージェントは普通のバックエンドとそれほど違いはありませんでした。カスタマーサポート、Q&A、注文照会といったシナリオでは、業務インターフェースを備えた LLM サービスに近い存在でした。しかしモデルの能力が伸びるにつれ、エージェントは本当に「手を動かす」ようになり——ファイルを扱い、コードを書き換え、テストを走らせ、ブラウザを操作し、複雑なシステムを束ねるようになり、これまで人手でやっていた仕事を少しずつ引き取るようになりました。権限境界を絞り、リソース利用をコントロールするうえで、サンドボックスは必須要素となりました。

次に直感的に思いつく構成は、エージェントのロジックとツールを同じサンドボックスに詰め込むことです。コールパスが短く、状態の共有もしやすい。構成自体はシンプルですが、マルチテナント、セキュリティ分離、コスト効率といったエンタープライズ級の要件に入った瞬間に綻びが見えてきます。ロジックを一行いじるためにツールチェーンを丸ごと含むイメージを再ビルドする必要があり、並行リクエスト下では会話一つにつきサンドボックスを丸ごと専有するためリソースコストが急速に積み上がります。エージェントのロジックと認証情報、信頼できないコードが同じ環境に同居することで、prompt injection の攻撃面も広がります。状態はサンドボックスに紐づいているため、破棄と同時に消え、復元も難しい。

そこで業界は、よりデカップルされたアプローチを模索し始めました——エージェントのロジック、ツールサンドボックス、状態がそれぞれ独立して動き、コンポーネントごとに自身のライフサイクルでスケジュールされ、互いに縛らない構成です。

ただし、コンポーネントを切り離すほどコールパスは長くなり、環境は分断されます。実際に組み込もうとすると、たいてい二種類の難所のいずれかに突き当たります。一つは、業務コードと設定をプラットフォーム固有の形に書き直さなければならないこと——プラットフォーム SDK を import し、プラットフォームのベースクラスを継承し、プラットフォーム専用の設定を宣言する。もう一つは、コンピュート、ステート、サンドボックス、可観測性をバラバラの独立サービスから自分で選んで組み合わせ、フレームワークに合わせて自前でアダプティングすることです。ローカルデバッグと分散トレーシングもまた、特に重要な課題になります。

Makers の選択

Makers はエージェント開発の方法そのものを再定義しません——エントリ関数の引数は context ただ一つ。プラットフォーム SDK も、専用設定もありません。Claude Agent SDK、OpenAI Agents、LangGraph、DeepAgents、CrewAI といった主流フレームワークをそのまま使えますし、書くのはそのフレームワーク公式ドキュメントのコードそのままです。自前で組み立てるのも自由です。ランタイムコンテキストには各フレームワークネイティブのセッションメモリ、サンドボックス原子インターフェース、リアルタイム可観測性が包まれており——インフラと下回りの依存はプラットフォームが引き受け、エージェント自体は開発者の手元に残ります。

agent-banner.png

もう一つの特徴は、Web アプリとエージェントが同じスタックに乗ることです。一つのプロジェクトの中でエージェントとフロントエンドを一緒に書き、一回のデプロイで同じドメインに公開します。

数行のコードで動かす

CLI で OpenAI Agents テンプレートを取得して、まずは動かしてみましょう。

$ npm install -g edgeone
$ edgeone makers create --template openai-agents-starter-node
$ cd openai-agents-starter-node && edgeone makers dev
  ▸ runtime  http://localhost:8088
  ▸ devtools http://localhost:8088/agent-metrics

:8088 を開けば、テンプレートに付属するチャット UI と直接やり取りできます。

agent_en_ui.png

:8088/agent-metrics を開くと、プラットフォームが Runtime 起動時に @openai/agents と OpenAI SDK 向けの instrumentor をすでに登録しており、リクエストごとの LLM 呼び出し、ツール呼び出し、Session の読み書きが自動でツリーに入り、ローカル SQLite にリアルタイムで書き込まれているのが分かります — 計測コードを 1 行も追加する必要はありません。

その数行の裏側

テンプレートのメインハンドラには、プラットフォームから注入される context 以外にプラットフォーム由来の import は一切ありません。

// agents/chat/index.ts —— パスは自動的に POST /chat にマッピングされる
import OpenAI from 'openai'
import { Agent, run, OpenAIChatCompletionsModel } from '@openai/agents'

export async function onRequest(context: any) {
  const { message, conversation_id } = context.request.body
  const { AI_GATEWAY_API_KEY, AI_GATEWAY_BASE_URL } = context.env

  const client = new OpenAI({ apiKey: AI_GATEWAY_API_KEY, baseURL: AI_GATEWAY_BASE_URL })
  const session = context.store.openaiSession(conversation_id)
  const agent = new Agent({
    name: 'Assistant',
    instructions: 'You are a helpful assistant.',
    model: new OpenAIChatCompletionsModel(client, '@makers/hy3-preview'),
    tools: [context.tools.web_search],
  })
  const result = await run(agent, message, { session })
  return Response.json({ reply: result.finalOutput })
}

handler に登場する 3 種類のプラットフォーム機能 — モデルゲートウェイ、セッションストレージ、組み込みツール — はいずれも context にぶら下がっています。

context.envAI_GATEWAY_* は、プロジェクト作成時にプラットフォームが自動発行・注入する環境変数です。これを OpenAI SDK に渡せば、呼び出しは内蔵の AI ゲートウェイを通り、別途 Key を申請する必要はありません — プラットフォームは期間限定で複数モデルのトークン枠を進呈しています。もちろん自分の API Key への差し替えも可能です。

context.store.openaiSession(cid) が返すのは @openai/agents ネイティブの Session です。run() に渡すだけで会話履歴の読み書きを引き受けてもらえます — フレームワークから見えるのは自分自身のインターフェースで、プラットフォームはフレームワークから見て透過的です。LangGraph や Claude Agent SDK など別のフレームワークに切り替えても、context.store には同様にそれぞれのフレームワーク固有のセッションストレージ型が乗っており、下層はプラットフォームの Blob ストレージが受け持ちます。

context.tools.* はプラットフォームがあらかじめ用意したツール集で、Web 検索、コードインタープリタ、ブラウザ操作といったよくある動作を網羅しています。フレームワークの tools にそのまま入れるだけです。サンドボックス系ツールは、同一会話の初回呼び出し時にマイクロ VM を遅延起動し、以降は再利用、タイムアウトで回収します — handler の起動でウォームアップされたり、コールドスタートのたびに作り直されたりはしません。

カスタムツールが必要なときは、context.sandbox が公開するサンドボックス原子インターフェースを自由に組み合わせられます:

const runPython = tool({
  name: 'run_python',
  parameters: z.object({ code: z.string() }),
  execute: async ({ code }) => {
    const sb = await context.sandbox()       // 遅延ロード、会話ごとに再利用
    return await sb.codeInterpreter.run(code)
  },
})

デプロイ

ローカルで動くことを確認したら、edgeone makers deploy の一行で公開できます。デプロイ後も同じ span、同じ instrumentation を見続けることになります。プロジェクト内のフロントエンドコードも一緒にデプロイされ、同じドメインにぶら下がります。

プラットフォームのリソーススケジューラは、conversation_id を基準に同一会話のリクエストを同じエージェントインスタンスとツールサンドボックスにルーティングし、必要時に作成し、アイドル時に回収します——業務コードからは完全に透過です。

ここまでで、Web ツールが動き、セッションメモリを持ち、可観測性をビルトインで備えた本番レディなエージェントが揃いました。開発者が実際に書いたのは、依然として @openai/agents のドキュメントにあるあの数行だけです。

LangGraph、Claude Agent SDK、CrewAI、DeepAgents など他フレームワーク向けのテンプレート、加えて、いかなるフレームワークにも依存しない Python と JavaScript のミニマル例も用意しています。edgeone makers create でローカルに取得するだけでなく、テンプレートギャラリーから自分のアカウントへワンクリックでデプロイすることも可能です。

テンプレート一覧 →

ドキュメント →