콘텐츠로 이동

개념

최신 에이전트는 파일시스템의 실제 파일을 다룰 수 있을 때 가장 잘 작동합니다. 샌드박스 에이전트는 특수 도구와 셸 명령을 사용해 대규모 문서 집합을 검색 및 조작하고, 파일을 편집하고, 아티팩트를 생성하고, 명령을 실행할 수 있습니다. 샌드박스는 모델에 지속되는 워크스페이스를 제공하며, 에이전트는 이를 사용해 사용자를 대신해 작업할 수 있습니다. Agents SDK의 샌드박스 에이전트는 샌드박스 환경과 쌍을 이루는 에이전트를 실행할 수 있게 해 주며, 파일시스템에 올바른 파일을 배치하고 샌드박스를 오케스트레이션해 대규모로 작업을 시작, 중지, 재개하기 쉽게 해 줍니다.

에이전트에 필요한 데이터를 중심으로 워크스페이스를 정의합니다. GitHub 리포지토리, 로컬 파일과 디렉터리, 합성 작업 파일, S3나 Azure Blob Storage 같은 원격 파일시스템, 그리고 사용자가 제공하는 다른 샌드박스 입력에서 시작할 수 있습니다.

컴퓨팅이 포함된 샌드박스 에이전트 하네스

SandboxAgentAgent를 확장하므로 여전히 Agent입니다. instructions, tools, handoffs, mcpServers, modelSettings, 출력 타입, 가드레일, 훅 같은 일반적인 에이전트 표면을 유지하며, 일반 run()Runner API를 통해 실행됩니다. 달라지는 것은 실행 경계입니다.

  • SandboxAgent는 에이전트 자체를 정의합니다. 일반적인 에이전트 설정에 더해 defaultManifest, baseInstructions, runAs 같은 샌드박스별 기본값과 파일시스템 도구, 셸 접근, 스킬, 메모리, 컴팩션 같은 기능을 포함합니다.
  • Manifest는 새 샌드박스 워크스페이스의 시작 콘텐츠와 레이아웃을 선언합니다. 여기에는 파일, 리포지토리, 마운트, 환경이 포함됩니다.
  • 샌드박스 세션은 명령이 실행되고 파일이 변경되는 활성 실행 환경입니다.
  • sandbox 실행 옵션은 실행이 해당 샌드박스 세션을 어떻게 얻을지 결정합니다. 예를 들어 세션을 직접 주입하거나, 직렬화된 샌드박스 세션 상태에서 다시 연결하거나, 샌드박스 클라이언트를 통해 새 샌드박스 세션을 생성할 수 있습니다.
  • 저장된 샌드박스 상태와 스냅샷을 사용하면 이후 실행이 이전 작업에 다시 연결하거나 저장된 콘텐츠에서 새 샌드박스 세션을 시작할 수 있습니다.

Manifest는 새 샌드박스 워크스페이스의 시작 콘텐츠를 정의합니다. 재사용된 세션, 직렬화된 세션 상태, 스냅샷이 모두 실행 시점에 워크스페이스를 제공하거나 변경할 수 있으므로, 모든 활성 샌드박스의 현재 파일을 설명하지는 않습니다.

이 페이지 전체에서 “샌드박스 세션”은 샌드박스 클라이언트가 관리하는 활성 실행 환경을 의미합니다. 정확한 경계는 클라이언트에 따라 달라집니다. Unix 로컬 세션은 호스트의 로컬 워크스페이스에서 실행되는 반면, Docker와 호스티드 클라이언트는 더 강한 환경 격리를 제공합니다. 이는 세션에 설명된 SDK의 대화형 Session 인터페이스와는 다릅니다.

외부 런타임은 여전히 승인, 트레이싱, 핸드오프, 재개 상태 관리를 담당합니다. 샌드박스 세션은 명령, 파일 변경, 환경 격리를 담당합니다. 이 분리는 모델의 핵심 요소입니다.

샌드박스 실행은 에이전트 정의와 실행별 샌드박스 설정을 결합합니다. runner는 에이전트를 준비하고, 이를 활성 샌드박스 세션에 바인딩하며, 이후 실행을 위해 상태를 저장할 수 있습니다.

