Wildcard patterns for
enabled_* fields:
function: reference to a function (namespace/name)async: if true, fire-and-forget (no impact on latency)on_timeout:block(stop pipeline) orpassthrough(continue) — sync hooks only
{"message": {"role": "...", "content": "..."}, "chat_id": "...", "agent": {"namespace": "...", "name": "..."}, "user_id": "..."} and can return:
{"content": "..."}to mutate the message{"block": true, "reply": "..."}to stop the pipelinenullto pass through unchanged
session_key: Maps an external identifier (Slack channel, Telegram chat, WhatsApp number) to a persistent Sinas chat. One chat per(agent_id, session_key)pair.reset: true: Archives the existing session and starts a new conversation.input: Agent input variables, only used when creating a new chat.- Streams internally, returns assembled reply as a single JSON payload.
- Create a chat linked to an agent (optionally with input variables validated against
input_schema) - Send a message — Sinas builds the conversation context with the system prompt, preloaded skills, message history, and available tools
- The LLM generates a response, possibly calling tools
- If tools are called, Sinas executes them (in parallel where possible) and sends results back to the LLM for a follow-up response
- The final response is streamed to the client via Server-Sent Events
expires_in (seconds) when creating the chat. Expired chats are automatically hard-deleted (with all messages) by a scheduled cleanup job:
PUT /chats/{id} with {"archived": true}. Archived chats are hidden from the default list but can be included with ?include_archived=true.
Agent-to-agent calls go through the Redis queue so sub-agents run in separate workers, avoiding recursive blocking. Results stream back via Redis Streams.
Function parameter defaults pre-fill values when an agent calls a function. Supports Jinja2 templates referencing the agent’s input variables: