🖥️ OpenComputerの構造とデータを実装・運用目線で読み解く
目次

⚠️ 非公開(zenn 未公開)

🖥️ OpenComputerの構造とデータを実装・運用目線で読み解く

OpenComputerは、AIエージェントをTypeScriptの関数として定義し、クラウド上のLinuxマイクロVMで動かすプラットフォームです。公式サイトはこれを「Firebase for agents.」と表現しています。

一見するとエージェント向けPaaSですが、内部にはKVM、QEMU、セル単位のコントロールプレーン、チェックポイント、ハイバネーション、実行中のメモリ変更まで含むサンドボックス基盤があります。本記事では、OpenComputerの公開ドキュメントとOSS実装をもとに、次の点を実装・運用目線で整理します。

  • Serverless AgentsとSandboxesの関係
  • HTTP、WebSocket、gRPCをまたぐ実行経路
  • Project、Session、Sandbox、Checkpointのデータモデル
  • SDK、CLI、HTTP APIの使い分け
  • timeout、シークレット、スケール、課金で迷いやすい点
  • 2026年8月26日時点で確認できる既知の問題

なお、同名の論文「OpenComputer: Verifiable Software Worlds for Computer-Use Agents」や、別作者のPyPIパッケージopencomputerとは異なる製品です。本記事で扱うPython SDKの配布名はopencomputer-sdk、import名はopencomputerです。

記事の全体像
この記事の全体像。以下、順に解説します。

概要

OpenComputerには、大きく分けて2つの利用面があります。

  1. Serverless Agents: @opencomputer/agentでエージェントを関数として定義し、CLIでデプロイする面
  2. Sandboxes: 自前のエージェントハーネスからLinuxマイクロVMを直接操作する面

両者は競合する機能ではありません。Serverless Agentsの実行基盤としてSandboxesが使われ、自前ハーネスも同じ計算プリミティブを利用できます。

製品の二層

表層 計算プリミティブ 開発者 自前ハーネス Serverless Agents セッション・ストリーミングスケジュール・シークレット Sandboxes KVM LinuxマイクロVM

Serverless Agentsでは、会話の再開、ストリーミング、途中操作、cron、シークレット注入などをプラットフォームが管理します。Sandboxesでは、ファイルシステム、ネットワーク、プロセス空間を持つ独立カーネルのLinux VMをSDKやHTTP APIから操作します。

Durable Agent Sessionsは、ClaudeやCodexのようなランタイム向けに、永続イベントログを持つbrainと、使い捨て可能なsandboxのhandsを分ける別の利用面です。@opencomputer/agentによるServerless Agentsとは区別して理解する必要があります。

Durable Agent Sessionsのbrain・hands・session

OpenComputerのOSSリポジトリはApache License 2.0です。Sandbox APIの既定エンドポイントはhttps://app.opencomputer.devです。Durable Agent Sessions SDKは別のhttps://api.opencomputer.dev/v3を既定base URLとして使います。2026年8月26日時点で、リポジトリのVERSIONは0.6.0でした。

QEMUとKVMの役割

OpenComputerはQEMUとKVMを組み合わせています。両者は代替関係ではありません。

  • QEMU: ユーザー空間でVMのデバイス、I/O、ライフサイクルを管理するVMM
  • KVM: Linuxカーネル内でCPU仮想化とメモリ分離を担う機構

QEMUとKVMの役割分担

エージェント向けサンドボックスの比較では、「KVMを使うか」だけでなく、その上のVMMがQEMU、Firecracker、Cloud Hypervisorのどれか、あるいはgVisorやコンテナ系かを見ると差を捉えやすくなります。

エージェント向けサンドボックスとVMMの関係

OpenComputerがQEMU on KVMを選ぶ理由として、公式ガイドは長さが読めないセッションへの適応を挙げています。virtio-memによる実行中のメモリ増減、hibernate / wake、長時間セッションでのRAM回収を同じ基盤で扱えるためです。

特徴

OpenComputerの特徴を、開発者から見える機能と基盤側の機能に分けると次のようになります。

