Skip to main content

A protocol framework for agent-to-agent communication

Project description

Bindu

Bindu

Python Version PyPI version Coverage Tests Discord Contributors Hits Star History Rank

English | Deutsch | Español | Français | हिंदी | বাংলা | 中文 | Nederlands | தமிழ்

The identity, communication, and payments layer for AI agents.


A Gmail-shaped inbox for the agent internet. Watch your agents send signed JSON-RPC to each other, verify identities inline, and reply to a swarm like it's a thread.

Bindu inbox — agents talking to agents, signatures verified inline

→ Open the inbox walkthrough


Here's the situation. You built an agent. It works. But to actually let it loose — talk to other agents, prove who it is, take money for the work — you'd be on the hook for a lot of boring plumbing. A DID library to integrate. An OAuth flow to set up. Payment middleware. An HTTP layer that follows whatever protocol the rest of the agent world is using.

Bindu is all of that plumbing, behind one function call. You wrap your handler with bindufy(), and a few seconds later your agent is online with its own cryptographic identity, speaking A2A (the protocol other agents already use), and ready to demand USDC on any EVM chain before it does any work (x402). Your handler stays as small as (messages) -> response. The framework inside the handler — Agno, LangChain, CrewAI, your own thing — Bindu doesn't care.

There are SDKs for Python, TypeScript, and Kotlin, and they all share the same gRPC core. The language is a choice; the protocol and identity are the same either way. When you're ready to go deeper, the docs are the next stop.

Installation

You'll need Python 3.12+ and uv.

uv add bindu

If you're hacking on Bindu itself rather than using it:

git clone https://github.com/getbindu/Bindu.git
cd Bindu
uv sync --dev

To run the examples you'll need an API key for at least one LLM provider — OPENROUTER_API_KEY, OPENAI_API_KEY, or MINIMAX_API_KEY.


Quickstart

Build the agent you want, hand it to bindufy(), and it's online. The block below is the whole thing — copy it into a file, set your OPENAI_API_KEY, run it.

import os
from bindu.penguin.bindufy import bindufy
from agno.agent import Agent
from agno.models.openai import OpenAIChat
from agno.tools.duckduckgo import DuckDuckGoTools

agent = Agent(
    instructions="You are a research assistant.",
    model=OpenAIChat(id="gpt-4o"),
    tools=[DuckDuckGoTools()],
)

config = {
    "author": "you@example.com",
    "name": "research_agent",
    "description": "Research assistant with web search.",
    "deployment": {"url": "http://localhost:3773", "expose": True},
    "skills": ["skills/question-answering"],
}

def handler(messages: list[dict[str, str]]):
    return agent.run(input=messages)

bindufy(config, handler)

The agent is now live at http://localhost:3773. expose: True opens an FRP tunnel so the rest of the internet can hit it without you setting up port forwarding.

TypeScript equivalent
import { bindufy } from "@bindu/sdk";
import OpenAI from "openai";

const openai = new OpenAI();

bindufy({
  author: "you@example.com",
  name: "research_agent",
  description: "Research assistant.",
  deployment: { url: "http://localhost:3773", expose: true },
  skills: ["skills/question-answering"],
}, async (messages) => {
  const response = await openai.chat.completions.create({
    model: "gpt-4o",
    messages: messages.map(m => ({ role: m.role as "user" | "assistant" | "system", content: m.content })),
  });
  return response.choices[0].message.content || "";
});

The TypeScript SDK spawns the Python core in the background — you won't see it, and you don't need any Python in your own codebase. Same protocol, same DID. Full example in examples/typescript-openai-agent/.

Calling the agent with curl
curl -X POST http://localhost:3773/ \
  -H 'Content-Type: application/json' \
  -d '{
    "jsonrpc": "2.0",
    "method": "message/send",
    "id": "<uuid>",
    "params": {
      "message": {
        "role": "user",
        "kind": "message",
        "parts": [{"kind": "text", "text": "Hello"}],
        "messageId": "<uuid>",
        "contextId": "<uuid>",
        "taskId": "<uuid>"
      }
    }
  }'

Then poll tasks/get with the same taskId until state hits completed.


Features

Every row here links out to the guide that actually goes into it.

Feature What it does Docs
A2A JSON-RPC The protocol other agents already speak. message/send, tasks/get, message/stream on port 3773.
DID identity Every response your agent sends is signed with an Ed25519 key. Callers verify with a W3C DID — there's no shared secret to leak. DID.md
OAuth2 via Hydra Scoped tokens (agent:read, agent:write, agent:execute) instead of one bearer that opens every door. AUTHENTICATION.md
x402 payments Flip a flag and the agent demands USDC before your handler ever sees the request. 5 chains pre-configured — Base, Base Sepolia, Ethereum, Ethereum Sepolia, SKALE Europa — and any other EVM chain (Polygon, Avalanche, Arbitrum, …) takes one extra_networks entry. PAYMENT.md
Push notifications The agent webhooks you when a task changes state. Stop polling. NOTIFICATIONS.md
Skills system Declare what your agent can do; callers see it on the agent card before they spend a token asking. SKILLS.md
Private skills Keep your commercial skill descriptions out of the public catalog. Public crawlers see a generic "we do X" — allowlisted partner DIDs see your real menu at a second auth-gated endpoint. Useful when your skill descriptions ARE your product roadmap. PRIVATE_SKILLS.md
Agent negotiation Two agents agree on price, latency, and SLA up front. No surprise bills. NEGOTIATION.md
Storage Postgres for tasks and messages. Swap the backend if you've got a preference. STORAGE.md
Scheduler Redis-backed retries, timeouts, and recurring tasks. SCHEDULER.md
Public tunnel expose: true puts your laptop on the internet. No port forwarding, no router config. TUNNELING.md
Polyglot SDKs Python, TypeScript, Kotlin — same gRPC core underneath, same DID, same auth. GRPC_LANGUAGE_AGNOSTIC.md
Cloud deploy bindu deploy agent.py --runtime=boxd ships your script to a microVM and prints the HTTPS URL. No Dockerfile. runtime/quickstart.md
Gateway A planner LLM that orchestrates a fleet of agents over A2A and streams the result back. GATEWAY.md
Observability OpenTelemetry traces, Sentry errors, a health endpoint. The boring stuff that saves you at 2am. OBSERVABILITY.md

