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トレース、任意のチェックポイントからのリプレイ |
標準的なエージェントIDがない | エージェントカード — すべてのエージェントがアドレス指定可能で発見可能 |
ハードコードされたエージェントルーティング | コーディネーターノード — 構造化スコアリング + 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})これら3つのレベルはすべて同じ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 (外部) | ❌ | ❌ |
エージェントID | ✅ エージェントカード、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経由で |
Javaクライアント |
| REST経由で |
Spring Bootスターター |
| 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サーバーによって公開される7つのMCPツール:memory_add、memory_recall、`
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