Skip to main content
Source Code: src/gaia/api/
Import: from gaia.api.openai_server import create_app

Detailed Spec: spec/api-server

7.1 OpenAI-Compatible API

Purpose: Expose GAIA agents as OpenAI-compatible REST API.
from gaia.api.openai_server import create_app
import uvicorn

# Create FastAPI app
app = create_app()

# Run server
uvicorn.run(app, host="0.0.0.0", port=8080)

# Now accessible via OpenAI SDK:
# from openai import OpenAI
# client = OpenAI(base_url="http://localhost:8080/v1", api_key="dummy")
# response = client.chat.completions.create(
#     model="gaia-code",
#     messages=[{"role": "user", "content": "Write Python code"}]
# )

7.2 Custom API Agent

Import: from gaia.agents.base.api_agent import ApiAgent
from gaia.agents.base.agent import Agent
from gaia.agents.base.api_agent import ApiAgent
from gaia.agents.base.tools import tool

class MyAPIAgent(ApiAgent, Agent):
    """Agent exposed via OpenAI-compatible API."""

    def get_model_id(self) -> str:
        # Model ID shown in /v1/models
        return "my-custom-agent"

    def get_model_info(self) -> dict:
        return {
            "max_input_tokens": 4096,
            "max_output_tokens": 2048,
            "description": "Custom agent for data analysis",
            "capabilities": ["data_analysis", "visualization"]
        }

    def _get_system_prompt(self) -> str:
        return "You are a data analysis assistant."

    def _register_tools(self):
        @tool
        def analyze(data: str) -> dict:
            """Analyze data."""
            return {"analysis": "Data is valid"}

# Register with API server
from gaia.api.agent_registry import registry
registry.register("my-agent", MyAPIAgent)

# Now available via API:
# POST /v1/chat/completions with model="my-agent"

7.3 SSE Streaming

Import: from gaia.api.sse_handler import SSEOutputHandler
from gaia.api.sse_handler import SSEOutputHandler

# Create SSE handler
sse = SSEOutputHandler()

# Use with agent
agent = MyAgent(console=sse)

# Process query
result = agent.process_query("Generate code")

# SSE events are emitted during processing:
# data: {"type": "thought", "content": "I need to..."}
# data: {"type": "tool_call", "content": {"name": "generate_code", ...}}
# data: {"type": "result", "content": {"answer": "Here's the code..."}}