1import {
2 ProviderDriverKind,
3 type ModelCapabilities,
4 type ServerProviderModel,
5} from "@t3tools/contracts";
6import { describe, expect, it } from "vite-plus/test";
7
8import { getProviderModelCapabilities } from "./providerModels";
9
10const PROVIDER = ProviderDriverKind.make("claudeAgent");
11
12function capabilities(id: string): ModelCapabilities {
13 return {
14 optionDescriptors: [{ id, label: id, type: "boolean" }],
15 };
16}
17
18function model(input: {
19 slug: string;
20 capabilities: ModelCapabilities;
21 aliases?: ReadonlyArray<string>;
22 isCustom?: boolean;
23}): ServerProviderModel {
24 return {
25 slug: input.slug,
26 name: input.slug,
27 ...(input.aliases ? { aliases: [...input.aliases] } : {}),
28 isCustom: input.isCustom ?? false,
29 capabilities: input.capabilities,
30 };
31}
32
33describe("getProviderModelCapabilities", () => {
34 it("resolves model-declared aliases", () => {
35 const aliasCapabilities = capabilities("aliased-option");
36 const models = [
37 model({
38 slug: "synthetic-model",
39 aliases: ["Legacy-Synthetic-Model"],
40 capabilities: aliasCapabilities,
41 }),
42 ];
43
44 expect(getProviderModelCapabilities(models, "legacy-synthetic-model", PROVIDER)).toEqual(
45 aliasCapabilities,
46 );
47 });
48
49 it("prefers an exact custom slug over a built-in model alias", () => {
50 const customCapabilities = capabilities("custom-option");
51 const models = [
52 model({
53 slug: "synthetic-model",
54 aliases: ["custom-model"],
55 capabilities: capabilities("built-in-option"),
56 }),
57 model({ slug: "custom-model", capabilities: customCapabilities, isCustom: true }),
58 ];
59
60 expect(getProviderModelCapabilities(models, " custom-model ", PROVIDER)).toEqual(
61 customCapabilities,
62 );
63 });
64
65 it("returns empty capabilities for an unknown slug", () => {
66 const models = [
67 model({
68 slug: "default-model",
69 capabilities: capabilities("default-option"),
70 }),
71 ];
72
73 expect(getProviderModelCapabilities(models, "unknown-model", PROVIDER)).toEqual({
74 optionDescriptors: [],
75 });
76 });
77});