agent-ecosystem/src/renderer/components/team/dialogs/memberModelScope.ts

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 };
}