Standardized Agent Runtime — preset-based AI agent gateway with stable HTTP API
Project description
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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file agent_toolbox-0.1.3.tar.gz.
File metadata
- Download URL: agent_toolbox-0.1.3.tar.gz
- Upload date:
- Size: 47.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
799c1c99ea90ebaf2391f4fcbc65f6479cad7ff7cd179e170bafa71f87b4d61c
|
|
| MD5 |
4c2a2c0d6035ca55139a0baf2278e134
|
|
| BLAKE2b-256 |
ced246f7088cbfcce0f1c437c52703d1b4bf1637efeb8e0341b1d9e3a4c24c0a
|
File details
Details for the file agent_toolbox-0.1.3-py3-none-any.whl.
File metadata
- Download URL: agent_toolbox-0.1.3-py3-none-any.whl
- Upload date:
- Size: 40.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.5
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4f79bc0da4d01d6f7058dde3df00956f69a6ee0fad44463f61d73b873ed589e8
|
|
| MD5 |
1b0269a453dbdd2f32cb987b33f0f795
|
|
| BLAKE2b-256 |
c364e2591b7a21d0fd836c74e0d39e00a9513bb0e9c0eac23d91a515c0edd4e9
|