import { useState } from 'react' import { Play, Brain, Plus, Trash2, Settings2, Loader2, Wrench } from 'lucide-react' import { useAgentStore } from '../store/agentStore' import { tools as builtinTools } from '../utils/tools' import { agents } from '../utils/agents' const EMPTY_PARAMS = '{"type":"object","properties":{}}' function ToolChip({ call }) { return (
{call?.function?.name || '未知工具'}
{call?.function?.arguments || ''}
) } function ToolModal({ toolsList, onChange, onClose }) { const [draft, setDraft] = useState({ name: '', description: '', parameters: EMPTY_PARAMS }) const [err, setErr] = useState('') const addTool = () => { const name = draft.name.trim() if (!name) return setErr('請輸入工具名稱') if (!/^[a-zA-Z0-9_-]+$/.test(name)) return setErr('名稱只能用英數字、底線與連字號') if (toolsList.some((t) => t.name === name)) return setErr('名稱重複') let parameters try { parameters = JSON.parse(draft.parameters || '{}') } catch { return setErr('parameters 不是合法 JSON') } onChange([ ...toolsList, { name, description: draft.description.trim() || '自訂工具', parameters }, ]) setDraft({ name: '', description: '', parameters: EMPTY_PARAMS }) setErr('') } return (

管理工具

{toolsList.length === 0 &&

目前沒有工具

} {toolsList.map((t) => (
{t.name}
{t.description}
))}
新增工具
setDraft({ ...draft, name: e.target.value })} placeholder="name,例如 get_weather" className="w-full bg-app px-4 py-2 rounded-xl focus:outline-none" /> setDraft({ ...draft, description: e.target.value })} placeholder="description(模型靠它決定何時呼叫)" className="w-full bg-app px-4 py-2 rounded-xl focus:outline-none" />