npm.io
0.0.38 • Published 5 months ago

@clinebot/llms

Licence
—
Version
0.0.38
Deps
21
Size
1.6 MB
Vulns
0
Weekly
0

[experimental] @clinebot/llms

@clinebot/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.

What You Get

  • @clinebot/llms/runtime for declarative config and runtime registry creation
  • @clinebot/llms/providers for handler creation and provider settings/types
  • @clinebot/llms/models for model catalogs and query helpers
  • @clinebot/llms root exports for the gateway registry and shared llm contracts

Installation

npm install @clinebot/llms zod

Quick Start

import { createHandler } from "@clinebot/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);
}

Main APIs

Runtime

Use createLlmsRuntime(...) when you want a small registry around:

  • configured providers and their default models
  • builtin provider discovery via getBuiltInProviders()
  • custom provider registration via registerBuiltinProvider(...)
  • handler creation for builtin or custom providers

Preferred import:

import { createLlmsRuntime, defineLlmsConfig } from "@clinebot/llms/runtime";
Providers

Use @clinebot/llms/providers for:

  • createHandler(...) and createHandlerAsync(...)
  • ProviderSettings and ProviderSettingsSchema
  • ProviderConfig
  • Message and ApiStreamChunk

Built-in providers are routed through the internal gateway registry and backed by AI SDK provider implementations. Shared gateway contracts are exported from both @clinebot/llms and @clinebot/shared.

Models

Use @clinebot/llms/models when you need generated provider/model metadata for selection UIs, defaults, or validation.

Entry Points

  • @clinebot/llms: runtime-focused convenience entrypoint
  • @clinebot/llms/node: explicit Node/runtime entrypoint
  • @clinebot/llms/browser: browser-safe bundle
  • @clinebot/llms/runtime: focused runtime entrypoint
  • @clinebot/llms/models: model catalog/query entrypoint
  • @clinebot/llms/providers: provider handler/settings entrypoint
  • @clinebot/agents: agent loop and tool execution
  • @clinebot/core: stateful runtime assembly and provider settings storage

More Examples

Live Provider Smoke Test

Use this for API-key-backed provider validation against real endpoints.

  1. Ensure provider keys are present in your environment (ANTHROPIC_API_KEY, OPENAI_API_KEY, GEMINI_API_KEY, CLINE_API_KEY, etc.).
  2. Use the sample config at packages/llms/scripts/live-providers.example.json as the providers list.
  3. Run:
LLMS_LIVE_TESTS=1 \
LLMS_LIVE_PROVIDERS_PATH=/absolute/path/to/packages/llms/scripts/live-providers.example.json \
bun -F @clinebot/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/scripts/live-providers.reasoning.example.json \
bun -F @clinebot/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/scripts/live-providers.tools.example.json \
bun -F @clinebot/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).
  • Point LLMS_LIVE_PROVIDERS_PATH to a custom file if you want a narrower provider set.
  • Point LLMS_LIVE_REASONING_PROVIDERS_PATH to a custom file for reasoning-enabled suites.
  • Point LLMS_LIVE_TOOL_PROVIDERS_PATH to a custom file for tool-use suites.

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/scripts/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.
  • assertion failures such as expected no reasoning chunks: likely real SDK/provider-option behavior regressions.
Adding A Model To Live Tests

Add a new entry under the providers object in either config file:

  • Cache/smoke suite: packages/llms/scripts/live-providers.example.json
  • Reasoning suite: packages/llms/scripts/live-providers.reasoning.example.json
  • Reasoning-disabled suite (asserts no reasoning chunks when reasoning is off): packages/llms/scripts/live-providers.reasoning-disabled.example.json
  • Tool-use suite: packages/llms/scripts/live-providers.tools.example.json

Minimal 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
  }
}