Home
Use the activity-window buttons to view request, success-rate, active-key, estimated-spend, and telemetry summaries.
The figures are workspace telemetry, not invoice-grade billing data.
TronXVI Platform exposes text, image-generation, Web Search, and realtime voice flows. This guide covers project setup, API keys, environment variables, model selection, and the core routes developers will integrate.
Read this before creating a project, key, or customer integration.
Complete these steps before wiring the application or client integration.
Read the current Platform status before using the console; confirm that your signed-in administrator account is authorised for the workspace.
Create a project in Platform so API keys and usage are scoped correctly.
Generate a TronXVI API key and store it in server-side configuration only.
Enable Web Search only when the API key's tool allowance is appropriate for the application.
Select a TronXVI voice name such as Maya or Adrian for the assistant experience.
Use the authenticated Platform routes for image generation, Web Search, and live voice sessions.
For General Chat rendering, install @tronxvi/brain-renderer, add the server proxy, consume the SSE stream, and render the terminal response.
These are the current sidebar workflows and their limits.
Use the activity-window buttons to view request, success-rate, active-key, estimated-spend, and telemetry summaries.
The figures are workspace telemetry, not invoice-grade billing data.
Filter the usage chart by day, week, or month and by API key.
Switch between key inventory and recent traffic. Refresh reloads the current workspace from the backend.
Create, search, inspect, and export projects as CSV. Project key details show current, revoked, and expired credentials.
Create a key for a selected project, set an optional expiry and spend limit, then copy the full value immediately. Deleting a key in the UI revokes it; it does not erase its historical usage record.
The text Playground sends a real chat request only after you paste a developer key. The key remains in page memory only and is cleared on refresh; it is never written to browser storage.
The voice view is an integration guide, not a browser-side realtime caller. Image generation and direct Web Search are API integrations rather than Playground actions.
Treat Billing tabs and cards as informational until authoritative payment and credit telemetry is connected.
Use the sidebar profile menu for Support or Report a bug. /support and /chats currently show the Playground; /analytics shows Dashboard; /users shows Projects.
Use the current key controls carefully; they are development-console controls, not a multi-user production control plane.
Most integrations only need one API key, one text mode, one image tier, an optional Web Search tool, one voice tier, and one public voice name.
TRONXVI_API_URL=https://api.tronxvi.com TRONXVI_API_KEY=<set-in-Railway-or-Vercel> TRONXVI_IMAGE_MODEL=atlas TRONXVI_VOICE_MODEL=atlas_voice TRONXVI_VOICE_NAME=adrian TRONXVI_ENABLED_TOOLS=web_search
Use one TronXVI API key, the canonical structured response, and the official renderer package to render tables, files, spreadsheets, diagrams, images, code, and other General Chat capabilities inside your own application.
npm install @tronxvi/brain-renderer
import { NextRequest } from "next/server";
export async function POST(request: NextRequest) {
const body = await request.text();
const upstream = await fetch(
process.env.TRONXVI_API_URL + "/api/platform/v1/chat/stream",
{
method: "POST",
headers: {
Authorization: "Bearer " + process.env.TRONXVI_API_KEY,
"Content-Type": "application/json",
Accept: "text/event-stream",
},
body,
cache: "no-store",
},
);
return new Response(upstream.body, {
status: upstream.status,
headers: {
"Content-Type": upstream.headers.get("Content-Type") || "text/event-stream",
"Cache-Control": "no-cache, no-transform",
},
});
}export async function consumeTronXVIStream(
body: ReadableStream<Uint8Array>,
onEvent: (event: Record<string, unknown>) => void,
) {
const reader = body.getReader();
const decoder = new TextDecoder();
let buffer = "";
while (true) {
const { value, done } = await reader.read();
buffer += decoder.decode(value || new Uint8Array(), { stream: !done });
const frames = buffer.split(/\r?\n\r?\n/);
buffer = frames.pop() || "";
for (const frame of frames) {
const data = frame
.split(/\r?\n/)
.filter((line) => line.startsWith("data:"))
.map((line) => line.slice(5).trimStart())
.join("\n");
if (data) onEvent(JSON.parse(data));
}
if (done) break;
}
}import {
GeneralChatAnswerRenderer,
type GeneralChatResponse,
} from "@tronxvi/brain-renderer";
import "@tronxvi/brain-renderer/styles.css";
export function TronXVIAnswer({ response }: { response: GeneralChatResponse | null }) {
if (!response) return null;
return <GeneralChatAnswerRenderer response={response} />;
}Send a message to /api/platform/v1/chat/stream. The stream uses general_chat.event.v2; the terminal response uses general_chat.response.v2.
{
"contract": "general_chat.response.v2",
"requestId": "req_123",
"answer": {
"blocks": [
{
"id": "table_001",
"kind": "answer_table",
"caption": "Comparison",
"columns": ["Option", "Price"],
"rows": [["Atlas", "$10"]]
}
],
"artifacts": []
},
"outcome": { "status": "complete" }
}Text, image, and voice are configured separately. Atlas is the recommended default for most new integrations.
Provider estimates are USD per million input / output text tokens, before any future TronXVI markup.
| Mode | Provider model | Provider price / 1M | Best for |
|---|---|---|---|
| scout | gpt-5.4-mini | $0.75 / $4.50 | Lowest-cost text traffic and fast general responses. |
| atlas | gpt-5.6-terra | $2 / $12 | Balanced default for most production chat integrations. |
| sentinel | gpt-5.6-sol | $5 / $30 | Highest-quality text output when response quality matters most. |
| Tier | Provider model | Provider price / 1M tokens | Best for |
|---|---|---|---|
| scout_voice | gpt-realtime-2.1-mini | $0.60 / $2.40 text · $10 / $20 audio | Fast, lower-cost realtime voice. |
| atlas_voice | gpt-realtime-1.5 | $4 / $16 text · $32 / $64 audio | Balanced realtime voice for most assistant products. |
| sentinel_voice | gpt-realtime-2.1 | $4 / $24 text · $32 / $64 audio | Most capable realtime voice for demanding conversations. |
All three public image tiers use the server-owned gpt-image-2 model. Tier selection controls quality; callers cannot send an upstream model or a raw quality value.
| Tier | Provider model | Quality | 1024×1024 output estimate | Best for |
|---|---|---|---|---|
| scout | gpt-image-2 | low | $0.006 / image | Fast drafts, thumbnails, and quick iteration. |
| atlas | gpt-image-2 | medium | $0.053 / image | The balanced default for product and marketing images. |
| sentinel | gpt-image-2 | high | $0.211 / image | Final assets and detailed, high-fidelity work. |
| Size | Scout | Atlas | Sentinel |
|---|---|---|---|
| 1024×1024 | $0.006 / image | $0.053 / image | $0.211 / image |
| 1024×1536 | $0.005 / image | $0.041 / image | $0.165 / image |
| 1536×1024 | $0.005 / image | $0.041 / image | $0.165 / image |
Estimates cover image output only. Prompt text can add provider cost. Reference-image inputs and image editing are not supported by this route.
Platform sends the query to Brave using its own server-held credential, then returns clean results and source URLs to your authenticated backend.
curl -X POST "$TRONXVI_API_URL/api/platform/v1/web/search" \
-H "Authorization: Bearer $TRONXVI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"query": "latest AI news in Australia",
"country": "AU",
"searchLanguage": "en",
"count": 8
}'Customer applications should use the authenticated /api/platform/v1 data-plane routes. Provisioning and key-management routes are signed-in administrator console routes, not external customer APIs.
| Method | Route | Purpose |
|---|---|---|
| POST | /api/platform/v1/chat/stream | Run General Chat through the API key and receive canonical general_chat.event.v2 SSE events with structured renderable output. |
| POST | /api/platform/v1/images/generate | Generate one image through the authenticated Scout, Atlas, or Sentinel image tier. |
| POST | /api/platform/v1/web/search | Run an authenticated Brave Web Search and return normalized cited results. |
| GET | /api/platform/developers | Development-console route: list local developer workspaces. Do not expose to external users. |
| POST | /api/platform/developers | Development-console route: create a local developer workspace. |
| POST | /api/platform/projects | Development-console route: create a local project to own keys and usage. |
| POST | /api/platform/keys | Development-console route: issue a TronXVI developer API key. |
| PATCH | /api/platform/keys/{keyId} | Development-console route: rename, expire, move, or revoke a TronXVI API key. |
| GET | /api/platform/developers/{developerAccountId} | Admin console route: load workspace state for the signed-in administrator. |
| POST | /api/platform/v1/realtime/sessions | Authenticate a server-held TronXVI key and issue a short-lived browser realtime client secret. |
Voice sessions should use a short-lived client secret rather than the long-lived server API key.
POST /api/platform/v1/realtime/sessions
Authorization: Bearer <server-issued-api-key>
Content-Type: application/json
{
"mode": "atlas_voice",
"voice": "adrian"
}Use a public TronXVI voice name in your request; Platform resolves it to the provider voice shown below.
| Public name | Request value | Resolved provider voice |
|---|---|---|
| Mason | mason | alloy |
| Skye | skye | ash |
| Grace | grace | ballad |
| Maya | maya | coral |
| Leo | leo | echo |
| Ivy | ivy | sage |
| Chloe | chloe | shimmer |
| Jude | jude | verse |
| Elena | elena | marin |
| Adrian | adrian | cedar |
Image generation is server-to-server and authenticated with the same TronXVI API key as text requests.
curl -X POST "$TRONXVI_API_URL/api/platform/v1/images/generate" \
-H "Authorization: Bearer $TRONXVI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"prompt": "A polished product hero image of a dark glass bottle on a black background",
"mode": "atlas",
"size": "1024x1024"
}'Use this sequence when handing the integration off to an application engineer.
Use the current console only from an authorised administrator session.
Create the developer account in Platform, then create a project for the application or environment you want to isolate.
Generate the TronXVI API key your backend will use for authenticated requests.
Enable TRONXVI_ENABLED_TOOLS=web_search in your own server environment when the application should be able to search.
Call /api/platform/v1/web/search for raw cited results.
Never configure a Brave API key in the customer application. Platform enforces the key entitlement, rate limit, monthly allowance, and server-side provider call.
Request a short-lived client secret from /api/platform/v1/realtime/sessions using your server-held key.
Pass the selected voice tier such as atlas_voice and a TronXVI voice name such as Adrian.
Use the returned client secret in the browser or application session instead of exposing the long-lived server key.
This docs page describes the platform console, not the broader public TronXVI chat surface.
These details matter when you are integrating locally and handing short-lived realtime session secrets to your own client.
Use this current-state matrix when deciding what data is safe to place in the development console.
| Surface | Current behavior |
|---|---|
| Developer state | Accounts, projects, hashed key records, and usage events are stored by the configured production persistence service. |
| API key material | The full key is returned only at creation. The console retains only its prefix and must not be used to store plaintext keys. |
| Realtime secret | Never saved in Platform state, browser storage, or usage records. It expires after 600 seconds and must only reach the intended signed-in application session. |
| Durability | The current state store is a local JSON file, not transactional storage. There is no documented backup, recovery, retention, or deletion service-level commitment. |
These settings belong to the Platform app. They are separate from the customer backend environment shown above.
NEXT_PUBLIC_API_URL=https://api.tronxvi.com NEXT_PUBLIC_APP_URL=https://infinity.tronxvi.com NEXT_PUBLIC_PLATFORM_URL=https://infinity.tronxvi.com/platform/
These are the concrete request and response shapes the current platform console exposes.
{
"developers": [
{
"id": "acct_001",
"display_name": "Acme Dev",
"email": "dev@acme.test",
"status": "active",
"default_mode": "atlas"
}
]
}{
"display_name": "Acme Dev",
"email": "dev@acme.test",
"default_mode": "atlas"
}{
"developer_account": {
"id": "acct_001",
"display_name": "Acme Dev",
"email": "dev@acme.test",
"status": "active",
"default_mode": "atlas"
}
}{
"developer_account_id": "acct_001",
"name": "Core API",
"description": "Primary integration project"
}{
"project": {
"id": "proj_001",
"developer_account_id": "acct_001",
"name": "Core API",
"slug": "core-api",
"description": "Primary integration project",
"key_count": 0,
"active_key_count": 0,
"created_at": "2026-07-19T10:00:00Z",
"archived_at": null
}
}{
"developer_account_id": "acct_001",
"project_id": "proj_001",
"label": "Primary API key",
"allowed_modes": ["scout", "atlas", "sentinel", "scout_voice", "atlas_voice", "sentinel_voice"],
"expires_at": "2026-12-31",
"allowed_tools": ["web_search"],
"web_search_requests_per_minute": 20,
"web_search_monthly_limit": 1000,
"spend_limit_usd": 25
}{
"api_key": "<server-issued-api-key>",
"key_id": "key_001",
"key_prefix": "<provider-issued-key-prefix>",
"developer_account_id": "acct_001",
"project_id": "proj_001",
"label": "Primary API key",
"allowed_modes": ["scout", "atlas", "sentinel", "scout_voice", "atlas_voice", "sentinel_voice"],
"allowed_tools": ["web_search"],
"web_search_requests_per_minute": 20,
"web_search_monthly_limit": 1000,
"spend_limit_usd": 25,
"created_at": "2026-07-19T10:02:00Z",
"expires_at": "2026-12-31T23:59:59Z"
}{
"label": "Renamed key",
"project_id": "proj_002",
"expires_at": "2026-07-25",
"allowed_tools": ["web_search"],
"web_search_requests_per_minute": 20,
"web_search_monthly_limit": 1000,
"revoke": false
}{
"id": "key_001",
"developer_account_id": "acct_001",
"project_id": "proj_002",
"project_name": "Mobile SDK",
"label": "Renamed key",
"key_prefix": "<provider-issued-key-prefix>",
"allowed_tools": ["web_search"],
"web_search_requests_per_minute": 20,
"web_search_monthly_limit": 1000,
"status": "active",
"created_at": "2026-07-19T10:02:00Z",
"last_used_at": null,
"revoked_at": null,
"expires_at": "2026-07-25T23:59:59Z",
"spent_usd": 0.0
}{
"developer_account": {
"id": "acct_001",
"display_name": "Acme Dev",
"email": "dev@acme.test",
"status": "active",
"default_mode": "atlas"
},
"projects": [
{
"id": "proj_001",
"developer_account_id": "acct_001",
"name": "Core API",
"slug": "core-api",
"description": "",
"key_count": 1,
"active_key_count": 1,
"created_at": "2026-07-19T10:00:00Z",
"archived_at": null
}
],
"api_keys": [
{
"id": "key_001",
"developer_account_id": "acct_001",
"project_id": "proj_001",
"project_name": "Core API",
"label": "Primary key",
"key_prefix": "<provider-issued-key-prefix>",
"status": "active",
"created_at": "2026-07-19T10:02:00Z",
"last_used_at": "2026-07-19T10:05:00Z",
"revoked_at": null,
"expires_at": null,
"spent_usd": 0.0325
}
],
"usage_summary": {
"total_requests": 2,
"successful_requests": 1,
"rejected_requests": 0,
"rate_limited_requests": 0,
"error_requests": 1,
"total_input_tokens": 17,
"total_output_tokens": 7,
"total_tokens": 24,
"total_estimated_cost_usd": 0.0325,
"last_request_at": "2026-07-19T10:05:00Z"
},
"recent_usage": [],
"usage_daily": [],
"usage_chart": []
}{
"query": "latest AI news in Australia",
"country": "AU",
"searchLanguage": "en",
"count": 8
}{
"status": "ok",
"provider": "brave",
"query": "latest AI news in Australia",
"result_count": 1,
"estimated_cost_usd": 0.005,
"results": [
{
"id": "web-1",
"title": "Example source",
"url": "https://example.com/news",
"snippet": "A result snippet.",
"source_name": "example.com",
"published_at": null
}
],
"citations": ["https://example.com/news"]
}{
"mode": "atlas_voice",
"voice": "adrian",
"instructions": "You are a concise, helpful product assistant."
}{
"status": "ok",
"client_secret": "rt_xxxxx",
"client_secret_expires_at": 1789999999,
"mode": "atlas_voice",
"model": "gpt-realtime-1.5",
"voice": "cedar",
"session": {}
}Inspect the HTTP status and detail object together. Preserve request_id when contacting support or correlating your own logs.
{
"detail": {
"code": "usage_limit_exceeded",
"message": "This API key has reached its spend limit.",
"retryable": false,
"request_id": "request-uuid",
"spend_limit_usd": 25
}
}Platform chat uses developer API key auth. These abbreviated examples share the standard retryable and request_id fields shown above.
{
"detail": {
"code": "auth_error",
"message": "Developer API key is required."
}
}{
"detail": {
"code": "auth_error",
"message": "Developer API key is invalid."
}
}{
"detail": {
"code": "auth_error",
"message": "Developer API key has been revoked."
}
}{
"detail": {
"code": "auth_error",
"message": "Developer API key has expired."
}
}{
"detail": {
"code": "auth_error",
"message": "Developer account is not active."
}
}Project and key provisioning routes use explicit validation and permission error shapes. These abbreviated examples share the standard retryable and request_id fields shown above.
{
"detail": {
"code": "validation_error",
"message": "Project name is required."
}
}{
"detail": {
"code": "validation_error",
"message": "Developer account was not found."
}
}{
"detail": {
"code": "validation_error",
"message": "Developer email already exists."
}
}{
"detail": {
"code": "validation_error",
"message": "Developer project was not found."
}
}{
"detail": {
"code": "validation_error",
"message": "Expiry date is invalid."
}
}{
"detail": {
"code": "permission_error",
"message": "Developer project is archived."
}
}The console exposes product telemetry. Treat estimated cost and fallback token counts as operational signals, not billing-grade accounting.
| Type | Value | Meaning |
|---|---|---|
| API key | active | The key is currently usable. |
| API key | revoked | The key was manually revoked and can no longer authenticate. |
| API key | expired | The key expiry time has passed. |
| Usage | ok | The request completed successfully. |
| Usage | error | The request failed because of a backend or provider-side failure. |
| Usage | rejected | The request failed with a non-rate-limit client error. |
| Usage | rate_limited | The request failed because of rate limiting. |
Use this page as the current in-sidebar reference for the documented Platform data-plane behavior.