sdk/packages/llms/README.md
@cline/llms is the model and provider layer for the Cline SDK. It gives
you typed provider settings, model catalogs, shared gateway contracts, and
AI SDK-backed handler creation for supported LLM backends.
@cline/llms/runtime for declarative config and runtime registry creation@cline/llms/providers for handler creation and provider settings/types@cline/llms/models for model catalogs and query helpers@cline/llms root exports for the gateway registry and shared llm contractsnpm install @cline/llms zod
import { createHandler } from "@cline/llms";
const handler = createHandler({
providerId: "anthropic",
apiKey: process.env.ANTHROPIC_API_KEY ?? "",
modelId: "claude-sonnet-4-6",
});
for await (const chunk of handler.createMessage("You are a concise assistant.", [
{ role: "user", content: [{ type: "text", text: "Say hello." }] },
])) {
console.log(chunk);
}
Use createLlmsRuntime(...) when you want a small registry around:
getBuiltInProviders()registerBuiltinProvider(...)Preferred import:
import { createLlmsRuntime, defineLlmsConfig } from "@cline/llms/runtime";
Use @cline/llms/providers for:
createHandler(...) and createHandlerAsync(...)ProviderSettings and ProviderSettingsSchemaProviderConfigMessage and ApiStreamChunkBuilt-in providers are routed through the internal gateway registry and backed by
AI SDK provider implementations. Shared gateway contracts are exported from both
@cline/llms and @cline/shared.
Use @cline/llms/models when you need generated provider/model metadata for
selection UIs, defaults, or validation.
@cline/llms: runtime-focused convenience entrypoint@cline/llms/node: explicit Node/runtime entrypoint@cline/llms/browser: browser-safe bundle@cline/llms/runtime: focused runtime entrypoint@cline/llms/models: model catalog/query entrypoint@cline/llms/providers: provider handler/settings entrypoint@cline/agents: agent loop and tool execution@cline/core: stateful runtime assembly and provider settings storageUse this for API-key-backed provider validation against real endpoints.
ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, CLINE_API_KEY, etc.).packages/llms/src/tests/live-providers.example.json as the providers list.LLMS_LIVE_TESTS=1 \
LLMS_LIVE_PROVIDERS_PATH=/absolute/path/to/packages/llms/src/tests/live-providers.example.json \
bun -F @cline/llms run test:live
Reasoning-focused live run (same command, different flags):
LLMS_LIVE_REASONING_TESTS=1 \
LLMS_LIVE_REASONING_PROVIDERS_PATH=/absolute/path/to/packages/llms/src/tests/live-providers.reasoning.example.json \
bun -F @cline/llms run test:live
Tool-use-focused live run (same command, different flags):
LLMS_LIVE_TOOL_TESTS=1 \
LLMS_LIVE_TOOL_PROVIDERS_PATH=/absolute/path/to/packages/llms/src/tests/live-providers.tools.example.json \
bun -F @cline/llms run test:live
Optional:
LLMS_LIVE_PROVIDER_TIMEOUT_MS=120000 to increase per-provider timeout.LLMS_LIVE_PROVIDER_RETRIES=2 to retry transient upstream/provider failures per provider (total attempts = retries + 1).LLMS_LIVE_PROVIDER_CONCURRENCY=3 to run multiple provider entries in parallel. Defaults to 3; lower it if you need stricter provider rate-limit behavior.LLMS_LIVE_PROVIDERS_PATH to a custom file if you want a narrower provider set.LLMS_LIVE_REASONING_PROVIDERS_PATH to a custom file for reasoning-enabled suites.LLMS_LIVE_TOOL_PROVIDERS_PATH to a custom file for tool-use suites.apiKeyEnv, baseUrlEnv, and headersEnv in a provider entry when a live config needs secrets without writing them to JSON.OpenAI Codex subscription live runs use the saved OAuth credentials from ~/.cline/data/settings/providers.json after cline auth --provider openai-codex. Point the plain or reasoning suite at packages/llms/src/tests/live-providers.openai-codex.example.json or packages/llms/src/tests/live-providers.openai-codex.reasoning.example.json.
Per-provider live assertions are configured in the JSON via expectations:
requireUsage: fail if no usage chunk is emitted (defaults to true; set to false to opt out).requireCacheReadTokens: fail unless cacheReadTokens > 0 (auto-runs at least 2 attempts with a long cache probe prompt if no prompt override is provided).minCacheReadTokens: stricter cache floor check.requireReasoningChunk: fail unless at least one reasoning chunk is emitted.requireNoReasoningChunk: fail if any reasoning chunk is emitted.minInputTokens / minOutputTokens: enforce lower bounds.requireToolCall: fail unless at least one tool_calls chunk is emitted.In reasoning suites, set requireReasoningSignal: true to require either a reasoning chunk or thoughtsTokenCount > 0 (provider-dependent; can be flaky on some endpoints).
To check that disabling reasoning actually suppresses reasoning output across models, use packages/llms/src/tests/live-providers.reasoning-disabled.example.json; it covers direct and routed provider paths across cline, openai, openrouter, anthropic, gemini, vercel-ai-gateway, zai, and deepseek where model support exists, with reasoning.enabled: false and requireNoReasoningChunk: true.
Common live failure classes:
Overloaded: provider/model capacity issue or transient upstream saturation.Insufficient Balance: the provider account needs funds.Model Not Exist: the model id is not available for that provider/account.expected no reasoning chunks: likely real SDK/provider-option behavior regressions.Add a new entry under the providers object in either config file:
packages/llms/src/tests/live-providers.example.jsonpackages/llms/src/tests/live-providers.reasoning.example.jsonpackages/llms/src/tests/live-providers.reasoning-disabled.example.jsonpackages/llms/src/tests/live-providers.tools.example.jsonMinimal smoke/cache entry:
"my-openai-model": {
"settings": {
"provider": "openai",
"model": "gpt-5.4"
},
"expectations": {
"requireUsage": true
}
}
Cache-asserted entry (auto-enforces multi-run cache probe):
"my-cache-model": {
"settings": {
"provider": "openai",
"model": "gpt-5.4"
},
"expectations": {
"requireUsage": true,
"requireCacheReadTokens": true
}
}
Reasoning entry:
"my-reasoning-model": {
"settings": {
"provider": "anthropic",
"model": "claude-sonnet-4-6",
"reasoning": {
"effort": "high"
}
},
"expectations": {
"requireUsage": true,
"requireReasoningChunk": true
}
}
Tool-use entry:
"my-tools-model": {
"settings": {
"provider": "openai",
"model": "gpt-5.4"
},
"expectations": {
"requireUsage": true,
"requireToolCall": true
}
}