Files
fusion/packages/core/src/model-resolution.ts

149 lines
3.7 KiB
TypeScript

import type { Settings } from "./types.js";
export interface ResolvedModelSelection {
provider?: string;
modelId?: string;
}
type ModelPair =
| ResolvedModelSelection
| {
provider?: string | null;
modelId?: string | null;
}
| undefined;
type TaskModelLike = {
modelProvider?: string | null;
modelId?: string | null;
validatorModelProvider?: string | null;
validatorModelId?: string | null;
planningModelProvider?: string | null;
planningModelId?: string | null;
};
function hasCompleteModelPair(pair: ModelPair): pair is { provider: string; modelId: string } {
return Boolean(pair?.provider && pair?.modelId);
}
function pickFirstModelPair(...pairs: ModelPair[]): ResolvedModelSelection {
for (const pair of pairs) {
if (hasCompleteModelPair(pair)) {
return { provider: pair.provider, modelId: pair.modelId };
}
}
return {};
}
export function resolveProjectDefaultModel(settings?: Partial<Settings>): ResolvedModelSelection {
return pickFirstModelPair(
{
provider: settings?.defaultProviderOverride,
modelId: settings?.defaultModelIdOverride,
},
{
provider: settings?.defaultProvider,
modelId: settings?.defaultModelId,
},
);
}
export function resolveExecutionSettingsModel(settings?: Partial<Settings>): ResolvedModelSelection {
return pickFirstModelPair(
{
provider: settings?.executionProvider,
modelId: settings?.executionModelId,
},
{
provider: settings?.executionGlobalProvider,
modelId: settings?.executionGlobalModelId,
},
resolveProjectDefaultModel(settings),
);
}
export function resolvePlanningSettingsModel(settings?: Partial<Settings>): ResolvedModelSelection {
return pickFirstModelPair(
{
provider: settings?.planningProvider,
modelId: settings?.planningModelId,
},
{
provider: settings?.planningGlobalProvider,
modelId: settings?.planningGlobalModelId,
},
resolveProjectDefaultModel(settings),
);
}
export function resolveValidatorSettingsModel(settings?: Partial<Settings>): ResolvedModelSelection {
return pickFirstModelPair(
{
provider: settings?.validatorProvider,
modelId: settings?.validatorModelId,
},
{
provider: settings?.validatorGlobalProvider,
modelId: settings?.validatorGlobalModelId,
},
resolveProjectDefaultModel(settings),
);
}
export function resolveTitleSummarizerSettingsModel(settings?: Partial<Settings>): ResolvedModelSelection {
return pickFirstModelPair(
{
provider: settings?.titleSummarizerProvider,
modelId: settings?.titleSummarizerModelId,
},
{
provider: settings?.titleSummarizerGlobalProvider,
modelId: settings?.titleSummarizerGlobalModelId,
},
{
provider: settings?.planningProvider,
modelId: settings?.planningModelId,
},
resolveProjectDefaultModel(settings),
);
}
export function resolveTaskExecutionModel(
task: TaskModelLike,
settings?: Partial<Settings>,
): ResolvedModelSelection {
return pickFirstModelPair(
{
provider: task.modelProvider,
modelId: task.modelId,
},
resolveExecutionSettingsModel(settings),
);
}
export function resolveTaskValidatorModel(
task: TaskModelLike,
settings?: Partial<Settings>,
): ResolvedModelSelection {
return pickFirstModelPair(
{
provider: task.validatorModelProvider,
modelId: task.validatorModelId,
},
resolveValidatorSettingsModel(settings),
);
}
export function resolveTaskPlanningModel(
task: TaskModelLike,
settings?: Partial<Settings>,
): ResolvedModelSelection {
return pickFirstModelPair(
{
provider: task.planningModelProvider,
modelId: task.planningModelId,
},
resolvePlanningSettingsModel(settings),
);
}