Skip to main content
Polpo doesn’t have an official Python SDK yet, but the API is standard REST + SSE — any HTTP client works.

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.