SandboxAgent에이전트와 샌드박스 기본값
Runnerinstructions 준비 및 기능 도구 바인딩
샌드박스 세션명령이 실행되고 파일이 변경되는 워크스페이스
저장된 상태나중에 재개하거나 새 워크스페이스의 시드로 사용

샌드박스별 기본값은 SandboxAgent에 유지됩니다. 실행별 샌드박스 세션 선택은 sandbox 실행 옵션에 유지됩니다.

생명주기는 세 단계로 생각할 수 있습니다.

  1. SandboxAgent, Manifest, 기능으로 에이전트와 시작 워크스페이스 콘텐츠를 정의합니다.
  2. run() 또는 Runner에 샌드박스 세션을 주입, 재개 또는 생성하는 sandbox 실행 옵션을 전달해 실행합니다.
  3. runner가 관리하는 RunState, 명시적인 샌드박스 sessionState, 또는 저장된 워크스페이스 스냅샷에서 나중에 계속합니다.

셸 접근이 가끔 사용하는 도구 중 하나일 뿐이라면 도구의 호스티드 셸부터 시작하세요. 워크스페이스 격리, 샌드박스 클라이언트 선택, 또는 샌드박스 세션 재개 동작이 설계의 일부일 때 샌드박스 에이전트를 사용하세요.

샌드박스 에이전트는 워크스페이스 중심 워크플로에 적합합니다. 예를 들면 다음과 같습니다.

  • 코딩 및 디버깅: GitHub 리포지토리의 이슈 리포트에 대한 자동 수정 작업을 오케스트레이션하고 대상 테스트를 실행합니다.
  • 문서 처리 및 편집: 사용자의 재무 문서에서 정보를 추출하고 작성된 세금 양식 초안을 만듭니다.
  • 파일 기반 검토 또는 분석: 답변하기 전에 온보딩 패킷, 생성된 보고서, 아티팩트 번들을 확인합니다.
  • 격리된 멀티 에이전트 패턴: 각 리뷰어 또는 코딩 하위 에이전트에 자체 워크스페이스를 제공합니다.
  • 여러 단계의 워크스페이스 작업: 한 번의 실행에서 버그를 수정하고 나중에 회귀 테스트를 추가하거나, 스냅샷 또는 샌드박스 세션 상태에서 재개합니다.

파일이나 활성 파일시스템에 접근할 필요가 없다면 계속 Agent를 사용하세요. 셸 접근이 가끔 필요한 기능일 뿐이라면 호스티드 셸을 추가하고, 워크스페이스 경계 자체가 기능의 일부라면 샌드박스 에이전트를 사용하세요.

로컬 개발에는 UnixLocalSandboxClient로 시작하세요. 컨테이너 격리나 이미지 일치성이 필요할 때 DockerSandboxClient로 이동하세요. 공급자가 관리하는 실행이 필요할 때는 호스티드 공급자로 이동하세요.

대부분의 경우 SandboxAgent 정의는 그대로 유지되고, 샌드박스 클라이언트와 해당 옵션만 sandbox 실행 옵션에서 변경됩니다. 로컬, Docker, 호스티드, 원격 마운트 옵션은 샌드박스 클라이언트를 참조하세요.

계층주요 SDK 구성 요소답하는 질문
에이전트 정의SandboxAgent, Manifest, 기능어떤 에이전트가 실행되며, 새 세션 워크스페이스 계약은 무엇에서 시작해야 하나요?
샌드박스 실행sandbox 실행 옵션, 샌드박스 클라이언트, 활성 샌드박스 세션이 실행은 활성 샌드박스 세션을 어떻게 얻고, 작업은 어디에서 실행되나요?
저장된 샌드박스 상태RunState 샌드박스 페이로드, sessionState, 스냅샷이 워크플로는 이전 샌드박스 작업에 어떻게 다시 연결하거나 저장된 콘텐츠에서 새 샌드박스 세션을 시작하나요?

주요 SDK 구성 요소는 이러한 계층에 다음과 같이 매핑됩니다.

