Skip to main content
Glama

Среда выполнения для агентов — надежная, компонуемая, созданная для продакшена.

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

jamjet.dev · Быстрый старт · Концепции · API Reference · Примеры · Блог · Discord

Open in GitHub Codespaces Open in Gitpod

jamjet MCP server

JamJet demo


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, одна среда выполнения

Нельзя запустить без сервера

Внутрипроцессное выполнение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?")

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

Когда использовать

Пример

Одиночный агент

Agent с @task

Простые прототипы, узкоспециализированные задачи

Чат-бот, классификатор

Последовательный конвейер

WorkflowGraph с ребрами

Упорядоченные шаги, где каждый зависит от предыдущего

ETL, обработка документов

Параллельное разветвление

ParallelNode

Независимые задачи, которые могут выполняться одновременно

Исследование из нескольких источников, пакетная классификация

Цикл и критик

LoopNode + EvalNode

Задачи, критичные к качеству, требующие итеративного уточнения

Проверка кода, генерация контента

Координатор (динамическая маршрутизация)

CoordinatorNode

Маршрутизация к лучшему агенту во время выполнения на основе возможностей, стоимости, задержки

Маршрутизация тикетов поддержки, делегирование задач

Agent-as-Tool

обертка 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

Координатор против статической маршрутизации

Статическая (ConditionalNode)

Динамическая (CoordinatorNode)

Кандидаты

Объявлены в YAML

Обнаружены в реестре во время выполнения

Выбор

Правила на основе выражений

Структурированная оценка + опциональный LLM-тайбрейкер

При изменении агентов

Переразвертывание рабочего процесса

Автоматически — новые агенты обнаруживаются

Наблюдаемость

Записывается выбранная ветка

Полная разбивка оценок + обоснование в журнале событий

Лучше всего для

Фиксированных, известных маршрутов

Динамических сред, мультиарендности, исследований


Сравнение JamJet

По состоянию на март 2026 года. Все фреймворки развиваются — проверяйте их документацию для получения актуальной информации.

Возможность

JamJet

Google ADK

LangChain

AutoGen

CrewAI

Простая настройка агента

✅ 3 строки (@task)

✅ 5 строк

6+ строк

10+ строк

8+ строк

Внутрипроцессное выполнение

pip install + запуск

✅ нативно

✅ нативно

✅ нативно

✅ нативно

Надежное выполнение

✅ event-sourced, устойчиво к сбоям

❌ эфемерно

❌ эфемерно

❌ эфемерно

❌ эфемерно

Динамическая маршрутизация

✅ Координатор с оценкой + LLM

transfer_to_agent()

Agent-as-Tool

✅ синхр, поток, диалог

AgentTool (только синхр)

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)

✅ любой

✅ любой

✅ любой

Прогрессивная сложность

@taskAgentWorkflow

🟡 код или 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

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-агенты, общающиеся с engram-server через REST

Java-клиент

dev.jamjet:jamjet-sdk (Maven Central)

JVM-агенты, общающиеся с engram-server через REST

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