Standardized Agent Runtime (MVP)
Run a preset-based AI agent gateway and call it immediately via a stable HTTP contract. The north-star workflow is: run the service locally/VM → call POST /invoke with JSON → get consistent JSON back (with discoverable docs at GET /schema and Swagger at /docs).
Quickstart (pipx recommended)
All examples use port 4280.
agent-toolbox requires Python 3.10+.
Install with pipx (recommended for CLI apps):
python3 -m pip install --user pipx
python3 -m pipx ensurepath
pipx install agent-toolbox
If you prefer a project-local environment, use bootstrap (creates .venv, upgrades pip, installs package):
./scripts/bootstrap.sh
Or run manually with venv:
python3.10 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install agent-toolbox
One-time setup helper (prints provider/env guidance):
agent-toolbox setup
Homebrew Python note (macOS)
If global pip install ... fails (PEP 668 / externally-managed environment), use a venv with an explicit interpreter:
brew install python@3.10
/opt/homebrew/bin/python3.10 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install agent-toolbox
If you prefer Homebrew for pipx on macOS:
brew install pipx
pipx ensurepath
pipx install agent-toolbox
If agent-toolbox command is not found after install, run:
python -m pip show agent-toolbox
agent-toolbox doctor
Run a specific agent preset (presets are bundled in the package):
macOS/Linux (bash/zsh):
source .venv/bin/activate
AGENT_PRESET=summarizer agent-toolbox
Windows PowerShell:
.\.venv\Scripts\activate
$env:AGENT_PRESET="summarizer"
agent-toolbox
WSL (Ubuntu bash):
source .venv/bin/activate
AGENT_PRESET=summarizer agent-toolbox
For other presets, set AGENT_PRESET to meeting_notes, extractor, classifier, or triage.
Open Swagger UI at http://localhost:4280/docs.
Quickstart (repo/dev)
If you're contributing or running from source:
git clone <REPO_URL>
cd agent-toolbox
python3 -m venv .venv
source .venv/bin/activate
python -m pip install -U pip
python -m pip install -r requirements.txt
AGENT_PRESET=summarizer uvicorn app.main:app --host 0.0.0.0 --port 4280
Docker (alternative)
make docker-up AGENT=summarizer
To stop containers:
make docker-down
Docker (no repo)
Once the GHCR image is published, you can run without cloning:
docker run --rm -p 4280:4280 -e AGENT_PRESET=summarizer ghcr.io/sharathb5/agent-toolbox:latest
Docker Compose
docker compose up --build
To switch presets:
AGENT_PRESET=triage docker compose up --build
API + Schema (stable across presets)
GET /– service metadataGET /health– health infoGET /schema– active preset schemas (no provider calls)GET /examples– plug-and-play input/output example for active presetPOST /invoke– core invocationPOST /stream– 501 Not Implemented in v1
Examples (plug-and-play)
All examples assume the server is running at http://localhost:4280.
Health
curl http://localhost:4280/health
Schema + examples
curl http://localhost:4280/schema
curl http://localhost:4280/examples
For a specific preset:
curl http://localhost:4280/agents/summarizer/examples
Example response (trimmed):
{
"agent": "summarizer",
"example": {
"input": {"text": "OpenAI released a new model that improves reasoning and tool use."},
"output": {"summary": "A new OpenAI model improves reasoning and tool use.", "bullets": ["Improved reasoning", "Better tool use"]}
}
}
Invoke using the example input
curl -X POST http://localhost:4280/invoke \
-H "Content-Type: application/json" \
-d '{"input": {"text": "OpenAI released a new model that improves reasoning and tool use."}}'
Auth example (Clerk)
Mutating endpoints (like POST /agents/register) require a Clerk session token when Clerk is configured. Pass a Bearer token from your frontend session.
CLERK_JWKS_URL=https://<clerk-frontend-api>/.well-known/jwks.json \
CLERK_ISSUER=https://<clerk-frontend-api> \
uvicorn app.main:app --host 0.0.0.0 --port 4280
curl -X POST http://localhost:4280/invoke \
-H "Authorization: Bearer <clerk-session-token>" \
-H "Content-Type: application/json" \
-d '{"input": {"text": "hello"}}'
Legacy: setting AUTH_TOKEN enables a static bearer token for dev/tests.
Context and session memory
You can pass optional context on POST /invoke to use session memory. Presets that support memory (e.g. summarizer, triage) use a memory policy (last N events, max chars) when building the prompt.
Invoke with optional context
- Backward compatible:
{"input": {...}}only is valid; nocontextrequired. - With session:
{"input": {...}, "context": {"session_id": "<id>"}}uses stored events for that session (and adds this invoke to the session when the preset supports memory). - With inline memory:
{"input": {...}, "context": {"memory": [{"role": "user", "content": "..."}]}}passes recent context without a session. - Empty context:
{"input": {...}, "context": {}}is accepted and does not fail.
When a session is used, the success response includes meta.session_id and meta.memory_used_count.
Session Memory API
POST /sessions– Create a new session. Body optional. Returns 201 with{ "session_id": "<uuid>" }. The active preset id is used asagent_id.POST /sessions/{id}/events– Append events. Body:{ "events": [ { "role": "user", "content": "..." }, ... ] }. Returns 200 with{ "ok": true, "session_id": "<id>", "appended": N }.GET /sessions/{id}– Get session. Returns 200 with{ "session_id", "agent_id", "created_at", "events", "running_summary" }or 404 when the session does not exist.
Policy (last N events, max chars)
Presets that set supports_memory: true and memory_policy in YAML (e.g. summarizer, triage) apply:
- max_messages: only the last N events are included in the prompt.
- max_chars: total event content is truncated to this many characters.
Example: summarizer uses max_messages: 2, max_chars: 8000 so the prompt contains at most 2 stored events (and up to 8000 chars).
curl examples (session memory)
Create a session:
curl -X POST http://localhost:4280/sessions
# → 201 { "session_id": "..." }
Append an event (e.g. a note):
SESSION_ID="<paste session_id from above>"
curl -X POST "http://localhost:4280/sessions/${SESSION_ID}/events" \
-H "Content-Type: application/json" \
-d '{"events": [{"role": "user", "content": "Reminder: follow up on Q3 report"}]}'
# → 200 { "ok": true, "session_id": "...", "appended": 1 }
Invoke with session (success response includes meta.session_id and meta.memory_used_count):
curl -X POST http://localhost:4280/invoke \
-H "Content-Type: application/json" \
-d "{\"input\": {\"text\": \"Summarize my notes.\"}, \"context\": {\"session_id\": \"${SESSION_ID}\"}}"
Get session (events, agent_id, created_at):
curl "http://localhost:4280/sessions/${SESSION_ID}"
CORS (frontend Session tab)
Set CORS_ORIGINS so the frontend can call the gateway (e.g. Session tab). Example: CORS_ORIGINS=http://localhost:3000 or * for development.
Configuration (environment variables)
AGENT_PRESET: which preset to load (default:summarizer). Presets are YAML files bundled in the package (app/presets).PROVIDER: provider implementation (default:stub). Useopenrouterfor one API key and many models (recommended).AUTH_TOKEN: optional legacy bearer auth for dev/tests (Authorization: Bearer <token>).CLERK_JWKS_URL: Clerk JWKS URL for verifying session tokens (e.g.https://<clerk-frontend-api>/.well-known/jwks.json).CLERK_JWT_KEY: optional Clerk JWT public key (PEM). Use this instead of JWKS if you prefer.CLERK_ISSUER: expected token issuer (usuallyhttps://<clerk-frontend-api>).CLERK_AUDIENCE: optional audience to enforce in JWT verification.CLERK_AUTHORIZED_PARTIES: optional comma-separatedazpallowlist.OPENROUTER_API_KEY: required whenPROVIDER=openrouter. Get a key at openrouter.ai/keys.OPENROUTER_MODEL: optional model id (default:openai/gpt-4o-mini). See openrouter.ai/models.OPENAI_API_KEY/OPENAI_MODEL: optional, for direct OpenAI whenPROVIDER=openai.DATABASE_URL: Postgres connection string (Supabase). When set, Postgres is used for registry + sessions.DB_PATH: path to SQLite DB whenDATABASE_URLis not set (default:./data/gateway.db).SESSION_DB_PATH: legacy alias forDB_PATH(still supported).CORS_ORIGINS: comma-separated origins for CORS (default:*). Use e.g.http://localhost:3000for the frontend Session tab.NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY: Clerk publishable key for the frontend.CLERK_SECRET_KEY: Clerk secret key for the frontend server.NEXT_PUBLIC_CLERK_JWT_TEMPLATE: optional Clerk JWT template name used when requesting tokens from the frontend.
Providers
- StubProvider (default): deterministic JSON output, runs with no API keys.
- OpenRouterProvider (recommended): one API key for many models (OpenAI, Claude, Gemini, etc.). Set
PROVIDER=openrouterandOPENROUTER_API_KEY. - OpenAIProvider (optional): direct OpenAI; set
PROVIDER=openaiandOPENAI_API_KEY.
Architecture (request flow)
POST /invoke follows this pipeline:
- auth (mutating endpoints only; Clerk session token when configured) →\
- input validation (jsonschema) →\
- engine/router selects primitive (
transform/extract/classify) →\ - provider call →\
- output validation (jsonschema) →\
- one repair attempt (if invalid) → response
In v1, POST /stream returns 501 Not Implemented with a standard error envelope.
Docker (direct)
docker build -t agent-gateway .
docker run --rm -p 4280:4280 \
-e AGENT_PRESET=summarizer \
-e PROVIDER=stub \
agent-gateway
Release files for agent-toolbox 0.1.3
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| agent_toolbox-0.1.3.tar.gz | 47.3 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| agent_toolbox-0.1.3-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 87.8 kB
Release files / agent_toolbox-0.1.3.tar.gz
| Download URL | agent_toolbox-0.1.3.tar.gz |
|---|---|
| Size | 47.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
799c1c99ea90ebaf2391f4fcbc65f6479cad7ff7cd179e170bafa71f87b4d61c
|
|
BLAKE2b-256 checksum How to use checksums |
ced246f7088cbfcce0f1c437c52703d1b4bf1637efeb8e0341b1d9e3a4c24c0a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|
Release files / agent_toolbox-0.1.3-py3-none-any.whl
| Download URL | agent_toolbox-0.1.3-py3-none-any.whl |
|---|---|
| Size | 40.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4f79bc0da4d01d6f7058dde3df00956f69a6ee0fad44463f61d73b873ed589e8
|
|
BLAKE2b-256 checksum How to use checksums |
c364e2591b7a21d0fd836c74e0d39e00a9513bb0e9c0eac23d91a515c0edd4e9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.13.5
|