구성 요소담당하는 것확인할 질문
SandboxAgent에이전트 정의이 에이전트는 무엇을 해야 하며, 어떤 기본값이 함께 이동해야 하나요?
Manifest새 세션 워크스페이스 파일과 폴더실행이 시작될 때 파일시스템에 어떤 파일과 폴더가 있어야 하나요?
Capability샌드박스 네이티브 동작어떤 도구, instructions 조각, 또는 런타임 동작을 이 에이전트에 연결해야 하나요?
sandbox 실행 옵션실행별 샌드박스 클라이언트와 샌드박스 세션 소스이 실행은 샌드박스 세션을 주입, 재개, 또는 생성해야 하나요?
RunStaterunner가 관리하는 저장된 샌드박스 상태이전에 runner가 관리하던 워크플로를 재개하면서 그 샌드박스 상태를 자동으로 이어가고 있나요?
sandbox.sessionState명시적으로 직렬화된 샌드박스 세션 상태RunState 외부에서 이미 직렬화한 샌드박스 상태에서 재개하고 싶나요?
sandbox.snapshot새 샌드박스 세션을 위한 저장된 워크스페이스 콘텐츠새 샌드박스 세션이 저장된 파일과 아티팩트에서 시작해야 하나요?

실용적인 설계 순서는 다음과 같습니다.

  1. Manifest 또는 매니페스트 초기화 객체로 새 세션 워크스페이스 계약을 정의합니다.
  2. SandboxAgent로 에이전트를 정의합니다.
  3. 기본 제공 또는 사용자 정의 기능을 추가합니다.
  4. 각 실행이 run(agent, input, { sandbox: ... }) 또는 new Runner({ sandbox: ... })에서 샌드박스 세션을 어떻게 얻을지 결정합니다.

실행 시점에 runner는 해당 정의를 구체적인 샌드박스 기반 실행으로 변환합니다.

  1. sandbox 실행 옵션에서 샌드박스 세션을 확인합니다.
  2. 실행에 적용될 워크스페이스 입력을 결정합니다.
  3. 기능이 결과 매니페스트를 처리하도록 합니다.
  4. 고정된 순서로 최종 instructions를 구성합니다. SDK의 기본 샌드박스 프롬프트 또는 명시적으로 재정의한 경우 baseInstructions, 그다음 instructions, 그다음 기능 instructions 조각, 그다음 원격 마운트 정책 텍스트, 그다음 렌더링된 파일시스템 트리입니다.
  5. 기능 도구를 활성 샌드박스 세션에 바인딩하고, 준비된 에이전트를 일반 run()Runner API를 통해 실행합니다.

샌드박싱은 턴의 의미를 바꾸지 않습니다. 턴은 여전히 모델 단계이며, 단일 셸 명령이나 샌드박스 작업이 아닙니다. 샌드박스 측 작업과 턴 사이에는 고정된 1:1 매핑이 없습니다. 실무적인 기준으로는, 샌드박스 작업이 발생한 뒤 에이전트 런타임에 또 다른 모델 응답이 필요할 때만 추가 턴이 소비됩니다.

다음은 일반적인 Agent 필드에 더해 제공되는 샌드박스별 옵션입니다.

옵션최적 용도
defaultManifestrunner가 생성하는 새 샌드박스 세션의 기본 워크스페이스
instructionsSDK 샌드박스 프롬프트 뒤에 추가되는 역할, 워크플로, 성공 기준
baseInstructionsSDK 샌드박스 프롬프트를 대체하는 고급 탈출구
capabilities이 에이전트와 함께 이동해야 하는 샌드박스 네이티브 도구와 동작
runAs셸 명령, 파일 읽기, 패치 등 모델에 노출되는 샌드박스 도구의 사용자 ID

샌드박스 클라이언트 선택, 샌드박스 세션 재사용, 매니페스트 재정의, 스냅샷 선택은 에이전트가 아니라 sandbox 실행 옵션에 속합니다.

defaultManifest는 runner가 이 에이전트의 새 샌드박스 세션을 생성할 때 사용하는 기본 워크스페이스입니다. Manifest 인스턴스 또는 new Manifest(...)에 전달할 것과 같은 초기화 객체를 전달하세요. 에이전트가 일반적으로 시작해야 하는 파일, 리포지토리, 헬퍼 자료, 출력 디렉터리, 마운트에 사용합니다.

이는 기본값일 뿐입니다. 실행은 sandbox.manifest로 이를 재정의할 수 있으며, 재사용되거나 재개된 샌드박스 세션은 기존 워크스페이스 상태를 유지합니다.

