JamJet
에이전트 네이티브 런타임 — 내구성 있고 구성 가능하며 프로덕션 환경을 위해 구축되었습니다.
jamjet.dev · 빠른 시작 · 개념 · API 참조 · 예제 · 블로그 · Discord

JamJet은 AI 에이전트를 위한 성능 우선, 에이전트 네이티브 런타임입니다. 단순한 프롬프트 래퍼나 가벼운 에이전트 SDK가 아니라, 데모를 넘어 실제로 작동해야 하는 에이전트를 위한 프로덕션급 오케스트레이션 기판입니다.
런타임 코어는 스케줄링, 상태 관리 및 동시성을 위해 Rust + Tokio로 작성되었습니다. 작성 인터페이스는 Python, Java, Go(계획 중) 또는 YAML을 지원합니다. 모두 동일한 IR 그래프로 컴파일되어 동일한 엔진에서 실행됩니다.
왜 JamJet인가?
문제 | JamJet의 답변 |
에이전트 실행 중 충돌 시 상태 손실 | 내구성 있는 그래프 실행 — 이벤트 소싱, 충돌 방지 재개 |
사람의 승인을 위해 일시 중지할 방법 없음 | Human-in-the-loop를 일급 워크플로우 기본 요소로 지원 |
에이전트가 자체 프레임워크에 고립됨 | 네이티브 MCP + A2A — 모든 에이전트, 모든 프레임워크와 상호 운용 |
대규모 Python 오케스트레이션의 느린 속도 | Rust 코어 — GIL 없음, 실제 비동기 병렬 처리 |
약한 관측 가능성, 재실행 불가 | 전체 이벤트 타임라인, OTel GenAI 추적, 모든 체크포인트에서 재실행 |
표준 에이전트 식별자 없음 | 에이전트 카드 — 모든 에이전트는 주소 지정 및 검색 가능 |
하드코딩된 에이전트 라우팅 | 코디네이터 노드 — 구조화된 점수 매기기 + LLM 타이브레이커를 통한 동적 라우팅 |
에이전트를 도구로 사용할 수 없음 | Agent-as-Tool — 모든 에이전트를 호출 가능한 도구(동기, 스트리밍, 대화형)로 래핑 |
거버넌스나 가드레일 없음 | 정책 엔진 — 도구 차단, 승인, 자율성 강제, 감사 로그 |
확인되지 않은 액세스 권한을 가진 에이전트 | OAuth 위임 — RFC 8693 토큰 교환, 범위 축소, 단계별 범위 지정 |
로그에 PII 유출 | 데이터 거버넌스 — PII 마스킹(마스킹/해시/제거), 보존 정책, 자동 삭제 |
테넌트 격리 없음 | 멀티 테넌트 — 행 수준 파티셔닝, 테넌트 범위 상태, 격리된 감사 로그 |
특정 언어에 종속됨 | 다국어 SDK — Python, Java (JDK 21), Go (계획 중), YAML — 동일한 IR, 동일한 런타임 |
서버 없이 실행 불가 | 프로세스 내 실행 — |
빠른 시작
요구 사항: Python 3.11+
가장 빠른 경로 — 순수 Python, 서버 없음
pip install jamjetfrom jamjet import task, tool
@tool
async def web_search(query: str) -> str:
return f"Search results for: {query}"
@task(model="claude-haiku-4-5-20251001", tools=[web_search])
async def research(question: str) -> str:
"""You are a research assistant. Search first, then summarize clearly."""
result = await research("What is JamJet?")
print(result)서버 없음. 설정 없음. YAML 없음. pip install 후 바로 실행.
전체 런타임 경로 — 내구성 있는 실행
pip install jamjet
jamjet init my-first-agent
cd my-first-agent
jamjet dev다른 터미널에서:
jamjet run workflow.yaml --input '{"query": "What is JamJet?"}'Hello World
YAML
# workflow.yaml
workflow:
id: hello-agent
version: 0.1.0
state_schema:
query: str
answer: str
start: think
nodes:
think:
type: model
model: claude-haiku-4-5-20251001
prompt: "Answer clearly and concisely: {{ state.query }}"
output_key: answer
next: end
end:
type: endjamjet validate workflow.yaml
jamjet run workflow.yaml --input '{"query": "What is JamJet?"}'Python — @task (가장 간단함)
from jamjet import task, tool
@tool
async def web_search(query: str) -> str:
return f"Search results for: {query}"
@task(model="claude-haiku-4-5-20251001", tools=[web_search])
async def research(question: str) -> str:
"""You are a research assistant. Search first, then summarize clearly."""
result = await research("What is JamJet?")독스트링이 지침이 됩니다. 함수 시그니처가 계약입니다. 이것으로 끝입니다.
Python — Agent
from jamjet import Agent, tool
@tool
async def web_search(query: str) -> str:
return f"Search results for: {query}"
agent = Agent(
"researcher",
model="claude-haiku-4-5-20251001",
tools=[web_search],
instructions="You are a research assistant. Search first, then summarize.",
)
result = await agent.run("What is JamJet?")
print(result)Python — Workflow (완전 제어)
from jamjet import Workflow, tool
from pydantic import BaseModel
@tool
async def web_search(query: str) -> str:
return f"Search results for: {query}"
workflow = Workflow("research")
@workflow.state
class State(BaseModel):
query: str
answer: str | None = None
@workflow.step
async def search(state: State) -> State:
result = await web_search(query=state.query)
return state.model_copy(update={"answer": result})세 가지 수준 모두 동일한 IR로 컴파일되어 동일한 내구성 있는 Rust 런타임에서 실행됩니다.
성능
JamJet의 IR 컴파일은 LangGraph의 그래프 컴파일보다 88배 빠릅니다:
작업 | JamJet | LangGraph |
컴파일 / 그래프 빌드 | ~0.006 ms | ~0.529 ms |
프로세스 내 호출 | ~0.015 ms | ~1.458 ms |
Python 3.11, 단일 도구 워크플로우로 측정되었습니다. JamJet은 가벼운 IR 딕셔너리를 컴파일하고, LangGraph는 NetworkX 그래프를 빌드합니다.
MCP 도구 호출
nodes:
search:
type: tool
server: brave-search # configured in jamjet.toml
tool: web_search
arguments:
query: "{{ state.query }}"
count: 10
output_key: results
next: summarizeA2A 위임
nodes:
delegate:
type: a2a_task
agent_url: "https://agents.example.com/research-agent"
input:
query: "{{ state.query }}"
output_key: research
next: end자기 개선을 통한 평가
nodes:
check:
type: eval
scorers:
- type: llm_judge
rubric: "Is the answer accurate and complete?"
min_score: 4
on_fail: retry_with_feedback # injects feedback into next model call
max_retries: 2
next: end코디네이터 — 동적 에이전트 라우팅
from jamjet.coordinator import DefaultCoordinatorStrategy
strategy = DefaultCoordinatorStrategy(registry=my_registry)
# Discover agents by skill, score them, route to the best fit
candidates, _ = await strategy.discover(
task="Analyze quarterly revenue data",
required_skills=["data-analysis", "finance"],
trust_domain="internal",
)
rankings, spread = await strategy.score(task, candidates, weights={})
decision = await strategy.decide(task, rankings, threshold=0.1)
# decision.selected_uri → "jamjet://org/finance-analyst"Agent-as-Tool — 에이전트를 호출 가능한 도구로 래핑
from jamjet.agent_tool import agent_tool
# Sync: quick, stateless
classifier = agent_tool(agent="jamjet://org/classifier", mode="sync",
description="Classifies documents by topic")
# Streaming: long-running with early termination on budget
researcher = agent_tool(agent="jamjet://org/researcher", mode="streaming",
description="Deep research with progress", budget={"max_cost_usd": 2.00})
# Conversational: multi-turn iterative refinement
reviewer = agent_tool(agent="jamjet://org/reviewer", mode="conversational",
description="Peer review with feedback", max_turns=5)자동 라우팅 — 컴파일러가 코디네이터를 자동으로 삽입
from jamjet.workflow.graph import WorkflowGraph
graph = WorkflowGraph("pipeline")
graph.add_agent_tool("process", agent="auto", mode="sync", output_key="result")
# ↑ "auto" expands at compile time into: Coordinator → AgentTool
ir = graph.compile()
# IR now has 2 nodes: _coordinator_process → process에이전트 설계 패턴
JamJet은 6가지 주요 다중 에이전트 오케스트레이션 패턴을 지원합니다. 각 패턴의 사용 시기는 다음과 같습니다:
패턴 | JamJet 기본 요소 | 사용 시기 | 예시 |
단일 에이전트 |
| 간단한 프로토타입, 단일 목적 작업 | 챗봇, 분류기 |
순차 파이프라인 | 에지가 있는 | 각 단계가 이전 단계에 의존하는 순차적 단계 | ETL, 문서 처리 |
병렬 팬아웃 |
| 동시에 실행 가능한 독립적인 작업 | 다중 소스 조사, 배치 분류 |
루프 및 비평 |
| 반복적인 개선이 필요한 품질 중심 작업 | 코드 리뷰, 콘텐츠 생성 |
코디네이터 (동적 라우팅) |
| 기능, 비용, 지연 시간에 따라 런타임에 최적의 에이전트로 라우팅 | 지원 티켓 라우팅, 작업 위임 |
Agent-as-Tool |
| 한 에이전트가 다른 에이전트를 함수로 호출해야 할 때 | 전문가를 호출하는 오케스트레이터 |
올바른 패턴 선택
Is it a single task?
→ Single Agent
Does order matter?
→ Sequential Pipeline
Can tasks run independently?
→ Parallel Fan-Out
Does output need quality checks?
→ Loop & Critic
Do you need to pick the best agent at runtime?
→ Coordinator
Does one agent need to invoke another?
→ Agent-as-Tool코디네이터 vs 정적 라우팅
정적 ( | 동적 ( | |
후보 | YAML에 선언됨 | 런타임에 레지스트리에서 검색됨 |
선택 | 표현식 기반 규칙 | 구조화된 점수 매기기 + 선택적 LLM 타이브레이커 |
에이전트 변경 시 | 워크플로우 재배포 | 자동 — 새로운 에이전트 검색 |
관측 가능성 | 분기 경로 기록됨 | 전체 점수 분석 + 이벤트 로그의 추론 |
최적 용도 | 고정된 알려진 경로 | 동적 환경, 멀티 테넌트, 연구 |
JamJet 비교
2026년 3월 기준. 모든 프레임워크는 발전하므로 최신 정보는 해당 문서를 확인하십시오.
기능 | JamJet | Google ADK | LangChain | AutoGen | CrewAI |
간단한 에이전트 설정 | ✅ 3줄 ( | ✅ 5줄 | 6줄 이상 | 10줄 이상 | 8줄 이상 |
프로세스 내 실행 | ✅ | ✅ 네이티브 | ✅ 네이티브 | ✅ 네이티브 | ✅ 네이티브 |
내구성 있는 실행 | ✅ 이벤트 소싱, 충돌 방지 | ❌ 일시적 | ❌ 일시적 | ❌ 일시적 | ❌ 일시적 |
동적 에이전트 라우팅 | ✅ 점수 매기기 + LLM 타이브레이커 포함 코디네이터 | ✅ | ❌ | ❌ | ❌ |
Agent-as-Tool | ✅ 동기, 스트리밍, 대화형 | ✅ | ❌ | ❌ | ❌ |
Human-in-the-loop | ✅ 일급 기본 요소 | 🟡 콜백 | 🟡 콜백 | 🟡 대화형 | 🟡 수동 |
MCP 지원 | ✅ 클라이언트 + 서버 | ✅ 클라이언트 + 서버 | 🟡 클라이언트 전용 | 🟡 클라이언트 전용 | 🟡 클라이언트 전용 |
A2A 프로토콜 | ✅ 클라이언트 + 서버 | 🟡 클라이언트 전용 | ❌ | ❌ | ❌ |
내장 평가 | ✅ LLM 판사, 어설션, 비용 | ✅ 8가지 내장 기준 | ❌ | ❌ | ❌ |
내장 관측 가능성 | ✅ OTel GenAI, 이벤트 재실행 | ✅ Cloud Trace | 🟡 LangSmith (외부) | ❌ | ❌ |
에이전트 식별자 | ✅ 에이전트 카드, A2A 검색 | ✅ 에이전트 카드 | ❌ | ❌ | ❌ |
정책 및 거버넌스 | ✅ 정책 엔진, 감사 로그 | 🟡 Model Armor 플러그인 | ❌ | ❌ | ❌ |
멀티 테넌트 격리 | ✅ 행 수준 파티셔닝 | ❌ | ❌ | ❌ | ❌ |
PII 마스킹 | ✅ 마스킹/해시/제거, 보존 | 🟡 플러그인 | ❌ | ❌ | ❌ |
모델 독립성 | ✅ 모든 모델 제공업체 | 🟡 Gemini 우선 (LiteLLM 우회) | ✅ 모두 | ✅ 모두 | ✅ 모두 |
점진적 복잡성 | ✅ | 🟡 코드 또는 YAML | ❌ 단일 API | ❌ | ❌ |
관리형 배포 | 📋 계획됨 | ✅ Vertex AI Agent Engine | ❌ | ❌ | ❌ |
런타임 언어 | Rust 코어 + Python/Java/Go | Python/TS/Go/Java | Python | Python | Python |
최적 용도 | 프로덕션 다중 에이전트 시스템 | Google Cloud AI 에이전트 | 빠른 프로토타이핑 | 대화형 에이전트 | 역할 기반 팀 |
메모리 — Engram
JamJet은 에이전트를 위한 내구성 있는 메모리 계층인 Engram을 제공합니다. 시간적 지식 그래프, 하이브리드 검색, 통합 엔진이 단일 SQLite 파일로 백업됩니다. Engram은 임베디드 Rust 라이브러리 또는 독립형 MCP/REST 서버로 실행되며 Python, Java, Spring Boot에서 사용할 수 있습니다.
제공업체 독립적. 동일한 Engram 바이너리가 Ollama(로컬, 무료), 모든 OpenAI 호환 엔드포인트(OpenAI, Azure, Groq, Together, Mistral, DeepSeek, Perplexity, OpenRouter, vLLM, LM Studio 등), Anthropic Claude, Google Gemini 또는 기타 모든 것을 위한 command 셸 아웃과 통신합니다. ENGRAM_LLM_PROVIDER=…로 선택하기만 하면 되며 재컴파일이 필요 없습니다.
형태 | 패키지 | 사용 시기 |
Rust 라이브러리 |
| Rust 애플리케이션에 메모리를 직접 임베딩 |
독립형 바이너리 |
| MCP 클라이언트(Claude Desktop, Cursor), 언어 독립적 REST 클라이언트, 제로 코드 설정 |
Python 클라이언트 |
| REST를 통해 |
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jamjet-labs/jamjet'
If you have feedback or need assistance with the MCP directory API, please join our Discord server