Skip to main content
Daytona 提供支持多语言的快速启动沙盒环境。最适合 TypeScript 和 Python 开发。

设置

npm install @langchain/daytona

身份验证

app.daytona.io 获取您的 API 密钥。
export DAYTONA_API_KEY=your_api_key
或者直接传递凭据:
const sandbox = await DaytonaSandbox.create({
  auth: { apiKey: "your-api-key-here" },
});

与 deepagents 一起使用

import { createDeepAgent } from "deepagents";
import { ChatAnthropic } from "@langchain/anthropic";
import { DaytonaSandbox } from "@langchain/daytona";

const sandbox = await DaytonaSandbox.create({
  language: "typescript",
  timeout: 300,
});

try {
  const agent = createDeepAgent({
    model: new ChatAnthropic({ model: "claude-sonnet-4-20250514" }),
    systemPrompt: "You are a coding assistant with sandbox access.",
    backend: sandbox,
  });

  const result = await agent.invoke({
    messages: [{ role: "user", content: "Create a hello world TypeScript app and run it" }],
  });
} finally {
  await sandbox.close();
}

独立使用

import { DaytonaSandbox } from "@langchain/daytona";

const sandbox = await DaytonaSandbox.create({
  language: "typescript",
  timeout: 300,
});

const result = await sandbox.execute("npm --version");
console.log(result.output);

await sandbox.close();

配置

选项类型默认值描述
languagestring"typescript"主要语言运行时。选项:"typescript" | "python" | "javascript"
timeoutnumber300命令超时时间(秒)
targetstring"us"区域。选项:"us" | "eu"
imagestring-自定义 Docker 镜像(例如 "node:20", "python:3.12"
snapshotstring-快照名称(不能与 image 一起使用)
resourcesobject-CPU、内存、磁盘分配(需要 image
autoStopIntervalnumber15空闲 N 分钟后自动停止(0 表示禁用)
labelsRecord<string, string>-用于组织沙盒的自定义标签
initialFilesRecord<string, string>-启动时创建的文件

自定义资源

要自定义 CPU、内存或磁盘,必须指定 Docker 镜像:
const sandbox = await DaytonaSandbox.create({
  image: "node:20",
  language: "typescript",
  resources: {
    cpu: 4,       // Number of CPUs
    memory: 8,    // GiB
    disk: 50,     // GiB
  },
});

可用区域

区域位置
us美国
eu欧洲

访问 Daytona SDK

要使用高级功能,请访问底层 Daytona SDK:
const daytonaSandbox = await DaytonaSandbox.create();
const sdk = daytonaSandbox.sandbox;

// Use any Daytona SDK feature directly
const workDir = await sdk.getWorkDir();
const homeDir = await sdk.getUserHomeDir();
await sdk.fs.createFolder("src", "755");

重新连接到现有沙盒

// Create sandbox with auto-stop interval
const sandbox = await DaytonaSandbox.create({
  language: "typescript",
  autoStopInterval: 60,
});
const sandboxId = sandbox.id;

// Stop the sandbox (keeps it available)
await sandbox.stop();

// Later: reconnect
const reconnected = await DaytonaSandbox.connect(sandboxId);
await reconnected.start();
const result = await reconnected.execute("ls -la");

沙盒生命周期

const sandbox = await DaytonaSandbox.create();

await sandbox.stop();   // Stop (can be restarted)
await sandbox.start();  // Start a stopped sandbox
await sandbox.close();  // Delete permanently

工厂函数

import { createDaytonaSandboxFactory, createDaytonaSandboxFactoryFromSandbox } from "@langchain/daytona";

// Create new sandbox per invocation
const factory = createDaytonaSandboxFactory({ language: "typescript" });

// Or reuse an existing sandbox across invocations
const sandbox = await DaytonaSandbox.create();
const reuseFactory = createDaytonaSandboxFactoryFromSandbox(sandbox);

错误处理

import { DaytonaSandboxError } from "@langchain/daytona";

try {
  await sandbox.execute("some command");
} catch (error) {
  if (error instanceof DaytonaSandboxError) {
    switch (error.code) {
      case "NOT_INITIALIZED":
        await sandbox.initialize();
        break;
      case "COMMAND_TIMEOUT":
        console.error("Command took too long");
        break;
      case "AUTHENTICATION_FAILED":
        console.error("Check your Daytona API key");
        break;
    }
  }
}

错误代码

代码描述
NOT_INITIALIZED沙盒未初始化 - 调用 initialize()
ALREADY_INITIALIZED无法重复初始化
AUTHENTICATION_FAILED无效或缺失的 Daytona API 密钥
SANDBOX_CREATION_FAILED创建沙盒失败
SANDBOX_NOT_FOUND沙盒 ID 未找到或已删除
SANDBOX_NOT_STARTED沙盒未处于启动状态
COMMAND_TIMEOUT命令执行超时
COMMAND_FAILED命令执行失败
FILE_OPERATION_FAILED文件读/写失败
RESOURCE_LIMIT_EXCEEDED超出 CPU、内存或存储限制

环境变量

变量描述
DAYTONA_API_KEYDaytona API 密钥(必需)
DAYTONA_API_URL自定义 Daytona API URL
DAYTONA_TARGET默认目标区域 (us/eu)