領域 主な特徴
エージェント定義 TypeScript関数、Tools、MCP、Skills、Subagents、cron
セッション ストリーミング、再開、途中操作、Deployment固定
シークレット HTTPS originに束縛した注入、Sandbox SecretStore
実行環境 KVMによる独立カーネル、Ubuntu 22.04ベースの既定環境
状態保存 Full / Disk-only Checkpoint、fork、hibernate / wake
リソース 1 / 4 / 8 / 16GBティアのlive resizeとautoscale
ネットワーク TAP + NATのoutbound、reverse proxyのPreview URL
クライアント TypeScript SDK、Python SDK、HTTP API、2系統のCLI

特に重要なのは、CheckpointとHibernationの役割が違う点です。

Checkpoint Hibernation
目的 保存状態から別Sandboxをfork 同じSandboxを休止・再開
元のSandbox 動き続ける 停止する
fork 可能 不可
保存数 Full 10、Disk-only 100 1つの休止状態
主用途 並列実験、分岐 idle時のコスト削減

Full Checkpointはディスク、メモリ、CPU状態を保存します。Disk-onlyはroot filesystemとworkspaceを保存します。一方、Checkpointからのforkで引き継ぐのはファイルシステムと導入済みパッケージであり、実行中プロセスは新しいVMにそのまま移りません。

構造

OpenComputerは、クライアント、コントロールプレーン、データプレーンの3層で捉えると理解しやすい構造です。

  • クライアント → コントロールプレーン: HTTP RESTとWebSocket
  • コントロールプレーン → ワーカー: gRPC
  • ワーカー → VM内osb-agent: gRPC over virtio-serial

配備と障害隔離の単位はセルです。セルIDは{cloud}-{region}-{slot}形式で、たとえばazure-us-east-2-aになります。

システムコンテキスト図

REST・WebSocket Dashboard Sandbox API VM起動 状態保存 認証 課金 モデル呼び出し ログ・メトリクス 開発者 運用者 OpenComputer マネージドエージェント制御面 クラウドIaaS オブジェクトストレージ IDプロバイダ 決済基盤 言語モデルプロバイダ 観測基盤

この境界で重要なのは、マネージドエージェントの制御面と、公開リポジトリのサンドボックス基盤が別系統であることです。前者は後者のSandbox APIを消費します。WorkOS、決済、LLM、観測などの外部サービスは、OpenComputer本体の外側にあります。

コンテナ図

Cell create セル選定 exec・files・PTY checkpoint・hibernate SDK・CLI Dashboard Edge・Global Registry S3互換Object Store Control Plane QEMU/KVM Worker Sandbox VM Postgres Redis Secret Store

createはエッジを経由し、グローバルレジストリがセルを選びます。その後のexec、ファイルI/O、PTY、destroyは、署名付きJWTを使ってセルのコントロールプレーンへ直通します。

セルのコントロールプレーンには4つの中心責務があります。

  1. Sandboxを特定ワーカーへスケジュールする
  2. 各VMの所在と状態を追跡する
  3. idle VMをオブジェクトストアへhibernateし、要求時にwakeする
  4. リバランス時にVMをワーカー間で移行する

セルへ分離されたVMライフサイクル責務

コンポーネント図

Clients Cloudflare Edge Cell S3互換Object Store TypeScript・Python SDK opencomputer CLI oc CLI api-edge events-ingest D1・Durable Objects opensandbox-serverAPI・Auth・Control Plane Postgres Redis opensandbox-workerQEMU・Secrets Proxy osb-agentExec・Files・PTY

OSS実装では、製品名がOpenComputerでも、バイナリや環境変数に歴史的なopensandbox名が残っています。

コンポーネント 役割
opensandbox-server HTTP API、認証、配置、課金フック、ワーカー調整
opensandbox-worker QEMU/KVMホスト、VM起動、hibernate、wake、exec、ファイル操作
osb-agent VM内gRPCサーバ、Exec、Files、PTY、Stats、resource limits
api-edge create時の認証、クレジット確認、セル選定、Preview URL解決
events-ingest HMAC付きイベントをD1とクレジット会計へ反映

コントロールプレーンとワーカー間の契約はproto/worker、ワーカーとVM内エージェント間の契約はproto/agentにあります。VMのNICはTAPで、outboundはiptablesのMASQUERADEです。Sandbox SecretStoreの置換プロキシは169.254.169.253:3128で動きます。