매니페스트 정의
import { file, gitRepo, Manifest } from '@openai/agents/sandbox';
const manifest = new Manifest({
root: '/workspace',
entries: {
'task.md': file({
content: 'Fix the failing test and summarize the change.',
}),
repo: gitRepo({
repo: 'openai/openai-agents-js',
ref: 'main',
}),
},
environment: {
NODE_ENV: 'test',
},
});

다른 프롬프트에서도 유지되어야 하는 짧은 규칙에는 instructions를 사용하세요. SandboxAgent에서 이러한 instructions는 SDK의 샌드박스 기본 프롬프트 뒤에 추가되므로, 기본 제공 샌드박스 가이던스를 유지하면서 자체 역할, 워크플로, 성공 기준을 추가할 수 있습니다.

SDK 샌드박스 기본 프롬프트를 대체하고 싶을 때만 baseInstructions를 사용하세요. 대부분의 에이전트는 이를 설정하지 않아야 합니다.

넣는 위치용도
instructions에이전트의 안정적인 역할, 워크플로 규칙, 성공 기준”온보딩 문서를 검사한 다음 핸드오프하세요.”, “최종 파일을 output/에 작성하세요.”
baseInstructionsSDK 샌드박스 기본 프롬프트의 전체 대체사용자 정의 저수준 샌드박스 래퍼 프롬프트
사용자 프롬프트이 실행의 일회성 요청”이 워크스페이스를 요약하세요.”
매니페스트의 워크스페이스 파일더 긴 작업 사양, 리포지토리 로컬 지침, 또는 범위가 제한된 참고 자료repo/task.md, 문서 번들, 샘플 패킷

사용자의 일회성 작업을 instructions에 복사하거나, 매니페스트에 속하는 긴 참고 자료를 포함하거나, 기본 제공 기능이 이미 주입하는 도구 문서를 반복해서 적거나, 모델이 실행 시점에 필요로 하지 않는 로컬 설치 메모를 섞지 마세요.

기능은 샌드박스 네이티브 동작을 SandboxAgent에 연결합니다. 실행이 시작되기 전에 워크스페이스를 구성하고, 샌드박스별 instructions를 추가하고, 활성 샌드박스 세션에 바인딩되는 도구를 노출하며, 해당 에이전트의 모델 동작이나 입력 처리를 조정할 수 있습니다.

기본 제공 기능은 다음과 같습니다.

기능추가하는 경우참고
shell()에이전트에 셸 접근이 필요합니다.exec_command를 추가하고, 샌드박스 클라이언트가 PTY 상호작용을 지원할 때는 write_stdin도 추가합니다.
filesystem()에이전트가 파일을 편집하거나 로컬 이미지를 검사해야 합니다.apply_patchview_image를 추가합니다. 패치 경로는 워크스페이스 루트 기준 상대 경로입니다.
skills()샌드박스에서 스킬 검색과 구체화를 사용하고 싶습니다.샌드박스 로컬 SKILL.md 스킬을 위해 .agents 또는 .agents/skills를 수동으로 마운트하는 것보다 이를 선호하세요.
memory()후속 실행이 메모리 아티팩트를 읽거나 생성해야 합니다.shell()이 필요합니다. 실시간 업데이트에는 filesystem()도 필요합니다.
compaction()장기 실행 흐름에서 컴팩션 항목 이후 컨텍스트 트리밍이 필요합니다.모델 샘플링과 입력 처리를 조정합니다.

기본적으로 SandboxAgent.capabilitiesCapabilities.default()를 사용하며, 여기에는 filesystem(), shell(), compaction()이 포함됩니다. capabilities: [...]를 전달하면 해당 목록이 기본값을 대체하므로, 여전히 원하는 기본 기능을 포함하세요.

Manifest는 새 샌드박스 세션의 워크스페이스를 설명합니다. 워크스페이스 root를 설정하고, 파일과 디렉터리를 선언하고, 로컬 파일을 복사하고, Git 리포지토리를 클론하고, 원격 스토리지 마운트를 연결하고, 환경 변수를 설정하고, 사용자 또는 그룹을 정의하고, 워크스페이스 외부의 특정 절대 경로에 대한 접근을 허용할 수 있습니다.

