| export const FREE_MODEL_BADGE_LABEL = "Free"; |
|
|
| |
| export const FREE_MODEL_SUFFIX = " (free)"; |
|
|
| |
| |
| |
| |
| export const FREE_OPENHANDS_MODELS = { |
| "openhands/deepseek-v4-flash": "OpenHands DeepSeek V4 Flash", |
| } as const; |
|
|
| export const FREE_OPENHANDS_MODEL_IDS = Object.keys(FREE_OPENHANDS_MODELS); |
|
|
| |
| |
| |
| |
| |
| |
| export type FreeModelSet = ReadonlySet<string>; |
|
|
| const EMPTY_FREE_MODELS: FreeModelSet = new Set<string>(); |
|
|
| |
| |
| |
| |
| |
| |
| export const isOpenHandsProviderModel = ( |
| model: string | null | undefined, |
| ): boolean => Boolean(model?.startsWith("openhands/")); |
|
|
| export const isFreeOpenHandsModel = ( |
| model: string | null | undefined, |
| freeModels: FreeModelSet = EMPTY_FREE_MODELS, |
| ): boolean => Boolean(model && freeModels.has(model)); |
|
|
| function appendFreeSuffix(display: string, isFree: boolean): string { |
| return isFree ? `${display}${FREE_MODEL_SUFFIX}` : display; |
| } |
|
|
| export function formatModelNameForDisplay( |
| model: string | null | undefined, |
| freeModels: FreeModelSet = EMPTY_FREE_MODELS, |
| ): string | null { |
| if (!model) return null; |
| return appendFreeSuffix(model, isFreeOpenHandsModel(model, freeModels)); |
| } |
|
|
| export function formatProviderModelNameForDisplay( |
| provider: string | null | undefined, |
| model: string | null | undefined, |
| freeModels: FreeModelSet = EMPTY_FREE_MODELS, |
| ): string | null { |
| if (!model) return null; |
| const fullModel = provider ? `${provider}/${model}` : model; |
| return appendFreeSuffix(model, isFreeOpenHandsModel(fullModel, freeModels)); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function formatNativeModelName( |
| model: string | null | undefined, |
| freeModels: FreeModelSet = EMPTY_FREE_MODELS, |
| ): string | null { |
| if (!model) return null; |
| const isFree = isFreeOpenHandsModel(model, freeModels); |
| const lastSegment = model.split("/").pop(); |
| return appendFreeSuffix(lastSegment || model, isFree); |
| } |
|
|
| |
| |
| |
| |
| |
| export function formatModelPillLabel( |
| model: string | null | undefined, |
| freeModels: FreeModelSet = EMPTY_FREE_MODELS, |
| ): string | null { |
| if (!model) return null; |
| const display = |
| model in FREE_OPENHANDS_MODELS |
| ? FREE_OPENHANDS_MODELS[model as keyof typeof FREE_OPENHANDS_MODELS] |
| : model; |
| return appendFreeSuffix(display, isFreeOpenHandsModel(model, freeModels)); |
| } |
|
|