diff --git a/external.ts b/external.ts index 2349b6a..a0b01ff 100644 --- a/external.ts +++ b/external.ts @@ -29,6 +29,7 @@ export function formatMcpToolRef(agentId: AgentId, toolName: string): string { // model alias registry lives in models.ts — re-exported here for shared access export type { ModelAlias, ModelProvider, ProviderConfig } from "./models.ts"; export { + DEFAULT_PROXY_MODEL, getModelEnvVars, getModelManagedCredentials, getModelProvider, diff --git a/internal/index.ts b/internal/index.ts index 40a6816..d6d1040 100644 --- a/internal/index.ts +++ b/internal/index.ts @@ -16,6 +16,7 @@ export type { WriteablePayload, } from "../external.ts"; export { + DEFAULT_PROXY_MODEL, getModelEnvVars, getModelManagedCredentials, getModelProvider, diff --git a/models.test.ts b/models.test.ts index 42f8e69..0d1aeef 100644 --- a/models.test.ts +++ b/models.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest"; import { + DEFAULT_PROXY_MODEL, getModelEnvVars, getModelProvider, isBedrockAnthropicId, @@ -134,6 +135,12 @@ describe("resolveDisplayAlias", () => { }); }); +describe("DEFAULT_PROXY_MODEL", () => { + it("tracks moonshotai/kimi-k2 openRouterResolve", () => { + expect(DEFAULT_PROXY_MODEL).toBe(resolveOpenRouterModel("moonshotai/kimi-k2")); + }); +}); + describe("resolveOpenRouterModel", () => { it("returns the openrouter specifier for a non-deprecated alias", () => { expect(resolveOpenRouterModel("anthropic/claude-opus")).toBe( diff --git a/models.ts b/models.ts index 551a2a0..1717bda 100644 --- a/models.ts +++ b/models.ts @@ -570,6 +570,13 @@ export const modelAliases: ModelAlias[] = Object.entries(providers).flatMap( })) ); +/** OpenRouter target when Router or OSS funding is active and `repo.model` is null. */ +const defaultProxyAlias = modelAliases.find((a) => a.slug === "moonshotai/kimi-k2"); +if (!defaultProxyAlias?.openRouterResolve) { + throw new Error("DEFAULT_PROXY_MODEL: moonshotai/kimi-k2 missing openRouterResolve"); +} +export const DEFAULT_PROXY_MODEL = defaultProxyAlias.openRouterResolve; + // ── resolution ───────────────────────────────────────────────────────────────── /** resolve a model slug to its concrete models.dev specifier (e.g. "anthropic/claude-opus-4-6") */ diff --git a/test/models-catalog.main.test.ts b/test/models-catalog.main.test.ts index bf2666a..ad22ef6 100644 --- a/test/models-catalog.main.test.ts +++ b/test/models-catalog.main.test.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from "vitest"; -import { modelAliases, resolveDisplayAlias } from "../models.ts"; +import { DEFAULT_PROXY_MODEL, modelAliases, resolveDisplayAlias } from "../models.ts"; // ── catalog drift tests ───────────────────────────────────────────────────── // @@ -99,6 +99,29 @@ describe("openRouterResolve models.dev validity", async () => { } }); +describe("DEFAULT_PROXY_MODEL models.dev validity", async () => { + const data = await api; + const parsed = parseResolve(DEFAULT_PROXY_MODEL); + + it(`${DEFAULT_PROXY_MODEL} exists on models.dev`, () => { + const providerData = data[parsed.provider]; + expect(providerData, `provider "${parsed.provider}" not found on models.dev`).toBeDefined(); + const model = providerData.models[parsed.modelId]; + expect( + model, + `model "${parsed.modelId}" not found under ${parsed.provider} on models.dev` + ).toBeDefined(); + }); + + it(`${DEFAULT_PROXY_MODEL} is not deprecated on models.dev`, () => { + const model = data[parsed.provider]?.models[parsed.modelId]; + if (!model) return; + expect(model.status, `${DEFAULT_PROXY_MODEL} is deprecated on models.dev`).not.toBe( + "deprecated" + ); + }); +}); + type OpenRouterModel = { id: string }; type OpenRouterModelsResponse = { data: OpenRouterModel[] };