概述
opencode 是预构建的 AI Agents 运行环境,已内置 OpenCode CLI,可在隔离的沙箱环境中以无头方式运行多供应商(Anthropic / OpenAI / Gemini 等)的开源编码代理,具备完整的文件系统、终端和 git 访问能力。
模板预装 Node.js、git、ripgrep、vim、GitHub CLI 等常用工具,以及 pnpm/tsx/vite 前端脚手架。镜像内不内置任何 API key,认证信息通过沙箱创建时的 envs 注入或通过密钥注入规则下发。
模板内容
| 组件 | 说明 |
|---|---|
opencode |
OpenCode CLI |
| 基础工具 | Node.js 24.x、git、ripgrep、vim、GitHub CLI、pnpm/tsx/vite 等 |
创建沙箱
OpenCode 支持多供应商,按所选模型注入对应密钥即可:
| 供应商 | 环境变量 |
|---|---|
| Anthropic | ANTHROPIC_API_KEY |
| OpenAI | OPENAI_API_KEY |
| Google Gemini | GEMINI_API_KEY |
import { Sandbox } from "e2b";
const sandbox = await Sandbox.create("opencode", {
envs: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY },
});
无头执行
通过 opencode run "<prompt>" 子命令进入非交互模式:
import { Sandbox } from "e2b";
const sandbox = await Sandbox.create("opencode", {
envs: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY },
});
const result = await sandbox.commands.run(
`opencode run "Create a hello world HTTP server in Go"`,
);
console.log(result.stdout);
await sandbox.kill();
Git 仓库集成
import { Sandbox } from "e2b";
const sandbox = await Sandbox.create("opencode", {
envs: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY },
timeoutMs: 600_000,
});
await sandbox.git.clone("https://github.com/your-org/your-repo.git", {
path: "/home/user/repo",
username: "x-access-token",
password: process.env.GITHUB_TOKEN,
depth: 1,
});
const result = await sandbox.commands.run(
`cd /home/user/repo && opencode run "Add error handling to all API endpoints"`,
{ onStdout: (data) => process.stdout.write(data) },
);
const diff = await sandbox.commands.run("cd /home/user/repo && git diff");
console.log(diff.stdout);
await sandbox.kill();
服务模式
OpenCode 提供 HTTP 服务接口(默认端口 4096),可配合官方 SDK 编程式控制。把 opencode serve 作为后台进程拉起,再通过 JS SDK 的 getHost(4096) 拿到外部访问地址:
import { Sandbox } from "e2b";
import { createOpencodeClient } from "@opencode-ai/sdk";
const sandbox = await Sandbox.create("opencode", {
envs: { ANTHROPIC_API_KEY: process.env.ANTHROPIC_API_KEY },
timeoutMs: 10 * 60 * 1000,
});
await sandbox.commands.run("opencode serve --hostname 0.0.0.0 --port 4096", {
background: true,
});
const baseUrl = `https://${sandbox.getHost(4096)}`;
while (true) {
try {
await fetch(`${baseUrl}/global/health`);
break;
} catch {
await new Promise((r) => setTimeout(r, 500));
}
}
const client = createOpencodeClient({ baseUrl });
const { data: session } = await client.session.create({
body: { title: "sandbox" },
});
const { data: result } = await client.session.prompt({
path: { id: session.id },
body: {
parts: [{ type: "text", text: "Create a hello world HTTP server in Go" }],
},
});
console.log(result);
配合密钥注入使用
如需让真实密钥留在平台侧,可创建对应类型的注入规则(如 anthropic、openai、gemini,参见密钥注入),沙箱内只传占位符:
const sandbox = await Sandbox.create("opencode", {
envs: { ANTHROPIC_API_KEY: "placeholder" },
injections: [{ id: "<rule-id>" }],
});
参考
- OpenCode 官网:https://opencode.ai
文档反馈
(如有产品使用问题,请 提交工单)