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
- Add `api` to the provider config matching the backend dialect (e.g. "openai-completions" for Ollama/LM Studio /v1).
- 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.
- 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
- Set api alongside any provider-level discovery block.
- Reserve discovery.type "proxy" for new-api/one-api upstreams that advertise supported_endpoint_types.
- When copying discovery config between providers, copy api too.
- Pre-validate with discoveryHasApi before writing models.json.
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
- Provider ${providerName}: "api" is required when registering
- Provider ${providerName}, model ${modelDef.id}: no "api" spe
- OMP_AUTH_BROKER_ACCOUNT_POOL_FILE contains an empty provider
- OMP_AUTH_BROKER_ACCOUNT_POOL_FILE contains a provider id wit
- ${name} path does not exist: ${trimmed}
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/eb2c3f38c91f7924.
Report an issue: GitHub.