Skip to main content

Infrastructure for building and deploying AI agents

Project description

Definable

Infrastructure for building and deploying AI agents with a simple YAML configuration and base class extension pattern.

Features

  • Simple Base Class: Extend AgentBox to create your agent
  • YAML Configuration: Configure builds with declarative YAML files
  • Docker Packaging: Build Docker images with a single command
  • FastAPI Integration: Automatic REST API generation with OpenAPI docs
  • CLI Tools: Complete toolkit with init, build, serve, push, and config commands
  • Project Scaffolding: Generate new agent projects with templates
  • Remote Deployment: Push agents to deployment servers
  • Hook System: Pre and post-processing hooks for middleware

Quick Start

1. Install Definable

pip install definable

2. Initialize a New Project

# Create a new agent project with interactive prompts
definable init

# Or specify details directly
definable init --name my-agent --description "My custom agent" --version 1.0.0

This creates:

  • main.py - Your agent implementation
  • agent.yaml - Configuration file
  • .agentignore - Files to exclude from builds
  • README.md - Project documentation

3. Create Your Agent

The generated main.py provides a template, or create your own:

# main.py
from definable import AgentBox, AgentInput, AgentOutput, AgentInfo
from pydantic import Field

class SampleAgentInput(AgentInput):
    message: str = Field(description="Input message to process")

class SampleAgentOutput(AgentOutput):
    response_message: str = Field(description="Processed response message")

class DemoAgent(AgentBox):
    def setup(self):
        """Initialize your agent - called once on startup"""
        self.name = 'demo-agent'
        self.version = '1.0.0'
        print("Demo agent initialized!")
    
    def invoke(self, agent_input: SampleAgentInput) -> SampleAgentOutput:
        """Main agent logic - called for each request"""
        processed_message = f"Processed: {agent_input.message.upper()}"
        return SampleAgentOutput(response_message=processed_message)
    
    def info(self) -> AgentInfo:
        """Return agent metadata for API documentation"""
        return AgentInfo(
            name=self.name,
            description="A simple demo agent that processes messages",
            version=self.version,
            input_schema=SampleAgentInput.model_json_schema(),
            output_schema=SampleAgentOutput.model_json_schema()
        )

4. Configure Your Agent

The agent.yaml file configures the build and deployment:

# agent.yaml
build:
  python_version: "3.11"
  dependencies:
    - "requests>=2.28.0"
    - "openai"  # Add your specific dependencies
  system_packages:
    - "curl"
  environment_variables:
    - API_KEY  # Environment variables to pass through

agent: "main.py:DemoAgent"

platform:
  name: "demo-agent"
  description: "A simple demo agent for testing"
  version: "1.0.0"

concurrency:
  max_concurrent_requests: 50
  request_timeout: 300

5. Develop and Deploy

# Serve locally for development (includes hot reload)
definable serve -p 8000

# Build Docker image for production
definable build -t my-agent

# Push to deployment server (if configured)
definable push

# Manage configuration
definable config

CLI Commands

  • definable init - Initialize a new agent project with templates
  • definable serve - Serve agent locally for development
  • definable build - Build Docker image from agent configuration
  • definable push - Deploy agent to remote deployment server
  • definable config - Manage global configuration settings

CLI Options

# Serve with custom options
definable serve --port 3000 --host localhost --file custom-agent.yaml

# Build with custom tag and config
definable build -t my-agent:v1.2.0 -f production-agent.yaml

# Push with deployment options
definable push -n my-agent

Advanced Features

Hook System

Add pre and post-processing logic:

class MyAgent(AgentBox):
    def pre_hook(self):
        """Called before invoke()"""
        print("Pre-processing...")
    
    def post_hook(self):
        """Called after invoke()"""
        print("Post-processing...")

Flexible Input/Output

You can use any types for inputs and outputs:

def invoke(self, agent_input: dict) -> str:
    """Simple string-to-string agent"""
    return f"Echo: {agent_input.get('message', '')}"

Environment Configuration

The framework supports environment variables and secrets:

build:
  environment_variables:
    - DATABASE_URL
    - API_SECRET
    - DEBUG=false

API Documentation

When served, your agent automatically gets:

  • OpenAPI/Swagger docs at /docs
  • Health check endpoint at /health
  • Agent info endpoint at /info

Requirements

  • Python: 3.9 or higher
  • Docker: Required for building images
  • Dependencies: FastAPI, Uvicorn, Pydantic, Click, Docker SDK

License

MIT License - see LICENSE file for details.

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

definable-0.2.0.tar.gz (19.9 kB view details)

Uploaded Source

Built Distribution

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

definable-0.2.0-py3-none-any.whl (23.4 kB view details)

Uploaded Python 3

File details

Details for the file definable-0.2.0.tar.gz.

File metadata

  • Download URL: definable-0.2.0.tar.gz
  • Upload date:
  • Size: 19.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for definable-0.2.0.tar.gz
Algorithm Hash digest
SHA256 1dcb30063a0e76017aaea8e9786433127fc2020e69b2baa2c70ba9ccdf166825
MD5 dd63afe3bc9ac9e5d2ee149321127ebf
BLAKE2b-256 881a99c906f348460c85a144682e5c6847fb04f7c12575eeab173a3d70fe08cd

See more details on using hashes here.

File details

Details for the file definable-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: definable-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 23.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.9.6

File hashes

Hashes for definable-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 85871e7bcad4cb632f77ba713c3d94e1151d92f488b6412438df8c927cd8f4c1
MD5 20040ba90cd3918658eab903100502e0
BLAKE2b-256 77b5df2a45b3833f529c0ae8b19cd5cc0760b2723ba9cc00573b2ebb498ab3f0

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