매니페스트 환경 값은 기본적으로 유지됩니다. 샌드박스 상태와 함께 저장되어서는 안 되는 API 키, 액세스 토큰, 기타 단기 자격 증명에는 { value: "...", ephemeral: true } 같은 임시 항목을 사용하세요.

매니페스트 항목 경로는 워크스페이스 기준 상대 경로입니다. 절대 경로가 될 수 없고 ..로 워크스페이스를 벗어날 수도 없습니다. 이를 통해 워크스페이스 계약이 로컬, Docker, 호스티드 클라이언트 전반에서 이식 가능하게 유지됩니다.

작업이 시작되기 전에 에이전트에 필요한 자료에는 매니페스트 항목을 사용하세요.

매니페스트 항목용도
file(), dir()작은 합성 입력, 헬퍼 파일, 또는 출력 디렉터리
localFile(), localDir()샌드박스에 구체화되어야 하는 호스트 파일 또는 디렉터리
gitRepo()워크스페이스로 가져와야 하는 리포지토리
s3Mount(), gcsMount(), r2Mount(), azureBlobMount(), s3FilesMount() 같은 마운트샌드박스 안에 나타나야 하는 외부 스토리지

로컬 구체화의 경우 localFile()localDir() 소스 경로는 로컬 소스 기준 디렉터리 안에 있어야 합니다. 기본 기준은 Node 프로세스의 현재 작업 디렉터리이며, 로컬 샌드박스 클라이언트는 항목을 구체화할 때 클라이언트별 기준 디렉터리를 제공할 수 있습니다. 소스가 다른 절대 호스트 디렉터리에서 와야 하는 경우, 필요한 최소한의 Manifest.extraPathGrants 항목을 추가하세요.

extraPathGrants는 로컬 지연 스킬 검색에도 사용됩니다. 소스 기준 디렉터리 밖을 가리키는 localDirLazySkillSource()는 매니페스트가 해당 디렉터리를 허용하지 않는 한 무시됩니다. 공유 스킬, 데이터셋, 참고 리포지토리 같은 입력 번들에는 readOnly: true를 선호하세요.

공유 로컬 소스 권한 부여
import { Manifest, localDir, skills } from '@openai/agents/sandbox';
import { localDirLazySkillSource } from '@openai/agents/sandbox/local';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const appRoot = dirname(fileURLToPath(import.meta.url));
const repoDir = join(appRoot, 'repo');
const sharedSkillsDir = '/opt/company/agent-skills';
const manifest = new Manifest({
extraPathGrants: [
{
path: sharedSkillsDir,
readOnly: true,
description: 'Shared skill bundle.',
},
],
entries: {
repo: localDir({ src: repoDir }),
},
});
const skillCapability = skills({
lazyFrom: localDirLazySkillSource({
src: sharedSkillsDir,
}),
});

마운트 항목은 노출할 스토리지를 설명하고, 마운트 전략은 샌드박스 백엔드가 해당 스토리지를 연결하는 방식을 설명합니다. 마운트 옵션과 공급자 지원은 샌드박스 클라이언트를 참조하세요.

Permissions는 매니페스트 항목의 파일시스템 권한을 제어합니다. 이는 샌드박스가 구체화하는 파일에 관한 것이며, 모델 권한, 승인 정책, API 자격 증명에 관한 것이 아닙니다.

사용자는 작업을 실행할 수 있는 샌드박스 ID입니다. 해당 ID가 샌드박스에 존재하길 원할 때 매니페스트에 사용자를 추가한 다음, 셸 명령, 파일 읽기, 패치처럼 모델에 노출되는 샌드박스 도구가 해당 사용자로 실행되어야 할 때 SandboxAgent.runAs를 설정합니다.

파일 수준 공유 규칙도 필요하다면 사용자와 매니페스트 그룹 및 항목 group 메타데이터를 결합하세요. runAs 사용자는 누가 샌드박스 네이티브 작업을 실행할지 제어하고, Permissions는 샌드박스가 워크스페이스를 구체화한 뒤 해당 사용자가 어떤 파일을 읽고, 쓰고, 실행할 수 있는지 제어합니다.

