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
- Fix the selector spelling shown in the error detail lines (one error line per failed selector)
- Run `omp models` (or list available models) to see valid selectors
- Update the package/catalog so newly released models are known
- 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
- List available model selectors first (`omp models`) before benching
- Keep the catalog/package updated so new models resolve
- Quote selectors to avoid shell word-splitting mangling names
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
- Model "${options.model}" not found
- resolved.error (model resolution failure)
- Model "${modelSelector}" not found
- No models available. Use --model to select a model or config
- Invalid --source: ${args.source}. Expected one of: ${TTSR_SO
AI-assisted analysis of can1357/oh-my-pi@9690622007 (2026-08-31).
Data as JSON: /api/errors/9f7773ffcd7ff0a4.
Report an issue: GitHub.