/* Copyright (C) 2023-2026 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import { memo, useCallback, useRef, useState } from 'react' import { type UseFormReturn } from 'react-hook-form' import { Code2, Eye, RotateCcw, Save } from 'lucide-react' import { useTranslation } from 'react-i18next' import { Button } from '@/components/ui/button' import { Form, FormControl, FormDescription, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form' import { Switch } from '@/components/ui/switch' import { Textarea } from '@/components/ui/textarea' import { SettingsForm, SettingsSwitchContent, SettingsSwitchItem, } from '../components/settings-form-layout' import { ModelRatioVisualEditor, type ModelRatioVisualEditorHandle, } from './model-ratio-visual-editor' type ModelFormValues = { ModelPrice: string ModelRatio: string CacheRatio: string CreateCacheRatio: string CompletionRatio: string ImageRatio: string AudioRatio: string AudioCompletionRatio: string ExposeRatioEnabled: boolean BillingMode: string BillingExpr: string } type ModelRatioFormProps = { form: UseFormReturn savedValues: ModelFormValues onSave: (values: ModelFormValues) => Promise onReset: () => void isSaving: boolean isResetting: boolean } export const ModelRatioForm = memo(function ModelRatioForm({ form, savedValues, onSave, onReset, isSaving, isResetting, }: ModelRatioFormProps) { const { t } = useTranslation() const [editMode, setEditMode] = useState<'visual' | 'json'>('visual') const visualEditorRef = useRef(null) const handleFieldChange = useCallback( (field: keyof ModelFormValues, value: string) => { form.setValue(field, value, { shouldValidate: true, shouldDirty: true, }) }, [form] ) const toggleEditMode = useCallback(() => { setEditMode((prev) => (prev === 'visual' ? 'json' : 'visual')) }, []) const handleSave = useCallback(async () => { if (editMode === 'visual') { const committed = await visualEditorRef.current?.commitOpenEditor() if (committed === false) return } await form.handleSubmit(onSave)() }, [editMode, form, onSave]) return (
{editMode === 'json' && ( )}
{editMode === 'visual' ? (
{ const fieldMap: Record = { 'billing_setting.billing_mode': 'BillingMode', 'billing_setting.billing_expr': 'BillingExpr', } const formField = fieldMap[field] || (field as keyof ModelFormValues) handleFieldChange(formField, value) }} /> ( {t('Expose ratio API')} {t( 'Allow clients to query configured ratios via `/api/ratio`.' )} )} />
) : ( ( {t('Model fixed pricing')}