핵심 개념
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 코드가 두 환경 모두에서 변경 없이 실행됩니다.