import React from "react"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "@/components/ui/dropdown-menu"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from "@/components/ui/tooltip"; import { Check, Brain } from "lucide-react"; import { ChatCompletionReasoningEffort } from "openai/resources/chat/completions"; import { PROVIDERS } from "@/lib/config/types"; interface ReasoningEffortSelectorProps { selectedReasoningEffort: ChatCompletionReasoningEffort | null | undefined; provider: PROVIDERS; isReasoning: boolean; onReasoningEffortChange: (effort: ChatCompletionReasoningEffort) => void; } interface ReasoningOption { value: ChatCompletionReasoningEffort; label: string; description: string; } // Define the reasoning effort options const REASONING_EFFORT_OPTIONS: Record = { [PROVIDERS.openai]: [ { value: "low" as ChatCompletionReasoningEffort, label: "Low", description: "Minimal reasoning, faster responses" }, { value: "medium" as ChatCompletionReasoningEffort, label: "Medium", description: "Balanced reasoning and speed" }, { value: "high" as ChatCompletionReasoningEffort, label: "High", description: "Thorough reasoning, slower responses" } ], [PROVIDERS.anthropic]: [ { value: "disabled" as ChatCompletionReasoningEffort, label: "Disabled", description: "No explicit reasoning" }, { value: "low" as ChatCompletionReasoningEffort, label: "Low", description: "Minimal reasoning (~8K tokens)" }, { value: "medium" as ChatCompletionReasoningEffort, label: "Medium", description: "Balanced reasoning (~16K tokens)" }, { value: "high" as ChatCompletionReasoningEffort, label: "High", description: "Thorough reasoning (~32K tokens)" } ] }; export const ReasoningEffortSelector = React.memo(({ selectedReasoningEffort, provider, isReasoning, onReasoningEffortChange }: ReasoningEffortSelectorProps) => { if (!isReasoning) return null; const options = REASONING_EFFORT_OPTIONS[provider] || REASONING_EFFORT_OPTIONS[PROVIDERS.openai]; const selectedOption = options.find((opt: ReasoningOption) => opt.value === selectedReasoningEffort) || options[0]; return ( {options.map((option: ReasoningOption) => ( onReasoningEffortChange(option.value)} >
{option.value === selectedReasoningEffort && ( )} {option.label}

{option.description}

))}
); }); ReasoningEffortSelector.displayName = "ReasoningEffortSelector";