Skip to main content
Glama

原生于代理的运行时 — 耐用、可组合,专为生产环境构建。

jamjet MCP server CI PyPI License Rust Python Java Go Docs Discord

jamjet.dev · 快速入门 · 概念 · API 参考 · 示例 · 博客 · Discord

Open in GitHub Codespaces Open in Gitpod

jamjet MCP server

JamJet demo


JamJet 是一个性能优先、原生于代理的 AI 代理运行时。它不是另一个提示词封装器或轻量级代理 SDK,而是为那些需要真正投入生产、而不仅仅是演示的代理所构建的生产级编排基底

运行时核心采用 Rust + Tokio 进行调度、状态管理和并发处理。创作界面支持 PythonJavaGo(计划中)或 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,相同的运行时

没有服务器无法运行

进程内执行pip install jamjet 即可立即运行


快速入门

要求: Python 3.11+

最快路径 — 纯 Python,无需服务器

pip install jamjet
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?")
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: end
jamjet 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: summarize

A2A 委托

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 原语

使用场景

示例

单代理

Agent 配合 @task

简单的原型,单一用途任务

聊天机器人,分类器

顺序流水线

WorkflowGraph 配合边

有序步骤,每一步都依赖于前一步

ETL,文档处理

并行扇出

ParallelNode

可以并发运行的独立任务

多源研究,批量分类

循环与批评

LoopNode + EvalNode

需要迭代优化的质量关键任务

代码审查,内容生成

协调器(动态路由)

CoordinatorNode

在运行时根据能力、成本、延迟路由到最佳代理

支持工单路由,任务委托

代理即工具

agent_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 静态路由

静态 (ConditionalNode)

动态 (CoordinatorNode)

候选者

在 YAML 中声明

在运行时从注册表中发现

选择

基于表达式的规则

结构化评分 + 可选的 LLM 决胜

代理变更时

重新部署工作流

自动 — 发现新代理

可观测性

记录所选分支

完整的评分明细 + 事件日志中的推理

最适合

固定、已知的路由

动态环境、多租户、研究


JamJet 的对比情况

截至 2026 年 3 月。所有框架都在演进 — 请查看其文档以获取最新信息。

能力

JamJet

Google ADK

LangChain

AutoGen

CrewAI

简单的代理设置

✅ 3 行 (@task)

✅ 5 行

6+ 行

10+ 行

8+ 行

进程内执行

pip install + 运行

✅ 原生

✅ 原生

✅ 原生

✅ 原生

耐用执行

✅ 事件溯源,崩溃安全

❌ 瞬态

❌ 瞬态

❌ 瞬态

❌ 瞬态

动态代理路由

✅ 协调器(评分+LLM)

transfer_to_agent()

代理即工具

✅ 同步、流式、对话式

AgentTool (仅同步)

人工介入

✅ 一等原语

🟡 回调

🟡 回调

🟡 对话式

🟡 手动

MCP 支持

✅ 客户端 + 服务器

✅ 客户端 + 服务器

🟡 仅客户端

🟡 仅客户端

🟡 仅客户端

A2A 协议

✅ 客户端 + 服务器

🟡 仅客户端

内置评估

✅ LLM 评判、断言、成本

✅ 8 个内置标准

内置可观测性

✅ OTel GenAI,事件重放

✅ Cloud Trace

🟡 LangSmith (外部)

代理身份

✅ 代理卡片,A2A 发现

✅ 代理卡片

策略与治理

✅ 策略引擎,审计日志

🟡 Model Armor 插件

多租户隔离

✅ 行级分区

PII 脱敏

✅ 掩码/哈希/移除,保留

🟡 插件

模型独立性

✅ 任何模型提供商

🟡 Gemini 优先 (LiteLLM)

✅ 任何

✅ 任何

✅ 任何

渐进式复杂度

@taskAgentWorkflow

🟡 代码或 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 库

jamjet-engram (crates.io)

直接在 Rust 应用程序中嵌入记忆

独立二进制文件

jamjet-engram-server (crates.io), ghcr.io/jamjet-labs/engram-server (Docker), 官方 MCP 注册表

MCP 客户端 (Claude Desktop, Cursor), 语言无关的 REST 客户端, 零代码设置

Python 客户端

jamjet (PyPI)

Python 代理通过 REST 与 engram-server 通信

Java 客户端

dev.jamjet:jamjet-sdk (Maven Central)

JVM 代理通过 REST 与 engram-server 通信

Spring Boot starter

dev.jamjet:engram-spring-boot-starter (Maven Central)

为 Spring AI 应用程序提供即插即用的 @Bean EngramMemory

# 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_addmemory_recallmemory_contextmemory_searchmemory_forgetmemory_statsmemory_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