ExecのWebSocketは、先頭1バイトでストリーム種別を表します。

Byte 方向 意味
0x00 Client → Server stdin
0x01 Server → Client stdout
0x02 Server → Client stderr
0x03 Server → Client 4-byte big-endianのexit code
0x04 Server → Client scrollback終了

接続時はscrollbackが再生され、0x04の後にライブ出力が流れます。PTYは同じバイナリフレームを使いますが、ストリームプレフィックスなしの生端末データです。

データ

永続エンティティは、Serverless Agents側とSandboxes側の2群に分かれます。

  • Serverless Agents: Projectを境界にAgent、Deployment、Alias、Sessionを保持
  • Sandboxes: Organizationを境界にSandbox、Checkpoint、Snapshot、SecretStoreを保持

概念モデル

Organization Project Session Sandbox Cell SecretStore Template Snapshot Agent Deployment Alias Secret Connection Schedule Turn Checkpoint PreviewURL Worker

ProjectはServerless Agentsのクラウド境界です。Deploymentは1つのAgentの不変ビルドで、developmentやproductionのAliasが参照します。Sessionは開始時のDeploymentに固定されるため、production Aliasを更新しても既存Sessionは古いDeploymentのままです。

Sandboxはハードウェア隔離されたLinuxマイクロVMです。Checkpointは同じSandbox内で名前が一意で、PreviewURLはVM内ポートへの公開HTTPS入口です。SecretStoreはSandbox向けの暗号化シークレット集合で、egress allowlistを持ちます。

情報モデル

Organization Project Sandbox Agent Deployment Session Checkpoint PreviewURL SecretStore Cell Worker 1 many 1 many 1 many 1 many 1 many many 1 1 many 1 many many 1 1 many

HTTP JSONとSDKでは、方向とキー名の両方が異なります。Createのリクエスト項目を、そのままCreateレスポンスの属性として扱わないようにします。

概念 Create request body Create 201 response TypeScript SDK Python SDK
Sandbox ID なし sandboxID プロパティSandbox.sandboxId プロパティSandbox.sandbox_id
Template templateID なし 作成optiontemplate 作成引数template
Disk diskMB なし 作成optiondiskMB 作成引数disk_mb
Memory memoryMB なし 作成optionmemoryMB 作成引数memory_mb
配置情報 なし region、workerID レスポンスから構築 レスポンスから構築

Createの201レスポンスには、sandboxID、status、region、workerIDが含まれ、指定時にはpreviewAuthTokenやwebhooksも加わります。templateID、diskMB、memoryMBは作成リクエストのキーです。

Sandboxの顧客向け状態はrunning、hibernated、stopped、errorです。実装内部にはpausedやpooledもありますが、制御面はpausedをhibernatedとして投影します。

Checkpointのkindはfullまたはdisk_only、statusはprocessing、ready、failedです。保持ポリシーで古いCheckpointを削除できますが、公開中、patch付き、fork参照中のものは削除対象外です。

構築方法

前提条件とバージョン

ホステッド版を使う場合はOpenComputerアカウントとAPIキーが必要です。実行環境の要件はクライアントによって異なります。

対象 要件・確認バージョン(2026-08-26)
Serverless Agents CLI Node.js 22以上、@opencomputer/cli 0.6.3
TypeScript SDK Node.js 18以上、@opencomputer/sdk 0.15.6
Agent SDK @opencomputer/agent 0.5.2
Python SDK Python 3.10以上、opencomputer-sdk 0.6.9
Sandbox向けGo CLI oc v0.6.0.43

公式サイトはnpm create @opencomputer/start@latestを案内しています。npmのinitializer規則により、実際には@opencomputer/create-startが実行されます。直接初期化する場合はnpx @opencomputer/cli initも使えます。

npm install @opencomputer/sdk
npm install @opencomputer/agent
pip install opencomputer-sdk

CLIは2系統ある

コマンド名を混ぜないことが大切です。

CLI 用途
opencomputer managed agentsのinit、login、deploy、session、logs、secrets
oc Sandbox、exec、checkpoint、preview、hibernate
npx @opencomputer/cli init my-agent
cd my-agent
npm install
npx --package @opencomputer/cli opencomputer login

