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 追踪,从任何检查点重放 |
没有标准的代理身份 | 代理卡片 (Agent Cards) — 每个代理都是可寻址且可发现的 |
硬编码的代理路由 | 协调器节点 (Coordinator Node) — 具有结构化评分 + 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"代理即工具 — 将代理封装为可调用工具
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 支持六种主要的多代理编排模式。以下是每种模式的使用场景:
模式 | JamJet 原语 | 使用场景 | 示例 |
单代理 |
| 简单的原型,单一用途任务 | 聊天机器人,分类器 |
顺序流水线 |
| 有序步骤,每一步都依赖于前一步 | ETL,文档处理 |
并行扇出 |
| 可以并发运行的独立任务 | 多源研究,批量分类 |
循环与批评 |
| 需要迭代优化的质量关键任务 | 代码审查,内容生成 |
协调器(动态路由) |
| 在运行时根据能力、成本、延迟路由到最佳代理 | 支持工单路由,任务委托 |
代理即工具 |
| 一个代理需要将另一个代理作为函数调用 | 编排器调用专家 |
选择正确的模式
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) | ✅ | ❌ | ❌ | ❌ |
代理即工具 | ✅ 同步、流式、对话式 | ✅ | ❌ | ❌ | ❌ |
人工介入 | ✅ 一等原语 | 🟡 回调 | 🟡 回调 | 🟡 对话式 | 🟡 手动 |
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 shell-out 对话 — 使用 ENGRAM_LLM_PROVIDER=… 选择一个,无需重新编译。
形式 | 包 | 使用场景 |
Rust 库 |
| 直接在 Rust 应用程序中嵌入记忆 |
独立二进制文件 |
| MCP 客户端 (Claude Desktop, Cursor), 语言无关的 REST 客户端, 零代码设置 |
Python 客户端 |
| Python 代理通过 REST 与 |
Java 客户端 |
| JVM 代理通过 REST 与 |
Spring Boot starter |
| 为 Spring AI 应用程序提供即插即用的 |
# Try it with Claude Desktop in 30 seconds (uses local Ollama by default)
docker run --rm -i \
-v engram-data:/data \
ghcr.io/jamjet-labs/engram-server:0.3.2
# Or point at Groq instead — same binary, no rebuild
docker run --rm -i \
-e ENGRAM_LLM_PROVIDER=openai-compatible \
-e ENGRAM_OPENAI_BASE_URL=https://api.groq.com/openai/v1 \
-e OPENAI_API_KEY=gsk_... \
-v engram-data:/data \
ghcr.io/jamjet-labs/engram-server:0.3.2服务器暴露了七个 MCP 工具:memory_add、memory_recall、memory_context、memory_search、memory_forget、memory_stats、memory_consolidate。完整文档请见 runtime/engram-server/README.md。关于 Engram 与 Mem0、Zep、Spring AI ChatMemory、LangChain4j、Koog、Google ADK Memory Bank 和 Embabel 的对比,请见 java-ai-memory.dev。
架构
┌──────────────────────────────────────────────────────────┐
│ Authoring Layer │
│ Python SDK | Java SDK | Go SDK (planned) | YAML │
├──────────────────────────────────────────────────────────┤
│ Compilation / Validation │
│ Graph IR | Schema | Policy lint │
├────────────────────────────┬─────────────────────────────┤
│ Rust Runtime Core │ Protocol Layer │
│ Scheduler | State SM │ MCP Client | MCP Server │
│ Event log | Snapshots │ A2A Client | A2A Server │
│ Workers | Timers │ │
├────────────────────────────┴─────────────────────────────┤
│ Enterprise Services │
│ Policy | Audit | PII Redaction | OAuth | mTLS │
├──────────────────────────────────────────────────────────┤
│ Runtime Services │
│ Model Adapters | Tool Execution | Observability │
├──────────────────────────────────────────────────────────┤
│ Storage │
│ Postgres (production) | SQLite (local) │
└──────────────────────────────────────────────────────────┘路线图
阶段 | 状态 | 目标 |
0 — 架构与 RFC | ✅ 完成 | 设计文档、RFC、仓库脚手架 |
1 — 最小可行运行时 | ✅ 完成 | 本地耐用执行、MCP 客户端、代理卡片、Python CLI |
2 — 生产核心 | ✅ 完成 | 分布式工作节点、MCP 服务器、完整的 A2A 客户端 + 服务器 |
3 — 开发者愉悦 | ✅ 完成 | 评估工具、追踪调试、模板、Java SDK |
4 — 企业级 | 🔄 进行中 | 策略引擎、租户隔离、PII 脱敏、OAuth 委托、A2A 联邦认证、mTLS |
5 — 规模与生态 | 📋 计划中 | Go SDK、TypeScript SDK、托管平台 |
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