Daytona

Daytona

deepagents와 함께 Daytona 샌드박스 백엔드를 사용하면 빠른 콜드 스타트로 격리된 코드 실행이 가능해요.

Daytona는 다중 언어를 지원하는 빠른 시작 샌드박스 환경을 제공해요. TypeScript와 Python 개발에 가장 적합합니다.

출처: 문서

본문

설정

npm install @langchain/daytona
yarn add @langchain/daytona
pnpm add @langchain/daytona

인증

API 키는 app.daytona.io에서 받으세요.

export DAYTONA_API_KEY=your_api_key

또는 자격 증명을 직접 전달하세요:

const sandbox = await DaytonaSandbox.create({
  auth: { apiKey: "your-...ere" },
});

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

단독 사용(Standalone usage)

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

구성(Configuration)

옵션(Option) 타입(Type) 기본값(Default) 설명(Description)
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> - 시작 시 생성할 파일

커스텀 리소스(Custom resources)

CPU, 메모리, 디스크를 커스터마이즈하려면 Docker 이미지를 지정해야 합니다:

const sandbox = await DaytonaSandbox.create({
  image: "node:20",
  language: "typescript",
  resources: {
    cpu: 4,       // Number of CPUs
    memory: 8,    // GiB
    disk: 50,     // GiB
  },
});

사용 가능한 리전(Available regions)

리전(Region) 위치(Location)
us 미국(United States)
eu 유럽(Europe)

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

샌드박스 수명 주기(Sandbox lifecycle)

const sandbox = await DaytonaSandbox.create();

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

팩토리 함수(Factory functions)

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

오류 처리(Error handling)

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

오류 코드(Error codes)

코드(Code) 설명(Description)
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, 메모리, 스토리지 제한 초과

환경 변수(Environment variables)

변수(Variable) 설명(Description)
DAYTONA_API_KEY Daytona API 키(필수)
DAYTONA_API_URL 커스텀 Daytona API URL
DAYTONA_TARGET 기본 대상 리전(us/eu)

더 알아보기 (Learn more)