"use client"; import { ChevronDown, ChevronRight, Database, Send, Sparkles } from "lucide-react"; import { useState } from "react"; import { Nl2SqlConsole } from "@/components/admin/sections/nl2sql-console"; import { Badge, Button, Card, ErrorState, LoadingBlock, Select, cn, useToast, } from "@/components/admin/ui"; import { errMessage } from "@/lib/admin-api"; import { nl2sqlApi, type Nl2SqlQueryResult } from "@/lib/nl2sql-api"; /** 示例问题,避免员工面对空白输入框不知道怎么问。 */ const SAMPLES = [ "近一个月成交额排名前十的客户有哪些?", "统计各风险等级客户的数量", "查询本月新增签约客户名单", ]; /** * NL2SQL 功能入口。 * 主界面只做「自然语言问数」这一件事;权限与运维面板默认折叠在下方, * 需要排查问题时再展开,避免员工被配置项淹没。 */ export function Nl2SqlSection() { const toast = useToast(); const [question, setQuestion] = useState(""); const [maxRows, setMaxRows] = useState(200); const [loading, setLoading] = useState(false); const [result, setResult] = useState(null); const [error, setError] = useState(null); const [showConsole, setShowConsole] = useState(false); const run = async (text: string) => { const value = text.trim(); if (!value || loading) return; setLoading(true); setError(null); setResult(null); try { const data = await nl2sqlApi.query({ question: value, max_rows: maxRows, }); setResult(data); } catch (err) { setError(errMessage(err, "问数失败,请改写问题后重试")); } finally { setLoading(false); } }; const columns = result?.columns ?? []; const rows = result?.rows ?? []; return (