JamJet
Среда выполнения для агентов — надежная, компонуемая, созданная для продакшена.
jamjet.dev · Быстрый старт · Концепции · API Reference · Примеры · Блог · Discord

JamJet — это ориентированная на производительность среда выполнения для AI-агентов. Это не просто очередная обертка над промптами или легкий SDK — это оркестрационная платформа промышленного уровня для агентов, которые должны работать, а не просто демонстрироваться.
Ядро среды выполнения написано на Rust + Tokio для планирования, управления состоянием и параллелизма. Интерфейс разработки — Python, Java, Go (планируется) или YAML. Все они компилируются в один и тот же IR-граф и работают на одном движке.
Почему JamJet?
Проблема | Ответ JamJet |
Агенты теряют состояние при сбое | Надежное выполнение графа — event-sourcing, возобновление после сбоя |
Нет возможности приостановить для одобрения человеком | Human-in-the-loop как примитив рабочего процесса первого класса |
Агенты изолированы в своих фреймворках | Native MCP + A2A — взаимодействие с любым агентом, любым фреймворком |
Медленная оркестрация на Python при масштабировании | Ядро на Rust — отсутствие GIL, реальный асинхронный параллелизм |
Слабая наблюдаемость, нет возможности повтора | Полная временная шкала событий, трассировки OTel GenAI, повтор с любой контрольной точки |
Нет стандартной идентификации агента | Agent Cards — каждый агент адресуем и обнаруживаем |
Жестко закодированная маршрутизация агентов | Узел координатора — динамическая маршрутизация со структурированной оценкой + 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?")Docstring становится инструкцией. Сигнатура функции — контрактом. Это всё.
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.
Производительность
Компиляция IR в JamJet в 88 раз быстрее, чем компиляция графа в LangGraph:
Операция | JamJet | LangGraph |
Компиляция / построение графа | ~0.006 мс | ~0.529 мс |
Внутрипроцессный вызов | ~0.015 мс | ~1.458 мс |
Измерено на 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"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 поддерживает шесть основных паттернов мультиагентной оркестрации. Вот когда использовать каждый из них:
Паттерн | Примитив 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Координатор против статической маршрутизации
Статическая ( | Динамическая ( | |
Кандидаты | Объявлены в YAML | Обнаружены в реестре во время выполнения |
Выбор | Правила на основе выражений | Структурированная оценка + опциональный LLM-тайбрейкер |
При изменении агентов | Переразвертывание рабочего процесса | Автоматически — новые агенты обнаруживаются |
Наблюдаемость | Записывается выбранная ветка | Полная разбивка оценок + обоснование в журнале событий |
Лучше всего для | Фиксированных, известных маршрутов | Динамических сред, мультиарендности, исследований |
Сравнение JamJet
По состоянию на март 2026 года. Все фреймворки развиваются — проверяйте их документацию для получения актуальной информации.
Возможность | JamJet | Google ADK | LangChain | AutoGen | CrewAI |
Простая настройка агента | ✅ 3 строки ( | ✅ 5 строк | 6+ строк | 10+ строк | 8+ строк |
Внутрипроцессное выполнение | ✅ | ✅ нативно | ✅ нативно | ✅ нативно | ✅ нативно |
Надежное выполнение | ✅ event-sourced, устойчиво к сбоям | ❌ эфемерно | ❌ эфемерно | ❌ эфемерно | ❌ эфемерно |
Динамическая маршрутизация | ✅ Координатор с оценкой + LLM | ✅ | ❌ | ❌ | ❌ |
Agent-as-Tool | ✅ синхр, поток, диалог | ✅ | ❌ | ❌ | ❌ |
Human-in-the-loop | ✅ примитив первого класса | 🟡 колбэки | 🟡 колбэки | 🟡 диалоговый | 🟡 ручной |
Поддержка MCP | ✅ клиент + сервер | ✅ клиент + сервер | 🟡 только клиент | 🟡 только клиент | 🟡 только клиент |
Протокол A2A | ✅ клиент + сервер | 🟡 только клиент | ❌ | ❌ | ❌ |
Встроенная оценка | ✅ LLM-судья, утверждения, стоимость | ✅ 8 встроенных критериев | ❌ | ❌ | ❌ |
Встроенная наблюдаемость | ✅ OTel GenAI, повтор событий | ✅ Cloud Trace | 🟡 LangSmith (внешний) | ❌ | ❌ |
Идентификация агента | ✅ Agent Cards, A2A discovery | ✅ Agent Cards | ❌ | ❌ | ❌ |
Политики и управление | ✅ движок политик, журнал аудита | 🟡 плагин Model Armor | ❌ | ❌ | ❌ |
Изоляция арендаторов | ✅ секционирование на уровне строк | ❌ | ❌ | ❌ | ❌ |
Маскирование PII | ✅ маска/хеш/удаление, хранение | 🟡 плагин | ❌ | ❌ | ❌ |
Независимость от моделей | ✅ любой провайдер | 🟡 Gemini-first (LiteLLM) | ✅ любой | ✅ любой | ✅ любой |
Прогрессивная сложность | ✅ | 🟡 код или YAML | ❌ один API | ❌ | ❌ |
Управляемое развертывание | 📋 Планируется | ✅ Vertex AI Agent Engine | ❌ | ❌ | ❌ |
Язык среды выполнения | Rust + Python/Java/Go | Python/TS/Go/Java | Python | Python | Python |
Лучше всего для | Продакшен мультиагентных систем | Google Cloud AI agents | Быстрого прототипирования | Диалоговых агентов | Ролевых команд |
Память — 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-агенты, общающиеся с |
Java-клиент |
| JVM-агенты, общающиеся с |
Spring Boot starter | `dev.jamjet:eng |
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