Skip to content
nikcli
Docs
Documentation

Providers

How nikcli builds its model catalog, resolves credentials, selects runtime adapters, and streams requests.

Overview

Providers are resolved by packages/nikcli/src/provider/provider.ts. The service starts with models.dev, layers local and gateway providers, applies user config and saved auth, lets plugins modify providers, filters models, then caches SDK instances and model loaders.

Models

Catalog

ModelsDev.get provides the default provider/model database and API package metadata.

Keys

Auth

Credentials can come from environment variables, saved auth records, or config.provider.*.options.

Adapters

SDK

Known AI SDK packages are imported directly; unknown provider packages can still be loaded dynamically.

Stream

Runtime

Session execution enters session/llm.ts, then uses AI SDK or the native @nikcli-ai/llm runtime when supported.

Provider resolution

The provider service constructs the final catalog in this order:

  1. Load models.dev and convert each provider/model into nikcli provider records.
  2. Apply disabled_providers and enabled_providers filters.
  3. Probe dynamic local providers such as ollama and nikcli-inference.
  4. Merge provider overrides from config.provider.
  5. Merge saved API auth records from Auth.Service.
  6. Run plugin auth loaders and plugin model loaders.
  7. Filter alpha, deprecated, unavailable, allow-list, and block-list models.
  8. Create provider/model caches for SDK instances, language models, and image models.
Filters are provider-level first

enabled_providers means only listed providers survive. disabled_providers removes providers from automatic loading. Model-level allow/block lists are applied later.

Configure a provider

Provider config is stored under provider in nikcli.json. The schema is ModelsDev.Provider.partial plus nikcli options such as API key, base URL, timeout, header timeout, chunk timeout, model variants, allow-lists, and block-lists.

nikcli.json
json
{
  "$schema": "https://nikcli-ai.dev/config.json",
  "model": "openrouter/openai/gpt-5",
  "small_model": "openai/gpt-5-mini",
  "provider": {
    "openrouter": {
      "options": {
        "apiKey": "{env:OPENROUTER_API_KEY}",
        "baseURL": "https://openrouter.ai/api/v1",
        "timeout": 300000,
        "headerTimeout": 10000,
        "chunkTimeout": 60000
      }
    },
    "ollama": {
      "options": {
        "baseURL": "http://127.0.0.1:11434/v1",
        "apiKey": "ollama"
      }
    }
  }
}
OptionMeaning
options.apiKeyExplicit key used when no saved auth or provider-specific env key wins first.
options.baseURLOpenAI-compatible or gateway URL, normalized by provider-specific loaders when needed.
options.timeoutTotal request timeout in milliseconds, or false to disable.
options.headerTimeoutMaximum wait for response headers. OpenAI defaults to a configured provider value.
options.chunkTimeoutMaximum gap between SSE chunks before aborting a stream.
whitelistOnly keep matching model ids for this provider.
blacklistRemove matching model ids for this provider.
models.*.variantsVariant-level config, including disabled variants.

Bundled SDK adapters

These provider packages are imported directly in provider/provider.ts, so they do not require a dynamic package install at runtime.

PackageFactoryNotes
@ai-sdk/openaicreateOpenAIUses Responses API through custom loader.
@ai-sdk/anthropiccreateAnthropicAdds Claude Code and fine-grained streaming beta headers.
@ai-sdk/azurecreateAzureCan choose chat or responses URL behavior.
@ai-sdk/googlecreateGoogleGenerativeAIGoogle Generative AI provider.
@ai-sdk/google-vertexcreateVertexVertex provider with project/location env handling.
@ai-sdk/google-vertex/anthropiccreateVertexAnthropicAnthropic on Vertex.
@ai-sdk/openai-compatiblecreateOpenAICompatibleDefault fallback for compatible providers.
@openrouter/ai-sdk-providercreateOpenRouterOpenRouter native adapter.
@ai-sdk/xaicreateXaixAI adapter.
@ai-sdk/amazon-bedrockcreateAmazonBedrockCredential chain, bearer token, region prefix logic.
@ai-sdk/gatewaycreateGatewayAI Gateway package support.
@ai-sdk/vercelcreateVercelVercel AI Gateway package support.
@gitlab/gitlab-ai-providercreateGitLabUses OAuth/API/env token resolution.
@ai-sdk/github-copilotCopilot compatibility factorySwitches between chat and responses for GPT-5 family models.

Dynamic providers

nikcli also creates providers that are not just copied from models.dev. The two important dynamic loaders are local Ollama and nikcli Inference Gateway.

ProviderDetectionResult
ollamaConfigured provider.ollama.options.baseURL, OLLAMA_BASE_URL, or local 127.0.0.1:11434 probe.Builds OpenAI-compatible models from /models with conservative limits.
nikcli-inferenceNIKCLI_INFERENCE_URL, NIKCLI_INFERENCE_KEY, or config options.Builds models from gateway /models, with pricing, context, thinking, and image input metadata.
Unknown configured providerEntry exists in config.provider or has a key.Creates a default provider record so custom compatible endpoints can appear.
Plugin providerPlugin exposes auth or model hooks.Merges options and model lists into the provider catalog.

Auth and credentials

Provider credentials can come from three places: environment variables read from model metadata and provider-specific loaders, saved auth records from Auth.Service, or explicit config options.

