Usage and cost tracking

Apus keeps subscription quota and Platform API billing distinct:

An explicit Admin key takes precedence over OAuth. Provider-reported history is not merged with Apus's session-derived estimated cost; it can include API activity from other clients and provider-side billing adjustments.

OpenAI's API Usage Dashboard documentation describes the organization-owner and explicit Usage Dashboard permission requirements for usage data.

Provider, model, runtime, and channel are separate layers. If those labels are getting mixed together, read Agent runtimes before changing config.

Apus feature coverage

OpenAI capability Apus surface Status
Chat / Responses openai/<model> model provider Yes
Codex subscription models openai/<model> with OpenAI OAuth Yes
Legacy Codex model refs old Codex model refs, codex-cli/<model> Repaired by doctor to openai/<model>
Codex app-server harness Codex-compatible HTTPS route with runtime unset/auto, or explicit agentRuntime.id: codex Yes
Server-side web search Native OpenAI Responses tool Yes, when web search is enabled and no other provider is pinned
Images image_generate Yes
Text-to-speech tts.provider: "openai" / tts Yes
Batch speech-to-text tools.media.audio / media understanding Yes
Streaming speech-to-text Voice Call streaming.provider: "openai" Yes
Realtime voice Voice Call realtime.provider: "openai" / Control UI Talk talk.realtime.provider: "openai" Yes (auth order depends on the selected Realtime route; see below)
Embeddings memory embedding provider Yes

Released GPT-Live browser and Gateway-relay WebRTC try an Apus ChatGPT OAuth profile first and fall back to Platform API-key auth. Ordinary GA browser Realtime tries Platform auth first and falls back to OAuth only when no Platform credential source is configured. Direct backend sockets and unlisted or private realtime routes require Platform API-key auth.

Platform auth is resolved in this order: configured realtime API key, openai API-key profile, then OPENAI_API_KEY. Voice Call, Discord realtime voice, direct backend sockets, unlisted or private realtime routes, and realtime transcription still require Platform auth.

If API-key auth reports missing billing, top up Platform credits at platform.openai.com/account/billing for the organization backing your realtime credentials when using API-key auth. Realtime voice accepts the openai API-key auth profile created by apus onboard --auth-choice openai-api-key, a Platform API key set via talk.realtime.providers.openai.apiKey for Control UI Talk, or plugins.entries.voice-call.config.realtime.providers.openai.apiKey for Voice Call, or the OPENAI_API_KEY environment variable.

In Control UI Video Talk with Platform auth, OpenAI WebRTC receives camera context on demand: when the model calls describe_view, the browser sends one bounded JPEG over the realtime data channel. Apus does not attach a continuous camera track to the OpenAI session.

Memory embeddings

Apus can use OpenAI, or an OpenAI-compatible embedding endpoint, for memory_search indexing and query embeddings:

{
  memory: {
    search: {
      provider: "openai",
      model: "text-embedding-3-small",
    },
  },
}

For OpenAI-compatible endpoints that require asymmetric embedding labels, set queryInputType and documentInputType under memory.search. Apus forwards these as provider-specific input_type request fields: query embeddings use queryInputType; indexed memory chunks and batch indexing use documentInputType. See the Memory configuration reference for the full example.