import { useTranslation } from "react-i18next"; import { FormLabel } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import EndpointSpeedTest from "./EndpointSpeedTest"; import { ApiKeySection, EndpointField } from "./shared"; import type { ProviderCategory } from "@/types"; import type { TemplateValueConfig } from "@/config/claudeProviderPresets"; interface EndpointCandidate { url: string; } interface ClaudeFormFieldsProps { providerId?: string; // API Key shouldShowApiKey: boolean; apiKey: string; onApiKeyChange: (key: string) => void; category?: ProviderCategory; shouldShowApiKeyLink: boolean; websiteUrl: string; isPartner?: boolean; partnerPromotionKey?: string; // Template Values templateValueEntries: Array<[string, TemplateValueConfig]>; templateValues: Record; templatePresetName: string; onTemplateValueChange: (key: string, value: string) => void; // Base URL shouldShowSpeedTest: boolean; baseUrl: string; onBaseUrlChange: (url: string) => void; isEndpointModalOpen: boolean; onEndpointModalToggle: (open: boolean) => void; onCustomEndpointsChange?: (endpoints: string[]) => void; // Model Selector shouldShowModelSelector: boolean; claudeModel: string; defaultHaikuModel: string; defaultSonnetModel: string; defaultOpusModel: string; onModelChange: ( field: | "ANTHROPIC_MODEL" | "ANTHROPIC_DEFAULT_HAIKU_MODEL" | "ANTHROPIC_DEFAULT_SONNET_MODEL" | "ANTHROPIC_DEFAULT_OPUS_MODEL", value: string, ) => void; // Speed Test Endpoints speedTestEndpoints: EndpointCandidate[]; } export function ClaudeFormFields({ providerId, shouldShowApiKey, apiKey, onApiKeyChange, category, shouldShowApiKeyLink, websiteUrl, isPartner, partnerPromotionKey, templateValueEntries, templateValues, templatePresetName, onTemplateValueChange, shouldShowSpeedTest, baseUrl, onBaseUrlChange, isEndpointModalOpen, onEndpointModalToggle, onCustomEndpointsChange, shouldShowModelSelector, claudeModel, defaultHaikuModel, defaultSonnetModel, defaultOpusModel, onModelChange, speedTestEndpoints, }: ClaudeFormFieldsProps) { const { t } = useTranslation(); return ( <> {/* API Key 输入框 */} {shouldShowApiKey && ( )} {/* 模板变量输入 */} {templateValueEntries.length > 0 && (
{t("providerForm.parameterConfig", { name: templatePresetName, defaultValue: `${templatePresetName} 参数配置`, })}
{templateValueEntries.map(([key, config]) => (
{config.label} onTemplateValueChange(key, e.target.value)} placeholder={config.placeholder || config.label} autoComplete="off" />
))}
)} {/* Base URL 输入框 */} {shouldShowSpeedTest && ( onEndpointModalToggle(true)} /> )} {/* 端点测速弹窗 */} {shouldShowSpeedTest && isEndpointModalOpen && ( onEndpointModalToggle(false)} onCustomEndpointsChange={onCustomEndpointsChange} /> )} {/* 模型选择器 */} {shouldShowModelSelector && (
{/* 主模型 */}
{t("providerForm.anthropicModel", { defaultValue: "主模型" })} onModelChange("ANTHROPIC_MODEL", e.target.value) } placeholder={t("providerForm.modelPlaceholder", { defaultValue: "", })} autoComplete="off" />
{/* 默认 Haiku */}
{t("providerForm.anthropicDefaultHaikuModel", { defaultValue: "Haiku 默认模型", })} onModelChange("ANTHROPIC_DEFAULT_HAIKU_MODEL", e.target.value) } placeholder={t("providerForm.haikuModelPlaceholder", { defaultValue: "", })} autoComplete="off" />
{/* 默认 Sonnet */}
{t("providerForm.anthropicDefaultSonnetModel", { defaultValue: "Sonnet 默认模型", })} onModelChange( "ANTHROPIC_DEFAULT_SONNET_MODEL", e.target.value, ) } placeholder={t("providerForm.modelPlaceholder", { defaultValue: "", })} autoComplete="off" />
{/* 默认 Opus */}
{t("providerForm.anthropicDefaultOpusModel", { defaultValue: "Opus 默认模型", })} onModelChange("ANTHROPIC_DEFAULT_OPUS_MODEL", e.target.value) } placeholder={t("providerForm.modelPlaceholder", { defaultValue: "", })} autoComplete="off" />

{t("providerForm.modelHelper", { defaultValue: "可选:指定默认使用的 Claude 模型,留空则使用系统默认。", })}

)} ); }