agent-ecosystem/src/shared/utils/teamProvider.ts

73 lines
2 KiB
TypeScript

import { parseOpenCodeQualifiedModelRef } from './opencodeModelRef';
import type { TeamProviderId } from '@shared/types';
export function isTeamProviderId(value: unknown): value is TeamProviderId {
return value === 'anthropic' || value === 'codex' || value === 'gemini' || value === 'opencode';
}
export function normalizeOptionalTeamProviderId(value: unknown): TeamProviderId | undefined {
return isTeamProviderId(value) ? value : undefined;
}
export function normalizeTeamProviderId(
value: unknown,
fallback: TeamProviderId = 'anthropic'
): TeamProviderId {
return normalizeOptionalTeamProviderId(value) ?? fallback;
}
export function inferTeamProviderIdFromModel(
model: string | undefined
): TeamProviderId | undefined {
const normalized = model?.trim().toLowerCase();
if (!normalized) {
return undefined;
}
const normalizedWithoutExtendedContextSuffix = normalized.replace(/(?:\[1m\])+$/, '');
if (
normalized.startsWith('opencode/') ||
normalizedWithoutExtendedContextSuffix.startsWith('opencode/')
) {
return 'opencode';
}
if (
normalized.startsWith('gpt-') ||
normalized.startsWith('codex') ||
normalizedWithoutExtendedContextSuffix.startsWith('gpt-') ||
normalizedWithoutExtendedContextSuffix.startsWith('codex')
) {
return 'codex';
}
if (
normalized.startsWith('gemini') ||
normalizedWithoutExtendedContextSuffix.startsWith('gemini')
) {
return 'gemini';
}
if (
normalized.startsWith('claude') ||
normalizedWithoutExtendedContextSuffix.startsWith('claude') ||
normalized === 'opus' ||
normalizedWithoutExtendedContextSuffix === 'opus' ||
normalized === 'sonnet' ||
normalizedWithoutExtendedContextSuffix === 'sonnet' ||
normalized === 'haiku' ||
normalizedWithoutExtendedContextSuffix === 'haiku'
) {
return 'anthropic';
}
if (
parseOpenCodeQualifiedModelRef(normalized) ||
parseOpenCodeQualifiedModelRef(normalizedWithoutExtendedContextSuffix)
) {
return 'opencode';
}
return undefined;
}