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.2.tar.gz (22.2 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.2-py3-none-any.whl (26.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: definable-0.2.2.tar.gz
  • Upload date:
  • Size: 22.2 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.2.tar.gz
Algorithm Hash digest
SHA256 af1ef117abe4aaa61ccf8439287dee3783508d711be2b2a0bcd89e8fcd96594f
MD5 8eef455bc145cd778535cb6c8c981341
BLAKE2b-256 cf3f3e04a32d395639c87f7795016707098e0680fdd8d9638860f52341886b8a

See more details on using hashes here.

File details

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

File metadata

  • Download URL: definable-0.2.2-py3-none-any.whl
  • Upload date:
  • Size: 26.0 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.2-py3-none-any.whl
Algorithm Hash digest
SHA256 8138701e26eb43103b5b432224b7a04292ebef90e4eb641a4f104470c09e2758
MD5 3d1442dafe4735e32db45b51cbc8c47b
BLAKE2b-256 e68b7e44bce017ea593884b64a3a09152265be6c0b2fa7168519214de76d0ad5

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