import React from 'react'; import { getProviderMeta } from '../ProviderIcons'; import { findSessionBridge, type AIProviderOption } from '../../utils/aiProvider'; import { ModelSourceHint, modelSourceToolForProvider } from '../ModelSourceHint'; import { AskSessionSetupHint } from './AskSessionSetupHint'; interface AIProviderBarProps { providers: AIProviderOption[]; selectedProviderId: string | null; selectedModel: string | null; selectedReasoningEffort?: string | null; onProviderChange: (providerId: string) => void; onModelChange: (model: string) => void; onReasoningEffortChange?: (effort: string | null) => void; /** * Optional muted line under the bar saying how to get "Ask this session" * (see askSessionSetupHint). Absent: the bar renders exactly as before. */ setupHint?: string | null; } export const AIProviderBar: React.FC = ({ providers, selectedProviderId, selectedModel, selectedReasoningEffort, onProviderChange, onModelChange, onReasoningEffortChange, setupHint, }) => { if (providers.length === 0) { return ( <>
No AI providers available
); } // "Ask this session": the session that opened Plannotator is the only thing // Ask AI talks to, so there is no provider or model to choose. Show its label. const sessionBridge = findSessionBridge(providers); if (sessionBridge) { const bridgeMeta = getProviderMeta(sessionBridge.name, sessionBridge.label); const BridgeIcon = bridgeMeta.icon; return (
{bridgeMeta.label}
); } const currentProvider = providers.find(p => p.id === selectedProviderId) ?? providers[0]; const effectiveProviderId = currentProvider?.id ?? ''; const models = currentProvider?.models ?? []; const defaultModel = models.find(m => m.default) ?? models[0]; const effectiveModel = selectedModel ?? defaultModel?.id ?? ''; const currentModel = models.find(m => m.id === effectiveModel) ?? defaultModel; const reasoningEfforts = currentModel?.reasoningEfforts ?? []; const meta = getProviderMeta(currentProvider?.name ?? 'AI', currentProvider?.label); const Icon = meta.icon; // Show only when the selected model actually reports reasoning efforts. const showReasoningEffort = !!onReasoningEffortChange && reasoningEfforts.length > 0; return ( <>
{models.length > 0 && ( )} {showReasoningEffort && ( )}
); };