import { useEffect, useState } from "react"; import { apiGet } from "../lib/api"; interface ToolParam { name: string; param_type: string; required: boolean; description: string; } interface ToolItem { name: string; description: string; source: string; path?: string; params: ToolParam[]; required_env: string[]; } interface ToolsResponse { success: boolean; total: number; tools_path: string; builtin_tools: ToolItem[]; capability_tools: ToolItem[]; warnings: string[]; } export function ToolsPage() { const [data, setData] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); useEffect(() => { apiGet("/v1/tools") .then(setData) .catch((err) => setError(err.message)) .finally(() => setLoading(false)); }, []); if (loading) { return (
加载中...
); } if (error) { return (

加载失败:{error}

); } if (!data) return null; const renderToolCard = (item: ToolItem) => (

{item.name}

{item.description}

{item.source}
{item.path && (
{item.path}
)} {item.params.length > 0 ? (
{item.params.map((param) => (
{param.name} {param.param_type} {param.required ? ( 必填 ) : ( 可选 )}

{param.description}

))}
) : (

无参数

)} {item.required_env.length > 0 && (
环境变量:{" "} {item.required_env.map((env) => ( {env} ))}
)}
); return (

工具列表

共 {data.total} 个工具;YAML 工具目录: {data.tools_path}

{data.warnings.length > 0 && (
部分工具定义未能加载
    {data.warnings.map((w, i) => (
  • {w}
  • ))}
)}

内置工具

{data.builtin_tools.length} 个
{data.builtin_tools.length === 0 ? (
暂无工具
) : ( data.builtin_tools.map(renderToolCard) )}

YAML 工具

{data.capability_tools.length} 个
{data.capability_tools.length === 0 ? (
暂无工具
) : ( data.capability_tools.map(renderToolCard) )}
); }