핵심 요약
Anthropic의 Managed Agents API와 호환되는 오픈소스 서버 castor-server를 구축하며 얻은 결정론적 런타임 설계와 SDK 버그 분석에 대한 기술적 회고이다.
배경
Anthropic이 출시한 Managed Agents 서비스의 프로토콜을 분석하여, 이를 로컬에서 실행하고 타 모델로 확장할 수 있는 와이어 호환 오픈소스 서버 castor-server를 개발한 경험을 공유했다.
의미 / 영향
에이전트 기술의 핵심이 단순한 모델 호출을 넘어 '런타임의 제어권'으로 이동하고 있음을 보여준다. 결정론적 실행 모델을 갖춘 오픈소스 대안이 상용 서비스의 제약을 극복하고 더 복잡한 인간-AI 협업 워크플로우를 가능하게 할 것으로 전망된다.
커뮤니티 반응
작성자가 발견한 SDK 버그와 결정론적 런타임에 대한 심도 있는 분석에 대해 커뮤니티는 매우 긍정적인 반응을 보였으며, 특히 에이전트의 상태 관리 방식에 대한 기술적 토론이 활발하게 이루어졌다.
주요 논점
에이전트 런타임은 반드시 결정론적 재현이 가능하도록 설계되어야 하며, 이는 디버깅과 복잡한 워크플로우 제어의 핵심이다.
Anthropic의 Managed Agents는 편리하지만 폐쇄적이며 데이터가 외부로 흐르는 제약이 있어, castor-server 같은 대안이 필요하다.
합의점 vs 논쟁점
합의점
- 공식 SDK의 추상화 계층이 실제 프로토콜의 기능을 가릴 수 있다는 점에 동의함
- 에이전트 실행 중 상태 변이(Mutation)를 피해야 재현 가능성이 보장된다는 점에 동의함
논쟁점
- 실제 프로덕션 환경에서 결정론적 런타임을 유지하기 위한 성능 오버헤드와 구현 복잡도에 대한 우려
실용적 조언
- Anthropic Managed Agents 사용 시 이벤트가 수신되지 않는다면 SDK 대신 직접 HTTP 스트리밍을 구현하여 테스트할 것
- 에이전트의 대화 기록을 수정해야 할 경우 원본 메시지 리스트를 건드리지 말고 별도의 상태 채널을 활용할 것
- LiteLLM을 활용하여 Anthropic 전용 API를 다른 LLM 제공자로 전환하여 비용과 유연성을 확보할 것
언급된 도구
Anthropic Managed Agents와 와이어 호환되는 오픈소스 에이전트 서버
다양한 LLM 제공자를 통합된 API로 호출하기 위한 라이브러리
에이전트의 Bash 실행을 위한 격리된 Docker 컨테이너 샌드박스
섹션별 상세
async def handle_user_message(db, ...):
# ... logic ...
# FastAPI route
@app.post("/message")
async def post_message(request: Request, db: Session = Depends(get_db)):
asyncio.create_task(handle_user_message(db, ...)) # Bug: session closed when request returns
return {"status": "ok"}FastAPI에서 요청 스코프의 DB 세션을 백그라운드 태스크로 전달할 때 발생하는 세션 종료 버그 예시
실무 Takeaway
- 공식 SDK는 프로토콜보다 한 단계 뒤처질 수 있으므로, 고수준 라이브러리보다 바이트 수준의 와이어 포맷 호환성을 우선시하는 것이 더 정확한 구현을 보장한다.
- 에이전트 런타임이 초기 설계부터 결정론적(Deterministic)이지 않으면, 향후 타임 트래블이나 포크와 같은 고급 기능을 추가하는 것이 불가능하다.
- FastAPI와 같은 비동기 환경에서 백그라운드 작업을 수행할 때는 요청 스코프의 리소스(DB 세션, 인증 등)를 절대 공유하지 말고 독립적으로 생성해야 한다.
- 에이전트 워크플로우는 장기 실행되고 인간의 개입이 빈번하므로, 단순 RPC 호출 방식보다 관찰 가능성과 실행 제어가 가능한 런타임 구조가 더 중요하다.
언급된 리소스
AI 요약 · 북마크 · 개인 피드 설정 — 무료
출처 · 인용 안내
인용 시 "요약 출처: AI Trends (aitrends.kr)"를 표기하고, 사실 확인은 원문 보기 기준으로 진행해 주세요. 자세한 기준은 운영 정책을 참고해 주세요.