Demo

The operator inbox at the top of this page is in inbox/ — same auth, same DID signing, just visible. Run it with cd inbox && npm run dev.


Examples

A handful from examples/:

Example What it shows
Agent Swarm A small society of Agno agents passing work to each other.
Premium Advisor x402 in practice — the caller has to pay USDC before anything runs.
Hermes via Bindu Nous Research's Hermes agent, bindufied in ~90 lines.
Gateway Test Fleet Five agents and one gateway — the multi-agent story end to end.
TypeScript OpenAI Agent A TS-only agent with zero Python in your repo.

There are 20+ more covering CSV analysis, PDF Q&A, speech-to-text, web scraping, multi-lingual collaboration, blog writing, and so on. Browse them in examples/.


Why we built Bindu

We're using Bindu in production to build the Trade Compliance OS — a swarm of agents that handles CBAM, EUDR, HS codes, and Digital Product Passports, so an SMB can ship coffee, textiles, or steel across borders without writing a six-figure check to a law firm. Every agent in that swarm is bindufied. The protocol, the identity, the payment rails — that's all the stuff we needed Bindu to solve in the first place.

If you've built an agent that touches any of this — customs paperwork, supplier audits, materials sourcing, regulatory filings, anything in the neighborhood — we'd love to have it in the network. Come find us on Discord and let's talk.


Supported frameworks

Bring whatever you already like writing agents in. Bindu doesn't care what's inside the handler.

Language Frameworks tested in this repo
Python AG2, Agno, CrewAI, Hermes Agent, LangChain, LangGraph, Notte
TypeScript OpenAI SDK, LangChain.js
Kotlin OpenAI Kotlin SDK
Any other via the gRPC core — a new SDK is usually a few hundred lines

If your model provider speaks the OpenAI or Anthropic API, it works — OpenRouter, OpenAI, MiniMax, and the rest.


Documentation


Testing

uv run pytest tests/unit/ -v                                    # fast unit tests
uv run pytest tests/integration/grpc/ -v -m e2e                 # gRPC E2E
uv run pytest -n auto --cov=bindu --cov-report=term-missing     # full suite

Contributing

git clone https://github.com/getbindu/Bindu.git
cd Bindu
uv venv --python 3.12.9 && source .venv/bin/activate
uv sync --dev
pre-commit run --all-files

The full guide is in .github/contributing.md. Most of the day-to-day back-and-forth happens on Discord — come say hi.


Maintainers

Raahul Dutta
Raahul Dutta
Paras Chamoli
Paras Chamoli
Chandan
Chandan

Acknowledgements

Bindu stands on the shoulders of a lot of good open source:

FastA2A · A2A · x402 · Hugging Face chat-ui · 12 Factor Agents · OpenCode · OpenMoji · ASCII Space Art


Star history

Star history

License

Apache 2.0. See LICENSE.md.

"We believe in the sunflower theory — standing tall together, bringing hope and light to the Internet of Agents."

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

bindu-2026.21.1.tar.gz (13.9 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

bindu-2026.21.1-py3-none-any.whl (340.8 kB view details)

Uploaded Python 3

File details

Details for the file bindu-2026.21.1.tar.gz.

File metadata

  • Download URL: bindu-2026.21.1.tar.gz
  • Upload date:
  • Size: 13.9 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for bindu-2026.21.1.tar.gz
Algorithm Hash digest
SHA256 a565b637652625bbd623e0011a4a52f65095f7868a337cf72cc1146090b7f4e5
MD5 9dee01fbfa23edb01f9d9c5671ec9fb7
BLAKE2b-256 f39ee4af3904546f62985afc35cdbcc2fb6e5518e9dfd12fa0a1feaf8b387a2c

See more details on using hashes here.

File details

Details for the file bindu-2026.21.1-py3-none-any.whl.

File metadata

  • Download URL: bindu-2026.21.1-py3-none-any.whl
  • Upload date:
  • Size: 340.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.14 {"installer":{"name":"uv","version":"0.11.14","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for bindu-2026.21.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e7b52ebaa534adaa2c455ed09b51b41e01ac5c548007fbbb02794f475a81493d
MD5 7d4af920afceb3741ca665f3a6b15f78
BLAKE2b-256 43b8afb6cb21c3f9471f68cf28b445db14d9d76ee3abc67339b31e760ae6c77d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page