Naia
Inhaltsverzeichnis
  1. 1Video-Handbuch
  2. 2Naia OS Live USB
  3. 3Installation und Bereitstellung
  4. 3.1Naia OS Installation (ISO)
  5. 3.2App-Installation
  6. 4Erste Schritte
  7. 4.1Naia Model Pricing
  8. 4.2naia-omni-cascade
  9. 4.3demo
  10. 4.4naia-offline
  11. 4.5naia-model-dev
  12. 4.6naia-online
  13. 5Hauptbildschirm
  14. 6Chatten
  15. 6.1Persönlicher Radio-DJ & Ausstellungsführer
  16. 7Gesprächsverlauf
  17. 8Arbeitsfortschritt
  18. 9Fähigkeiten
  19. 10Kanäle
  20. 11Agenten
  21. 12Diagnose
  22. 13Arbeitsbereich
  23. 14Browser
  24. 15Panel-Verwaltung
  25. 16Sprachgespräch
  26. 17Einstellungen
  27. 18Werkzeugdetails
  28. 19Naia-Konto
  29. 20Fehlerbehebung
  30. 21Open-Source-Nutzung und Beitrag

4.6. naia-online

The online version runs Naia's own models in the cloud, so you can talk to Naia from a browser or app without your own GPU.

⏳ The full cloud service is planned (coming soon). For now use the 4.4 Offline version (your own GPU) and the 4.3 free Live Demo. The How it works / developer API below is the same gateway Realtime API the demo already uses.

Plan

  • Tier B — rented cloud GPU (planned): $0.36 / hour (6 credits per minute, planned price, billed per active minute); time-reservation under review. Not available yet.
  • A full online service opens once a GPU pool is secured. (Cloud RunPod/Vast is currently under temporary suspension for prep/experimentation — demo & offline run on local GPUs.)
  • Until then, the main paths are the offline (owned) $10/month subscription for all Naia models (individuals only; B2B by separate arrangement) + the free demo.

Models

  • naia-0.9-omni-24g (available now — offline / demo)
  • naia-0.9-coding-24g · naia-0.9-omni-48g (planned)

Full pricing & lineup: 4.1 Model pricing.


How it works — gateway Realtime API (developers)

The shared entry point for online (cloud), the web demo, and naia-os. naia-0.9-omni-24g is served over an OpenAI Realtime API–compatible WebSocket. The client connects to the gateway, which admits it onto a backend (a local GPU slot, or — when cloud is enabled — a cloud Pod).

1. Issue an API key

Create one on the dashboard API Keys page. (The live demo auto-issues a short-lived key.)

2. Connect + authenticate

Endpoint (prod):

wss://gateway.nextain.io/v1/realtime?model=naia-0.9-omni-24g&instance=<userId>:<random>
  • Always connect over wss:// (TLS) — your key and audio travel over it.
  • instance = a stable session id. Reusing it across reconnects re-attaches to the same reservation. (Native clients may send X-Naia-OS-Instance; browsers can't send headers, so use the query param.)

Right after the socket opens, send credentials as the first message (browsers can't send headers):

{ "setup": { "apiKey": "<your key>", "locale": "en", "instanceId": "<userId>:<random>" } }

3. Configure the session — persona / reference voice

After the server sends session.created, configure with session.update.

{
  "type": "session.update",
  "model": "naia-0.9-omni-24g",
  "session": {
    "modalities": ["text", "audio"],
    "input_audio_format": "pcm16",
    "output_audio_format": "pcm16",
    "instructions": "<persona instructions>",
    "turn_detection": { "type": "server_vad" },
    "ref_audio_url": "<reference voice sample URL (optional)>"
  }
}
  • instructions = persona only. Output formatting is enforced by the server.
  • ref_audio_url = a URL of a reference voice to mimic (not a file upload, optional).

4. Messages

Client → Server

PurposeMessage
Voice input{"type":"input_audio_buffer.append","audio":"<base64 PCM16 24kHz>"} (server VAD auto-detects end of speech)
Text input{"type":"conversation.item.create", ...} then {"type":"response.create"}
Interrupt{"type":"response.cancel"}

Server → Client

MessageMeaning
response.audio.deltabase64 PCM16 24kHz audio chunk
response.audio_transcript.delta / response.text.deltareply text (streaming)
conversation.item.input_audio_transcription.completedtranscription of your spoken turn
response.doneend of a turn
emotion.updatedemotion tag (Naia extension)

5. Admission / queue / sold-out — status contract (clients must read)

The outcome arrives as a status event (JSON) + a WebSocket close code. Judge by the JSON event that precedes the close, not the close code alone.

Server → client eventcloseMeaning / what the client does
session.created—Admitted (active). Configure via session.update
session.queued4503The slot is busy — wait in line (NOT an error). Carries position (0-based, render +1), queue_len (total waiters incl. you), reservation_token. eta_s is optional — the local queue does not send it, so the client estimates place × session-seconds (the cloud path adds eta_s + provider). Show "N waiting · your place · ~T s" + auto-reconnect with the same instance (backoff 5→60s) → session.created once the slot frees. (Demo = one local GPU, rotated)
session.preparing4503(Currently inactive — cloud suspended.) Cloud Pod cold-start. The voice tier (naia-0.9-omni-24g) is local-only today, so this event does not occur. When cloud is enabled it carries the same fields as queued (position·queue_len·reservation_token, + eta_s·provider) and is handled the same (auto-reconnect)
session.sold_out4503No slot available (e.g. local slot down). Carries retry_after_s + tier_a_hint (local-model hint). Retry, or fall back to the local model (Naia OS)
session.consent_required4409Account already has a live session. Choose a branches option (replace/add)
session.error4503Narrow case — assigned but the backend URL couldn't resolve (no endpoint). Generic internal errors arrive as type:"error" + close 4500, not session.error

WebSocket close codes

CodeMeaning
4001Auth failed (missing/invalid api_key)
4002superseded — same account connected from another device/tab (last-wins; this connection yields)
4003Insufficient credits
4409Consent required
4500Server internal error (carries a type:"error" message)
4503Queued / preparing / sold-out / no-endpoint (session.error) / transient unavailable — disambiguate via the preceding JSON event

⚠️ Never render 4503 as "closed" or an error. On session.queued/preparing, show a "waiting" UX and auto-reconnect with the same instance. (A bare 4503 with no preceding event = transient unavailable → reconnect, not an error.)

Reconnect rule: reconnecting with the same instance re-attaches to the held reservation (reservation_token). Retry with backoff (5s → 60s max); once it's your turn the reconnect yields session.created.

6. Check balance

GET /v1/profile/balance  →  {"success": true, "data": {"balance": <credits>}}

A full working implementation is on the 4.3 Live Demo page.