Skip to main content

Universal runtime for AI agents - Deploy any agent with one line of code

Project description

Agent Platform - Universal Runtime & Hosting for AI Agents

Deploy and share your AI agents instantly. Transform any Python AI agent (CrewAI, LangGraph, OpenAI) into a production-ready streaming API with just one line of code, then deploy and share with one command.

Features

โœจ One-Line Integration: Wrap any agent with serve() ๐Ÿš€ Instant Deployment: Deploy with agent deploy (< 1 second) ๐Ÿ”— Auto-Generated URLs: Get shareable links instantly ๐Ÿ’ฌ Chat UI Included: Beautiful Next.js frontend with expert review panel ๐Ÿ”„ Real-time Streaming: SSE-based token streaming ๐ŸŽฏ Multi-Tenant: Host unlimited agents on one server ๐Ÿ›ก๏ธ Secure: UUID-based isolation, timeout enforcement ๐Ÿ”Œ Framework Agnostic: OpenAI, CrewAI, LangGraph, or plain Python

Quick Start

Option A: Deploy & Share (Recommended)

1. Install CLI

cd /Users/kazuma/Desktop/AXEN\ INC./dev/runtime-app
pip install -e ".[cli]"

2. Initialize Your Agent

mkdir my-agent
cd my-agent
python -m cli init --name my-agent

This creates:

  • agent.yaml - Configuration file
  • main.py - Sample agent code

3. Implement Your Agent

Edit main.py:

from agent_runner import serve
from typing import List
from agent_runner.types import Message

def my_agent(messages: List[Message]):
    """Your agent logic here."""
    latest_message = messages[-1]["content"]

    # Your AI logic...
    response = f"Response to: {latest_message}"

    # Yield tokens for streaming
    for word in response.split():
        yield word + " "

# Register the agent
serve(my_agent)

4. Deploy

# Start the platform (first time only)
cd /Users/kazuma/Desktop/AXEN\ INC./dev/runtime-app
docker-compose up -d

# Deploy your agent
cd my-agent
python -m cli deploy

Output:

โœ… Deployment successful!
๐Ÿ“‹ Deployment ID: 550e8400-e29b-41d4-a716-446655440000
๐Ÿ”— Access your agent here:
   http://localhost:3000/chat/550e8400-e29b-41d4-a716-446655440000

5. Share & Use

Share the URL with anyone. They can:

  • Chat with your agent via the web UI
  • Integrate via API using the deployment_id

Option B: Local Development (Docker)

For developing agents locally before deployment:

1. Install SDK

pip install -e .

2. Write Your Agent

# main.py
from agent_runner import serve
from typing import List
from agent_runner.types import Message

def my_agent(messages: List[Message]):
    latest_message = messages[-1]["content"]
    yield f"Echo: {latest_message}"

serve(my_agent)

3. Build & Run

# Make build script executable
chmod +x sandbox/build.sh

# Build Docker images
./sandbox/build.sh

# Run the agent
docker run -p 8000:8000 agent-runtime:latest

4. Test It

curl -X POST http://localhost:8000/api/chat \
     -H "Content-Type: application/json" \
     -d '{"messages": [{"role": "user", "content": "Hello!"}]}'

Deploy & Share

CLI Commands

agent init

Initialize a new agent project:

python -m cli init [OPTIONS]

Options:

  • --name, -n TEXT: Agent name (default: "my-agent")
  • --force, -f: Overwrite existing files

Example:

python -m cli init --name awesome-chatbot

agent deploy

Deploy your agent to the platform:

python -m cli deploy [OPTIONS]

