Install
pip install httpx sseclient-py
Client setup
import httpx
BASE_URL = "https://api.polpo.sh/v1"
API_KEY = "pk_live_..."
headers = {
"x-api-key": API_KEY,
"Content-Type": "application/json",
}
client = httpx.Client(base_url=BASE_URL, headers=headers)
Chat with an agent (streaming)
import httpx
import json
def chat_stream(agent: str, messages: list[dict]):
with httpx.stream(
"POST",
f"{BASE_URL}/chat/completions",
headers={**headers, "Authorization": f"Bearer {API_KEY}"},
json={
"agent": agent,
"messages": messages,
"stream": True,
},
) as response:
for line in response.iter_lines():
if line.startswith("data: ") and line != "data: [DONE]":
chunk = json.loads(line[6:])
delta = chunk["choices"][0].get("delta", {}).get("content", "")
if delta:
print(delta, end="", flush=True)
print()
chat_stream("backend-dev", [
{"role": "user", "content": "Explain the auth module"}
])
Chat (non-streaming)
response = client.post("/chat/completions", json={
"agent": "backend-dev",
"messages": [{"role": "user", "content": "Explain the auth module"}],
"stream": False,
})
data = response.json()
print(data["choices"][0]["message"]["content"])
List agents
response = client.get("/agents")
agents = response.json()["data"]["agents"]
for agent in agents:
print(f"{agent['name']} — {agent.get('role', '')}")
Create a task
response = client.post("/tasks", json={
"title": "Refactor the payment module",
"assignTo": "backend-dev",
"group": "sprint-3",
})
task = response.json()["data"]
print(f"Created: {task['id']}")
List missions
response = client.get("/missions")
missions = response.json()["data"]["missions"]
for m in missions:
print(f"{m['name']} — {m['status']}")
Execute a mission
response = client.post(f"/missions/{mission_id}/execute")
result = response.json()["data"]
print(f"Started {len(result['tasks'])} tasks")
SSE events
import sseclient
import requests
url = f"{BASE_URL}/events"
response = requests.get(url, headers=headers, stream=True)
events = sseclient.SSEClient(response)
for event in events:
if event.data:
data = json.loads(event.data)
print(f"[{event.event}] {data}")
Webhook receiver (Flask)
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route("/webhooks/polpo", methods=["POST"])
def handle_webhook():
event = request.json
if event["event"] == "task:transition":
print(f"Task {event['data']['taskId']} → {event['data']['to']}")
elif event["event"] == "mission:completed":
print(f"Mission completed: {event['data']['missionId']}")
return jsonify({"ok": True})
Webhook receiver (FastAPI)
from fastapi import FastAPI, Request
app = FastAPI()
@app.post("/webhooks/polpo")
async def handle_webhook(request: Request):
event = await request.json()
match event["event"]:
case "task:transition":
print(f"Task {event['data']['taskId']} → {event['data']['to']}")
case "mission:completed":
print(f"Mission completed")
return {"ok": True}
Memory
# Read shared memory
response = client.get("/state/memory")
content = response.json()["data"]["content"]
# Save shared memory
client.put("/state/memory", json={"content": "Updated context..."})
# Per-agent memory
response = client.get("/state/memory/backend-dev")
client.put("/state/memory/backend-dev", json={"content": "Prefers functional patterns"})
A dedicated Python SDK (
polpo-ai) is on the roadmap. For now, the REST API provides full access to all features.