핵심 개념
JamJet의 에이전트, 노드, 상태 및 내구성을 이해합니다.
핵심 개념
JamJet은 AI 에이전트를 위한 내구성 런타임입니다. 핵심 아이디어는 간단합니다. 워크플로는 일시적인 함수 호출이 아닌 복구 가능한 상태 전환으로 실행됩니다. 이것이 재생, 크래시 복구, 승인 일시 정지, 정확한 추적을 가능하게 만듭니다. 이 페이지는 핵심 프리미티브를 다룹니다.
워크플로
워크플로는 노드의 방향성 그래프입니다. 다음을 포함합니다:
- 고유한
id와version state_schema— 그래프를 통해 흐르는 데이터의 타입 형태- 실행이 시작되는
start노드 - 하나 이상의
end노드
workflow:
id: my-agent
version: 0.1.0
state_schema:
query: str
answer: str
confidence: float
start: think워크플로는 실행 전에 IR(중간 표현) 그래프로 컴파일됩니다. IR은 Rust 스케줄러가 실제로 실행하는 것입니다 — YAML과 Python은 작성 인터페이스일 뿐입니다.
노드
노드는 워크플로의 계산 단위입니다. 각 노드는 수행 작업을 결정하는 type을 가집니다:
| 노드 타입 | 수행 작업 |
|---|---|
model | LLM 호출 (Claude, GPT-4, Gemini 등) |
tool | MCP를 통한 외부 툴 호출 |
http | HTTP 요청 수행 |
branch | 조건에 따라 실행 경로 분기 |
parallel | 여러 브랜치로 동시 실행 분산 |
wait | 외부 이벤트까지 일시 정지 |
eval | 출력 품질 평가 (루브릭, 단언, 지연시간) |
end | 워크플로 종료 |
모든 노드는 상태를 읽고 씁니다.
상태
상태는 워크플로 실행을 위한 공유 데이터 저장소입니다. 노드 간, 재시작 간에도 지속됩니다.
state_schema:
query: str # 사용자 입력
search_results: list[str] # 중간 데이터
answer: str # 최종 출력상태는 타입이 지정됩니다 — 스키마는 컴파일 타임에 검증됩니다. 런타임에서 각 노드는 모든 상태 키를 읽고 자신의 output_key에 쓸 수 있습니다.
팁: 상태는 메모리가 아닌 데이터베이스에 저장됩니다. 실행 중 런타임이 크래시되어도 상태는 완전히 복구되며, 마지막 체크포인트부터 실행이 재개됩니다.
실행
실행은 특정 입력으로 워크플로를 한 번 실행하는 것입니다. 각 실행은 고유한 ID를 받습니다(예: exec_01JM4X8NKWP2).
실행의 특징:
- 내구성 — 데이터베이스에 저장되며, 재시작 후에도 유지됨
- 관찰 가능 — 모든 상태 전환이 이벤트로 기록됨
- 검사 가능 —
jamjet inspect로 전체 상태, 이벤트 타임라인, 토큰 사용량 확인 가능
내구성
내구성은 JamJet의 핵심 보장입니다: 런타임이 중단되어도 실행은 항상 완료됩니다.
이는 이벤트 소싱을 통해 작동합니다:
- 각 노드 실행 전,
node_started이벤트가 데이터베이스에 기록됩니다 - 각 노드 완료 후,
node_completed이벤트가 상태 패치와 함께 기록됩니다 - 재시작 시, 스케줄러는 이벤트 로그를 재생하여 실행이 중단된 지점을 정확히 재구성합니다
- 실행은 첫 번째 미완료 노드부터 재개됩니다
작업이 손실되지 않습니다. 노드가 두 번 실행되지 않습니다.
참고: 이는 "최소 한 번" 전달 방식과 다릅니다. JamJet의 스케줄러는 분산 락을 사용하여 여러 워커 프로세스가 있어도 각 노드가 정확히 한 번만 실행되도록 보장합니다.
에이전트
에이전트는 다음을 수행할 수 있는 워크플로입니다:
- 다른 에이전트가 발견하고 호출할 수 있음(에이전트 카드를 통해)
- 다른 에이전트에게 작업을 위임할 수 있음(A2A 프로토콜을 통해)
- 여러 사용자 상호작용에 걸쳐 장기 실행 상태를 유지할 수 있음
모든 에이전트는 에이전트 카드를 가지고 있습니다 — 기능, 엔드포인트, 입출력 스키마에 대한 기계 판독 가능한 설명입니다. 이것이 A2A 프로토콜의 기반입니다.
스케줄러
JamJet 스케줄러는 Rust로 작성되었으며 jamjet dev(로컬) 또는 호스팅 런타임(프로덕션)의 일부로 실행됩니다.
동작 방식:
- 대기 중인 작업을 위해 실행 큐를 폴링합니다
- 중복 실행을 방지하기 위해 실행에 대한 락을 획득합니다
- 워커 스레드에 노드를 디스패치합니다
- 각 노드 후 체크포인트를 작성합니다
스케줄러는 JamJet 워크플로가 기본적으로 내구성을 가지는 이유입니다 — 실행을 절대 잊지 않습니다.
로컬 vs. 프로덕션
| 기능 | jamjet dev (로컬) | 호스팅 / 자체 호스팅 |
|---|---|---|
| 스토리지 | SQLite | PostgreSQL |
| 워커 | 단일 프로세스 | 분산 |
| MCP 서버 | 로컬 stdio | 원격 SSE/HTTP |
| 인증 | 없음 | mTLS / API 키 |
프로그래밍 모델은 동일합니다 — 동일한 YAML 또는 Python 코드가 두 환경 모두에서 변경 없이 실행됩니다.
다음 단계
- 빠른 시작 — 첫 번째 내구성 에이전트 구축
- Python SDK — 데코레이터, 라우팅, 병렬 단계
- 크래시 복구 체험 — 내구성 실전 확인