ai() LLM Models Create provider clients and select models. cpp subsystems subsystems/ai website/content-src/templates/subsystem-ai.md subsystems ai() LLM Models

ai() LLM Models

Use ai() to create provider clients and keep model traffic behind one Ax request shape.

C++
auto client = axllm::OpenAICompatibleClient({
  {"api_key", api_key},
  {"model", "gpt-4.1-mini"},
});

What It Does

ai() selects a provider implementation from configuration and returns a client that Ax programs can call. The client handles chat, streaming, embeddings, media where supported, usage normalization, provider options, model keys, routing hooks, tracing, and runtime defaults.

flowchart LR
  A["Model key or alias"] --> B["Model catalog"]
  B --> C["Capability filter"]
  C --> D["Provider client"]
  D --> E["Request mapping"]
  E --> F["Provider API"]
  F --> G["Response normalization"]
  G --> H["Usage + trace"]

Core Call Shape

Create the client once near the application boundary, then pass it into forward(), streamingForward(), agents, flows, or optimizers.

text
client = ai(provider options)
result = program.forward(client, inputs)

Common Patterns

  • Use a provider name and environment-backed API key.
  • Set a default model in provider config when the app has one obvious model.
  • Define model aliases when callers should choose fast, smart, or cheap instead of provider model IDs.
  • Use OpenAI-compatible apiURL for compatible providers.
  • Use model catalog helpers before runtime when the UI needs provider/model selectors.
  • Use routers or balancers when provider fallback is part of the product.

Provider clients

Generated Package Provider Path

The C++ package exposes the AxIR-supported provider surface. Public examples use OpenAI-compatible clients, while internal fixtures cover provider normalization without credentials.

IllustrativeGenerated-package equivalent. Prefer checked-in package examples for copy/paste runnable code.
C++
auto client = axllm::OpenAICompatibleClient({
  {"api_key", api_key},
  {"model", "gpt-4.1-mini"},
});

Use the generated package examples for exact provider API runs, stream mapping, Responses audio mapping, and realtime event folding for this language.

Embeddings and audio

IllustrativeGenerated-package equivalent. Prefer checked-in package examples for copy/paste runnable code.
C++
// Implement embedding calls through the generated AxAI client surface when present.
// Use package conformance coverage to confirm current support for this language.
IllustrativeGenerated-package equivalent. Prefer checked-in package examples for copy/paste runnable code.
C++
// Realtime audio over WebSocket — build with -DAXLLM_ENABLE_REALTIME=ON
axllm::OpenAIResponsesClient client(axllm::object({{"model", "gpt-realtime-2"}, {"api_key", std::getenv("OPENAI_APIKEY")}}));
axllm::Value request = axllm::object({{"model", "gpt-realtime-2"}, {"chat_prompt", axllm::array({axllm::object({{"role", "user"}, {"content", "Say hello."}})})}, {"audio", axllm::object({{"output", axllm::object({{"voice", "alloy"}})}})}});
axllm::Value result = client.realtime_chat(request, nullptr);  // one merged turn: transcript + base64 PCM audio
// Realtime models also route transparently through chat(); chat() accepts input_audio parts; transcribe()/speak() do batch STT/TTS.

Practical Notes

  • Prefer provider factories over direct provider classes in new code.
  • Use model catalog and provider-scoring helpers when choosing between providers.
  • Use routers/balancers when a workflow can fall back or split traffic.
  • Keep public provider examples separate from internal conformance fixtures.
  • Trace provider requests, token usage, estimated cost, and routing decisions in production.

See ai() API.

Docs