can1357/oh-my-pi · error

Provider ${providerName}: "api" is required when discovery i

Error message

Provider ${providerName}: "api" is required when discovery is enabled at provider level.

What it means

Provider-level discovery (discovery.type other than "proxy") needs to know which wire API the discovered models speak, since the /models listing does not encode it. In models-config mode, validateProviderConfiguration throws when `discovery` is enabled at the provider level but neither `config.api` is set nor discovery.type is "proxy" (proxy discovery infers per-model APIs from supported_endpoint_types).

Source

Thrown at packages/coding-agent/src/config/models-config.ts:82

	} else {
		if (!config.baseUrl) {
			throw new Error(`Provider ${providerName}: "baseUrl" is required when defining custom models.`);
		}
		const requiresAuth =
			mode === "runtime-register"
				? !config.apiKey && !config.oauthConfigured
				: !config.apiKey && (config.auth ?? "apiKey") !== "none" && (config.auth ?? "apiKey") !== "oauth";
		if (requiresAuth) {
			throw new Error(
				mode === "runtime-register"
					? `Provider ${providerName}: "apiKey" or "oauth" is required when defining models.`
					: `Provider ${providerName}: "apiKey" is required when defining custom models unless auth is "none" or "oauth".`,
			);
		}
	}

	if (mode === "models-config" && config.discovery && !config.api && config.discovery.type !== "proxy") {
		throw new Error(`Provider ${providerName}: "api" is required when discovery is enabled at provider level.`);
	}

	for (const modelDef of models) {
		if (!hasProviderApi && !modelDef.api) {
			throw new Error(
				mode === "runtime-register"
					? `Provider ${providerName}, model ${modelDef.id}: no "api" specified.`
					: `Provider ${providerName}, model ${modelDef.id}: no "api" specified. Set at provider or model level.`,
			);
		}
		if (!modelDef.id) {
			throw new Error(`Provider ${providerName}: model missing "id"`);
		}
		if (mode === "models-config") {
			if (modelDef.contextWindow !== undefined && modelDef.contextWindow <= 0) {
				throw new Error(`Provider ${providerName}, model ${modelDef.id}: invalid contextWindow`);
			}
			if (modelDef.maxTokens !== undefined && modelDef.maxTokens <= 0) {

View on GitHub (pinned to 9690622007)

Solutions

  1. Add `api` to the provider config matching the backend dialect (e.g. "openai-completions" for Ollama/LM Studio /v1).
  2. If the backend is a new-api/one-api style proxy advertising supported_endpoint_types, set discovery.type to "proxy" so APIs are inferred per model.
  3. Move discovery from provider level into a form that specifies api per discovered group if you need mixed dialects.

Example fix

// before
{ "provider": "lmstudio", "baseUrl": "http://localhost:1234/v1", "auth": "none", "discovery": { "type": "lm-studio" } }
// after
{ "provider": "lmstudio", "baseUrl": "http://localhost:1234/v1", "auth": "none", "api": "openai-completions", "discovery": { "type": "lm-studio" } }
Defensive patterns

Strategy: validation

Validate before calling

if (cfg.discovery && cfg.discovery.type !== "proxy" && !cfg.api) {
  throw new Error(`Provider ${cfg.provider}: provider-level discovery needs "api"`);
}

Type guard

function discoveryHasApi(cfg: { api?: unknown; discovery?: { type?: string } | null }): boolean {
  return !cfg.discovery || cfg.discovery.type === "proxy" || typeof cfg.api === "string";
}

Try / catch

try {
  modelsConfig.apply(parsed);
} catch (err) {
  if (err instanceof Error && err.message.includes('"api" is required when discovery is enabled')) {
    const provider = err.message.match(/Provider ([^:]+):/)?.[1];
    throw new Error(`Add "api" (or use discovery.type "proxy") for provider "${provider}"`);
  }
  throw err;
}

Prevention

When it happens

Trigger: A models-config provider with `{ discovery: { type: "ollama" | "llama-cpp" | "models-list" | ... } }` but no provider-level `api` field. Only discovery.type "proxy" is exempt.

Common situations: Configuring discovery for a local Ollama or LM Studio server and omitting `api`; switching from a proxy setup (where api is inferred) to a plain models-list discovery; copying the discovery block into a new provider without copying `api`.

Related errors


AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31). Data as JSON: /api/errors/eb2c3f38c91f7924. Report an issue: GitHub.