SnapshotSpec는 새 샌드박스 세션에 저장된 워크스페이스 콘텐츠를 어디에서 복원하고 다시 어디에 유지할지 알려줍니다. 이는 샌드박스 워크스페이스의 스냅샷 정책이며, sessionState는 특정 샌드박스 백엔드를 재개하기 위한 직렬화된 연결 상태입니다.

로컬의 지속성 있는 스냅샷에는 로컬 스냅샷을 사용하고, 앱이 원격 스냅샷 클라이언트를 제공할 때는 원격 스냅샷을 사용하세요. 마운트된 경로와 임시 경로는 지속성 있는 워크스페이스 콘텐츠로 스냅샷에 복사되지 않습니다.

생명주기 모드는 SDK 소유개발자 소유 두 가지입니다.

SDK 소유Runner가 활성 샌드박스를 소유합니다.
  1. sandbox.client를 전달합니다.

  2. Runner가 샌드박스 세션을 생성하거나 재개합니다.

  3. 에이전트가 실행되고 스냅샷 기반 워크스페이스 상태가 유지될 수 있습니다.

  4. Runner가 runner 소유 리소스를 닫습니다.

개발자 소유애플리케이션이 활성 샌드박스를 소유합니다.
  1. session을 생성합니다.

  2. 실행에 sandbox.session을 전달합니다.

  3. 에이전트가 기존 워크스페이스를 사용합니다.

  4. 검사하고, 재사용한 다음, 세션을 직접 닫습니다.

샌드박스가 한 번의 실행 동안만 살아 있으면 되는 경우 SDK 소유 생명주기를 사용하세요. client, 선택적 manifest, 선택적 snapshot, 클라이언트 options를 전달하면 runner가 샌드박스를 생성하거나 재개하고, 에이전트를 실행하고, 스냅샷 기반 워크스페이스 상태를 유지하며, 클라이언트가 runner 소유 리소스를 정리하도록 합니다.

runner가 샌드박스 세션을 관리하도록 하기
import { run } from '@openai/agents';
import { SandboxAgent } from '@openai/agents/sandbox';
import { UnixLocalSandboxClient } from '@openai/agents/sandbox/local';
const agent = new SandboxAgent({
name: 'Workspace reviewer',
model: 'gpt-5.5',
instructions: 'Inspect the sandbox workspace before answering.',
});
const result = await run(agent, 'Inspect the workspace.', {
sandbox: {
client: new UnixLocalSandboxClient(),
},
});
console.log(result.finalOutput);

샌드박스를 미리 생성하거나, 하나의 활성 샌드박스를 여러 실행에서 재사용하거나, 실행 후 파일을 검사하거나, 직접 생성한 샌드박스를 통해 스트리밍하거나, 정리가 언제 발생할지 정확히 결정하고 싶을 때 개발자 소유 생명주기를 사용하세요. session을 전달하면 runner가 해당 활성 샌드박스를 사용하되, 대신 닫지는 않습니다.

샌드박스 세션 직접 관리
import { run } from '@openai/agents';
import { Manifest, SandboxAgent } from '@openai/agents/sandbox';
import { UnixLocalSandboxClient } from '@openai/agents/sandbox/local';
const manifest = new Manifest();
const agent = new SandboxAgent({
name: 'Workspace reviewer',
model: 'gpt-5.5',
instructions: 'Inspect the sandbox workspace before answering.',
});
const client = new UnixLocalSandboxClient();
const session = await client.create({ manifest });
try {
await run(agent, 'First task.', { sandbox: { session } });
await run(agent, 'Follow-up task.', { sandbox: { session } });
} finally {
await session.close?.();
}

sandbox 실행 옵션은 샌드박스 세션이 어디에서 오는지, 새 세션을 어떻게 초기화할지 결정하는 실행별 옵션을 담습니다.

다음 옵션은 runner가 샌드박스 세션을 재사용, 재개, 또는 생성해야 하는지 결정합니다.

옵션사용하는 경우참고
clientrunner가 샌드박스 세션을 생성, 재개, 정리해 주길 원합니다.활성 샌드박스 session을 제공하지 않는 한 필수입니다.
session이미 활성 샌드박스 세션을 직접 생성했습니다.호출자가 생명주기를 소유합니다. runner는 해당 활성 샌드박스 세션을 재사용합니다.
sessionState직렬화된 샌드박스 세션 상태는 있지만 활성 샌드박스 세션 객체는 없습니다.client가 필요합니다. runner는 해당 명시적 상태에서 소유 세션으로 재개합니다.

