Agents
DARS — the Dynamic Agent Response System that powers every chat turn on TRUE.
What this is
TRUE doesn’t run on a single LLM. It runs on a coordinated system of specialized agents called DARS — the Dynamic Agent Response System. The router is itself an agent: it decides which downstream specialists are involved and in what order before any model token streams back.
The DARS pipeline
Every user message enters a five-stage pipeline before a response is composed.
Specialist agents
The TRUE agent registry currently runs six core specialists, hosted on AWS AgentCore over Bedrock. Agents are stateless workers — context is held in the orchestrator, not the agent itself.
| Agent | Domain | Primary tools |
|---|---|---|
price-agent | Quotes, market data, OHLCV | TRUE Quotes, Pyth, Chainlink |
research-agent | Project deep-dives, fundamentals | Web fetch, on-chain RPC |
news-agent | Headlines, sentiment, catalysts | Highlights API, news feed |
signal-agent | Setups, risk-on / risk-off reads | OHLCV, funding, oracles |
memecoin-agent | Long-tail discovery, security | Solana RPC, holder checks |
execution-agent | Swap routes, slippage, gas | Jupiter, route solver, SAE |
Agents are narrow and replaceable. A specialist that can’t be swapped for a better one in under a day is too coupled to the orchestrator. The agent contract is intentionally small: input schema, output schema, tool allow-list, latency budget.
How escalation works
Most chat turns are handled by Claude Haiku 4.5 for its latency-to-quality ratio at scale. When the complexity score crosses a configured threshold — long context, multi-step reasoning, ambiguous intent across multiple tools — the orchestrator escalates to a Sonnet-class model. Escalations are logged with reason codes for audit; you can see them in the trace view of any turn.
How tool-use is gated
Every tool call passes through the orchestrator’s policy layer before it reaches the network. Tools have explicit allow-lists per agent (the news-agent cannot call swap_quote), an arg-shape validator that rejects malformed requests, and a per-turn budget so a single message cannot detonate the rate-limit bucket. Trace IDs propagate to every downstream tool so a misbehaving call is traceable to the originating turn.
Agent outputs are never auto-executed. Every execution path — swap, perp, agentic flow — flows through SAE after the agent has spoken, with the user’s signature in the loop unless agentic trading is explicitly opted in.
When you ask a question, the answer is composed by multiple specialists — that’s why the chat shows reasoning frames before the final reply. The badges next to a response indicate which sources informed it (Pyth, on-chain RPC, news feed). If a response looks confident but wrong, use Report an issue so the trace gets reviewed.
Each chat turn emits an SSE stream with discrete frame types. To inspect tool use:
// Pseudocode for consuming the chat SSE stream
const res = await fetch('https://chat-api.true.trading/v1/chat', {
method: 'POST',
headers: { Authorization: `Bearer ${token}`, 'Content-Type': 'application/json' },
body: JSON.stringify({ message, session_id })
});
for await (const frame of parseSSE(res.body!)) {
switch (frame.event) {
case 'reasoning': render.reasoning(frame.data); break;
case 'tool_call': trace.push({ tool: frame.data.name, args: frame.data.args }); break;
case 'tool_result': trace.push({ result_preview: frame.data.preview }); break;
case 'token': render.token(frame.data); break;
case 'done': render.citations(frame.data.citations); break;
}
}Tool args are sanitized in the SSE preview (no bearer tokens, no full payloads). Full payloads remain server-side. Reproduction requests for an agent answer go to [email protected] with the trace ID from the response.
Safety, limits, failure modes
- Hallucination on cold tokens. Long-tail memecoins with no oracle pricing surface as best-effort; the chat marks them with a confidence flag.
- Tool timeouts. A specialist that exceeds its latency budget returns a partial answer with the missing pieces called out, never silent failure.
- Escalation thrashing. Repeated escalations on the same conversation open a circuit-breaker and pin the model for the rest of the session.
- Off-policy outputs. Anything that looks like an unsolicited execution instruction is filtered before the user ever sees it.
See also
- Chat — the streaming runtime DARS produces frames into.
- MCP — the tool surface DARS uses internally and exposes externally.
- Agentic Trading — what happens after an agent decides something is actionable.