Features
Built for AI application developers
Agents, functions, database queries, state, files, and templates — behind a single API with role-based access control. Deploy with Docker Compose.
Agents
Multi-provider AI agent
Deploy conversational AI with any provider. Agents call tools, other agents, and maintain state across conversations.
Multi-provider support
Granular permissions with wildcard matching and scope hierarchy. :all automatically grants :own. Define custom permission prefixes for external apps.
Multi-provider support
Granular permissions with wildcard matching and scope hierarchy. :all automatically grants :own. Define custom permission prefixes for external apps.
Tool calling
Agents call functions, queries, other agents, skills, state, and file search as tools. Parallel tool execution where possible. Approval flow for sensitive operations.
Tool calling
Agents call functions, queries, other agents, skills, state, and file search as tools. Parallel tool execution where possible. Approval flow for sensitive operations.
Agent-to-agent orchestration
Agents call other agents as sub-tools via async queue. Results stream back via Redis Streams. No recursive blocking.
Agent-to-agent orchestration
Agents call other agents as sub-tools via async queue. Results stream back via Redis Streams. No recursive blocking.
Skills system
Reusable instruction documents. Preload into system prompts for always-on guidance, or expose as tools for progressive disclosure.
Skills system
Reusable instruction documents. Preload into system prompts for always-on guidance, or expose as tools for progressive disclosure.
Streaming responses
Server-Sent Events with reconnectable Redis Streams. Clients can reconnect to any active stream from any position.
Streaming responses
Server-Sent Events with reconnectable Redis Streams. Clients can reconnect to any active stream from any position.
Function parameter defaults
Pre-fill tool parameters per agent with Jinja2 templates. Lock sensitive values like user_id so the LLM cannot override them.
Function parameter defaults
Pre-fill tool parameters per agent with Jinja2 templates. Lock sensitive values like user_id so the LLM cannot override them.
Functions
Serverless Python execution
Write Python, deploy instantly. Isolated Docker containers with automatic execution tracking and nested call trees.
Isolated containers
Pre-warmed Docker container pool with configurable memory (512MB), CPU (1 core), disk (1GB), and timeout (300s) limits. Recycled after N executions.
Isolated containers
Pre-warmed Docker container pool with configurable memory (512MB), CPU (1 core), disk (1GB), and timeout (300s) limits. Recycled after N executions.
Execution tracking
AST injection adds tracking decorators to all function definitions. Nested calls build execution trees with timing, input/output, and error data.
Execution tracking
AST injection adds tracking decorators to all function definitions. Nested calls build execution trees with timing, input/output, and error data.
Multiple triggers
Execute via API (sync or async), webhooks, cron schedules, or agent tool calls. Each trigger type is tracked in execution history.
Multiple triggers
Execute via API (sync or async), webhooks, cron schedules, or agent tool calls. Each trigger type is tracked in execution history.
Package management
Admin-approved Python packages only. Whitelist control, hot-reload into running containers, and version pinning.
Package management
Admin-approved Python packages only. Whitelist control, hot-reload into running containers, and version pinning.
Package management
Admin-approved Python packages only. Whitelist control, hot-reload into running containers, and version pinning.
Data
Database queries & state
SQL templates for external databases. Key-value state for agent memory. Both usable as agent tools.
SQL query templates
Parameterized SQL with :param_name placeholders. Input/output schema validation. Read and write operations with timeout and row limits.]
SQL query templates
Parameterized SQL with :param_name placeholders. Input/output schema validation. Read and write operations with timeout and row limits.]
Multiple databases
PostgreSQL, ClickHouse, and Snowflake. Connection pooling with automatic invalidation on config changes. Encrypted credentials.
Multiple databases
PostgreSQL, ClickHouse, and Snowflake. Connection pooling with automatic invalidation on config changes. Encrypted credentials.
Persistent state
Namespace-based key-value storage. Private or shared visibility. Optional TTL expiration. Agents declare read-only or read-write access per namespace.
Persistent state
Namespace-based key-value storage. Private or shared visibility. Optional TTL expiration. Agents declare read-only or read-write access per namespace.
Locked query parameters
Lock sensitive parameters (user_id, email) so the LLM can't override them. Jinja2 template support for dynamic defaults from agent input variables.
Locked query parameters
Lock sensitive parameters (user_id, email) so the LLM can't override them. Jinja2 template support for dynamic defaults from agent input variables.
Locked query parameters
Lock sensitive parameters (user_id, email) so the LLM can't override them. Jinja2 template support for dynamic defaults from agent input variables.
Platform
Everything else you need
Everything else you need
Role-based access control
Permission format: service.resource.action:scope. Wildcards, scope hierarchy (:all grants :own), and custom prefixes for external apps.
Role-based access control
Permission format: service.resource.action:scope. Wildcards, scope hierarchy (:all grants :own), and custom prefixes for external apps.
Declarative config
YAML configuration with idempotent apply, SHA256 change detection, env var interpolation, reference validation, and dry-run. Auto-apply on startup.
Declarative config
YAML configuration with idempotent apply, SHA256 change detection, env var interpolation, reference validation, and dry-run. Auto-apply on startup.
Authentication
OTP email login, external OIDC (Authentik, Auth0, Keycloak), API keys with scoped permissions. JWT access + refresh tokens.
Authentication
OTP email login, external OIDC (Authentik, Auth0, Keycloak), API keys with scoped permissions. JWT access + refresh tokens.
File collections
Upload, version, and search files. Metadata validation against JSON Schema. Content filtering and post-upload processing hooks.
File collections
Upload, version, and search files. Metadata validation against JSON Schema. Content filtering and post-upload processing hooks.
Template engine
Jinja2 templates for emails and dynamic content. Variable validation, XSS auto-escaping, render and send endpoints.
Template engine
Jinja2 templates for emails and dynamic content. Variable validation, XSS auto-escaping, render and send endpoints.
Request logging
Every request logged to ClickHouse. Permission tracking, duration metrics, user attribution. Auth endpoints automatically redacted.
Request logging
Every request logged to ClickHouse. Permission tracking, duration metrics, user attribution. Auth endpoints automatically redacted.
GET STARTED IN MINUTES
Ready to build?
Three commands to install. Open source. Deploy anywhere.
GET STARTED IN MINUTES
Ready to build?
Three commands to install. Open source. Deploy anywhere.
GET STARTED IN MINUTES
Ready to build?
Three commands to install. Open source. Deploy anywhere.