Daytona
最后更新 查看 Markdown 源文件
Daytona 适配器将已初始化的 Daytona 沙箱(来自 @daytona/sdk)适配为 Flue 的沙箱接口。当 Node 托管的应用需要提供商管理的、具有文件系统和 shell 操作的 Linux 环境时,可以使用它。
快速开始
使用 Daytona 蓝图为现有 Flue 项目添加提供商管理的 Linux 沙箱能力。在终端或你选择的编码智能体中运行以下命令:
flue add sandbox daytona
概述
蓝图会在需要时安装 @daytona/sdk,并在你的源码根目录下创建 sandboxes/daytona.ts。该文件适配你的应用已经创建的 Daytona 沙箱;它不会选择其镜像、身份、保留或清理策略。
// flue-blueprint: sandbox/daytona@1
import { sandboxFromDriver, useModel } from '@flue/runtime';
import type { SandboxDriver, SandboxFactory, Sandbox, FileStat } from '@flue/runtime';
import type { Sandbox as DaytonaSandbox } from '@daytona/sdk';
class DaytonaSandboxDriver implements SandboxDriver {
constructor(private sandbox: DaytonaSandbox) {}
/* 使用 sandbox.fs 实现文件读写、stat、列表、存在检查和 mkdir。 */
/* 转发递归删除,并在删除前拒绝不支持的 force 选项。 */
/* 使用 executeCommand() 实现 exec(),将 timeoutMs 向上取整为整秒。 */
}
export function daytona(sandbox: DaytonaSandbox): SandboxFactory {
return {
async createSandbox(): Promise<Sandbox> {
const sandboxCwd = (await sandbox.getWorkDir()) ?? '/home/daytona';
const driver = new DaytonaSandboxDriver(sandbox);
return sandboxFromDriver(driver, sandboxCwd);
},
};
}将已初始化的 Daytona Sandbox 传递给 daytona(...),然后将返回的工厂传递给智能体的 useSandbox(...) 调用。Flue 使用提供商的工作目录作为工作区根目录,通过会话暴露 Daytona 文件系统和进程操作,保留 Daytona 可用的文件元数据,并将毫秒级命令超时向上取整到 SDK 的整秒超时。Daytona 支持递归删除但不支持 force 语义,因此适配器会在删除前拒绝 force 选项。你的应用仍然负责沙箱的创建和生命周期。
配置
| 变量 | 用途 |
|---|---|
DAYTONA_API_KEY | 必需 — 向 Daytona API 进行认证。 |
| 覀求 | 用途 |
|---|---|
@daytona/sdk 包 | 必需 — 创建由 Flue 适配的 Daytona 沙箱。 |
| 应用自有的生命周期 | 必需 — 创建、保留和删除沙箱,然后将其传递给 daytona(sandbox)。 |
生成的适配器期望你的应用创建并拥有 Daytona 沙箱。它不会为你决定沙箱的身份、保留或清理策略。
典型用法
import { Daytona } from '@daytona/sdk';
import { useModel, useSandbox } from '@flue/runtime';
import { daytona } from '../sandboxes/daytona';
export function Assistant() {
useModel('anthropic/claude-sonnet-4-6');
useSandbox({
// 按照 SandboxFactory 契约,延迟执行:构造此对象成本很低;
// 昂贵的 Daytona 沙箱创建只在 createSandbox() 内部的初始化阶段
// 执行一次 —— 永远不会在重新渲染时执行。
async createSandbox(options) {
const client = new Daytona({ apiKey: env.DAYTONA_API_KEY });
const sandbox = await client.create();
return daytona(sandbox).createSandbox(options);
},
});
}
在将沙箱传递给 daytona(...) 之前,通过 Daytona SDK 配置镜像、快照、区域、环境变量和卷。要使用更窄的工作目录,请在智能体的 useSandbox(...) 调用上配置 cwd;Flue 会在 init() 期间针对适配器的提供商拥有的基础目录解析它一次。