Project Think: Cloudflare에서 차세대 AI 에이전트 구축하기

2 hours ago 2
  • Cloudflare가 Agents SDK의 차세대 버전인 Project Think를 발표하며, 장기 실행 에이전트를 위한 내구적 실행·서브 에이전트·샌드박스 코드 실행·영속 세션 등 새로운 핵심 프리미티브를 제공
  • 기존 코딩 에이전트들은 로컬 노트북에서만 실행되고, 유휴 상태에서도 비용이 발생하며, 수동 설정과 관리가 필요한 한계가 있었음
  • 에이전트는 기존 애플리케이션과 달리 1:1 모델(한 사용자·한 작업당 하나의 인스턴스)로 동작하므로, 수천만 동시 세션을 지원하려면 컨테이너 기반의 비용 구조로는 지속 불가능
  • Durable Objects 기반의 액터 모델을 활용해 에이전트가 휴면 시 컴퓨팅 비용 제로, 메시지 수신 시 자동 깨어남 방식으로 대규모 확장 경제성을 확보
  • AI 에이전트의 세 번째 물결로서 인프라로서의 에이전트(내구성·분산·서버리스·구조적 보안)를 지향하며, 모든 개발자가 수십억 사용자 대상 에이전트를 구축·배포할 수 있는 플랫폼 목표

Project Think 개요

  • Cloudflare Agents SDK의 차세대 버전으로, 장기 실행 에이전트 구축을 위한 새로운 프리미티브 세트와 이를 통합하는 기본 클래스 제공
  • 주요 프리미티브: 내구적 실행(fibers), 서브 에이전트, 영속 세션, 샌드박스 코드 실행, 실행 래더, 셀프 저작 확장
  • 프리미티브를 개별적으로 사용하거나, Think 기본 클래스를 통해 빠르게 시작 가능

코딩 에이전트의 현재 한계

  • Pi, OpenClaw, Claude Code, Codex 같은 도구들이 LLM에 파일 읽기·코드 작성·실행·학습 능력을 부여하면 범용 어시스턴트처럼 동작함을 증명
  • 이러한 코딩 에이전트는 코드뿐 아니라 캘린더 관리, 데이터셋 분석, 구매 협상, 세금 신고, 비즈니스 워크플로 자동화 등에도 활용
  • 패턴은 항상 동일: 에이전트가 컨텍스트를 읽고, 추론하고, 코드를 작성해 행동하고, 결과를 관찰하고, 반복 → 코드가 행동의 보편적 매체
  • 현재 한계:
    • 노트북이나 고가 VPS에서만 실행: 공유·협업·디바이스 간 전환 불가
    • 유휴 시에도 비용 발생: 고정 월비용이 팀·회사 단위로 확장 시 급증
    • 수동 설치·관리 필요: 의존성 설치, 업데이트 관리, 인증 및 시크릿 설정

에이전트의 구조적 문제: 1:1 모델

  • 전통적 애플리케이션은 하나의 인스턴스가 다수의 사용자를 처리하지만, 에이전트는 1:1 — 각 에이전트가 고유 인스턴스로 한 사용자·한 작업 수행
  • 1억 명의 지식 노동자가 각각 에이전트 어시스턴트를 사용하면 수천만 동시 세션 필요
  • 현재 컨테이너당 비용 구조로는 지속 불가능, 다른 기반이 필요

