Ax Audio And Realtime For C++
Use when writing C++ code with axllm for audio input/output, OpenAI Responses audio mapping, realtime event folding, and generated package audio examples.
Install
Install only this skill for C++:
npx skills add https://ax-llm.github.io/ax/cpp/ --skill 'ax-cpp-audio'Published skill file: ax-cpp-audio/SKILL.md.
Source
- Source: packages/cpp/skills/ax-cpp-audio/SKILL.md
- Version:
25.3.2
Skill Instructions
This skill helps an agent write C++ code with the generated Ax package axllm. Use the generated package API, examples, and manifests; do not import TypeScript-only APIs unless you are editing the TypeScript package.
When To Use
- Map speech, transcription, or realtime events through the generated provider surface.
- Use no-key examples for event folding and provider request mapping.
- Keep live provider calls behind explicit credentials and provider-api examples.
Package Facts
- Language: C++.
- Package:
axllm. - Package API docs:
API.mdandaxir-api.json. - Capability manifest:
axir-capabilities.json. - Runnable examples:
examples/. - Real network support: yes.
- Scripted no-key transport support: yes.
- Runtime profiles:
javascript-quickjs,python-pyodide.
Core Pattern
#include "axllm/axllm.hpp"
auto llm = axllm::ai("openai", { {"apiKey", std::getenv("OPENAI_API_KEY")} });Speech And Audio Fields
speak()returns TypeScript’s speech result keys:data(base64 audio),format,mimeType,transcript(the spoken text), andsampleRate/channelswhen the mime type gives them. The older keysaudio,mime_type, andsample_rateare removed.- As in TypeScript, a binary speech body’s Content-Type is its
mimeType(else the format’s mime type), and a JSON body (by its Content-Type) is read fromaudio_data,audioData,data,audio.data,output.audio.data, or a Gemini part’s inline data. A JSON body with a bare string underaudio, or without an audio data field, raises TypeScript’s error. - Speak requests match TypeScript: OpenAI defaults to
gpt-4o-mini-ttswith thealloyvoice, sends a{ id }voice by its id, sendsspeedwhen set, and asks forpcmwhen the format ispcm16; Mistral defaults tovoxtral-mini-tts-2603and sends the voice asvoice_id; Grok sendsspeedwhen set. - The renderer calls
AIClient::speak(request, options):AxAIServiceclients speak, and the baseAIClientthrows. - An AxGen
audiooutput field becomes speech with therenderAudio/render_audiooption (see the gen skill): the field then holds thespeak()result, with the spoken text as itstranscript. - An agent’s
audiooutput fields render the same way whenrenderAudio/render_audiois set on the agent, itsresponderOptions, or the forward call (the call’s wins); as in TypeScript, the responder’sspeak()request takes the forward call’sspeechorresponderOptions.speech, not a top-levelspeechoption. - An audio input that is a string, or an audio object with a string
transcript(a rendered audio output), reaches the model as text. Audio without a transcript goes as an audio part with only itsformat(wavwhen it has none) anddata.
Relevant API Surface
- AxAI:
axllm::ai,axllm::openai_decisions,axllm::AxAIOpenAIDecisionsClient,axllm::typesafe,axllm::AxAITypesafeClient,axllm::AxCancellationToken,axllm::AxAIServiceAbortedError,axllm::get_supported_ai_models,axllm::AxCredentialRequest,axllm::AxCredentialProvider,axllm::AIClient::owned_worker_factory,axllm::AxChatSession,axllm::AxStreamHandler,axllm::OpenAICompatibleClient,axllm::OpenAIResponsesClient,axllm::GoogleGeminiClient,axllm::AnthropicClient,axllm::AxUsageContext,axllm::AxUsageEvent,axllm::AxUsageObserver,axllm::set_usage_observer,axllm::AxRuntimeHooks,axllm::AxRateLimitInfo,axllm::AxRateLimiter,axllm::AxTracer,axllm::AxMeter,axllm::AxGlobals,axllm::set_rate_limiter,axllm::set_tracer,axllm::set_meter,axllm::AxBalancer,axllm::AxBalancerAdaptiveStrategy,axllm::AxBalancerStatsStore,axllm::AxInMemoryBalancerStatsStore,axllm::create_balancer_route_stats,axllm::update_balancer_route_stats,axllm::sample_balancer_route_health,axllm::MultiServiceRouter,axllm::ProviderRouter
Guardrails
- Start from package examples for exact native syntax before inventing a new call shape.
- Use
provider-apiexamples only when the user explicitly has provider credentials available. - Use
no-keyexamples for deterministic local checks and provider request mapping. - Treat AxIR as the source of generated package truth: if package docs disagree with source code, update the compiler and regenerate packages.
- Do not copy repo-maintainer skills from
tools/*/skills/into user packages.