# @leumas/providers

LLM provider adapters — one contract (complete / adapter step-loop / realtimeSession / available) over ollama, openai, openai-realtime, claude, gemini, codex, cursor-agent and leumas-slm. The brains...


The **LLM provider adapter base** — every brain Leumas can think with, behind one contract.
`@leumas/chatbots` and the Leviathan runtime resolve a bot's `provider` here; Studio lists and
prices them via `GET /api/providers`.

```js
import { createProviderRegistry, providers } from '@leumas/providers';

const registry = createProviderRegistry(providers); // stub always included as fallback
const provider = await registry.resolve({ provider: 'auto' }); // first available: ollama → openai → claude → gemini
const { reply, toolCalls } = await provider.complete({ system, messages, tools, model });
```

**Contract** (`defineProvider`): `capabilities {text,tools,stream,realtimeVoice}` + `envKeys` +
`available()` + either a step-loop `adapter` (`createConversation/step/appendToolResults` — the shape
ported from leumas-cursor-agent-mvp's runners) or a direct `complete()`; realtime providers add
`realtimeSession()`. `runAgentLoop` (from `@leumas/providers/agent-loop`) drives multi-step tool use
and pauses/resumes around client-side tool calls.

**Providers:** `ollama` (bridges `adapters/domain/ollama`) · `openai` · `openai-realtime` · `claude` ·
`gemini` · `codex` (CLI wrap) · `cursor-agent` · `leumas-slm` · `stub` (echo fallback). SDKs are
lazy-imported so a missing key/dep degrades to `available: false`, never a crash.


---
Source: shared/engines/adapters/providers/README.md
Canonical: https://docs.leumas.tech/p/adapters/providers
