PACT Agent Collaboration Layer - Multi-Agent Coordination Protocol
Project description
PACT-AX: Agent Collaboration Layer
Part of the neurobloom.ai Open Source Ecosystem
Use the SDK
The fastest way to build on PACT-AX is the Python SDK — no server wiring required for your first experiment:
pip install pact-ax-client
from pact_ax_client import Agent
agent = Agent("my-agent", base_url="http://localhost:8000")
agent.register_capability("contract_review", description="Reviews NDAs")
decision = agent.route("contract_review")
if decision.routed:
result = agent.handoff(decision.best_agent, state_data={"doc": "..."})
agent.remember("contract_review", partner_id=decision.best_agent, outcome="positive")
→ Full SDK docs: neurobloomai/pact-ax-client
What problem does this solve?
When you build a system with more than one AI agent, you immediately hit the same three problems:
- Who handles this? — no way to discover which agent has the right skill
- Can I trust the answer? — no persistent record of how agents have performed before
- How do I hand off context? — passing state between agents loses continuity
PACT-AX solves all three. It's a FastAPI server (84 routes) that your agents call to register capabilities, track trust, route tasks, hand off state, and record episodic memory. The Python SDK (pact-ax-client) wraps the API so you don't touch HTTP directly.
Architecture
neurobloom.ai Ecosystem
├── PACT-HX (Human Experience Layer)
│ └── Personalized memory, emotional context, adaptive communication
│
└── PACT-AX (Agent Collaboration Layer) [This Repository]
├── pact_ax.primitives
│ ├── StoryKeeper — narrative continuity across turns
│ ├── ContextShareManager — trust-aware context exchange
│ ├── TrustManager — network-wide trust scoring (persistent SQLite)
│ ├── CapabilityRegistry — agent skill registration and discovery
│ └── AgentRouter — trust-weighted task routing
├── pact_ax.state
│ ├── StateTransferManager — full handoff lifecycle (prepare → send → receive)
│ └── EpistemicStateTransfer — knowledge + confidence fidelity
├── pact_ax.coordination
│ ├── ConsensusProtocol — weighted-vote multi-agent decisions
│ └── CoordinationBus — event-driven agent messaging
└── pact_ax.api — 84-route REST API (FastAPI)
├── /capabilities — register, find, search, deregister skills
├── /trust — get, update, network trust, insights
├── /route — trust-weighted and capability-only routing
├── /memory/episodes — record and recall episodic memory
├── /consensus — stateless run + stateful sessions
├── /dlq — dead letter queue with exponential backoff
└── /transfer — prepare, send, receive, checkpoint
Key Features
🗺️ Capability Registry + Router
Register agent skills and route tasks to the best trusted+capable agent:
from pact_ax.primitives import CapabilityRegistry, AgentRouter
registry = CapabilityRegistry()
registry.register("agent-a", "contract_review", tags=["legal"])
registry.register("agent-b", "contract_review", tags=["legal"])
registry.register("agent-b", "tax_analysis", tags=["finance"])
router = AgentRouter(capability_db=":memory:", trust_db=":memory:")
decision = router.route(from_agent="orch", skill="contract_review", min_trust=0.6)
print(decision.best_agent, decision.strategy_used)
# "agent-b" "trust_weighted"
📖 Story Keeper
Maintains narrative continuity across conversation turns:
from pact_ax.primitives import StoryKeeper
keeper = StoryKeeper(agent_id="agent-001", session_id="user-session-42")
keeper.process_turn("I want to build a startup in the health space")
keeper.process_turn("What should I focus on first?")
story = keeper.get_story_state()
# {"arc": "Collaboration: startup, health", "themes": [...], ...}
🤝 Context Sharing
Trust-aware context exchange with validated packets:
from pact_ax.primitives import ContextShareManager, ContextType, Priority
manager = ContextShareManager("agent-001", agent_type="support_specialist",
capabilities=["nlp", "customer_support"])
packet = manager.create_context_packet(
target_agent="agent-002",
context_type=ContextType.TASK_KNOWLEDGE,
payload={"current_task": "customer_support", "context": "billing issue"},
priority=Priority.HIGH,
)
🔄 State Transfer
Full handoff lifecycle — prepare, send, receive, checkpoint:
from pact_ax.state import StateTransferManager, HandoffReason
sender = StateTransferManager(agent_id="agent-A")
packet_id = sender.prepare("agent-B", state_data={"task": "analyse Q3"}, reason=HandoffReason.CONTINUATION)
packet = sender.send(packet_id)
receiver = StateTransferManager(agent_id="agent-B")
result = receiver.receive(packet)
print(result.success, result.integrated_state)
🛡️ Trust Scoring
Persistent, network-wide trust that evolves from real collaboration outcomes:
from pact_ax.primitives import TrustManager
tm = TrustManager(agent_id="agent-001")
tm.update_trust("agent-002", "positive", "task_knowledge")
score = tm.get_trust("agent-002") # overall
inferred = tm.get_network_trust("agent-unknown") # transitive
trusted = tm.get_trusted_agents(min_trust=0.7)
🧠 Episodic Memory
Record and recall past interactions with filters:
from pact_ax.primitives import EpisodicMemory
mem = EpisodicMemory()
mem.record("agent-a", "reviewed_nda", partner_id="agent-b",
outcome="positive", importance=0.8, tags=["legal"])
episodes = mem.recall("agent-a", outcome="positive", min_importance=0.5)
summary = mem.summary("agent-a")
# {"total_episodes": 12, "avg_importance": 0.72, "outcome_breakdown": {...}}
📬 Dead Letter Queue
Park failed deliveries for retry with exponential backoff:
from pact_ax.primitives import DeadLetterQueue
dlq = DeadLetterQueue(max_attempts=3, base_seconds=30)
entry = dlq.enqueue("pkt-xyz", "agent-a", "agent-b", reason="timeout")
dlq.retry(entry.id) # next_retry = now + 30s, 60s, 120s...
🗳️ Consensus Protocol
Weighted-vote multi-agent decisions:
from pact_ax.coordination.consensus import ConsensusProtocol, ConsensusStrategy, Vote
proto = ConsensusProtocol(strategy=ConsensusStrategy.WEIGHTED_VOTE)
votes = [
Vote("agent-A", "deploy-v2", confidence=0.85),
Vote("agent-B", "deploy-v2", confidence=0.80),
Vote("agent-C", "hold", confidence=0.65),
]
result = proto.run(votes, trust_scores={"agent-A": 0.9, "agent-B": 0.85, "agent-C": 0.7})
print(result.reaching, result.winning_decision) # True, "deploy-v2"
REST API
PACT-AX ships a 84-route FastAPI server. Run it:
git clone https://github.com/neurobloomai/pact-ax
cd pact-ax
pip install -r requirements.txt
uvicorn pact_ax.api.server:app --reload
Swagger docs at http://localhost:8000/docs.
Or use the SDK instead of calling HTTP directly:
pip install pact-ax-client
Demos
All runnable demos live in neurobloomai/pact-demos:
git clone https://github.com/neurobloomai/pact-demos
cd pact-demos
pip install -r requirements.txt
python demos/capability_routing/demo.py
python demos/orchestrate_rest/demo.py
Development
git clone https://github.com/neurobloomai/pact-ax
cd pact-ax
pip install -r requirements.txt
pytest tests/ -v # 743 tests
pytest tests/unit/ -v # unit only
pytest tests/integration/ -v # integration only
Roadmap
✅ Built
- StoryKeeper — narrative continuity, arc detection, multi-session persistence
- ContextShareManager — trust-aware context packets, capability sensing
- TrustManager — per-context trust, time-based decay, network reputation, persistent SQLite
- StateTransferManager — full handoff lifecycle, checkpoints, epistemic state transfer
- ConsensusProtocol — weighted vote, quorum, unanimous, confidence-threshold
- CoordinationBus — event-driven pub/sub
- CapabilityRegistry — skill registration, semantic search, tag filtering
- AgentRouter — trust-weighted routing, fuzzy search
- EpisodicMemory — record, recall, summary, partner analytics
- DeadLetterQueue — enqueue, retry, exhaustion, exponential backoff
- REST API — 84 routes across all primitives
- pact-ax-client — Python SDK on PyPI (
pip install pact-ax-client)
🎯 Next
- TypeScript SDK (
npm install pact-ax-client) - Docker / one-command server setup
- Real integration (GitHub Actions, Slack bot)
- PACT-HX integration (Human Experience Layer)
Package Structure
pact_ax/
├── primitives/
│ ├── story_keeper.py
│ ├── context_share/
│ ├── trust_score.py
│ ├── capability_registry.py
│ ├── agent_router.py
│ ├── episodic_memory.py
│ └── dead_letter_queue.py
├── state/
│ ├── state_transfer_manager.py
│ └── epistemic_transfer.py
├── coordination/
│ ├── consensus.py
│ └── coordination_bus.py
└── api/
├── server.py
└── routes/
├── capabilities.py
├── trust.py
├── agent_router.py
├── episodic_memory.py
├── dead_letter.py
├── consensus.py
└── transfer.py
License
MIT — built with 🎵 by the neurobloom.ai community.
Where Artificial Intelligence meets Emotional Intelligence.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pact_ax-0.1.1.tar.gz.
File metadata
- Download URL: pact_ax-0.1.1.tar.gz
- Upload date:
- Size: 162.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7614ba415db052e9b0b3c63f2710c7f816f34615bee82bb59db36ec52d05ae0f
|
|
| MD5 |
b922b8f4d7251064cd85ebcc298af0c4
|
|
| BLAKE2b-256 |
a3da94e3cd93544958f0d329560e75b5699c98278cd81939cea801885f805568
|
File details
Details for the file pact_ax-0.1.1-py3-none-any.whl.
File metadata
- Download URL: pact_ax-0.1.1-py3-none-any.whl
- Upload date:
- Size: 176.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2becf88b42b556b31a2a610f4d59f362801a38bd24cc12b2e917273066cf969e
|
|
| MD5 |
260e6c34be1dc4aecd218c7c2d3352eb
|
|
| BLAKE2b-256 |
a984d9fc10c5c67a2f6f064b417ca07de634ff0d5e21eb80841024bbceeda522
|