import { useState, useEffect } from 'react'; import { X, Save, Bot, Cpu, Key, FileText, Layers } from 'lucide-react'; import axios from 'axios'; import { APP_ENDPOINTS } from '../../../config/env'; import { useAppStore } from '../../../store/appStore'; import { pickLocale } from '../../../i18n'; import { managementZhCn } from '../../../i18n/management.zh-cn'; import { managementEn } from '../../../i18n/management.en'; import { useLucentPrompt } from '../../../components/lucent/LucentPromptProvider'; import { LucentSelect } from '../../../components/lucent/LucentSelect'; import { PasswordInput } from '../../../components/PasswordInput'; interface CreateBotModalProps { isOpen: boolean; onClose: () => void; onSuccess: () => void; } interface NanobotImage { tag: string; status: string; source_dir?: string; } export function CreateBotModal({ isOpen, onClose, onSuccess }: CreateBotModalProps) { const locale = useAppStore((s) => s.locale); const { notify } = useLucentPrompt(); const t = pickLocale(locale, { 'zh-cn': managementZhCn, en: managementEn }).create; const passwordToggleLabels = locale === 'zh' ? { show: '显示密码', hide: '隐藏密码' } : { show: 'Show password', hide: 'Hide password' }; const [formData, setFormData] = useState({ id: '', name: '', llm_provider: 'openai', llm_model: 'gpt-4o', api_key: '', system_prompt: t.systemPrompt, image_tag: 'nanobot-base:v0.1.4', }); const [availableImages, setAvailableImages] = useState([]); useEffect(() => { if (!isOpen) { return; } axios .get(`${APP_ENDPOINTS.apiBase}/images`) .then((res) => setAvailableImages(res.data.filter((img) => img.status === 'READY' || img.status === 'UNKNOWN'))) .catch((err) => console.error('Failed to fetch images', err)); }, [isOpen]); if (!isOpen) return null; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { await axios.post(`${APP_ENDPOINTS.apiBase}/bots`, formData); onSuccess(); onClose(); } catch { notify(t.createFail, { tone: 'error' }); } }; return (

{t.title}

setFormData({ ...formData, id: e.target.value })} />
setFormData({ ...formData, name: e.target.value })} />
setFormData({ ...formData, image_tag: e.target.value })} value={formData.image_tag} > {availableImages.map((img) => ( ))} {availableImages.length === 0 && }

{t.imageHint}

setFormData({ ...formData, llm_provider: e.target.value })} >
setFormData({ ...formData, llm_model: e.target.value })} />
setFormData({ ...formData, api_key: e.target.value })} toggleLabels={passwordToggleLabels} />