장기 실행 에이전트

  • 현재 에이전트는 일시적(ephemeral): 세션 종료 시 사라지고, 노트북 슬립 시 중단
  • Agents SDK는 Durable Objects 기반으로 모든 에이전트에 아이덴티티, 영속 상태, 메시지 수신 시 자동 기동 기능 부여
  • 액터 모델: 각 에이전트는 주소 지정 가능한 엔티티로 자체 SQLite 데이터베이스 보유, 휴면 시 컴퓨팅 비용 제로
  • HTTP 요청, WebSocket 메시지, 스케줄 알람, 인바운드 이메일 등 이벤트 발생 시 플랫폼이 에이전트를 깨우고 상태를 로드
  • VM/컨테이너 대비 Durable Objects 비교:
    • 유휴 비용: VM은 항상 전체 컴퓨팅 비용 vs DO는 제로(휴면)
    • 스케일링: VM은 수동 프로비저닝 vs DO는 에이전트당 자동 확장
    • 상태: VM은 외부 DB 필요 vs DO는 내장 SQLite
    • 복구: VM은 직접 구축 vs DO는 플랫폼 자동 재시작, 상태 보존
    • 라우팅: VM은 로드밸런서·스티키세션 직접 구축 vs DO는 이름→에이전트 내장 매핑
    • 10,000개 에이전트(각 1% 활성): VM은 10,000개 상시 인스턴스 vs DO는 약 100개만 활성
  • 새 에이전트 생성의 한계 비용이 사실상 제로 → "사용자당 하나", "작업당 하나", "이메일 스레드당 하나"의 에이전트 모델 가능

내구적 실행: Fibers

  • LLM 호출은 30초, 멀티턴 에이전트 루프는 그 이상 실행 가능하며, 그 사이 실행 환경이 사라질 수 있음(배포, 플랫폼 재시작, 리소스 한도)
  • runFiber(): 실행 시작 전 SQLite에 등록되는 내구적 함수 호출로, stash()를 통해 체크포인트 생성, onFiberRecovered를 통해 재시작 시 복구 가능
  • SDK가 fiber 실행 중 에이전트를 자동으로 유지, 특별한 설정 불필요
  • 분 단위 작업에는 keepAlive() / keepAliveWhile()로 퇴출 방지
  • CI 파이프라인, 디자인 리뷰, 영상 생성 등 더 긴 작업은 작업 시작 후 job ID를 저장하고 휴면, 콜백 시 기동

서브 에이전트: Facets

  • 단일 에이전트가 모든 작업을 수행할 필요 없음
  • 서브 에이전트는 부모와 공동 배치된 자식 Durable Objects로, 각각 격리된 SQLite와 실행 컨텍스트 보유
  • Facets 기반으로 부모 에이전트와 함께 위치하며, 서브 에이전트 간 데이터의 암시적 공유 없음
  • 서브 에이전트 RPC 지연은 함수 호출 수준, TypeScript가 컴파일 타임에 오용 감지

영속 세션: Session API

  • 일·주 단위로 실행되는 에이전트에는 일반적인 플랫 메시지 리스트 이상이 필요
  • 실험적 Session API는 대화를 트리 구조로 모델링, 각 메시지에 parent_id 부여
    • 포킹: 원래 경로를 잃지 않고 대안 탐색
    • 비파괴적 압축: 오래된 메시지를 삭제 대신 요약
    • 전문 검색: FTS5 기반 대화 이력 전체 텍스트 검색
  • Agent 기본 클래스에서 직접 사용 가능하며, Think 기본 클래스의 저장 레이어 역할

도구 호출에서 코드 실행으로

  • 기존 도구 호출 방식: 모델이 도구 호출 → 결과를 컨텍스트 윈도우로 회수 → 반복, 도구가 많아지면 비용과 비효율 증가
  • 파일 100개 = 모델과의 100회 왕복
  • 모델은 도구 호출 게임보다 시스템 사용을 위한 코드 작성에 더 뛰어남 — 이것이 @cloudflare/codemode의 핵심 통찰
  • 순차적 도구 호출 대신 LLM이 전체 작업을 처리하는 단일 프로그램 작성
  • Cloudflare API MCP 서버 사례: 도구 2개(search(), execute())만 노출하여 약 1,000 토큰 소비 vs 엔드포인트당 도구 방식의 약 117만 토큰99.9% 감소

안전한 샌드박스: Dynamic Workers

  • 모델이 사용자를 대신해 코드를 작성한다면, 그 코드의 실행 환경이 핵심 질문
  • Dynamic Workers: 런타임에 밀리초 단위로 생성되는 새로운 V8 격리 환경, 수 메가바이트 메모리
    • 컨테이너 대비 약 100배 빠르고 최대 100배 메모리 효율적
    • 요청마다 새로 생성, 코드 실행 후 폐기 가능
  • 핵심 설계: 케이퍼빌리티 모델 — 범용 머신을 제한하는 방식이 아닌, 거의 권한 없는 상태에서 시작(globalOutbound: null, 네트워크 접근 없음)하고 개발자가 바인딩을 통해 리소스별로 명시적 권한 부여
  • "이것이 너무 많이 하는 것을 어떻게 막을까?"에서 "이것이 정확히 무엇을 할 수 있게 할 것인가?" 로 전환

