Skip to main content

API

Overview

The API is a RESTful API built with FastAPI that provides a way to interact with the ABI system. It automatically exposes registered agents as API endpoints and provides authentication via API keys.

Authentication

All API endpoints are protected with Bearer token authentication. You need to include your API key in the request headers:

curl -X POST "https://your-api-url/agents/naas/completion" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "Your question here", "thread_id": 1}'

Alternatively, you can also pass the token as a query parameter:

curl -X POST "https://your-api-url/agents/naas/completion?token=YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prompt": "Your question here", "thread_id": 1}'

API Endpoints

Each agent in the system is automatically exposed through the API with two endpoints:

  1. POST /agents/{agent_name}/completion - For synchronous completions
  2. POST /agents/{agent_name}/stream-completion - For streaming completions

Request Format

Both endpoints accept the same request format:

{
"prompt": "Your question or instruction for the agent",
"thread_id": 1
}
  • prompt - The input text for the agent
  • thread_id - A numerical ID to maintain conversation context between requests

Response Format

  • The completion endpoint returns the full response as JSON
  • The stream-completion endpoint returns a server-sent events (SSE) stream with partial responses

Extending the API

Adding New Agents

Agents are automatically registered in the API when they are added to a module. To add a new agent:

  1. Create a new module directory in src/core/modules/ or src/custom/modules/
  2. Add an agents directory within your module
  3. Create a Python file inside the agents directory with an agent implementation
  4. Implement a create_agent() function that returns your agent instance
  5. Your agent class should extend the base Agent class and can override the as_api method to customize its API exposure:
class YourAgent(Agent):
def as_api(
self,
router: APIRouter,
route_name: str = "your_agent",
name: str = "Your Agent",
description: str = "API endpoints to call Your Agent completion.",
description_stream: str = "API endpoints to call Your Agent stream completion.",
tags: list[str] = []
):
return super().as_api(router, route_name, name, description, description_stream, tags)

The agent will automatically be registered with the API router with endpoints at:

  • /agents/your_agent/completion
  • /agents/your_agent/stream-completion

Adding Pipelines and Workflows

Pipeline and workflow endpoints are managed via dedicated routers:

# Pipelines router
pipelines_router = APIRouter(
prefix="/pipelines",
tags=["Pipelines"],
responses={401: {"description": "Unauthorized"}},
dependencies=[Depends(is_token_valid)]
)

# Workflows router
workflows_router = APIRouter(
prefix="/workflows",
tags=["Workflows"],
responses={401: {"description": "Unauthorized"}},
dependencies=[Depends(is_token_valid)]
)

Support for automatically exposing module-specific pipelines and workflows is on the roadmap.

OpenAPI Documentation

The API provides interactive documentation through the OpenAPI standard:

  • Swagger UI: /docs
  • ReDoc UI: /redoc

API Testing

To run the API locally for testing:

make api

This will start the API server on http://localhost:9879.

If you're new to the project and want to see all available make commands:

make

This will display the help menu with all available commands and their descriptions.