全栈应用服务器

  • 全栈应用服务器 > 使用指南 > 沙箱服务概述 > AI Agents > OpenCode

    OpenCode

    最近更新时间: 2026-04-30 16:22:07

    概述

    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);
    

    配合密钥注入使用

    如需让真实密钥留在平台侧,可创建对应类型的注入规则(如 anthropicopenaigemini,参见密钥注入),沙箱内只传占位符:

    const sandbox = await Sandbox.create("opencode", {
      envs: { ANTHROPIC_API_KEY: "placeholder" },
      injections: [{ id: "<rule-id>" }],
    });
    

    参考

    以上内容是否对您有帮助?