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)
- 이 문서를 MCP로 연결하면 Claude, VSCode 등에서 실시간 답변을 받을 수 있어요.
- GitHub에서 이 페이지 편집하기 또는 이슈 제출하기.