Skip to content

Unified API (OpenAI compat)

Updated View as Markdown

Truememory AI Gateway offers an OpenAI-compatible /v1/chat/completions endpoint, enabling integration with multiple AI providers using a single URL. This is a drop-in replacement for OpenAI, Cloudflare AI Gateway, or LiteLLM — change the base URL and it works.

Authentication

All requests require a Bearer token in the Authorization header. See Ways to authenticate for how to get one.

Caller Method Details
Browser / mobile app User tokens Sign in via Truememory Auth, pass the JWT
Backend service Service accounts Use AUTH_SECRET, optionally with X-On-Behalf-Of for user context

Endpoint URL

POST /v1/chat/completions

Switch providers by changing the model parameter. For example: anthropic/claude-sonnet-4-5, openai/gpt-5.1, vertexai/gemini-2.5-flash.

Parameters

Parameter Type Default Description
model string required Model to use (e.g. anthropic/claude-sonnet-4-5, openai/gpt-5.1)
messages array required Conversation messages in OpenAI format. Each message’s content can be a plain string or an array of content parts mixing text and images — see Vision. If the array includes a system or developer message, it replaces the agent’s built-in prompt for that request (memory and personas are still injected). Each message also accepts an optional cache_control field — see Prompt caching.
tools array null Tool definitions in OpenAI function calling format. See Tool calling.
stream boolean false Enable SSE streaming
stream_options object null Streaming options. Set {"include_usage": true} to receive a final chunk with token usage (only applies when stream is true).
temperature float null Sampling temperature. Ignored on anthropic/claude-opus-5-5, anthropic/claude-sonnet-5-5 and anthropic/claude-haiku-5-5, which do not accept sampling parameters.
max_tokens integer null Maximum tokens to generate
top_p float null Nucleus sampling parameter. Ignored on anthropic/claude-opus-5-5, anthropic/claude-sonnet-5-5 and anthropic/claude-haiku-5-5.
stop string/array null Stop sequences
thread_id string null Conversation thread for state persistence (see Threads)
parent_message_id string null Id of the last stored message the client received on this thread (the message_id of the previous response). When set, anything already stored after it is not appended again, so a failed request can be re-sent unchanged. messages holds the messages after it, and may also start with history that ends at it; that history is dropped exactly as it is without this field. Ignored without thread_id. See Retrying a failed turn.
store boolean true When true (default), the call is recorded in the conversation thread and shows up in /threads. Set to false for one-off agent calls — for example, a background helper that should run the agent without leaving a trace in the user’s chat history.
memory object null Per-request memory controls. {"read": true, "write": false} lets the agent recall facts but skips saving anything new from this turn; both default to true on user-scoped requests. The thread itself is still recorded either way (so it still appears in /threads) — only the memory graph writes are suppressed.
persona_id string null Persona to use for this request. Falls back to the user’s active persona if omitted.
context_management array null Context-management strategies for this request (OpenAI-compatible). Include a {"type": "compaction", ...} entry to fold older thread history into a rolling summary checkpoint once it crosses a token threshold. See Thread compaction.
metadata object null Up to 16 key-value string pairs attached to this request. Persisted with the thread and returned in history. Echoed in the SSE first chunk when streaming. See Custom metadata.
skill_instructions string null Caller-composed skill prompt. Injected after persona, before memory context. Purely additive — never replaces persona or base instructions. See Skill instructions.
knowledge_pack_ids string[] null Ground the answer in specific uploaded documents. See Knowledge Packs.
skill_id string null Ground the answer in every knowledge pack tagged with this skill. Can be combined with knowledge_pack_ids. See Knowledge Packs — Retrieval.
brain_id string null Ground the answer in every pack in a brain (a named collection of packs). Singular alias for brain_ids; send both and their union is resolved. Ignored when knowledge_pack_ids is also provided. Resolved on the memory path — requires a memory-enabled agent and memory reads on (see Brains).
brain_ids string[] null Ground the answer in several brains at once. Their packs merge into one deduplicated set. Every ID must be readable by the caller — an unreachable one returns 404 BRAIN_NOT_FOUND.
graph_ids string[] null Blend one or more graph namespaces (shared knowledge graphs) into this request’s memory retrieval, alongside the user’s own memory.

Custom Prompt Mode

If you want to replace the agent’s built-in prompt with your own instructions, send a system or developer message in the messages array.

When Truememory sees one of those roles, your message replaces the agent’s base instructions for that request:

  • your system or developer message becomes the top-level instruction instead of the agent’s built-in prompt
  • Truememory still injects persistent memory context so the model knows what it remembers about the user
  • Truememory still injects the active persona (if any)
  • thread history and turn recording still work normally
  • client-defined tools in the tools parameter still work

This is useful when you want full prompt control for a specific request while keeping Truememory’s memory and conversation features.

Example: caller-owned prompt

curl -X POST https://your-tie-host/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "model": "openai/gpt-5.1",
    "messages": [
      {"role": "developer", "content": "You are a concise support assistant. Answer in 3 bullet points max."},
      {"role": "user", "content": "How do I rotate an API key?"}
    ]
  }'

Examples

A minimal request — memory and the active persona are injected automatically, nothing extra to send:

curl -X POST https://your-tie-host/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "model": "anthropic/claude-sonnet-4-5",
    "messages": [{"role": "user", "content": "What did I say I was working on?"}]
  }'

