Skip to content

Drivers

The driver layer abstracts LLM providers behind a uniform InferenceDriver interface. It lives in its own workspace at projects/omega-drivers/, separate from projects/omega-lisp/.

The interface

ts
// projects/omega-drivers/packages/inference/src/index.ts:16-34
interface InferenceDriver {
  readonly id: string;
  readonly capabilities: DriverCapabilities;
  infer(request: InferRequest): Promise<InferResponse>;
  inferStream?(request: InferRequest): AsyncIterable<InferStreamChunk>;
  readonly sessions?: DriverSessionManager;
  health(): Promise<HealthResult>;
  dispose?(): Promise<void>;
}

Capabilities (DriverCapabilities, lines 38-73) are structured: oracle protocol support, tooling format, session/streaming/multi-turn, IO (vision, audio, structured output, files, artifacts), transport class, MCP client/server.

Built-in drivers

PackageWhat it talks toNotes
@open-matrix/driver-anthropicAnthropic APIUses @anthropic-ai/sdk under the hood. Anthropic-format tool calling.
@open-matrix/driver-openaiOpenAI / Codex / chatgpt.com backend-apiThree configurations: standard OpenAI (baseUrl: api.openai.com), Codex (baseUrl: chatgpt.com/backend-api), or custom.
@open-matrix/driver-ollamaLocal Ollama instanceReads OLLAMA_BASE_URL and OLLAMA_MODEL.
@open-matrix/driver-claude-cliThe local claude CLI binarySubprocess transport. Always available if claude is on PATH.
@open-matrix/driver-mockIn-memory deterministic mockFor tests. Always registered if installed.
@open-matrix/driver-chatgptchatgpt.com web (browser transport)Browser-driven; not a pure HTTP API.
@open-matrix/driver-codex-cliThe local codex CLI binarySubprocess transport.

The registry

DriverRegistry (registry.ts) is a name-keyed map. register(name, driver) adds; get(name) retrieves; has(name) checks; list() enumerates.

Drivers are registered under arbitrary names — common conventions:

  • anthropic for the Anthropic driver.
  • openai-codex for the OpenAI driver pointed at chatgpt.com/backend-api.
  • openai for standard OpenAI.
  • claude-cli / codex-cli / ollama / mock for the named transports.

Auto-population

createRegistryFromEnv() (inference/src/index.ts:309-401) discovers available drivers in this order:

  1. Codex JWT at ~/.codex/auth.jsonopenai-codex.
  2. OpenClaw auth-profiles at ~/.openclaw/agents/main/agent/auth-profiles.json → matching providers.
  3. Environment variables: OPENAI_API_KEY, ANTHROPIC_API_KEY, OLLAMA_BASE_URL/OLLAMA_MODEL.
  4. Claude CLI if installed.
  5. Mock always.

Each step uses dynamic import so missing driver packages are skipped silently. The same auto-pop logic is what populateRegistryFromEnv in omega-lisp/src/runtime.ts calls before constructing an OmegaRuntime.

Adding a new driver

  1. Create projects/omega-drivers/packages/driver-<name>/ with src/index.ts.
  2. Implement InferenceDriver. Set id and capabilities honestly — the registry uses capabilities for routing decisions.
  3. Add a workspace entry in projects/omega-drivers/package.json.
  4. (Optionally) add an env-var hook in createRegistryFromEnv so it's auto-detected.
  5. Build with pnpm --filter @open-matrix/driver-<name> build.

Per-call driver selection

Omega's (effect infer.op …) accepts an optional :driver keyword:

lisp
(effect infer.op (list "What is 2+2?") :driver 'anthropic :model 'claude-sonnet)

If :driver is omitted, OmegaConfig.defaultDriver (or DEFAULT_INFERENCE_DRIVER env var, or first-registered driver) is used.

See also

Source: projects/omega-drivers/packages/inference/src/index.ts:16-220 (interface + types), projects/omega-drivers/packages/inference/src/index.ts:309-401 (auto-pop), driver packages at projects/omega-drivers/packages/driver-*/.