Building with Modal and the OpenAI Agents SDK
🖼️ 인포그래픽
🖼️ 4컷 인포그래픽
💡 한 줄 요약
Modal 블로그 글은 OpenAI Agents SDK와 Modal Sandbox를 결합해 안전한 코딩 에이전트 하네스를 만들고, 세션·서브에이전트·비동기 병렬 실행을 추가해 장기 작업과 GPU 기반 실험을 확장하는 과정을 설명한다.
📌 핵심 요약
- 글은 OpenAI Agents SDK 출시를 계기로, 기업이 Codex·Claude Code·OpenCode 같은 기성 에이전트 하네스를 넘어 내부 목적에 맞는 에이전트 시스템을 직접 구축하려는 흐름을 소개한다.
- 가장 단순한 코딩 에이전트는 LLM이 임의의 셸 명령을 실행하는 구조로 시작할 수 있지만, 호스트에서 직접 실행하면 시스템 삭제나 비밀 유출 같은 심각한 보안 위험이 생긴다고 설명한다.
- Modal Sandbox를 사용하면 에이전트가 실제 호스트가 아니라 격리된 리눅스 환경에서 명령을 실행하게 되며, OpenAI Agents SDK의 SandboxAgent, ShellTool, Capability, ModalSandboxSession을 통해 상태가 있는 원격 작업 환경을 연결할 수 있다.
- 이후 글은 MNIST 학습 같은 원샷 코딩 작업에서 출발해, 세션을 통한 대화 기억, 오케스트레이터와 서브에이전트 분리, 서브에이전트 풀을 통한 비동기 병렬 실행으로 하네스를 점진적으로 확장한다.
- 최종적으로 이 구조는 Parameter Golf 같은 실험적 코딩·훈련 과제를 여러 GPU 기반 서브에이전트가 동시에 수행하게 하여, 각 에이전트가 독립적으로 접근법을 탐색하고 결과를 오케스트레이터가 수집하는 방식으로 처리량을 높이는 데 초점을 둔다.
🧩 주요 포인트
- 글은 OpenAI Agents SDK 출시를 계기로, 기업이 Codex·Claude Code·OpenCode 같은 기성 에이전트 하네스를 넘어 내부 목적에 맞는 에이전트 시스템을 직접 구축하려는 흐름을 소개한다.
- 가장 단순한 코딩 에이전트는 LLM이 임의의 셸 명령을 실행하는 구조로 시작할 수 있지만, 호스트에서 직접 실행하면 시스템 삭제나 비밀 유출 같은 심각한 보안 위험이 생긴다고 설명한다.
- Modal Sandbox를 사용하면 에이전트가 실제 호스트가 아니라 격리된 리눅스 환경에서 명령을 실행하게 되며, OpenAI Agents SDK의 SandboxAgent, ShellTool, Capability, ModalSandboxSession을 통해 상태가 있는 원격 작업 환경을 연결할 수 있다.
- 이후 글은 MNIST 학습 같은 원샷 코딩 작업에서 출발해, 세션을 통한 대화 기억, 오케스트레이터와 서브에이전트 분리, 서브에이전트 풀을 통한 비동기 병렬 실행으로 하네스를 점진적으로 확장한다.
- 최종적으로 이 구조는 Parameter Golf 같은 실험적 코딩·훈련 과제를 여러 GPU 기반 서브에이전트가 동시에 수행하게 하여, 각 에이전트가 독립적으로 접근법을 탐색하고 결과를 오케스트레이터가 수집하는 방식으로 처리량을 높이는 데 초점을 둔다.
🧠 상세 정리
1. OpenAI Agents SDK와 내부 에이전트 하네스의 배경
글은 OpenAI가 Agents SDK를 출시했다는 소식에서 출발하며, 이 SDK를 코딩과 심층 리서치 등 다양한 작업을 위한 에이전트 하네스 구축 도구로 소개한다. 특히 내부 에이전트는 아직 새로운 주제이지만, Ramp처럼 Modal 위에서 백그라운드 코딩 에이전트 군단을 운영해 PR 생성의 절반 이상을 맡기고 있는 사례가 언급된다. 저자는 많은 기업이 Codex, Claude Code, OpenCode 같은 기성 하네스에는 익숙해지고 있지만, 이를 자기 조직의 강력한 내부 도구로 맞춤화하는 방법은 여전히 고민하고 있다고 본다. 이 글의 목적은 OpenAI Agents SDK와 Modal을 결합해 그런 맞춤형 에이전트 하네스를 처음부터 구성하는 과정을 보여주는 것이다.
2. Modal과 SDK 결합의 핵심 목적
저자는 OpenAI Agents SDK가 팀이 사내 에이전트 시스템을 직접 만들기에 적절한 빌딩 블록을 제공한다고 평가한다. 이 SDK는 Modal의 샌드박스 확장과 자연스럽게 연결되어, 에이전트가 작업할 수 있는 일종의 ‘홈 컴퓨터’를 제공받는 구조를 만든다. Modal은 확장성에 강점이 있는 플랫폼으로 제시되며, 글에서는 이 특성을 활용해 많은 작업을 백그라운드에서 대규모로 병렬화할 수 있는 범용 코딩 하네스를 완성하는 것을 목표로 삼는다. 예제로는 OpenAI의 Parameter Golf 챌린지를 사용하며, 이 과제는 가능한 적은 파라미터로 기준 지능 임계값을 달성하는 접근을 찾는 문제로 설명된다.
3. 가장 단순한 코딩 에이전트와 그 위험
첫 단계에서는 OpenAI Agents SDK로 최소한의 코딩 에이전트를 만드는 방식이 제시된다. 글은 에이전트를 ‘LLM이 도구 함수들을 실행하며 작업 완료까지 반복하는 for-loop’로 설명하고, 그 주변에 붙는 도구와 상태의 묶음을 하네스라고 부른다. 가장 단순한 예시는 exec(command) 함수를 도구로 등록해 에이전트가 호스트 머신에서 임의의 셸 명령을 실행하게 하는 구조다. 하지만 저자는 이 접근이 단순하긴 해도 안전하지 않으며 권장되지 않는다고 명확히 말한다. 악성 프롬프트나 품질 낮은 모델이 개입하면 rm -rf / 같은 파괴적 명령이나 .env의 키를 외부 사이트로 전송하는 명령이 실행될 수 있기 때문이다.
4. Sandbox로 옮겨 보안 경계를 만드는 방식
다음 단계에서는 에이전트를 Modal Sandbox 안으로 옮겨 호스트 대신 격리된 리눅스 환경에서 명령을 실행하게 한다. 글은 샌드박스를 VM 또는 보안이 강화된 컨테이너 위에 구축된 격리 환경으로 설명하며, 이렇게 하면 LLM이 보는 실행 환경이 실제 호스트가 아니라 샌드박스가 된다. OpenAI Agents SDK에는 SandboxAgent 클래스가 제공되며, 이는 원격 샌드박스에 붙기 위한 도구들이 포함된 Agent의 확장 형태로 소개된다. ShellTool은 명령 실행에 추가적인 가드레일을 제공하고, 내부적으로는 원격 샌드박스 클라이언트 역할을 하는 ModalSandboxSession을 관리한다. 또한 ModalSandboxClientOptions를 통해 각 샌드박스에 GPU를 요청할 수 있다는 점도 Modal 고유의 기능으로 강조된다.
5. Capability와 상태가 있는 샌드박스 도구
샌드박스 도구의 중요한 차이는 특정 ModalSandboxSession 인스턴스에 묶인 상태 있는 도구라는 점이다. 이를 위해 글은 Capability라는 개념을 사용해 도구 묶음을 세션 인스턴스에 바인딩하는 방식을 설명한다. 예시 코드의 WorkspaceShellCapability는 세션이 준비되면 bind 메서드에서 해당 세션을 저장하고, tools 메서드에서 ShellTool을 반환한다. 실제 셸 명령 실행은 바인딩된 샌드박스 안에서 수행되며 stdout과 stderr가 결과로 돌아오는 구조다. 이 구성에 SandboxAgent, ModalSandboxClient, ModalSandboxClientOptions를 결합하면, 에이전트는 격리된 환경에서 명령을 실행하면서도 필요하면 A10 같은 GPU가 붙은 작업 공간을 사용할 수 있다.
6. 원샷 프롬프트로 MNIST 학습 작업 실행
샌드박스 capability와 shell tool이 붙은 하네스가 준비되면, 글은 이를 실제 코딩 작업에 적용하는 예로 MNIST 이미지 모델 학습을 든다. 사용자는 uv run main.py 명령과 함께 ‘PyTorch로 MNIST 데이터셋 모델을 구현하고 학습하라’는 프롬프트를 전달한다. 저자는 이 수준의 구성만으로도 에이전트가 엔드투엔드 코딩 작업을 수행할 수 있으며, 기본 상태에서도 동작해야 한다고 설명한다. 이 단계는 완성된 시스템이라기보다, 샌드박스 기반 코딩 에이전트가 실제 파일 작성, 의존성 설치, 학습 실행 같은 작업을 수행할 수 있음을 확인하는 출발점에 가깝다. 이후 글은 이 기본 하네스를 Parameter Golf 실험에 안정적으로 사용할 수 있도록 점진적으로 기능을 추가한다.
7. 세션을 통한 기억 추가와 컨텍스트 관리 문제
OpenAI Agents SDK의 기본 Agent는 상태가 없으며, run 메서드에 문자열 컨텍스트를 넣고 문자열 출력을 받는 구조로 설명된다. 따라서 일반 에이전트를 사용자 입력 루프에 넣어도 누적된 대화 내용이 모델에 자동으로 보이지 않는다. 이를 해결하기 위해 글은 Sessions를 도입하며, 세션 객체를 여러 번의 에이전트 실행에 전달해 컨텍스트 윈도우를 누적할 수 있다고 설명한다. 예시에서는 SQLiteSession을 사용해 사용자 입력 루프에서 같은 session을 Runner.run에 넘긴다. 다만 이로 인해 새로운 문제가 생기는데, 기억이 무한정 쌓이면 컨텍스트 관리와 ‘context rot’이 발생할 수 있다. 이후 작업의 상당 부분은 주 작업 흐름이 컨텍스트 비대화에 오염되지 않도록 보호하는 데 초점을 둔다.
8. 오케스트레이터와 서브에이전트로 장기 작업을 분리
코딩 에이전트는 코드베이스를 탐색하고 수정하며 stdout과 stderr를 읽어들이기 때문에 토큰을 매우 많이 소비한다고 글은 설명한다. 이 때문에 단일 에이전트의 유효 수명은 짧아지고, 장기 작업을 안정적으로 수행하려면 구조를 나눌 필요가 있다. 저자는 이를 위해 에이전트를 오케스트레이터와 서브에이전트로 분리한다. 오케스트레이터는 전체 작업의 기억을 유지하는 메인 채팅 에이전트이며, invoke_subagent 같은 도구를 통해 완전히 새로운 컨텍스트 윈도우와 Session을 가진 서브에이전트를 호출한다. 서브에이전트는 짧고 집중된 작업을 수행한 뒤 결과 요약만 돌려주며, 작업이 끝나면 세션 기억은 버려질 수 있다. 이렇게 하면 구현 세부사항이 오케스트레이터 컨텍스트를 불필요하게 채우지 않는다.
9. 서브에이전트 풀과 비동기 병렬 실행
글은 서브에이전트 실행을 동기적으로 기다리는 방식에서 더 나아가, 여러 서브에이전트를 병렬로 관리하는 worker pool 구조를 제안한다. SubAgentPool은 활성 서브에이전트들을 key:value 형태로 보관하며 오케스트레이터 인스턴스에 연결된다. 기존 invoke_subagent가 결과를 기다리던 방식과 달리, 수정된 구조에서는 asyncio.create_task로 Runner.run을 시작하고 Future 핸들을 저장한 뒤 즉시 반환한다. 이후 오케스트레이터는 wait_for_subagent_result로 특정 서브에이전트의 완료를 기다리거나, wait_for_first_subagent_result로 먼저 끝난 작업의 결과를 받을 수 있다. 이 구조 덕분에 Parameter Golf 같은 실험에서 여러 접근을 동시에 시도하고, 완료된 결과를 선택적으로 수집하는 처리량 중심의 운영이 가능해진다.
10. 상태 관찰을 위한 Hooks와 set_status 도구
비동기 병렬 실행이 가능해지면 오케스트레이터는 더 이상 각 서브에이전트의 작업을 기본적으로 막고 기다리지 않는다. 따라서 무엇이 진행 중인지 관찰할 수 있는 별도의 방법이 필요해진다. 글은 이를 두 가지 방식으로 구현한다고 설명한다. 하나는 SDK의 Hooks를 사용해 각 서브에이전트가 현재 어떤 도구를 사용하고 있는지 추적하는 것이고, 다른 하나는 서브에이전트가 작업을 완전히 종료하지 않고도 짧은 상태 메시지를 갱신할 수 있도록 set_status 도구를 제공하는 것이다. 예시의 SubAgentHooks는 셸 명령이 dispatch될 때 마지막 명령을 기록하고, LLM 호출이 시작될 때 turn 수를 증가시킨다. 이 설계는 병렬 작업의 내부 상태를 오케스트레이터나 표시 계층이 더 잘 파악하게 해준다.
🧾 핵심 주장 / 시사점
- 이 글의 핵심은 ‘에이전트 자체’보다 ‘하네스 설계’가 중요하다는 점이다. 같은 LLM이라도 샌드박스, 세션, 도구, 오케스트레이션, 병렬 실행을 어떻게 붙이느냐에 따라 단순 챗봇이 될 수도 있고 내부 개발 자동화 시스템이 될 수도 있다.
- 보안 모델은 초기 설계 단계에서 결정되어야 한다. 호스트에서 exec를 바로 허용하는 예시는 학습용으로는 단순하지만, 실제 운영에서는 Modal Sandbox처럼 격리된 실행 환경을 기본 전제로 삼아야 한다는 메시지가 분명하다.
- 장기 코딩 작업의 병목은 모델 성능만이 아니라 컨텍스트 수명과 작업 분해 방식이다. 오케스트레이터가 고수준 기억을 유지하고 서브에이전트가 짧은 작업을 처리하는 구조는 컨텍스트 오염을 줄이면서 병렬 실험 처리량을 높이는 실용적 패턴으로 제시된다.
✅ 액션 아이템
- OpenAI Agents SDK와 Modal Sandbox를 함께 쓸 때 planner, subagent, tool execution, artifact storage가 어느 경계에서 분리되는지 최소 예제로 검증한다.
- 원격 코드 실행 에이전트에는 파일 시스템, 네트워크, 비밀값, 패키지 설치 권한을 sandbox 정책으로 분리하고 실행 로그와 결과물을 재현 가능하게 남긴다.
- 병렬 coding/research agent를 운영할 때 비용, 시간 제한, 실패 재시도, 사용자 승인 지점을 Modal job 단위로 추적하는 대시보드 항목을 만든다.
❓ 열린 질문
- agent runtime에서 모델 orchestration과 실제 코드 실행 sandbox를 같은 프레임워크에 묶을 때 얻는 장점과 위험은 무엇일까?
- Modal Sandbox 같은 원격 실행 환경은 로컬 개발 환경 대비 보안, 재현성, 비용 통제에서 어떤 trade-off를 만들까?
- 여러 subagent가 병렬로 코드를 작성하고 검증할 때 최종 책임과 결과 병합은 사람, planner agent, CI 중 누가 맡아야 할까?