Sandbox向けGo CLIは次のスクリプトで~/.local/binへ導入できます。

curl -fsSL https://raw.githubusercontent.com/diggerhq/opencomputer/main/scripts/install.sh | bash

APIキーは環境変数から渡せます。HTTP APIではX-API-Keyヘッダです。

export OPENCOMPUTER_API_KEY=your-api-key
npx --package @opencomputer/cli opencomputer whoami
oc config show

OPENCOMPUTER_API_KEYが設定済みの状態でopencomputer loginを使う場合は、環境変数を外すか--forceが必要です。ocの設定はフラグ、環境変数、~/.oc/config.json、既定値の順に解決します。APIキーには既定値がなく、既定値があるのはAPI URLです。

セルフホストの構成

セルフホストには、KVMを利用できるworker、PostgreSQL、Redis、S3互換オブジェクトストレージが必要です。workerイメージにはQEMU、opensandbox-worker、osb-agent、kernel、rootfsを含めます。

最短の確認は、serverのhealth、Sandbox作成、VM内execの順です。

curl -sf "$OPENCOMPUTER_URL/health"

SBX=$(curl -s -X POST "$OPENCOMPUTER_URL/api/sandboxes" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $OPENCOMPUTER_API_KEY" \
  -d '{"templateID":"default"}' | jq -r .sandboxID)

curl -s -X POST "$OPENCOMPUTER_URL/api/sandboxes/$SBX/exec" \
  -H "Content-Type: application/json" \
  -H "X-API-Key: $OPENCOMPUTER_API_KEY" \
  -d '{"cmd":"uname -a && pwd && date"}'

ここには命名上の差があります。SandboxドキュメントとSDKの既定templateは"base"ですが、SELFHOSTING.mdのsmoke testは"default"を送ります。セルフホスト時は、自分の環境に登録されたtemplate名を確認してください。

本番では、HTTPS終端、複数のcontrol-plane replica、failure domainを分けたworker、managed Postgres / Redis、オブジェクトストレージを用意します。単一ホスト構成は開発確認向けです。

利用方法

Serverless Agentsをデプロイする

エージェントはopencomputer/agents/<agent-id>/agent.tsに定義します。ローカルのagent serverを常駐させるのではなく、managed development cloudへデプロイします。

import { useInput, useModel } from "@opencomputer/agent";

export default function Agent() {
  const input = useInput();
  useModel("anthropic/claude-sonnet-4.6");

  return input.text
    ? `Help the user with this request: ${input.text}`
    : "You are a helpful assistant.";
}
npm run deploy -- --watch
npm run deploy -- --alias production
npm run session -- --agent hello-world "Say hello"
npx --package @opencomputer/cli opencomputer logs --follow

クライアントからはagent-id@aliasで指定します。hello-world@developmentのような形です。production Aliasを切り替えても、既存Sessionは開始時のDeploymentを使い続けます。

Toolはagents/<agent>/tools/*.tsへ置きます。agent.ts内に直接書いたdefineToolがデプロイ成果物から落ちる既知の問題があるためです。

// opencomputer/agents/support/tools/lookup-order.ts
import { defineTool } from "@opencomputer/agent";

export const lookupOrder = defineTool({
  name: "lookup_order",
  description: "Look up an order by ID",
  input: {
    type: "object",
    properties: { orderId: { type: "string" } },
    required: ["orderId"],
    additionalProperties: false,
  },
  async run({ input }) {
    return { orderId: String(input.orderId), status: "processing" };
  },
});

MCP serverはdefineMcpServer、同じProject内の別AgentはuseSubagent(agentId)で接続できます。Skillはopencomputer/agents/<agent-id>/skills/<skill>/SKILL.mdへ置きます。

Sandboxを作成してコマンドを実行する

現行APIはsandbox.exec.run()です。一部の古いIntroductionにはcommands.runが残っていますが、新しいコードではexecを使います。

import { Sandbox } from "@opencomputer/sdk";

const sandbox = await Sandbox.create({
  template: "base",
  timeout: 600,
  cpuCount: 1,
  memoryMB: 4096,
  diskMB: 20480,
  envs: { NODE_ENV: "production" },
});

const result = await sandbox.exec.run("echo Hello from $(uname -a)");
console.log(result.stdout);
await sandbox.kill();
from opencomputer import Sandbox

async with await Sandbox.create(timeout=600) as sandbox:
    result = await sandbox.exec.run("echo Hello from $(uname -a)")
    print(result.stdout)

Pythonには注意が必要です。PyPI 0.6.9と公式Python SDKリファレンス、GitHub mainの実装には差があります。ホステッド版でコピー可能な例はPyPI版に合わせ、hibernate()やwake()などGitHub mainの先行実装を使う場合はコミットSHAを固定するのが安全です。

Checkpointから環境を分岐する

const sandbox = await Sandbox.create();
await sandbox.exec.run("npm install && npm run build", { cwd: "/app" });

const checkpoint = await sandbox.createCheckpoint("after-build");
const experimentA = await Sandbox.createFromCheckpoint(checkpoint.id);
const experimentB = await Sandbox.createFromCheckpoint(checkpoint.id);

await sandbox.restoreCheckpoint(checkpoint.id);

Checkpoint名はSandbox内で一意です。重複はHTTP 409になります。分岐後のVMはディスク状態から新しくbootするため、元VMの実行中プロセスを前提にしないでください。

HibernateとWakeを使う

await sandbox.hibernate();
await sandbox.wake({ timeout: 600 });
curl -X POST "https://app.opencomputer.dev/api/sandboxes/$SBX/hibernate" \
  -H "X-API-Key: $OPENCOMPUTER_API_KEY"

curl -X POST "https://app.opencomputer.dev/api/sandboxes/$SBX/wake" \
  -H "X-API-Key: $OPENCOMPUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"timeout":600}'

wake()はまずsnapshot resumeを試し、失敗時は保存ディスクからのcold bootへフォールバックします。Sandbox IDとPreview URLは変わりません。

Preview URLを保護する

Preview URLは既定では公開です。外部公開するサービスでは、Sandbox作成時にbearer認証を明示します。

const sandbox = await Sandbox.create({
  previewAuth: { scheme: "bearer", token: "auto" },
});

console.log(sandbox.previewAuthToken);
curl -H "Authorization: Bearer $TOKEN" \
  https://sb-abc123-p3000.workers.opencomputer.dev/

平文トークンはcreateまたはrotateの応答で一度だけ返り、サーバ側にはSHA-256ハッシュが保存されます。安全な場所へ直ちに保存してください。

シークレットを実行環境から分離する

Serverless Agentsのmanaged secretは、defineConnectionで定義したHTTPS originへの送信時にだけ注入されます。ランタイム環境変数、プロンプト、ログから秘密を切り離せます。

import { bearer, defineConnection, useSecret } from "@opencomputer/agent";

const github = defineConnection({
  id: "github-api",
  origin: "https://api.github.com",
  methods: ["GET"],
  pathPrefix: "/repos/",
  headers: {
    Authorization: bearer(useSecret("GITHUB_TOKEN")),
    "User-Agent": "my-opencomputer-agent",
  },
});

Sandbox SecretStoreでは、VM内にはosb_sealed_*形式の封印トークンだけが入ります。許可されたHTTPS hostへの送信時に、worker上のプロキシが実値へ置換します。

import { Sandbox, SecretStore } from "@opencomputer/sdk";

const store = await SecretStore.create({
  name: "my-agent-secrets",
  egressAllowlist: ["api.anthropic.com"],
});

await SecretStore.setSecret(store.id, "ANTHROPIC_API_KEY", "sk-ant-...", {
  allowedHosts: ["api.anthropic.com"],
});

const sandbox = await Sandbox.create({
  secretStore: "my-agent-secrets",
  timeout: 600,
});

運用

timeoutは必ず明示する

公式資料にはidle timeoutの既定値が2通りあります。

出典 既定値
Sandboxes Overview、Troubleshooting 300秒、期限切れでauto-hibernate
Timeoutページ、SDK実装、Issue #325 0、persistent

ドキュメント差に依存しないよう、作成時または実行後に用途別の値を明示します。

const sandbox = await Sandbox.create({ timeout: 600 });
await sandbox.setTimeout(3600);
await sandbox.setTimeout(0); // persistent

always-on以外で0を使うと、不要なmachine timeを消費しやすくなります。対話開発なら600〜3600秒、短命なバッチやテストなら60〜300秒を起点に調整します。

状態と実エラーを確認する

oc ls
oc sandbox get sb-abc123
oc exec sb-abc123 --wait -- journalctl --no-pager -n 50
npx --package @opencomputer/cli opencomputer logs --follow

失敗ターンの詳細がCLIのlogsに出ず、managed sessionのevents APIにだけ出る既知の問題があります。表面的なメッセージしか見えない場合は、次のAPIを確認します。

GET /api/managed-agents/sessions/{id}/events?after=0

セルフホストではserverとworkerの両方を確認します。

sudo journalctl -u opensandbox-server -n 100 --no-pager
sudo journalctl -u opensandbox-worker -f

live resizeとautoscale

autoscaleはSandbox単位のopt-inです。CPUはメモリに比例し、公開されている主なティアは次の通りです。

Memory vCPU
1GB 1(best-effort)
4GB 1
8GB 2
16GB 4
await sandbox.setAutoscale({
  enabled: true,
  minMemoryMB: 1024,
  maxMemoryMB: 16384,
});

await sandbox.scale({ memoryMB: 4096 });

scale upは1分平均のメモリ使用率が75%を超えると次ティアへ進み、cooldownは60秒です。scale downは1分、5分、15分平均がすべて25%未満で1ティア下がり、cooldownは5分です。明示的なscaleはautoscaleを無効化します。

縮小先がworking setを下回るとHTTP 409 oom_floor、lock中は403 scaling_locked、プラン上限超過は402になります。

課金を見積もる

2026年8月26日時点の公式サイトでは、モデル料金のパススルーとmachine timeが別メーターです。BYOモデルキーではtoken meterが0になり、bare Sandboxではmachine timeだけが対象です。

Agentの既定マシンは2GB / 1 vCPUで、$0.00315/分です。hibernate中はcompute課金が止まります。課金粒度は10秒ハートビートを秒単位へ集約します。

Plan 価格と特徴
PAYG $10 free credit、使用量課金
Pro $20/月、10倍相当のprepaid credit
Max $200/月、より多い常時稼働向け
Enterprise 自前cloud / VPC、SSO、audit log

価格、プラン、制限は変わりやすいため、本番導入時は公式Pricingを再確認してください。

Burst Sandboxesを再実行可能にする

alphaのBurst Sandboxesはburst: trueで作成します。ディスクはインフラ再起動をまたいで残りますが、プロセス、メモリ、端末、接続は再起動する可能性があります。再起動通知がある場合、ゲストには最大25秒のflush時間があります。

環境変数OPENSANDBOX_RESUMABLE=trueとOPENSANDBOX_RESUME_NOTICE_SECONDS=25を確認し、/home/sandbox/.opencomputer/on-restart-noticeへflush hookを置きます。CI、バッチ、探索処理のように再実行可能なワークロード向けです。

ベストプラクティス

CI/CD

  • developmentの--watchとproduction Aliasを分離する
  • productionはdeploy --alias productionで不変Deploymentを切り替える
  • 切り替え後の確認は新規Sessionで行う
  • CIのsecret値はコマンド引数ではなく標準入力から渡す
  • Toolはagents/<agent>/tools/*.tsへ置く
  • Reserved Capacityの書き込みには決定的なIdempotency-Keyを付ける

マルチ環境

Agentの環境はdevelopmentとproductionを基本にし、secretsとruntime variablesを分けます。クライアントはagent-id@aliasで環境を固定します。

基盤側はセルID{cloud}-{region}-{slot}でfailure domainを表します。開発セルは単一ホストでも構築できますが、本番ではcontrol plane、worker、Postgres、Redis、Object Storeの障害境界を分けます。

リソース制限

  • idle timeoutを必ず用途別に明示する
  • autoscaleのmin/maxは公開ティアから選ぶ
  • ベンチマーク中や固定課金が必要な場合だけscaling lockを使う
  • 重いビルド前にVM内metadata APIでscale upし、終了後に下げる
  • Burstには再実行可能な処理だけを載せる
  • 20GBを超えるdiskが必要なら超過課金とclosed beta条件を確認する

セキュリティ

  • managed secretをHTTPS originとmethod、path prefixに束縛する
  • runtime variableとmanaged secretを用途で分ける
  • Preview URLにはbearer認証を明示する
  • create / rotateで一度だけ返るトークンをdurable storeへ保存する
  • worker RPC、Postgres、Redisをprivate networkへ閉じる
  • セルフホストの秘密はKey VaultやSecrets Managerから供給する
  • GitHub API向けConnectionにはUser-Agentを明示する

設定管理

主な環境変数にはOPENSANDBOX_*プレフィックスが付きます。

変数 役割
OPENSANDBOX_MODE serverまたはworker
OPENSANDBOX_COMPUTE_PROVIDER azureまたはaws
OPENSANDBOX_CELL_ID {cloud}-{region}-{slot}
OPENSANDBOX_S3_* Checkpoint、Hibernation、Templateの保存先
OPENSANDBOX_MIN_WORKERS / MAX_WORKERS worker台数の範囲
OPENSANDBOX_SENTRY_DSN 観測、未設定なら無効

秘密値と非秘密値を分け、server用とworker用の設定ファイルも分離します。Postgresを直接変更する運用は避け、公開APIとCLIを正とします。

トラブルシューティング

問題が起きたら、認証、Sandbox状態、worker登録、VM内プロセスの順に切り分けます。

oc config show
oc sandbox get sb-abc123
oc exec sb-abc123 --wait -- ps aux
oc exec sb-abc123 --wait -- journalctl --no-pager -n 50

頻出エラー

症状 主な原因 対処
401 Unauthorized APIキー欠落・不一致 環境変数とdashboardのキーを照合
Sandbox not found kill済み、timeout後の休止 一覧と状態を確認し、必要ならwake
Connection refused bootまたはwake中 状態確認後、起動完了を待つ
Command timeout exec.runの既定60秒 呼び出しのtimeoutを明示
503 no workers available worker未登録 server logでworker登録を待つ
403 scaling_locked scaling lock中 unlock後、autoscaleも再設定
409 oom_floor 縮小先がworking set未満 VM内でメモリを解放して再試行
Preview 401 bearer不一致 Token再確認、紛失時はrotate
GitHub Connection 403 User-Agent欠落 Connectionヘッダへ追加
egress 407 proxy session未成立 別Sandboxで再試行しissueを追跡
Agentの詳細エラーが見えない CLI logsの既知問題 managed session events APIを確認

2026年8月26日時点の既知の問題

運用に影響しやすいopen issueは次の通りです。状態は変わるため、導入時に各issueを再確認してください。

Issue 内容
#637 session create --localがlocal service起動でtimeout
#636 managed egressのUser-Agent欠落でGitHubが403
#633 失敗ターンの実エラーがCLI logsに出ない
#632 agent.ts内のToolがDeploymentから落ちる
#610 新規Sandboxのegress proxyが間欠的に407
#609 exec可能でもCheckpoint作成がorg不一致になる
#325 persistent timeout 0の意味が不明確

セルフホストで/dev/kvmが無い場合は、ホストとクラウドインスタンスのnested virtualizationを確認します。Local SSD上のSandbox diskはインスタンス停止や置換で消えるため、CheckpointやHibernationを検証する前にObject Storeを設定してください。

まとめ

OpenComputerは、TypeScriptで定義するServerless Agentsと、QEMU on KVMで動くLinux Sandboxesを重ねたプラットフォームです。エージェントAPIだけを見るよりも、セル、コントロールプレーン、worker、VM内osb-agent、Object Storeまでを一続きの構造として捉えると、Checkpoint、Hibernation、live resize、secret injectionの設計意図が見えます。

実装時には、opencomputerとocの2系統のCLI、HTTP JSONとSDKのキー差、PyPI版とGitHub mainのPython SDK差に注意が必要です。運用時にはtimeoutを明示し、Preview URLを保護し、autoscaleとlockの相互作用を監視してください。特に公式資料間で既定値が揺れている項目は、コード側で値を固定するのが安全です。

この記事が少しでも参考になった、あるいは改善点などがあれば、ぜひリアクションやコメント、SNSでのシェアをいただけると励みになります!

参考リンク