设置
npm install @langchain/daytona
yarn add @langchain/daytona
pnpm add @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();
配置
| 选项 | 类型 | 默认值 | 描述 |
|---|---|---|---|
language | string | "typescript" | 主要语言运行时。选项:"typescript" | "python" | "javascript" |
timeout | number | 300 | 命令超时时间(秒) |
target | string | "us" | 区域。选项:"us" | "eu" |
image | string | - | 自定义 Docker 镜像(例如 "node:20"、"python:3.12") |
snapshot | string | - | 快照名称(不能与 image 同时使用) |
resources | object | - | CPU、内存、磁盘分配(需要 image) |
autoStopInterval | number | 15 | 空闲 N 分钟后自动停止(0 表示禁用) |
labels | Record<string, string> | - | 用于组织沙箱的自定义标签 |
initialFiles | Record<string, string> | - | 启动时创建的文件 |
自定义资源
要自定义 CPU、内存或磁盘,必须指定 Docker 镜像:const sandbox = await DaytonaSandbox.create({
image: "node:20",
language: "typescript",
resources: {
cpu: 4, // CPU 数量
memory: 8, // GiB
disk: 50, // GiB
},
});
可用区域
| 区域 | 位置 |
|---|---|
us | 美国 |
eu | 欧洲 |
访问 Daytona SDK
要使用高级功能,请访问底层的 Daytona SDK:const daytonaSandbox = await DaytonaSandbox.create();
const sdk = daytonaSandbox.sandbox;
// 直接使用任何 Daytona SDK 功能
const workDir = await sdk.getWorkDir();
const homeDir = await sdk.getUserHomeDir();
await sdk.fs.createFolder("src", "755");
重新连接到现有沙箱
// 创建具有自动停止间隔的沙箱
const sandbox = await DaytonaSandbox.create({
language: "typescript",
autoStopInterval: 60,
});
const sandboxId = sandbox.id;
// 停止沙箱(保持其可用)
await sandbox.stop();
// 稍后:重新连接
const reconnected = await DaytonaSandbox.connect(sandboxId);
await reconnected.start();
const result = await reconnected.execute("ls -la");
沙箱生命周期
const sandbox = await DaytonaSandbox.create();
await sandbox.stop(); // 停止(可以重新启动)
await sandbox.start(); // 启动已停止的沙箱
await sandbox.close(); // 永久删除
工厂函数
import { createDaytonaSandboxFactory, createDaytonaSandboxFactoryFromSandbox } from "@langchain/daytona";
// 每次调用创建新沙箱
const factory = createDaytonaSandboxFactory({ language: "typescript" });
// 或在多次调用间重用现有沙箱
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_KEY | Daytona API 密钥(必需) |
DAYTONA_API_URL | 自定义 Daytona API URL |
DAYTONA_TARGET | 默认目标区域(us/eu) |
将这些文档 通过 MCP 连接到 Claude、VSCode 等,以获取实时答案。