With "stream": true, tokens arrive as SSE chunks in the standard OpenAI shape — content lives in choices[0].delta.content, and the stream ends with a finish_reason chunk followed by data: [DONE]:

data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1711234567,"model":"anthropic/claude-sonnet-4-5","choices":[{"index":0,"delta":{"content":"Hel"},"finish_reason":null}]}

data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1711234567,"model":"anthropic/claude-sonnet-4-5","choices":[{"index":0,"delta":{"content":"lo!"},"finish_reason":null}]}

data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1711234567,"model":"anthropic/claude-sonnet-4-5","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}

data: [DONE]

Use the interactive picker below for per-language variants (OpenAI SDKs, Vercel AI SDK, cURL) and image inputs:

Sendtousing
import OpenAI from "openai";

const client = new OpenAI({
  apiKey: "$TOKEN",
  baseURL: "https://your-tie-host/v1",
});

const response = await client.chat.completions.create({
  model: "anthropic/claude-sonnet-4-5",
  messages: [{ role: "user", content: "What is the capital of France?" }],
});

console.log(response.choices[0].message.content);

Response

{
  "id": "chatcmpl-abc123",
  "object": "chat.completion",
  "created": 1711234567,
  "model": "anthropic/claude-sonnet-4-5",
  "choices": [
    {
      "index": 0,
      "message": {
        "role": "assistant",
        "content": "The capital of France is Paris."
      },
      "finish_reason": "stop"
    }
  ],
  "usage": {
    "prompt_tokens": 12,
    "completion_tokens": 8,
    "total_tokens": 20,
    "cache_read_tokens": 0,
    "cache_creation_tokens": 0
  },
  "metadata": null
}

If metadata was included in the request, it is echoed back here.

Understanding the usage object

Every time you call the AI, it counts the pieces of text (called tokens) that go in and out. You pay your provider for these tokens, so the usage object is how you know what just got spent.

Think of it like a taxi meter: prompt_tokens is how far you rode in, completion_tokens is how far the AI drove back, and total_tokens is the full fare.

Field What it means (in plain English)
prompt_tokens How much you sent in (your messages + system prompt + memory + persona). Bigger question = bigger number.
completion_tokens How much the AI wrote back. A one-word answer is tiny. A long essay is big.
total_tokens Simply prompt_tokens + completion_tokens. The whole bill.
cache_read_tokens Of your prompt_tokens, how many were reused from a cached copy the provider had already saved. These are WAY cheaper — Anthropic charges up to 10× less for cache reads.
cache_creation_tokens How many tokens the provider saved into cache for next time. Slightly pricier than a normal token, but it makes future calls much cheaper.

Features

Request-level capabilities — each has its own page under Features:

Threads

Pass a thread_id to maintain conversation state across requests. Truememory uses it to persist the message history so the LLM has context from previous turns.

  • If omitted, Truememory auto-generates a UUID for the thread. Each request starts a new conversation.
  • If provided, Truememory resumes the conversation from where it left off. Use any string (e.g. a UUID you generate client-side).

See Threads for the full API reference (list, rename, delete, history).

Streaming Usage

When streaming (stream: true), token usage is available by setting stream_options.include_usage to true.

curl -X POST https://your-tie-host/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{
    "model": "anthropic/claude-sonnet-4-5",
    "stream": true,
    "stream_options": {"include_usage": true},
    "messages": [
      {"role": "user", "content": "Hello!"}
    ]
  }'

When enabled, Truememory emits a final SSE chunk after the finish_reason chunk with an empty choices array and the accumulated usage:

data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","created":1711234567,"model":"anthropic/claude-sonnet-4-5","choices":[],"usage":{"prompt_tokens":9,"completion_tokens":12,"total_tokens":21,"cache_read_tokens":0,"cache_creation_tokens":0}}

data: [DONE]

The final usage chunk includes the same fields as the non-streaming response, including cache_read_tokens and cache_creation_tokens. Numbers are accumulated across every internal step (tool calls, memory lookups, etc.) so you get one clean bill for the whole request. See Understanding the usage object for what each field means.

If stream_options is omitted or include_usage is false, no usage chunk is emitted.

Agent Selection

By default, requests use the chatbot agent. To use a different agent, pass the X-Agent-Id header:

curl -X POST https://your-tie-host/v1/chat/completions \
  -H "X-Agent-Id: research-assistant" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"model": "anthropic/claude-sonnet-4-5", "messages": [...]}'

If the request includes a system or developer message, that message replaces the agent’s built-in prompt for that request. Memory and personas are still injected.

Per-App Thread Isolation

To scope threads to a specific application, pass the X-App-Id header. Threads sent with an app ID are isolated — they won’t appear in other apps’ thread lists, and can only be resumed, renamed, or deleted with the same X-App-Id.

curl -X POST https://your-tie-host/v1/chat/completions \
  -H "X-App-Id: vibrantly" \
  -H "X-Agent-Id: chatbot" \
  -H "Authorization: Bearer $TOKEN" \
  -d '{"model": "anthropic/claude-sonnet-4-5", "messages": [{"role": "user", "content": "Hello"}], "thread_id": "my-thread"}'

When X-App-Id is omitted, threads are unscoped and visible to all apps. See Threads — Per-App Thread Isolation for details.

For the full agent registry (memory scope and safety behavior per agent), see Agents — the single source of truth. Query GET /info to see the agents on your instance.

Supported Providers

Query GET /info to see which models are currently available on your instance.

Navigation

Type to search…

↑↓ navigate↵ selectEsc close