Keppler
Keppler is a human-gated learning layer for agent fleets. Agents submit patterns with evidence, a debate engine challenges and evaluates each proposal, and a reviewer decides what enters the immutable knowledge history.
The current local reference implementation includes the core learning loop and the organization/federation protocol foundation:
- register an agent;
- propose a pattern with evidence;
- run a deterministic challenge and evaluation;
- approve or reject the proposal in the review console; and
- expose approved knowledge to another agent;
- isolate resources by organization namespace;
- federate approved knowledge with explicit receiver consent;
- expose approved patterns as read-only MCP tools; and
- bridge pattern proposals to the A2A 1.0 REST task lifecycle.
The original roadmap briefs are preserved as product inputs. The implemented scope and explicit non-goals live in docs/PRODUCT_SCOPE.md.
Quick start
Install from PyPI
The client and observer use only the Python standard library:
python -m pip install keppler
Install the API server dependencies when hosting Keppler:
python -m pip install 'keppler[server]'
keppler
API development
Keppler targets Python 3.12.
python3.12 -m venv .venv
.venv/bin/pip install -e '.[dev]'
.venv/bin/uvicorn keppler.api:app --reload --port 8000
The API documentation is then available at http://localhost:8000/docs.
Review console
Keppler targets Node.js 22.12+ and pnpm.
cd frontend
pnpm install
pnpm dev
Open http://localhost:5173. The console expects the API at
http://localhost:8000 unless VITE_API_URL is set.
Tests
.venv/bin/pytest backend/tests
cd frontend && pnpm build
API walkthrough
Register an agent:
curl -X POST http://localhost:8000/v1/agents \
-H 'content-type: application/json' \
-d '{"name":"agent-a","capabilities":["postgres","api-design"]}'
Submit a pattern using the returned agent ID:
curl -X POST http://localhost:8000/v1/proposals \
-H 'content-type: application/json' \
-d '{
"agent_id":"<agent-id>",
"title":"Bound database concurrency",
"context":"A service opens many concurrent PostgreSQL connections.",
"pattern":"Use a bounded connection pool and measure queue wait time.",
"evidence":[
"Load test reduced open connections from 120 to 20.",
"p95 request latency fell from 420ms to 180ms."
]
}'
Proposals with sufficient evidence enter pending_review; the review console
can approve them into the knowledge history.
Organization-aware requests are scoped with X-Keppler-Org. Omitting it preserves legacy
behavior by selecting the built-in local organization. This header is context,
not authentication; see docs/MULTI-TENANCY.md before any
production deployment.
Product APIs
POST /v1/kep/messages— KEP 0.1/1.0 pattern envelopesGET/POST /v1/organizations— organization namespacesGET /v1/skillsandPOST /mcp— MCP skill discovery and invocationGET/POST /v1/federation— receiver-consented federation workflowGET /v1/sync?after=<sequence>— organization-scoped delta feed/.well-known/agent-card.json,/message:send,/tasks/{id}— A2A bridge
Metadata
Release files for keppler 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| keppler-0.2.0.tar.gz | 21.0 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| keppler-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 45.5 kB
Release files / keppler-0.2.0.tar.gz
| Download URL | keppler-0.2.0.tar.gz |
|---|---|
| Size | 21.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
31377a6595cb4ee96a2cf3f1ddba1c9c767b74fb422f7142f414ecab8d7c8a45
|
|
BLAKE2b-256 checksum How to use checksums |
132c7c7ee4a2bdd4626a8a56bd8d4c4215bdc448b68f3a4eb8c88d68d4574fea
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.14
|
Release files / keppler-0.2.0-py3-none-any.whl
| Download URL | keppler-0.2.0-py3-none-any.whl |
|---|---|
| Size | 24.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ac09e400263d43ba3dc7c33fcd083fb635fc7378d40644091d6240b8441298df
|
|
BLAKE2b-256 checksum How to use checksums |
24cc755136235c913a4b02e54ff16b2758b10b2ba3041260eff9e19aa841ddb9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.12.14
|