Terminal
bash
export OPENAI_API_KEY=sk-...
export ANTHROPIC_API_KEY=sk-ant-...
export OPENROUTER_API_KEY=sk-or-...
export AWS_REGION=us-east-1
export AWS_PROFILE=default
export NIKCLI_INFERENCE_KEY=nik-...
Provider familySpecial handling
Amazon BedrockConfig region wins over AWS_REGION, bearer token can override credential chain, endpoint/baseURL can override endpoint.
AzureCan use resource-name derived base URL and switch completion URLs through options.
GitLabUses saved OAuth, saved API key, or GITLAB_TOKEN; instance URL defaults to https://gitlab.com.
CloudflareUses account/gateway env plus token and transforms auth/header behavior for AI Gateway.
GitHub CopilotBuilt-in auth plugin can register personal or enterprise Copilot providers.

Model selection

The active model is a provider/model string. It can come from CLI flags, session/TUI selection, config model, or defaults chosen by provider availability. small_model is used for supporting tasks such as title generation.

SettingUsed for
modelDefault primary model for agent turns.
small_modelLow-cost helper work such as title and summaries.
NIKCLI_ENABLE_EXPERIMENTAL_MODELSKeeps alpha models in the catalog.
NIKCLI_DISABLE_MODELS_FETCHDisables models.dev fetch path where supported.
provider.*.whitelistProvider-local model allow-list.
provider.*.blacklistProvider-local model block-list.
Provider/model ids are exact

Provider.ModelNotFoundError includes provider id, model id, and suggestions. Check both sides of the slash before assuming the provider is unavailable.

Runtime streaming

Runtime ownership starts in session/llm.ts. It builds headers, normalizes messages, converts tools, applies ProviderTransform, and streams output. A native runtime in session/llm/native-runtime.ts can use @nikcli-ai/llm for OpenAI, Anthropic, and OpenAI-compatible providers when requirements are met.

StepSourceNotes
Message repairLLM.normalizeStreamMessagesRepairs UI-shaped messages that would otherwise trigger invalid prompt errors.
HeadersbuildRequestHeadersAdds nikcli request headers for nikcli providers and user agent for most others.
Provider optionsProviderTransform.providerOptionsTransforms model/provider options before SDK/native call.
Native runtimenative-runtime.tsRequires supported provider family and configured API key.
AI SDK fallbacksession/llm/ai-sdk.tsGeneral runtime path for all supported SDK adapters.

Images and speech

Image generation and speech use separate config sections so they can choose different providers and models from chat. The tool implementations also read provider-specific environment variables for OpenRouter and ElevenLabs.

nikcli.json
json
{
  "image": {
    "provider": "openrouter",
    "model": "openai/gpt-5-image"
  },
  "speak": {
    "provider": "elevenlabs",
    "model": "voice-id",
    "modelId": "eleven_v3",
    "outputFormat": "mp3_44100_128"
  }
}
EnvUsed by
NIKCLI_OPENROUTER_API_KEY / OPENROUTER_API_KEYOpenRouter image, speech, and voice-related tools.
NIKCLI_ELEVENLABS_API_KEY / ELEVENLABS_API_KEYElevenLabs speech provider.
NIKCLI_OPENROUTER_BASE_URLOpenRouter-compatible base URL override.
NIKCLI_ELEVENLABS_BASE_URLElevenLabs base URL override.

Refresh and cache

Provider service state is cached per instance. After writes that change auth or config.provider.*, route handlers call provider refresh so subsequent list and language-model reads see the new credentials and options.

MutationRefresh path
Save provider API keyserver/httpapi/provider.ts or httpapi/provider.ts writes auth and refreshes provider cache.
Remove provider authAuth removal clears the saved record and refreshes.
Config provider updateConfig route update invalidates provider state through route helper.
Plugin auth loader changeProvider service rebuilds plugin-derived options during refresh.

Failure modes

SymptomLikely causeCheck
Provider absent from model listFiltered by enabled_providers/disabled_providers, missing auth, or failed dynamic probe.Inspect config filters and provider log entries.
Model id missingAlpha/deprecated filtering, provider allow/block list, or no API key for paid nikcli models.Enable experimental models only if the model status requires it.
Bedrock authentication failureRegion/profile/bearer token mismatch.Check config region, AWS_REGION, AWS_PROFILE, bearer token, and endpoint.
OpenAI-compatible usage missingProvider options disabled usage inclusion or compatible endpoint omits usage.Check includeUsage and provider response.
Invalid prompt errorMalformed message shape reached runtime.Verify normalizeStreamMessages input and message history.
Fresh key not usedProvider cache was not refreshed after auth/config write.Call provider refresh or use route handlers that already do it.

Source anchors

NeedFile
Provider catalog and SDK cachepackages/nikcli/src/provider/provider.ts
Provider transformspackages/nikcli/src/provider/transform.ts
Provider auth routespackages/nikcli/src/server/httpapi/provider.ts, packages/nikcli/src/server/httpapi/provider.ts
Session runtime hot pathpackages/nikcli/src/session/llm.ts
Native runtimepackages/nikcli/src/session/llm/native-runtime.ts
LLM package providerspackages/llm/src/providers
Image and speech toolspackages/nikcli/src/tool/generate_image.ts, packages/nikcli/src/tool/speak.ts