Merge pull request #1182 from zerone0x/fix/issue-1115-filter-openrouter-auto
fix(configure): filter openrouter/auto from model selection list
This commit is contained in:
@@ -8,7 +8,7 @@ Docs: https://docs.clawd.bot
|
|||||||
- Dependencies: update core + plugin deps (grammy, vitest, openai, Microsoft agents hosting, etc.).
|
- Dependencies: update core + plugin deps (grammy, vitest, openai, Microsoft agents hosting, etc.).
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
- macOS: load menu session previews asynchronously so items populate while the menu is open.
|
- Configure: hide OpenRouter auto routing model from the model picker. (#1182) — thanks @zerone0x.
|
||||||
|
|
||||||
## 2026.1.18-4
|
## 2026.1.18-4
|
||||||
|
|
||||||
|
|||||||
67
src/commands/model-picker.test.ts
Normal file
67
src/commands/model-picker.test.ts
Normal file
@@ -0,0 +1,67 @@
|
|||||||
|
import { describe, expect, it, vi } from "vitest";
|
||||||
|
|
||||||
|
import type { ClawdbotConfig } from "../config/config.js";
|
||||||
|
import { makePrompter } from "./onboarding/__tests__/test-utils.js";
|
||||||
|
import { promptDefaultModel } from "./model-picker.js";
|
||||||
|
|
||||||
|
const loadModelCatalog = vi.hoisted(() => vi.fn());
|
||||||
|
vi.mock("../agents/model-catalog.js", () => ({
|
||||||
|
loadModelCatalog,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const ensureAuthProfileStore = vi.hoisted(() =>
|
||||||
|
vi.fn(() => ({
|
||||||
|
version: 1,
|
||||||
|
profiles: {},
|
||||||
|
})),
|
||||||
|
);
|
||||||
|
const listProfilesForProvider = vi.hoisted(() => vi.fn(() => []));
|
||||||
|
vi.mock("../agents/auth-profiles.js", () => ({
|
||||||
|
ensureAuthProfileStore,
|
||||||
|
listProfilesForProvider,
|
||||||
|
}));
|
||||||
|
|
||||||
|
const resolveEnvApiKey = vi.hoisted(() => vi.fn(() => undefined));
|
||||||
|
const getCustomProviderApiKey = vi.hoisted(() => vi.fn(() => undefined));
|
||||||
|
vi.mock("../agents/model-auth.js", () => ({
|
||||||
|
resolveEnvApiKey,
|
||||||
|
getCustomProviderApiKey,
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe("promptDefaultModel", () => {
|
||||||
|
it("filters internal router models from the selection list", async () => {
|
||||||
|
loadModelCatalog.mockResolvedValue([
|
||||||
|
{
|
||||||
|
provider: "openrouter",
|
||||||
|
id: "auto",
|
||||||
|
name: "OpenRouter Auto",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
provider: "openrouter",
|
||||||
|
id: "meta-llama/llama-3.3-70b:free",
|
||||||
|
name: "Llama 3.3 70B",
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
|
||||||
|
const select = vi.fn(async (params) => {
|
||||||
|
const first = params.options[0];
|
||||||
|
return first?.value ?? "";
|
||||||
|
});
|
||||||
|
const prompter = makePrompter({ select });
|
||||||
|
const config = { agents: { defaults: {} } } as ClawdbotConfig;
|
||||||
|
|
||||||
|
await promptDefaultModel({
|
||||||
|
config,
|
||||||
|
prompter,
|
||||||
|
allowKeep: false,
|
||||||
|
includeManual: false,
|
||||||
|
ignoreAllowlist: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const options = select.mock.calls[0]?.[0]?.options ?? [];
|
||||||
|
expect(options.some((opt) => opt.value === "openrouter/auto")).toBe(false);
|
||||||
|
expect(
|
||||||
|
options.some((opt) => opt.value === "openrouter/meta-llama/llama-3.3-70b:free"),
|
||||||
|
).toBe(true);
|
||||||
|
});
|
||||||
|
});
|
||||||
@@ -17,6 +17,11 @@ const KEEP_VALUE = "__keep__";
|
|||||||
const MANUAL_VALUE = "__manual__";
|
const MANUAL_VALUE = "__manual__";
|
||||||
const PROVIDER_FILTER_THRESHOLD = 30;
|
const PROVIDER_FILTER_THRESHOLD = 30;
|
||||||
|
|
||||||
|
// Models that are internal routing features and should not be shown in selection lists.
|
||||||
|
// These may be valid as defaults (e.g., set automatically during auth flow) but are not
|
||||||
|
// directly callable via API and would cause "Unknown model" errors if selected manually.
|
||||||
|
const HIDDEN_ROUTER_MODELS = new Set(["openrouter/auto"]);
|
||||||
|
|
||||||
type PromptDefaultModelParams = {
|
type PromptDefaultModelParams = {
|
||||||
config: ClawdbotConfig;
|
config: ClawdbotConfig;
|
||||||
prompter: WizardPrompter;
|
prompter: WizardPrompter;
|
||||||
@@ -183,6 +188,8 @@ export async function promptDefaultModel(
|
|||||||
}) => {
|
}) => {
|
||||||
const key = modelKey(entry.provider, entry.id);
|
const key = modelKey(entry.provider, entry.id);
|
||||||
if (seen.has(key)) return;
|
if (seen.has(key)) return;
|
||||||
|
// Skip internal router models that can't be directly called via API.
|
||||||
|
if (HIDDEN_ROUTER_MODELS.has(key)) return;
|
||||||
const hints: string[] = [];
|
const hints: string[] = [];
|
||||||
if (entry.name && entry.name !== entry.id) hints.push(entry.name);
|
if (entry.name && entry.name !== entry.id) hints.push(entry.name);
|
||||||
if (entry.contextWindow) hints.push(`ctx ${formatTokenK(entry.contextWindow)}`);
|
if (entry.contextWindow) hints.push(`ctx ${formatTokenK(entry.contextWindow)}`);
|
||||||
|
|||||||
Reference in New Issue
Block a user