import React, { useEffect, useState } from 'react'; import { ProviderBrandLogo } from '@renderer/components/common/ProviderBrandLogo'; import { ANTHROPIC_LONG_CONTEXT_PRICING_URL, ANTHROPIC_SONNET_EXTRA_USAGE_WARNING, AnthropicExtraUsageWarning, } from '@renderer/components/team/dialogs/AnthropicExtraUsageWarning'; import { EffortLevelSelector } from '@renderer/components/team/dialogs/EffortLevelSelector'; import { LimitContextCheckbox } from '@renderer/components/team/dialogs/LimitContextCheckbox'; import { getProviderScopedTeamModelLabel, getTeamProviderLabel, TeamModelSelector, } from '@renderer/components/team/dialogs/TeamModelSelector'; import { Checkbox } from '@renderer/components/ui/checkbox'; import { Label } from '@renderer/components/ui/label'; import { getTeamColorSet } from '@renderer/constants/teamColors'; import { useTheme } from '@renderer/hooks/useTheme'; import { cn } from '@renderer/lib/utils'; import { agentAvatarUrl } from '@renderer/utils/memberHelpers'; import { isAnthropicHaikuTeamModel, isAnthropicSonnetOneMillionContextTeamModel, } from '@renderer/utils/teamModelCatalog'; import { resolveTeamLeadColorName } from '@shared/utils/teamMemberColors'; import { AlertTriangle, ChevronDown, ChevronRight, Info } from 'lucide-react'; import { Button } from '../../ui/button'; import type { EffortLevel, TeamProviderId } from '@shared/types'; export { ANTHROPIC_LONG_CONTEXT_PRICING_URL, ANTHROPIC_SONNET_EXTRA_USAGE_WARNING }; interface LeadModelRowProps { providerId: TeamProviderId; model: string; effort?: EffortLevel; limitContext: boolean; onProviderChange: (providerId: TeamProviderId) => void; onModelChange: (model: string) => void; onEffortChange: (effort: string) => void; onLimitContextChange: (value: boolean) => void; syncModelsWithTeammates: boolean; onSyncModelsWithTeammatesChange: (value: boolean) => void; warningText?: string | null; disableGeminiOption?: boolean; providerNoticeById?: Partial>; modelIssueText?: string | null; modelAdvisoryReasonByValue?: Partial>; modelIssueReasonByValue?: Partial>; modelUnavailableReasonByValue?: Partial>; showAnthropicContextLimit?: boolean; disableAnthropicContextLimit?: boolean; } export const LeadModelRow = ({ providerId, model, effort, limitContext, onProviderChange, onModelChange, onEffortChange, onLimitContextChange, syncModelsWithTeammates, onSyncModelsWithTeammatesChange, warningText, disableGeminiOption = false, providerNoticeById, modelIssueText, modelAdvisoryReasonByValue, modelIssueReasonByValue, modelUnavailableReasonByValue, showAnthropicContextLimit = providerId === 'anthropic', disableAnthropicContextLimit, }: LeadModelRowProps): React.JSX.Element => { const { isLight } = useTheme(); const hasActiveProviderNotice = Boolean(providerNoticeById?.[providerId]); const [modelExpanded, setModelExpanded] = useState(hasActiveProviderNotice); const leadColorSet = getTeamColorSet(resolveTeamLeadColorName()); const modelButtonLabel = model.trim() ? getProviderScopedTeamModelLabel(providerId, model.trim()) : 'Default'; const modelButtonAriaLabel = `${getTeamProviderLabel(providerId)} provider, ${modelButtonLabel}`; const selectedModelIssueText = model.trim() && modelIssueReasonByValue?.[model.trim()] ? modelIssueReasonByValue[model.trim()] : null; const selectedModelUnavailableText = model.trim() && modelUnavailableReasonByValue?.[model.trim()] ? modelUnavailableReasonByValue[model.trim()] : null; const selectedModelAdvisoryText = model.trim() && modelAdvisoryReasonByValue?.[model.trim()] ? modelAdvisoryReasonByValue[model.trim()] : null; const currentModelIssueText = modelIssueText ?? selectedModelUnavailableText ?? selectedModelIssueText ?? null; const currentModelAdvisoryText = currentModelIssueText ? null : selectedModelAdvisoryText; const hasModelIssue = Boolean(currentModelIssueText); const hasModelAdvisory = Boolean(currentModelAdvisoryText); const showSonnetExtraUsageWarning = providerId === 'anthropic' && !limitContext && isAnthropicSonnetOneMillionContextTeamModel(model); const warningMessages = [warningText?.trim() || null].filter((message): message is string => Boolean(message) ); const hasWarnings = warningMessages.length > 0 || showSonnetExtraUsageWarning; const contextLimitDisabled = disableAnthropicContextLimit ?? (providerId === 'anthropic' && isAnthropicHaikuTeamModel(model)); useEffect(() => { if (hasActiveProviderNotice && !modelExpanded) { setModelExpanded(true); } }, [hasActiveProviderNotice, modelExpanded]); return (
); };