Chat
Chat is the surface where everything else shows up. It's the runtime for DARS, not a thin wrapper around a model.
What chat actually does
When a user sends a message, the chat backend at chat-api.true.trading opens a Server-Sent Events stream and pushes back five kinds of frames: reasoning chunks, tool-use frames, tool-result previews, final answer tokens, and a terminal done frame with citations. The client renders all five differently — reasoning is shown in a thinking-mode visualizer, tool use renders as inline pills, and the final answer streams character by character.
# SSE frame types
event: reasoning # thinking-mode visualizer
event: tool_call # tool name + sanitized args
event: tool_result # compressed payload preview
event: token # final answer streaming
event: done # turn complete + citations
Default model
The default reasoning model is Claude Haiku 4.5, chosen for its latency-to-quality ratio at scale. Heavier work — research-agent deep-dives, signal-agent narrative composition — escalates to Sonnet-class models when the orchestrator’s complexity score crosses a configured threshold. Escalation reasons are logged and visible in the trace.
Memory model
Chat sessions are persisted per wallet. The orchestrator carries a sliding window of the conversation plus a long-term summary updated at session boundaries. The user-visible Reset chat button clears the window but keeps the long-term profile, which feeds personalization (preferred assets, time-zone, language). To wipe the long-term profile entirely, use Settings → Privacy → Erase profile.
Quick actions
Twelve curated prompts ship as one-tap entry points, translated into eight languages and updated based on usage telemetry.
- 60-Sec News — global market debrief in one minute.
- What’s Hot — top movers and unusual flow.
- Surprise Me — opportunistic asset surfacing.
- Dip Alert — local lows worth a closer look.
- Bull or Bear This Week — directional read with reasons.
Public-facing surfaces avoid the words trading, investing, finance, financial. Use thought, signal, read, flow instead. This isn’t a stylistic preference — it’s a regulatory constraint that keeps the surface compliant in the jurisdictions TRUE serves.
Chat works in eight languages. Switch with the language selector in the top nav — your conversation history follows you. Voice input is available on mobile. Quick actions surface what’s most relevant to your watchlist; you can pin or hide any of them.
The chat endpoint is publicly documented and auth-gated by a TRUE bearer token.
POST https://chat-api.true.trading/v1/chat Request body:
{
"message": "What's SOL doing today?",
"session_id": "ses_01JX...",
"locale": "en",
"stream": true
}Streaming response is SSE with the frame types above. Reconnection logic should resume from the last event: token cursor; the server idempotently re-emits any token after the cursor on reconnect. Idempotency keys (Idempotency-Key header) deduplicate retried POSTs within a 24-hour window.
// Minimal TypeScript client
const r = await fetch('https://chat-api.true.trading/v1/chat', {
method: 'POST',
headers: {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({ message, session_id, stream: true }),
});
const reader = r.body!.getReader();
const decoder = new TextDecoder();
let buf = '';
while (true) {
const { value, done } = await reader.read();
if (done) break;
buf += decoder.decode(value, { stream: true });
// parse SSE frames out of `buf` and dispatch...
}Error frames carry event: error with a structured payload (code, retryable, message). 429s include Retry-After. See Rate Limits for the full table.
Never paste seed phrases, private keys, or recovery phrases into chat. Chat content is logged for abuse-prevention and quality review, and even encrypted-at-rest logs are an unnecessary attack surface for secrets that should never leave your wallet. The chat will refuse a message that looks like a seed phrase, but the only safe rule is: don’t type it.
Safety, limits, failure modes
- Streaming dropouts. Reconnect with the cursor from the last
tokenframe; the server resumes from the next token deterministically. - Idempotency window. 24 hours. After that, the same key on a new POST creates a new turn.
- Sliding window size. Last 30 turns by default; older turns roll into the long-term summary.
- Rate limit on free tier. 60 requests / minute / token. Higher tiers available for partners.