Files
tkmind_go/ui/desktop/src/components/settings/models/modelInterface.ts
T
2025-10-22 21:17:02 -04:00

77 lines
2.2 KiB
TypeScript

import { ProviderDetails } from '../../../api';
export default interface Model {
id?: number; // Make `id` optional to allow user-defined models
name: string;
provider: string;
lastUsed?: string;
alias?: string; // optional model display name
subtext?: string; // goes below model name if not the provider
}
export function createModelStruct(
modelName: string,
provider: string,
id?: number, // Make `id` optional to allow user-defined models
lastUsed?: string,
alias?: string, // optional model display name
subtext?: string
): Model {
// use the metadata to create a Model
return {
name: modelName,
provider: provider,
alias: alias,
id: id,
lastUsed: lastUsed,
subtext: subtext,
};
}
export async function getProviderMetadata(
providerName: string,
getProvidersFunc: (b: boolean) => Promise<ProviderDetails[]>
) {
const providers = await getProvidersFunc(false);
const matches = providers.find((providerMatch) => providerMatch.name === providerName);
if (!matches) {
throw Error(`No match for provider: ${providerName}`);
}
return matches.metadata;
}
export interface ProviderModelsResult {
provider: ProviderDetails;
models: string[] | null;
error: string | null;
}
/**
* Fetches models for all active providers in parallel.
* Falls back to known_models if fetching fails or returns no models.
*/
export async function fetchModelsForProviders(
activeProviders: ProviderDetails[],
getProviderModelsFunc: (providerName: string) => Promise<string[]>
): Promise<ProviderModelsResult[]> {
const modelPromises = activeProviders.map(async (p) => {
const providerName = p.name;
try {
let models = await getProviderModelsFunc(providerName);
if ((!models || models.length === 0) && p.metadata.known_models?.length) {
models = p.metadata.known_models.map((m) => m.name);
}
return { provider: p, models, error: null };
} catch (e: unknown) {
const errorMessage = `Failed to fetch models for ${providerName}${e instanceof Error ? `: ${e.message}` : ''}`;
return {
provider: p,
models: null,
error: errorMessage,
};
}
});
return await Promise.all(modelPromises);
}