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이 범용 머신 임을 증명, 그러나 노트북에서만 한 사용자 대상으로 실행되며 내구성 보장 없음
세 번째 물결 — 인프라로서의 에이전트 : 내구적, 분산, 구조적으로 안전, 서버리스, 인터넷에서 실행, 장애 생존, 유휴 시 비용 제로, 행동이 아닌 아키텍처를 통한 보안 강제
Homepage
개발자
Project Think: Cloudflare에서 차세대 AI 에이전트 구축하기
🔉 볼륨 줄이기
🔊 볼륨 키우기
🔇 음소거
⏭️ 다음 곡