跳转到内容

输入关键词开始搜索文档。

Daytona

最后更新 查看 Markdown 源文件

Daytona 适配器将已初始化的 Daytona 沙箱(来自 @daytona/sdk)适配为 Flue 的沙箱接口。当 Node 托管的应用需要提供商管理的、具有文件系统和 shell 操作的 Linux 环境时,可以使用它。

快速开始

使用 Daytona 蓝图为现有 Flue 项目添加提供商管理的 Linux 沙箱能力。在终端或你选择的编码智能体中运行以下命令:

flue add sandbox daytona

概述

蓝图会在需要时安装 @daytona/sdk,并在你的源码根目录下创建 sandboxes/daytona.ts。该文件适配你的应用已经创建的 Daytona 沙箱;它不会选择其镜像、身份、保留或清理策略。

<source-root>/sandboxes/daytona.ts (abridged)
// 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() 期间针对适配器的提供商拥有的基础目录解析它一次。

参见沙箱、沙箱适配器 API 和 Daytona 的 TypeScript SDK 参考。