실행 래더(Execution Ladder)

  • 에이전트가 필요에 따라 단계적으로 상위 컴퓨팅 환경으로 에스컬레이션하는 스펙트럼:
    • Tier 0 — Workspace: SQLite + R2 기반 내구적 가상 파일시스템, 읽기·쓰기·편집·검색·grep·diff 지원, @cloudflare/shell 구동
    • Tier 1 — Dynamic Worker: LLM 생성 JavaScript를 네트워크 접근 없는 샌드박스 격리 환경에서 실행, @cloudflare/codemode 구동
    • Tier 2 — npm 추가: @cloudflare/worker-bundler가 레지스트리에서 패키지를 가져오고 esbuild로 번들링하여 Dynamic Worker에 로드, import { z } from "zod" 그대로 동작
    • Tier 3 — 헤드리스 브라우저: Cloudflare Browser Run으로 내비게이션, 클릭, 추출, 스크린샷, MCP나 API를 지원하지 않는 서비스에 유용
    • Tier 4 — Cloudflare Sandbox: 도구체인, 리포, 의존성이 구성된 환경에서 git clone, npm test, cargo build 등 실행, Workspace와 양방향 동기화
  • 핵심 설계 원칙: Tier 0만으로도 에이전트가 유용해야 하며, 각 티어는 추가적

빌딩 블록, 프레임워크가 아님

  • 모든 프리미티브가 독립 패키지로 제공: Dynamic Workers, @cloudflare/codemode, @cloudflare/worker-bundler, @cloudflare/shell
  • Agent 기본 클래스와 직접 결합하여 워크스페이스, 코드 실행, 런타임 패키지 해석 기능을 독자적 프레임워크 도입 없이 사용 가능

플랫폼 전체 스택

  • 에이전트별 격리: Durable Objects — 모든 에이전트가 자체 세계
  • 유휴 시 비용 제로: DO Hibernation — 에이전트가 깨어날 때까지 $0
  • 영속 상태: DO SQLite — 쿼리·트랜잭션 가능 저장소
  • 내구적 파일시스템: Workspace(SQLite + R2)
  • 샌드박스 코드 실행: Dynamic Workers + @cloudflare/codemode
  • 런타임 의존성: @cloudflare/worker-bundler — import * from react 그대로 동작
  • 웹 자동화: Browser Run
  • 풀 OS 접근: Sandboxes — git, 컴파일러, 테스트 러너
  • 스케줄 실행: DO Alarms + Fibers
  • 실시간 스트리밍: WebSockets
  • 외부 도구 연결: MCP
  • 에이전트 간 조율: 서브 에이전트(Facets) — 타입 RPC
  • 모델 접근: AI Gateway + Workers AI(또는 자체 모델)

Think 기본 클래스

  • 에이전트 루프, 메시지 영속, 스트리밍, 도구 실행, 스트림 재개, 확장 등 전체 채팅 라이프사이클을 처리하는 통합 하네스
  • 최소 서브클래스: getModel() 메서드만 구현하면 스트리밍, 영속, 중단/취소, 오류 처리, 재개 가능한 스트림, 내장 워크스페이스 파일시스템을 갖춘 채팅 에이전트 동작
  • npx wrangler deploy로 배포
  • 오버라이드 가능 항목: getModel(), getSystemPrompt(), getTools(), maxSteps, configureSession()
  • 매 턴마다 전체 에이전틱 루프 실행: 컨텍스트 조립(기본 명령 + 도구 설명 + 스킬 + 메모리 + 대화 이력) → streamText 호출 → 도구 호출 실행(컨텍스트 폭발 방지를 위한 출력 잘라내기) → 결과 추가 → 모델 완료 또는 스텝 한도 도달까지 반복