다음 옵션은 runner가 새 샌드박스 세션을 생성할 때만 의미가 있습니다.

옵션사용하는 경우참고
manifest일회성 새 세션 워크스페이스 재정의를 원합니다.Manifest 또는 매니페스트 초기화 객체를 허용합니다. 생략하면 agent.defaultManifest로 폴백합니다.
snapshot새 샌드박스 세션이 스냅샷에서 시작되어야 합니다.재개와 유사한 흐름 또는 원격 스냅샷 클라이언트에 유용합니다.
options샌드박스 클라이언트에 생성 시점 옵션이 필요합니다.Docker 이미지, 공급자 타임아웃, 유사한 클라이언트별 설정에 흔히 사용됩니다.

concurrencyLimits는 병렬로 실행될 수 있는 샌드박스 구체화 작업량을 제어합니다. 큰 매니페스트 또는 로컬 디렉터리 복사에 더 엄격한 리소스 제어가 필요할 때 manifestEntrieslocalDirFiles를 사용하세요.

구체화 제어는 의도적으로 실행별로 설정됩니다. 같은 SandboxAgent가 큰 로컬 디렉터리 복사에는 보수적인 제한을 사용하고 작은 매니페스트에는 더 느슨한 제한을 사용할 수 있도록 sandbox 실행 옵션 가까이에 두세요.

매니페스트에 파일, 디렉터리, 리포지토리, 마운트 같은 독립 항목이 많을 때 concurrencyLimits.manifestEntries를 사용하세요. localDir() 항목에 파일이 많고 로컬 복사 부하를 제한해야 할 때 concurrencyLimits.localDirFiles를 사용하세요.

이 코딩 스타일 예제는 기본 시작점으로 적합합니다.

샌드박스 코딩 작업
import { run } from '@openai/agents';
import {
Capabilities,
Manifest,
SandboxAgent,
localDir,
skills,
} from '@openai/agents/sandbox';
import {
UnixLocalSandboxClient,
localDirLazySkillSource,
} from '@openai/agents/sandbox/local';
import { dirname, join } from 'node:path';
import { fileURLToPath } from 'node:url';
const exampleDir = dirname(fileURLToPath(import.meta.url));
const hostRepoDir = join(exampleDir, 'repo');
const hostSkillsDir = join(exampleDir, 'skills');
const manifest = new Manifest({
entries: {
repo: localDir({ src: hostRepoDir }),
},
});
const agent = new SandboxAgent({
name: 'Sandbox engineer',
model: 'gpt-5.5',
instructions:
'Read `repo/task.md` before editing files. Load the `$invoice-total-fixer` skill before changing code. Stay grounded in the repository, preserve existing behavior, and mention the exact verification command you ran. If you edit files with apply_patch, paths are relative to the sandbox workspace root.',
defaultManifest: manifest,
capabilities: [
...Capabilities.default(),
skills({
lazyFrom: localDirLazySkillSource({
src: hostSkillsDir,
}),
}),
],
});
const result = await run(
agent,
'Open `repo/task.md`, fix the issue, run the targeted test, and summarize the change.',
{
sandbox: {
client: new UnixLocalSandboxClient(),
},
},
);
console.log(result.finalOutput);

위의 전체 예제에서 시작하세요. 많은 경우 동일한 SandboxAgent를 그대로 유지하면서 샌드박스 클라이언트, 샌드박스 세션 소스, 또는 워크스페이스 소스만 변경할 수 있습니다.

에이전트 정의는 그대로 두고 실행 설정만 변경하세요. 컨테이너 격리나 이미지 일치성을 원할 때 Docker를 사용하고, 공급자 관리 실행을 원할 때 호스티드 공급자를 사용하세요. 예제와 공급자 옵션은 샌드박스 클라이언트를 참조하세요.

에이전트 정의는 그대로 두고 sandbox: { client, manifest }로 새 세션 매니페스트만 교체하세요. 같은 에이전트 역할을 에이전트를 다시 만들지 않고도 서로 다른 리포지토리, 패킷, 작업 번들에 대해 실행해야 할 때 사용합니다.

