83 lines
2.6 KiB
TypeScript
83 lines
2.6 KiB
TypeScript
import {
|
|
isTeamModelAvailableForUi,
|
|
normalizeExplicitTeamModelForUi,
|
|
type TeamModelRuntimeProviderStatus,
|
|
} from '@renderer/utils/teamModelAvailability';
|
|
import { normalizeOptionalTeamProviderId } from '@shared/utils/teamProvider';
|
|
|
|
import type { MemberDraft } from '@renderer/components/team/members/membersEditorTypes';
|
|
import type { TeamProviderId } from '@shared/types';
|
|
|
|
type RuntimeProviderStatusById = ReadonlyMap<
|
|
TeamProviderId,
|
|
TeamModelRuntimeProviderStatus | null | undefined
|
|
>;
|
|
|
|
export function resolveMemberProviderForModelScope(input: {
|
|
memberProviderId?: TeamProviderId;
|
|
selectedProviderId: TeamProviderId;
|
|
}): TeamProviderId {
|
|
return normalizeOptionalTeamProviderId(input.memberProviderId) ?? input.selectedProviderId;
|
|
}
|
|
|
|
export function resolveProviderScopedMemberModel(input: {
|
|
memberProviderId?: TeamProviderId;
|
|
memberModel?: string | null;
|
|
selectedProviderId: TeamProviderId;
|
|
runtimeProviderStatusById: RuntimeProviderStatusById;
|
|
}): { providerId: TeamProviderId; model: string } {
|
|
const providerId = resolveMemberProviderForModelScope(input);
|
|
const rawModel = input.memberModel?.trim() ?? '';
|
|
if (!rawModel) {
|
|
return { providerId, model: '' };
|
|
}
|
|
|
|
const normalizedModel = normalizeExplicitTeamModelForUi(providerId, rawModel);
|
|
if (!normalizedModel) {
|
|
return { providerId, model: '' };
|
|
}
|
|
|
|
const providerStatus = input.runtimeProviderStatusById.get(providerId) ?? null;
|
|
if (!isTeamModelAvailableForUi(providerId, normalizedModel, providerStatus)) {
|
|
return { providerId, model: '' };
|
|
}
|
|
|
|
return { providerId, model: normalizedModel };
|
|
}
|
|
|
|
export function clearInheritedMemberModelsUnavailableForProvider(input: {
|
|
members: MemberDraft[];
|
|
selectedProviderId: TeamProviderId;
|
|
runtimeProviderStatusById: RuntimeProviderStatusById;
|
|
}): { members: MemberDraft[]; changed: boolean } {
|
|
let changed = false;
|
|
const members = input.members.map((member) => {
|
|
if (member.removedAt || member.providerId || !member.model?.trim()) {
|
|
return member;
|
|
}
|
|
if (
|
|
input.selectedProviderId !== 'anthropic' &&
|
|
!input.runtimeProviderStatusById.get(input.selectedProviderId)
|
|
) {
|
|
return member;
|
|
}
|
|
|
|
const scoped = resolveProviderScopedMemberModel({
|
|
memberProviderId: member.providerId,
|
|
memberModel: member.model,
|
|
selectedProviderId: input.selectedProviderId,
|
|
runtimeProviderStatusById: input.runtimeProviderStatusById,
|
|
});
|
|
if (scoped.model) {
|
|
return member;
|
|
}
|
|
|
|
changed = true;
|
|
return {
|
|
...member,
|
|
model: '',
|
|
};
|
|
});
|
|
|
|
return { members, changed };
|
|
}
|