Options:

  • --api-url TEXT: API server URL (default: http://localhost:8000)

Example:

python -m cli deploy --api-url https://api.axen.dev

agent.yaml Configuration

The agent.yaml file configures your agent:

# Basic Information
name: my-agent
description: A simple AI agent
version: 1.0.0

# Runtime Configuration
runtime:
  python_version: "3.11"
  entrypoint: main.py
  framework: auto  # auto, openai, crewai, langgraph, generic
  timeout: 300     # seconds

# Dependencies (optional)
dependencies:
  - openai==1.6.0
  - langchain==0.1.0

# Environment Variables (optional)
env:
  MODEL_NAME: gpt-4

Deployment Process

When you run agent deploy:

  1. โœ… Validates agent.yaml and main.py
  2. ๐Ÿ“ฆ Packages code into project.zip (excludes venv, .git, etc.)
  3. ๐Ÿš€ Uploads to server at /api/deploy
  4. ๐Ÿ”‘ Generates unique deployment_id (UUID)
  5. ๐Ÿ“ Extracts to uploads/{deployment_id}/
  6. ๐Ÿ”— Returns shareable URL

No Docker build = Instant deployment (< 1 second)

Accessing Deployed Agents

Via Web UI:

http://localhost:3000/chat/{deployment_id}

Via API:

curl -X POST http://localhost:8000/api/chat/{deployment_id} \
  -H "Content-Type: application/json" \
  -d '{"messages": [{"role": "user", "content": "Hello"}]}'

Examples

Plain Python Generator

from agent_runner import serve
from typing import List
from agent_runner.types import Message
import time

def my_simple_agent(messages: List[Message]):
    latest_message = messages[-1]["content"]
    for word in latest_message.split():
        yield word + " "
        time.sleep(0.1)

serve(my_simple_agent)

OpenAI Streaming (with Full Conversation History)

from agent_runner import serve
from agent_runner.types import Message
from openai import OpenAI
from typing import List
import os

def my_openai_agent(messages: List[Message]):
    client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
    # Pass full conversation history directly to OpenAI
    stream = client.chat.completions.create(
        model="gpt-4",
        messages=messages,  # Full history!
        stream=True
    )
    for chunk in stream:
        if chunk.choices[0].delta.content:
            yield chunk.choices[0].delta.content

serve(my_openai_agent, framework="openai")

CrewAI Multi-Agent

from agent_runner import serve
from crewai import Agent, Task, Crew

def my_crew_agent(input_text: str):
    # Define agents
    researcher = Agent(role='Researcher', goal='Research topic')
    writer = Agent(role='Writer', goal='Write summary')

    # Create crew
    crew = Crew(agents=[researcher, writer], tasks=[...])
    result = crew.kickoff()

    for word in str(result).split():
        yield word + " "

serve(my_crew_agent, framework="crewai")

LangGraph Workflow

from agent_runner import serve
from langgraph.graph import StateGraph, END

def my_graph_agent(input_text: str):
    workflow = StateGraph(...)
    # Build graph...
    app = workflow.compile()

    for state in app.stream({"input": input_text}):
        yield state.get("output", "")

serve(my_graph_agent, framework="langgraph")

Project Structure

runtime-app/
โ”œโ”€โ”€ cli.py                       # Deployment CLI
โ”œโ”€โ”€ templates/                   # CLI templates
โ”‚   โ”œโ”€โ”€ agent.yaml               # Agent config template
โ”‚   โ””โ”€โ”€ main.py                  # Sample agent code
โ”œโ”€โ”€ uploads/                     # Deployed agents
โ”‚   โ””โ”€โ”€ {deployment_id}/         # One directory per deployment
โ”‚
โ”œโ”€โ”€ agent_runner/                # Universal SDK
โ”‚   โ”œโ”€โ”€ __init__.py              # Public API
โ”‚   โ”œโ”€โ”€ sdk.py                   # Core serve() function
โ”‚   โ”œโ”€โ”€ types.py                 # Type definitions
โ”‚   โ”œโ”€โ”€ logger.py                # Logging
โ”‚   โ”œโ”€โ”€ exceptions.py            # Custom exceptions
โ”‚   โ”œโ”€โ”€ adapters/                # Framework adapters
โ”‚   โ”‚   โ”œโ”€โ”€ base.py
โ”‚   โ”‚   โ”œโ”€โ”€ generic_adapter.py
โ”‚   โ”‚   โ”œโ”€โ”€ openai_adapter.py
โ”‚   โ”‚   โ”œโ”€โ”€ crewai_adapter.py
โ”‚   โ”‚   โ””โ”€โ”€ langgraph_adapter.py
โ”‚   โ””โ”€โ”€ streaming/               # Async/sync bridge
โ”‚       โ””โ”€โ”€ normalizer.py
โ”‚
โ”œโ”€โ”€ runtime/                     # FastAPI server
โ”‚   โ”œโ”€โ”€ server.py                # HTTP endpoints
โ”‚   โ”œโ”€โ”€ loader.py                # Dynamic agent loader
โ”‚   โ”œโ”€โ”€ config.py                # Configuration
โ”‚   โ”œโ”€โ”€ middleware.py            # Timeout, rate limiting
โ”‚   โ””โ”€โ”€ routers/
โ”‚       โ””โ”€โ”€ deploy.py            # Deployment API
โ”‚
โ”œโ”€โ”€ frontend/                    # Next.js Chat UI
โ”‚   โ”œโ”€โ”€ app/
โ”‚   โ”‚   โ”œโ”€โ”€ page.tsx             # Main chat page
โ”‚   โ”‚   โ””โ”€โ”€ layout.tsx           # Root layout
โ”‚   โ”œโ”€โ”€ components/
โ”‚   โ”‚   โ”œโ”€โ”€ chat.tsx             # Chat interface (useChat)
โ”‚   โ”‚   โ”œโ”€โ”€ message.tsx          # Message bubbles
โ”‚   โ”‚   โ”œโ”€โ”€ review-panel.tsx     # Expert review panel
โ”‚   โ”‚   โ””โ”€โ”€ review-form.tsx      # Review form
โ”‚   โ””โ”€โ”€ lib/
โ”‚       โ”œโ”€โ”€ types.ts             # TypeScript types
โ”‚       โ””โ”€โ”€ utils.ts             # Utilities
โ”‚
โ”œโ”€โ”€ sandbox/                     # Docker environment (legacy)
โ”‚   โ”œโ”€โ”€ Dockerfile.base          # Base image
โ”‚   โ”œโ”€โ”€ Dockerfile.runtime       # Runtime image
โ”‚   โ””โ”€โ”€ build.sh                 # Build script
โ”‚
โ”œโ”€โ”€ examples/                    # Example implementations
โ”‚   โ”œโ”€โ”€ plain_generator_example/
โ”‚   โ”œโ”€โ”€ openai_example/
โ”‚   โ”œโ”€โ”€ crewai_example/
โ”‚   โ””โ”€โ”€ langgraph_example/
โ”‚
โ”œโ”€โ”€ docker-compose.yml           # Local development
โ”œโ”€โ”€ pyproject.toml               # SDK package definition
โ”œโ”€โ”€ README.md                    # This file
โ””โ”€โ”€ DEPLOY.md                    # Detailed deployment guide

API Endpoints

POST /api/deploy

Deploy a new agent.

Request:

  • file: Zip file containing agent code (multipart/form-data)
  • name: Agent name (optional)

Response:

{
  "deployment_id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "my-agent",
  "status": "success",
  "message": "Agent 'my-agent' deployed successfully"
}

POST /api/chat/{deployment_id}

Chat with a deployed agent (multi-tenant endpoint).

Request:

{
  "messages": [
    {"role": "user", "content": "Hello!"},
    {"role": "assistant", "content": "Hi there!"},
    {"role": "user", "content": "How are you?"}
  ]
}

Response (Server-Sent Events):

data: Hello
data: there
data: !
data: [DONE]

POST /api/chat

Chat with the default agent (single-tenant endpoint).

Same format as above, but uses the agent loaded at startup.

Frontend Integration (Vercel AI SDK):

// app/page.tsx
import { useChat } from 'ai/react';

export default function Chat() {
  const { messages, input, handleInputChange, handleSubmit } = useChat({
    api: 'http://localhost:8000/api/chat/YOUR_DEPLOYMENT_ID',
  });

  return (
    <div>
      {messages.map(m => (
        <div key={m.id}>{m.role}: {m.content}</div>
      ))}
      <form onSubmit={handleSubmit}>
        <input value={input} onChange={handleInputChange} />
      </form>
    </div>
  );
}

GET /api/deployments/{deployment_id}

Get information about a deployment.

Response:

{
  "deployment_id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "my-agent",
  "version": "1.0.0",
  "description": "A simple AI agent",
  "framework": "auto",
  "created_at": "1234567890.123"
}

GET /health

Health check endpoint.

Response:

{
  "status": "healthy",
  "agent_loaded": true,
  "uptime_seconds": 123.45
}

GET /docs

Interactive API documentation (Swagger UI).

Visit http://localhost:8000/docs for the full API reference.

Frontend Chat UI

The platform includes a modern Next.js chat interface with expert review capabilities.

Running the Frontend

# Start backend first
docker-compose up -d

# Start frontend
cd frontend
npm install
npm run dev

Visit: http://localhost:3000

Features

  • Real-time Streaming: See agent responses token-by-token
  • Expert Review Panel: Annotate and review agent responses
    • Star rating (1-5)
    • Correction input
    • Comment textarea
  • Responsive Design: Works on desktop and mobile
  • Vercel AI SDK Integration: Uses useChat hook

For detailed frontend documentation, see frontend/README.md.

Configuration

Environment Variables

# API Keys
export OPENAI_API_KEY="your-key-here"

# Server Configuration
export HOST="0.0.0.0"
export PORT="8000"
export LOG_LEVEL="INFO"

# Resource Limits
export MAX_EXECUTION_TIME="300"    # 5 minutes
export MAX_MEMORY="512m"
export MAX_CPU="1.0"

# Rate Limiting
export RATE_LIMIT_ENABLED="true"
export RATE_LIMIT_MAX_REQUESTS="100"
export RATE_LIMIT_WINDOW="60"      # seconds

# CLI Configuration
export AGENT_PLATFORM_URL="http://localhost:8000"

Docker Compose

For local development:

# Create .env file
echo "OPENAI_API_KEY=your-key" > .env

# Run with docker-compose
docker-compose up

SDK API Reference

serve(handler, *, framework=None, config=None, timeout=300, chunk_size=1, debug=False)

Register an agent handler for serving.

Parameters:

  • handler (Callable): Your agent function (sync/async generator)
  • framework (str, optional): Framework hint ("auto", "crewai", "langgraph", "openai")
  • config (dict, optional): Additional configuration
  • timeout (int): Maximum execution time in seconds (default: 300)
  • chunk_size (int): Tokens per chunk for batching (default: 1)
  • debug (bool): Enable debug logging (default: False)

Example:

serve(my_agent, framework="openai", timeout=600, debug=True)

test_agent(messages, handler=None)

Test an agent locally without running the server.

Parameters:

  • messages (List[Message]): Messages to test with
  • handler (Callable, optional): Handler to test (uses registered if not provided)

Returns:

  • Generator yielding tokens

Example:

messages = [{"role": "user", "content": "Hello"}]
for token in test_agent(messages):
    print(token, end="")

Architecture

Hot-Loading System

The platform uses hot-loading for instant deployment:

  1. Agent code uploaded as zip file
  2. Extracted to uploads/{deployment_id}/
  3. On first request, Python dynamically imports the agent
  4. AgentRuntime instance cached for subsequent requests
  5. No Docker build = deployment in < 1 second

Multi-Tenant Design

  • Single server handles unlimited agents
  • Each agent gets unique UUID deployment_id
  • Agents run in isolated namespaces
  • Shared infrastructure (FastAPI, middleware, adapters)
  • Independent execution contexts per request

Security

  • UUID Validation: Prevents directory traversal attacks
  • Path Resolution: Ensures files stay within uploads directory
  • Timeout Enforcement: Maximum 300s per request
  • Rate Limiting: 100 requests/minute per IP
  • File Exclusions: Auto-excludes .env, credentials from deployments

Performance

Deployment Speed

  • Hot-loading: < 1 second (instant)
  • Docker build (legacy): 15-30 seconds
  • Base image build (one-time): 2-3 minutes

Resource Limits

  • CPU: 1 core per agent
  • Memory: 512MB per agent
  • Execution timeout: 5 minutes (configurable)
  • Rate limit: 100 requests/minute (configurable)

Streaming Latency

  • API latency: p95 < 200ms
  • Token streaming: p95 < 100ms
  • Agent caching: First load ~100ms, cached < 10ms

Troubleshooting

CLI Issues

"agent.yaml not found"

# Run init first
python -m cli init --name my-agent

"Cannot connect to API server"

# Make sure backend is running
docker-compose up -d

# Check server status
curl http://localhost:8000/health

"Invalid zip file"

# Check for syntax errors
python -m py_compile main.py

# Try re-deploying
python -m cli deploy

Runtime Issues

"Agent handler not registered"

Solution: Make sure main.py calls serve(your_handler):

serve(my_agent)  # Don't forget this!

"Agent not found or failed to load"

Check deployment exists:

ls -la uploads/{deployment_id}/
# Should show: agent.yaml, main.py

Import errors

ModuleNotFoundError: No module named 'crewai'

Solution: Add the module to agent.yaml:

dependencies:
  - crewai>=0.1.0

Timeout errors

Agent execution timeout after 300s

Solution: Increase timeout in agent.yaml:

runtime:
  timeout: 600

Rate limit exceeded

Rate limit exceeded: 100 requests per 60s

Solution: Adjust RATE_LIMIT_MAX_REQUESTS environment variable.

Development

Local Testing (Without Docker)

# test_local.py
from agent_runner import serve, test_agent
from agent_runner.types import Message
from typing import List

def my_agent(messages: List[Message]):
    yield f"Echo: {messages[-1]['content']}"

serve(my_agent)

# Test it
messages = [{"role": "user", "content": "Hello World"}]
for token in test_agent(messages):
    print(token, end="", flush=True)

Run:

python test_local.py

Running Full Stack Locally

# Terminal 1: Start backend
docker-compose up

# Terminal 2: Start frontend
cd frontend
npm run dev

# Terminal 3: Deploy an agent
cd examples/openai_example
python -m cli deploy

Visit:

  • Backend: http://localhost:8000
  • Frontend: http://localhost:3000
  • Docs: http://localhost:8000/docs

Documentation

  • DEPLOY.md: Detailed deployment guide
  • frontend/README.md: Frontend documentation
  • CLAUDE.md: Architecture and development guidelines
  • examples/: Working examples for each framework

Contributing

We welcome contributions! See CLAUDE.md for development guidelines.

License

MIT License - See LICENSE file

Support

  • Issues: GitHub Issues
  • Documentation: See DEPLOY.md and examples/
  • Architecture: See CLAUDE.md

Built with the Agent Platform SDK - Deploy and share AI agents in one command.

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

axen_runtime-0.2.0.tar.gz (22.1 kB view details)

Uploaded Source

Built Distribution

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

axen_runtime-0.2.0-py3-none-any.whl (25.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: axen_runtime-0.2.0.tar.gz
  • Upload date:
  • Size: 22.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.14

File hashes

Hashes for axen_runtime-0.2.0.tar.gz
Algorithm Hash digest
SHA256 3fd91675c283dedb073e28507bb471a6c6f8e1d3b52125513f3d089ca8c68c4b
MD5 40c3b47419ba85507f1ad276c400e81c
BLAKE2b-256 8d2f133017bad3c1d4d9d0dc184bf0141291577a1038f89ebee3c807772aa9ab

See more details on using hashes here.

File details

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

File metadata

  • Download URL: axen_runtime-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 25.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.14

File hashes

Hashes for axen_runtime-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 4d7700bade3b4c6b9c1c6ac0fd1ad90466d3f20a986df65b610d03bb2614bec2
MD5 e3f8aaa77d76654672c221062a42e9fe
BLAKE2b-256 3d6c2958a8e0ed9e97a0a22bf15dd1fd599f83054723ef6e3a7c665389c113ba

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