Production-Grade
Agent Task Broker

Reliably hand off tasks between AI agents.
No lost tasks, no budget overruns, no policy bypass, full traceability.

Agent Collaboration Breaks in Production

📭

Lost Tasks

Tasks vanish when agents go offline

→ Durable mailboxes survive crashes
🔍

No Traceability

Who called whom and with what data?

→ Full audit trail + Trace ID
💥

Concurrency Overload

Downstream agents get overwhelmed

→ Budget + concurrency limits
🔐

No Access Control

No rules on who can call whom

→ Policy engine + approval flow
💰

Invisible Costs

Which team exceeded token budget?

→ Token / cost budget control
🔌

Protocol Chaos

Every framework has a different interface

→ A2A / MCP / SDK unified access

Core Capabilities

🔄 Durable Delivery

  • Dual-write persistence: PostgreSQL + NATS
  • Automatic recovery after agent crashes
  • Idempotent ACK/NACK, no double execution
  • Auto-retry + dead letter queue + replay

⚖️ Governance

  • Policy engine: who can call whom, with what data
  • Budget: RPM / TPM / concurrency / daily cost
  • Human approval for high-risk tasks
  • Full audit trail for every step

🧭 Capability Routing

  • Match agents by capability, not hard-coded target
  • Hard constraints: online / policy / capacity / budget
  • Semantic scoring of candidates
  • Intent resolver: natural language → capability

🔌 Multi-Protocol

  • HTTP REST API + gRPC
  • A2A Gateway (Agent Card / Task Send)
  • ACP Gateway (Manifest / Runs)
  • MCP Gateway (Tool Call / Resource)

📊 Observability

  • Prometheus metrics (16+ core metrics)
  • OpenTelemetry distributed tracing
  • Structured JSON logging
  • Pre-built Grafana dashboard

🛡️ Security

  • Tenant isolation (data / messages / files)
  • API Key auth + mTLS
  • Automatic cross-tenant access denial
  • Security audit events

Running in 5 Minutes

1. Start Janus
docker compose up -d
2. Publish a task (Python SDK)
from janus_sdk import JanusClient

client = JanusClient("http://localhost:8080", tenant_id="acme")
client.publish_task({
    "id": "task-001",
    "source_agent": "product",
    "target_type": "mailbox",
    "target_value": "review-mb",
    "envelope": { ... }
})
3. Agent pulls and completes
result = client.pull_task("review-mb", "reviewer")
client.start_task(result.task.id, result.lease.lease_id)

# Process task...

client.ack_task(result.task.id, {
    "lease_id": result.lease.lease_id,
    "result_ref": "s3://result.json"
})
Full Tutorial →

Use Cases

📝 Code Review

Product → Review → Code → Test → Deploy

PR triggers review agent, code agent fixes issues, test agent validates, deploy agent ships

🔧 CI Auto-Fix

Failure → Diagnose → Fix → Verify → Merge

CI failure auto-dispatches to diagnosis agent, generates fix, validates and merges

🔒 Security Scan

Commit → Dependency Scan → Credential Check → Approve

Auto-scan for vulnerabilities and leaked credentials, high-risk changes require approval

Framework Compatibility

LangGraph · AutoGen · CrewAI · GitHub Actions · Claude Code · Custom Agents · Human Approval Nodes

View Integration Examples →