// opsxdb-agent-accept:阶段 2 冒烟 — 真 LLM(~/.opsxdb/ai.json)+ 真库 aitools。 // 用法:cd server && go run ./cmd/opsxdb-agent-accept/ package main import ( "context" "encoding/json" "fmt" "os" "strings" "time" "opsxdb/server/internal/ai" "opsxdb/server/internal/aitools" ) func main() { llm, err := ai.DefaultToolChat() if err != nil { fmt.Println("SKIP: no ToolChat LLM configured:", err) fmt.Println("提示:Ask|Agent 单测已覆盖 tool loop;配置 DeepSeek 后重跑本命令做真库冒烟。") os.Exit(0) } rt, err := aitools.DefaultRuntime() if err != nil { fmt.Println("FAIL: runtime", err) os.Exit(1) } ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) defer cancel() req := ai.AgentReq{ Prompt: "列出 demo 库有哪些表,再用 SELECT 查 users 表最多 3 行,简要中文回答。", ConnectionID: "accept-mysql-demo", Driver: "mysql", Database: "demo", MaxRounds: 8, } fmt.Println("RUN Agent:", req.Prompt) res, err := ai.RunAgent(ctx, llm, rt, req) b, _ := json.MarshalIndent(res, "", " ") fmt.Println(string(b)) if err != nil { fmt.Println("FAIL:", err) os.Exit(1) } okTool := false for _, s := range res.Steps { fmt.Printf("STEP ok=%v tool=%s summary=%s ms=%d\n", s.OK, s.Tool, s.Summary, s.Ms) if s.OK && (s.Tool == aitools.ToolListTables || s.Tool == aitools.ToolExecuteQuery || s.Tool == aitools.ToolGetSchemaContext) { okTool = true } } if !okTool { fmt.Println("FAIL: Agent 未成功调用 list_tables / execute_query / get_schema_context") os.Exit(1) } if strings.TrimSpace(res.Content) == "" { fmt.Println("FAIL: empty content") os.Exit(1) } fmt.Println("OK: agent smoke passed, rounds=", res.Rounds) }