@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...
@leumas/providers
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.
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.