import { Settings2 } from 'lucide-react'; import type { Dispatch, SetStateAction } from 'react'; import { LucentIconButton } from '../../../components/lucent/LucentIconButton'; import { LucentSelect } from '../../../components/lucent/LucentSelect'; import { PasswordInput } from '../../../components/PasswordInput'; import { buildLlmProviderOptions } from '../../../utils/llmProviders'; import type { BotWizardForm } from '../types'; interface BotWizardBaseStepProps { isZh: boolean; ui: any; lc: any; passwordToggleLabels: { show: string; hide: string }; form: BotWizardForm; setForm: Dispatch>; botIdStatus: 'idle' | 'checking' | 'available' | 'exists' | 'invalid'; botIdStatusText: string; defaultSystemTimezone: string; systemTimezoneOptions: Array<{ value: string; label?: string }>; cpuCoresDraft: string; memoryMbDraft: string; storageGbDraft: string; maxTokensDraft: string; configuredChannelsLabel: string; envEntries: Array<[string, string]>; testResult: string; isTestingProvider: boolean; onProviderChange: (provider: string) => void; onTestProvider: () => Promise; commitCpuCoresDraft: (raw: string) => void; commitMemoryMbDraft: (raw: string) => void; commitStorageGbDraft: (raw: string) => void; commitMaxTokensDraft: (raw: string) => void; setCpuCoresDraft: (value: string) => void; setMemoryMbDraft: (value: string) => void; setStorageGbDraft: (value: string) => void; setMaxTokensDraft: (value: string) => void; onOpenChannelModal: () => void; onOpenToolsModal: () => void; } export function BotWizardBaseStep({ isZh, ui, lc, passwordToggleLabels, form, setForm, botIdStatus, botIdStatusText, defaultSystemTimezone, systemTimezoneOptions, cpuCoresDraft, memoryMbDraft, storageGbDraft, maxTokensDraft, configuredChannelsLabel, envEntries, testResult, isTestingProvider, onProviderChange, onTestProvider, commitCpuCoresDraft, commitMemoryMbDraft, commitStorageGbDraft, commitMaxTokensDraft, setCpuCoresDraft, setMemoryMbDraft, setStorageGbDraft, setMaxTokensDraft, onOpenChannelModal, onOpenToolsModal, }: BotWizardBaseStepProps) { const providerOptions = buildLlmProviderOptions(form.llm_provider); return (
{ui.baseInfo}
{ const normalized = e.target.value.replace(/[^A-Za-z0-9_]/g, ''); setForm((prev) => ({ ...prev, id: normalized })); }} />
{botIdStatusText || ui.botIdHint}
setForm((prev) => ({ ...prev, name: e.target.value }))} />
{isZh ? '基础信息' : 'Basic Info'}
setForm((prev) => ({ ...prev, system_timezone: e.target.value }))} > {systemTimezoneOptions.map((option) => ( ))}
{isZh ? '提示:系统时区保存后,在 Bot 重启后生效。' : 'Tip: timezone changes take effect after the bot restarts.'}
{isZh ? '资源配额' : 'Resource Limits'}
setCpuCoresDraft(e.target.value)} onBlur={(e) => commitCpuCoresDraft(e.target.value)} /> setMemoryMbDraft(e.target.value)} onBlur={(e) => commitMemoryMbDraft(e.target.value)} /> setStorageGbDraft(e.target.value)} onBlur={(e) => commitStorageGbDraft(e.target.value)} />
{isZh ? '提示:填写 0 表示不限制。' : 'Tip: value 0 means unlimited.'}
{ui.modelAccess}
onProviderChange(e.target.value)}> {providerOptions.map((option) => ( ))} setForm((prev) => ({ ...prev, llm_model: e.target.value }))} /> setForm((prev) => ({ ...prev, api_key: e.target.value }))} toggleLabels={passwordToggleLabels} /> setForm((prev) => ({ ...prev, api_base: e.target.value }))} /> {testResult ?
{testResult}
: null}
{ui.modelParams}
setForm((prev) => ({ ...prev, temperature: Number(e.target.value) }))} />
setForm((prev) => ({ ...prev, top_p: Number(e.target.value) }))} />
setMaxTokensDraft(e.target.value)} onBlur={(e) => commitMaxTokensDraft(e.target.value)} />
{ui.tokenRange}
{[4096, 8192, 16384, 32768].map((value) => ( ))}
{lc.wizardSectionTitle}
{lc.wizardSectionDesc}
{configuredChannelsLabel}
{ui.toolsConfig}
{ui.toolsDesc}
{envEntries.length > 0 ? envEntries.map(([key]) => key).join(', ') : ui.noEnvParams}
); }