can1357/oh-my-pi · error

Could not resolve ${errors.length === 1 ? "model" : "models"

Error message

Could not resolve ${errors.length === 1 ? "model" : "models"}:\n${errors.join("\n")}

What it means

resolveBenchTargets maps user model selectors to concrete models plus thinking levels. Any selector that fails to resolve is collected into an errors list; if any failed, it throws a single aggregated Error listing all unresolved selectors, so users see every problem at once instead of one at a time.

Source

Thrown at packages/coding-agent/src/cli/bench-runtime.ts:183

			modelRegistry,
			preferences.providerOrder,
		);
		if (authenticated) {
			writeStderr(
				`${chalk.yellow(
					`Warning: no credentials for "${model.provider}"; benchmarking ${formatModelString(authenticated)} instead. Pin "${formatModelString(model)}" to force it.`,
				)}\n`,
			);
			model = authenticated;
		}
		resolved.push({
			selector,
			model,
			thinking: resolveThinkingLevelForModel(model, concreteThinkingLevel(result.thinkingLevel)),
		});
	}
	if (errors.length > 0) {
		throw new Error(`Could not resolve ${errors.length === 1 ? "model" : "models"}:\n${errors.join("\n")}`);
	}
	return resolved;
}

View on GitHub (pinned to 9690622007)

Solutions

  1. Fix the selector spelling shown in the error detail lines (one error line per failed selector)
  2. Run `omp models` (or list available models) to see valid selectors
  3. Update the package/catalog so newly released models are known
  4. Remove or replace selectors for models unavailable in your environment/auth

Example fix

// before
await resolveBenchTargets(["gpt5-turbo"])
// after
await resolveBenchTargets(["gpt-5.2"]) // corrected selector
Defensive patterns

Strategy: try-catch

Validate before calling

import { resolveModel } from "@oh-my-pi/pi-catalog"; // pre-check each selector resolves before benching
for (const s of selectors) {
  if (resolveModel(s) === undefined) console.warn(`Selector "${s}" may not resolve`);
}

Try / catch

try {
  const targets = await resolveBenchTargets(selectors);
} catch (err) {
  if (err instanceof Error && err.message.startsWith("Could not resolve")) {
    for (const line of err.message.split("\n").slice(1)) console.error(`- ${line}`);
    process.exitCode = 2;
  } else throw err;
}

Prevention

When it happens

Trigger: Calling resolveBenchTargets (or running `omp bench`) with one or more selectors that match no known model — misspelled aliases, model names not in the catalog, or provider-specific ids that discovery cannot see.

Common situations: Typos in model short-names (e.g. `opus-4-6` when alias differs); referencing a newly released model before the catalog is updated; offline/failed provider discovery leaving the model unknown; using an alias removed in a newer version.

Related errors


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