Skip to content

v0.11.0 - Multi-Agent Swarms

Choose a tag to compare

@divshekhar divshekhar released this 06 Apr 09:54

[0.11.0] - 2026-04-06

First-class multi-agent orchestration with shared budget control, cross-agent memory, agent-to-agent communication, and enterprise security hardening.

Added

Multi-Agent Swarm System

  • Swarm with 5 topologies: ORCHESTRATOR, PARALLEL, CONSENSUS, REFLECTION, WORKFLOW
  • Shared BudgetPool — hard per-agent caps enforced; no agent can exceed its allocation even if pool has funds
  • MemoryBus — selective cross-agent memory sharing with type filters and custom backends
  • A2ARouter — typed agent-to-agent messaging (direct, broadcast, topic pub/sub) with ack support and audit log
  • SwarmController.topup_budget() / reallocate_budget() — runtime budget reallocation without restarting agents; backed by asyncio.Lock
  • BroadcastBus — pub/sub with wildcard topic patterns ("research.*")
  • MonitorLoop — async supervisor loop: heartbeat polling, quality assessment, bounded interventions with MaxInterventionsExceeded escalation
  • SwarmAuthorityGuard — role-based permission model (ORCHESTRATOR > SUPERVISOR > WORKER); every control action permission-checked and audit-logged
  • AgentRouter — LLM-driven agent selection from a pool (replaces removed DynamicPipeline)
  • Workflow — sequential, parallel, branch, and dynamic fan-out steps with HandoffContext; full play()/pause()/resume()/cancel() lifecycle
  • SwarmResult — unified result: content, cost_breakdown, agent_results, partial_results, budget_report

Budget Intelligence

  • Pre-flight estimation: Budget.estimate() with EstimationPolicy
  • Budget forecasting from run history with Hook.BUDGET_FORECAST
  • Anomaly detection: Budget(anomaly_detection=True) triggers Hook.BUDGET_ANOMALY on p95 breach
  • Cross-run daily/weekly limits with Hook.DAILY_LIMIT_APPROACHING
  • FileBudgetStore for persistent cross-run history

Workflow & Swarm Visualization

  • Workflow.visualize() — Rich ASCII tree
  • Workflow.to_mermaid() — Mermaid graph TD for GitHub/docs
  • Workflow.run(show_graph=True) — live Rich overlay with per-step status and cost
  • GET /graph HTTP endpoint on Swarm.serve() and Workflow.serve()

AgentRegistry

  • AgentRegistry with @registry.register(tags=[...]) — discover and control agents by name or capability tag

Security Hardening

  • PIIGuardrail — detect and redact PII (email, phone, SSN, credit card) in inputs, outputs, and memory writes
  • ToolOutputValidator — schema validation on tool results before the LLM sees them
  • AgentIdentity — Ed25519 cryptographic identity; every A2A message signed and verified
  • Decision provenance: DECISION_MADE hook with DecisionRecord (model, timestamp, hash) for audit trails

Remote Config Control Plane

  • RemoteConfig — live push of any agent field without restart; schema export for dashboard rendering
  • Config versioning and rollback(), per-field allow/deny lists, RemoteConfigValidator
  • Remote lifecycle commands: PAUSE, RESUME, KILL over the wire

Multi-Agent Pry Debugger (TUI)

  • SwarmPryTUI — Rich Live compositor: GraphPanel (per-agent status + cost), BudgetPanel (pool tree), MessagePanel (A2A/MemoryBus timeline), SwarmNav (keyboard navigation)

Changed

  • rich>=13.0 promoted to core dependency
  • requests>=2.33.0 minimum enforced (CVE-2026-25645)
  • ExceedPolicy is now the canonical budget policy enum; on_exceeded= callback pattern deprecated
  • MockResponseMode enum replaces raw strings "lorem"/"custom" in Model.mock()
  • Class-based agent definition is now the canonical pattern in all docs and examples

Fixed

  • @structured decorator now applies @dataclass internally — no manual decoration needed
  • _has_default() helper: fixed broken is not type(None) comparison
  • Swarm context injection: _AgentMeta metaclass compatibility fixed via plain setattr fallback
  • @tool without a description now emits UserWarning at decoration time

Removed

  • DynamicPipeline — removed; use AgentRouter. Importing raises ImportError with migration message.
  • AgentTeam — removed; use Swarm(topology=SwarmTopology.ORCHESTRATOR). Importing raises ImportError.