Skip to main content
The Chat API provides a text-based interface to the same agent reasoning loop that powers the voice pipeline. Send a message, get a response — with optional session continuity, tool execution, and intelligent model routing.

Endpoint

Base URL: http://<host>:4102/api The chat endpoint is served on the health/API server (port 4102), not the voice server (port 3000).

Request

Response

The metadata object provides transparency into what happened during processing:
  • stepCount: How many reasoning steps the agent took (including tool calls)
  • toolCallCount: How many tools were invoked
  • durationMs: Total processing time in milliseconds

Streaming Endpoint

For real-time streaming responses with thinking/reasoning blocks and tool call visibility, use the SSE streaming endpoint:

Request

SSE Events

The endpoint returns a text/event-stream response with the following event types:
Done event metadata
The dashboard’s Chat page uses this endpoint. Connect with fetch() + ReadableStream — native EventSource does not support POST requests.

Image & Vision Support

The chat endpoints accept images via the files array. Images are formatted per-provider automatically:
  • Claude: image content blocks with base64 source
  • OpenAI: image_url content parts with data URIs
  • Ollama: images array with raw base64
  • OpenRouter: Follows the upstream provider format
Supported formats: PNG, JPEG, GIF, WebP. The dashboard Chat page supports paste and drag-and-drop image upload.

Thinking & Reasoning

When using models with thinking/reasoning capabilities, the streaming endpoint surfaces internal reasoning:
  • Claude: Extended thinking blocks (adaptive mode)
  • OpenAI o-series: Reasoning summary text via Responses API
  • Ollama: think field (Qwen3, DeepSeek-R1, Gemma 4)
  • OpenRouter: message.reasoning content
Thinking blocks are streamed as thinking events. Multi-turn reasoning continuity is preserved — the agent stores thinking tokens and replays them on subsequent turns so the model can build on its prior reasoning.

Model Router

The chat endpoint routes requests through a slot-based model routing system. Each named slot maps to a configured provider and model.
1

Intent Classification

A lightweight local model (Ollama) classifies the user’s intent into categories like general_knowledge, smart_home, scheduling, code, etc. This classification takes 10-50ms.
2

Slot Resolution

The intent maps to a capability slot (chat, reasoning, coding, tool_calling, creative). Each slot is configured with a provider+model pair.
3

Fallback Chain

If the primary slot provider is unavailable (down, billing exhausted), the system follows the slot’s fallback chain to an alternate provider.
If Ollama is unavailable for intent classification, all requests use the chat slot directly. The routing system is designed for graceful degradation, not hard dependencies. See Model Router for configuration.

Agent Reasoning Loop

When a request requires tool use, the chat endpoint runs the full agent reasoning loop:
  1. The LLM receives the user’s message along with available tools
  2. If the LLM decides to call a tool, the tool is executed and the result is fed back
  3. This loop continues until the LLM produces a final text response
  4. The complete response (including tool results) is returned to the caller
The agent loop is provider-agnostic — it works with both Claude and Ollama through the CommandProtocol interface.
A request like “Schedule a morning briefing for 7 AM every day” might involve:
  1. Step 1: LLM recognizes the scheduling intent and calls schedule.create
  2. Step 2: The scheduler tool creates a cron task and returns the task ID
  3. Step 3: LLM formats the confirmation response with the task details

Session Management

Passing a sessionId enables conversation continuity. The session system provides:
  • Working memory: Recent conversation turns are maintained in the LLM’s context
  • Episodic memory: Past conversations are summarized and available for recall
  • Semantic memory: Long-term facts and preferences are retrieved via vector search
When no sessionId is provided, the request is stateless — there is no conversation history.

Input Validation

All requests are validated using Zod schemas before processing:
  • text must be a non-empty string (max 10,000 characters)
  • Request bodies are capped at 1 MB
  • Invalid JSON returns 400
  • Missing or empty text field returns 400 with validation details
400 Bad Request

Rate Limiting

The chat endpoint has a stricter rate limit than general API endpoints: Rate limit information is included in response headers:
When the limit is exceeded:
429 Too Many Requests

Authentication

When AGTOS_API_KEY is set, the chat endpoint requires a Bearer token:
Authentication is opt-in. If AGTOS_API_KEY is not set, the endpoint is open. See Authentication for details on configuring API access.

Error Responses

CLI Integration

The npx agtos chat command uses this same endpoint under the hood. It opens an interactive prompt with session persistence:
In-chat commands: /quit, /exit, /help, /session (show session ID), /new (start new session). See CLI Reference for details.

Conversation History

Retrieve past conversation messages for a session:
When the session has expired or doesn’t exist, sessionExpired is true and messages is empty. The dashboard Conversations page uses this endpoint to let users browse and resume past sessions.

Background Tasks

For longer-running agent tasks, use the tasks endpoint instead:
Tasks run through the same agent reasoning loop but are designed for workloads that may take several seconds. The response includes a generated taskId for tracking.

What’s next

Memory System

How sessions build context with three-tier memory.

HTTP Endpoints

Complete REST API reference with all request/response schemas.