라이프사이클 후크

  • Think는 전체 파이프라인을 소유하지 않고도 채팅 턴의 모든 단계에서 후크 제공:
    • beforeTurn() → streamText() → beforeToolCall() → afterToolCall() → onStepFinish() → onChatResponse()
  • 후속 턴에서 저비용 모델로 전환, 도구 제한, 클라이언트 컨텍스트 전달, 모든 도구 호출 분석 로깅, 자동 후속 턴 트리거 등 onChatMessage 교체 없이 가능

영속 메모리와 긴 대화

  • Think는 Session API 위에 구축되어 트리 구조 메시지와 브랜칭 내장
  • 컨텍스트 블록을 통한 영속 메모리: 시스템 프롬프트의 구조화된 섹션으로 모델이 읽고 시간에 따라 업데이트 가능, 휴면 간에도 유지
  • 모델이 "MEMORY (Important facts, use set_context to update) [42%, 462/1100 tokens]" 형태로 확인하고 능동적으로 기억 가능
  • 에이전트당 복수 대화 실행 가능, 포킹으로 원래 대화를 잃지 않고 다른 방향 탐색
  • 컨텍스트 증가 시 비파괴적 압축: 오래된 메시지를 삭제 대신 요약, 전체 이력은 SQLite에 보존
  • FTS5 기반 검색: 세션 내 또는 전체 세션에 걸쳐 대화 이력 쿼리 가능, 에이전트도 search_context 도구로 자체 과거 검색

전체 실행 래더 통합

  • Think가 getTools() 반환 하나로 전체 실행 래더를 통합: 워크스페이스 도구, 실행 도구, 브라우저 도구, 샌드박스 도구, 확장 도구를 한 번에 구성

셀프 저작 확장(Self-authored Extensions)

  • 에이전트가 자체 확장 프로그램을 직접 작성 가능: Dynamic Workers에서 실행되는 TypeScript 프로그램으로 네트워크 접근과 워크스페이스 작업 권한을 선언
  • Think의 ExtensionManager가 확장을 번들링(npm 의존성 포함 가능), Dynamic Worker에 로드, 새 도구 등록
  • 확장은 DO 저장소에 영속되어 휴면에서도 생존
  • 예: 사용자가 PR 관련 질문 시 30초 전에는 존재하지 않던 github_create_pr 도구가 생성
  • 파인튜닝이나 RLHF가 아닌 코드를 통한 자기 개선 루프 — 샌드박스화, 감사 가능, 철회 가능한 TypeScript

서브 에이전트 RPC

  • Think는 부모에서 chat() over RPC로 호출되는 서브 에이전트로도 동작, 콜백을 통한 스트리밍 이벤트 지원
  • 각 자식이 자체 대화 트리, 메모리, 도구, 모델 보유, 부모가 세부사항을 알 필요 없음

시작하기

  • Project Think는 실험적(experimental) 상태, API 표면은 안정적이나 향후 계속 발전 예정
  • Cloudflare 내부에서 자체 백그라운드 에이전트 인프라 구축에 이미 사용 중
  • Think는 @cloudflare/ai-chat와 동일한 WebSocket 프로토콜을 사용하므로 기존 UI 컴포넌트 그대로 동작
  • AIChatAgent 기반으로 구축한 경우 클라이언트 코드 변경 불필요

AI 에이전트의 세 가지 물결

  • 첫 번째 물결 — 챗봇: 상태 없음, 반응적, 취약, 매 대화 처음부터 시작, 메모리·도구·행동 능력 없음, 질문 답변에만 유용
  • 두 번째 물결 — 코딩 에이전트: 상태 유지, 도구 사용, Pi·Claude Code·OpenClaw·Codex 같은 도구, 코드베이스 읽기·코드 작성·실행·반복 가능, 적절한 도구가 있는 LLM이 범용 머신임을 증명, 그러나 노트북에서만 한 사용자 대상으로 실행되며 내구성 보장 없음
  • 세 번째 물결 — 인프라로서의 에이전트: 내구적, 분산, 구조적으로 안전, 서버리스, 인터넷에서 실행, 장애 생존, 유휴 시 비용 제로, 행동이 아닌 아키텍처를 통한 보안 강제
Read Entire Article