명시적인 생명주기 제어, 실행 후 검사, 또는 출력 복사가 필요할 때 활성 샌드박스 세션을 주입하세요. 해당 실행에 sandbox: { session }을 사용하고, 애플리케이션 코드에서 세션을 닫으세요.

RunState 외부에서 이미 샌드박스 상태를 직렬화했다면 sandbox: { client, sessionState }로 runner가 해당 상태에서 다시 연결하도록 하세요. 샌드박스 상태가 자체 스토리지나 작업 시스템에 있고 Runner가 이를 직접 재개하길 원할 때 사용합니다.

sandbox: { client, snapshot }으로 저장된 파일과 아티팩트에서 새 샌드박스를 시작하세요. 새 실행이 agent.defaultManifest만이 아니라 저장된 워크스페이스 콘텐츠에서 시작해야 할 때 사용합니다.

skills({ from: gitRepo(...) })로 로컬 스킬 소스를 리포지토리 기반 소스로 교체하세요. 스킬 번들에 자체 릴리스 주기가 있거나 샌드박스 간에 공유되어야 할 때 사용합니다.

도구 에이전트는 자체 샌드박스 경계를 가질 수도 있고 부모 실행의 활성 샌드박스를 재사용할 수도 있습니다. 재사용은 빠른 읽기 전용 탐색 에이전트에 유용합니다. 추가 샌드박스를 생성, 하이드레이트, 또는 스냅샷하는 비용 없이 부모가 사용하는 정확한 워크스페이스를 검사할 수 있습니다.

도구 에이전트에 실제 격리가 필요하다면 sandboxAgent.asTool(...)을 통해 자체 runConfig를 제공하세요. 도구 에이전트가 자유롭게 변경하거나, 신뢰할 수 없는 명령을 실행하거나, 다른 백엔드 또는 이미지를 사용해야 할 때 별도의 샌드박스를 사용합니다.

샌드박스 워크스페이스를 유지하면서도 같은 에이전트에서 일반 도구를 계속 사용하세요. 샌드박스 기능은 tools, mcpServers, 핸드오프, 모델 설정, 출력 설정과 공존할 수 있습니다.

향후 샌드박스 에이전트 실행이 이전 실행에서 학습해야 할 때 memory() 기능을 사용하세요. 메모리는 SDK의 대화형 Session 메모리와 별개입니다. 교훈을 샌드박스 워크스페이스 안의 파일로 추출하고, 이후 실행이 해당 파일을 읽을 수 있습니다.

설정, 읽기/생성 동작, 멀티턴 대화, 레이아웃 격리는 에이전트 메모리를 참조하세요.

단일 에이전트 패턴이 명확해지면, 다음 설계 질문은 더 큰 시스템에서 샌드박스 경계를 어디에 둘지입니다.

샌드박스 에이전트는 여전히 SDK의 나머지와 함께 구성됩니다.

  • 핸드오프: 문서가 많은 작업을 샌드박스가 아닌 수집 에이전트에서 샌드박스 리뷰어로 넘깁니다.
  • Agents as tools: 여러 샌드박스 에이전트를 도구로 노출합니다. 보통 각 asTool(...) 호출에 샌드박스 실행 설정을 전달해 각 도구가 자체 샌드박스 경계를 갖도록 합니다.
  • MCP 및 일반 함수 도구: 샌드박스 기능은 mcpServers 및 일반 도구와 공존할 수 있습니다.
  • 에이전트 실행: 샌드박스 실행도 일반 run()Runner API를 사용합니다.

핸드오프의 경우에도 여전히 하나의 최상위 실행과 하나의 최상위 턴 루프가 있습니다. 활성 에이전트는 변경되지만 실행이 중첩되는 것은 아닙니다.

asTool(...)의 경우 관계가 다릅니다. 외부 오케스트레이터는 하나의 외부 턴을 사용해 도구 호출을 결정하고, 해당 도구 호출은 샌드박스 에이전트의 중첩 실행을 시작합니다. 중첩 실행은 자체 턴 루프, maxTurns, 승인, 그리고 보통 자체 샌드박스 실행 설정을 가집니다. 외부 오케스트레이터 관점에서는 이 모든 작업이 여전히 하나의 도구 호출 뒤에 있으므로, 중첩 턴은 외부 실행의 턴 카운터를 증가시키지 않습니다.