1export type ModelEsque = {
2 slug: string;
3 name: string;
4 shortName?: string | undefined;
5 subProvider?: string | undefined;
6 aliases?: ReadonlyArray<string> | undefined;
7 isDefault?: boolean | undefined;
8 badge?: "new" | undefined;
9 isLegacy?: boolean | undefined;
10 isUnavailable?: boolean | undefined;
11};
12
13function escapeRegExp(value: string): string {
14 return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
15}
16
17function stripLeadingQualifier(value: string, qualifier: string | null | undefined): string {
18 const trimmedQualifier = qualifier?.trim();
19 if (!trimmedQualifier) {
20 return value;
21 }
22
23 const pattern = new RegExp(`^${escapeRegExp(trimmedQualifier)}(?:\\s*[.:/-]\\s*|\\s+)`, "iu");
24 return value.replace(pattern, "").trim() || value;
25}
26
27export function getDisplayModelName(
28 model: ModelEsque,
29 options?: { preferShortName?: boolean },
30): string {
31 const name = options?.preferShortName && model.shortName ? model.shortName : model.name;
32 return stripLeadingQualifier(name, model.subProvider);
33}
34
35/**
36 * The second line of a model row, naming where the model comes from. A
37 * sub-provider whose name reads as its provider plus a qualifier ("OpenCode
38 * Zen" under "OpenCode") stands alone: joining the two shows "OpenCode ·
39 * OpenCode Zen", and OpenCode's own picker shows the sub-provider by itself.
40 */
41export function getProviderRowLabel(
42 providerDisplayName: string,
43 subProvider: string | undefined,
44): string {
45 const provider = providerDisplayName.trim();
46 const sub = subProvider?.trim();
47 if (!sub) {
48 return providerDisplayName;
49 }
50 if (provider && new RegExp(`^${escapeRegExp(provider)}\\s+\\S`, "i").test(sub)) {
51 return sub;
52 }
53 return `${providerDisplayName} · ${sub}`;
54}
55
56export function getTriggerDisplayModelName(model: ModelEsque): string {
57 return getDisplayModelName(model, { preferShortName: true });
58}
59
60export function getTriggerDisplayModelLabel(model: ModelEsque): string {
61 return getTriggerDisplayModelName(model);
62}