Event-driven Agent-to-Agent protocol SDK and developer CLI
Project description
cosmonapse
Event-driven Agent-to-Agent protocol SDK for Python.
v0.1.0 - Python 3.11+ · MIT
Install
pip install cosmonapse
# Optional synapse adapters
pip install "cosmonapse[nats]" # NATS transport
pip install "cosmonapse[kafka]" # Kafka transport (aiokafka)
# Optional storage backend
pip install "cosmonapse[postgres]" # Postgres registry store (asyncpg)
# Provider-backed Neurons (Ollama / HuggingFace / OpenAI / Anthropic / groq /
# openrouter / together / mistral) need httpx
pip install httpx
Quick start
import asyncio
from cosmonapse import (
Axon, Dendrite, Neuron,
MemoryRegistryStore,
connect_synapse,
)
async def main():
# 1. Connect to a running synapse (cosmo synapse start memory)
synapse = await connect_synapse("cosmo://127.0.0.1:7070")
try:
# 2. Define a pure agent function (zero protocol knowledge)
async def my_agent(input, context):
return {"answer": f"You asked: {input['q']}"}
# -- Worker Dendrite: hosts an Axon --------------------------
worker = Dendrite(synapse=synapse, namespace="demo")
worker.attach_axon(Axon(neuron_id="answerer", neuron_fn=my_agent))
# -- Orchestrator Dendrite: drives the workflow ---------------
orch = Dendrite(
synapse=synapse,
registry_store=MemoryRegistryStore(),
namespace="demo",
)
@orch.on_agent_output
async def done(sig):
print("Got answer:", sig.payload["output"])
await orch.emit_final(
trace_id=sig.trace_id,
parent_id=sig.id,
result=sig.payload["output"],
)
async with orch, worker:
await orch.dispatch_task(neuron="answerer", input={"q": "hi"})
await asyncio.sleep(0.5)
finally:
await synapse.close()
asyncio.run(main())
Start the dev synapse first:
cosmo synapse start memory --namespace=demo
Clarification & permission
A Neuron can pause and ask instead of returning a result, by returning a marker.
The Axon turns it into a CLARIFICATION or PERMISSION signal; an answering
Dendrite (a central Cortex or any peer) replies. No extra client - the Engram
is the memory, the return-marker is the request.
async def writer(input, context, *, recall, imprint):
# 1. Try the Engram of standing grants first.
if input.get("permission"): # resumed with a verdict
if input["permission"]["granted"]:
await imprint("grants", op="upsert", merge_key="action",
entry={"action": "write_file", "granted": True})
return {"wrote": True}
return {"wrote": False}
hit = await recall("grants", query={"action": "write_file"})
if hit.hits:
return {"wrote": True} # already allowed
# 2. Miss -> ask. Same shape as {"__clarification__": True, ...}.
return {"__permission__": True, "action": "write_file",
"scope": {"path": "/tmp/out"}, "reason": "persist output"}
# Answering side (centralised or decentralised - just who subscribes):
@cortex.on_permission
async def decide(sig):
granted = sig.payload["action"] == "write_file"
# Re-dispatch a TASK carrying the verdict so the Neuron resumes:
await cortex.respond_to_permission(sig, granted=granted, reason="allowlisted")
# ...or emit a discrete signal instead:
# await cortex.grant_permission(sig, reason="allowlisted", ttl_ms=3_600_000)
on_clarification / respond_to_clarification / answer_clarification are the
clarification-side equivalents. See design/ENVELOPE_SPEC.md §7.5.
Provider-backed Neurons
Drop an LLM into any workflow with Neuron(source=...):
from cosmonapse import Axon, Neuron
# Local Ollama daemon
axon = Axon(
neuron_id="chat",
neuron_fn=Neuron(source="ollama", model="llama3"),
)
# HuggingFace TGI / vLLM / llama.cpp / LM Studio
axon = Axon(
neuron_id="summariser",
neuron_fn=Neuron(
source="huggingface",
endpoint="http://localhost:8080",
),
)
# HuggingFace hosted endpoint (requires api_key)
axon = Axon(
neuron_id="classifier",
neuron_fn=Neuron(
source="huggingface",
endpoint="https://<your-endpoint>.endpoints.huggingface.cloud",
api_key="hf_…",
use_chat_api=True,
),
)
# OpenAI (api_key falls back to OPENAI_API_KEY)
axon = Axon(
neuron_id="writer",
neuron_fn=Neuron(source="openai", model="gpt-4o", system="Be concise."),
)
# Anthropic (api_key falls back to ANTHROPIC_API_KEY)
axon = Axon(
neuron_id="reasoner",
neuron_fn=Neuron(source="anthropic", model="claude-opus-4-6"),
)
# OpenAI-compatible hosted endpoints - groq, openrouter, together, mistral.
# Pre-configured huggingface Neurons; api_key falls back to <PROVIDER>_API_KEY.
axon = Axon(
neuron_id="fast",
neuron_fn=Neuron(source="groq", model="llama-3.1-70b-versatile"),
)
Neuron(...) returns an async callable satisfying NeuronFn. Pass prompt or
messages (OpenAI-style) in the task input. Output is always
{"response": "<text>", "meta": <raw provider payload>}.
source= |
Kind | Key kwargs |
|---|---|---|
"ollama" |
LLM | model*, endpoint, system, temperature, max_tokens |
"huggingface" / "hf" |
LLM | endpoint*, model, use_chat_api, api_key, max_new_tokens |
"openai" |
LLM | model*, api_key (or OPENAI_API_KEY), endpoint, temperature, max_tokens, system |
"anthropic" |
LLM | model*, api_key (or ANTHROPIC_API_KEY), system, max_tokens, temperature |
"groq" / "openrouter" / "together" / "mistral" |
LLM | model, api_key (or <PROVIDER>_API_KEY), endpoint, temperature, max_new_tokens |
"mcp" |
MCP server | command+args or server+args, env, cwd, tool |
Requires httpx (pip install httpx).
Synapse adapters
| Import | Use when |
|---|---|
MemorySynapse |
tests, single-process |
DevSynapse |
multi-process dev on one host (cosmo synapse start memory) |
NatsSynapse |
production default (pip install cosmonapse[nats]) |
KafkaSynapse |
durable audit log (pip install "cosmonapse[kafka]") |
URL factory:
from cosmonapse import connect_synapse, synapse_from_url
synapse = await connect_synapse("cosmo://127.0.0.1:7070") # DevSynapse
synapse = await connect_synapse("nats://nats:4222") # NatsSynapse
synapse = await connect_synapse("kafka://broker:9092") # KafkaSynapse
For MemorySynapse, construct directly:
from cosmonapse import MemorySynapse
synapse = MemorySynapse()
await synapse.connect()
Storage backends
| Import | Use when |
|---|---|
MemoryRegistryStore |
tests, ephemeral orchestrators |
SqliteRegistryStore |
single-process production, zero extra |
Project details
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 cosmonapse-0.1.4.tar.gz.
File metadata
- Download URL: cosmonapse-0.1.4.tar.gz
- Upload date:
- Size: 199.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
29bd9a773ff85b293b48513bac58ed4e151cf1613be4281b326e16a80f1b4a6f
|
|
| MD5 |
38d83771bfbb6d268b768960d2fe10fe
|
|
| BLAKE2b-256 |
44b26f095eca01da4852f0e902a295c4342bf22c411cda209dd14eb14e8ae6ff
|
Provenance
The following attestation bundles were made for cosmonapse-0.1.4.tar.gz:
Publisher:
release.yml on Cosmonapse/cosmonapse-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cosmonapse-0.1.4.tar.gz -
Subject digest:
29bd9a773ff85b293b48513bac58ed4e151cf1613be4281b326e16a80f1b4a6f - Sigstore transparency entry: 1829191088
- Sigstore integration time:
-
Permalink:
Cosmonapse/cosmonapse-core@cb4e14f8d0681912639724a546d4e106b980c9db -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/Cosmonapse
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cb4e14f8d0681912639724a546d4e106b980c9db -
Trigger Event:
push
-
Statement type:
File details
Details for the file cosmonapse-0.1.4-py3-none-any.whl.
File metadata
- Download URL: cosmonapse-0.1.4-py3-none-any.whl
- Upload date:
- Size: 240.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
727751cba780dcfcd0e2e23a55f736bdf04d446337814498d016b3ae42df8f5e
|
|
| MD5 |
ecbc72f41bf768f1fcb0cc8de93668ff
|
|
| BLAKE2b-256 |
bf88093607c3277fdbd493ec41ac007e1e5e1715feec073ddc9ab4fa872736ed
|
Provenance
The following attestation bundles were made for cosmonapse-0.1.4-py3-none-any.whl:
Publisher:
release.yml on Cosmonapse/cosmonapse-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cosmonapse-0.1.4-py3-none-any.whl -
Subject digest:
727751cba780dcfcd0e2e23a55f736bdf04d446337814498d016b3ae42df8f5e - Sigstore transparency entry: 1829191196
- Sigstore integration time:
-
Permalink:
Cosmonapse/cosmonapse-core@cb4e14f8d0681912639724a546d4e106b980c9db -
Branch / Tag:
refs/tags/v0.1.4 - Owner: https://github.com/Cosmonapse
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@cb4e14f8d0681912639724a546d4e106b980c9db -
Trigger Event:
push
-
Statement type: