153 lines
3.6 KiB
Go
153 lines
3.6 KiB
Go
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"bytes"
|
|||
|
|
"encoding/json"
|
|||
|
|
"fmt"
|
|||
|
|
"io"
|
|||
|
|
"net/http"
|
|||
|
|
"os"
|
|||
|
|
"strings"
|
|||
|
|
"time"
|
|||
|
|
|
|||
|
|
"github.com/gogf/gf/v2/frame/g"
|
|||
|
|
"github.com/gogf/gf/v2/os/gcfg"
|
|||
|
|
"github.com/gogf/gf/v2/os/gctx"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
type Dataset struct {
|
|||
|
|
Id string `json:"id"`
|
|||
|
|
Name string `json:"name"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type ListDatasetsRes struct {
|
|||
|
|
Code int `json:"code"`
|
|||
|
|
Data []Dataset `json:"data"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type DeleteReq struct {
|
|||
|
|
Ids []string `json:"ids"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
type CommonResponse struct {
|
|||
|
|
Code int `json:"code"`
|
|||
|
|
Message string `json:"message"`
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func main() {
|
|||
|
|
ctx := gctx.New()
|
|||
|
|
|
|||
|
|
fmt.Println("🚀 RAGFlow知识库清理工具(简化版)")
|
|||
|
|
fmt.Println("=" + strings.Repeat("=", 50))
|
|||
|
|
|
|||
|
|
// 设置配置文件路径
|
|||
|
|
g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetPath("../")
|
|||
|
|
|
|||
|
|
// 读取配置
|
|||
|
|
baseURL := g.Cfg().MustGet(ctx, "ragflow.base_url").String()
|
|||
|
|
apiKey := g.Cfg().MustGet(ctx, "ragflow.api_key").String()
|
|||
|
|
|
|||
|
|
if baseURL == "" || apiKey == "" {
|
|||
|
|
fmt.Println("❌ RAGFlow配置缺失,请检查../config.yaml")
|
|||
|
|
fmt.Println(" 需要配置: ragflow.base_url 和 ragflow.api_key")
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
baseURL = strings.TrimSuffix(baseURL, "/")
|
|||
|
|
fmt.Printf("📡 连接到RAGFlow: %s\n", baseURL)
|
|||
|
|
|
|||
|
|
// 创建HTTP客户端
|
|||
|
|
client := &http.Client{
|
|||
|
|
Timeout: 30 * time.Second,
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 1. 列出所有知识库
|
|||
|
|
listURL := baseURL + "/api/v1/datasets?page=1&page_size=1000"
|
|||
|
|
req, err := http.NewRequest("GET", listURL, nil)
|
|||
|
|
if err != nil {
|
|||
|
|
fmt.Printf("❌ 创建请求失败: %v\n", err)
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
req.Header.Set("Authorization", "Bearer "+apiKey)
|
|||
|
|
|
|||
|
|
resp, err := client.Do(req)
|
|||
|
|
if err != nil {
|
|||
|
|
fmt.Printf("❌ 查询知识库列表失败: %v\n", err)
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
defer resp.Body.Close()
|
|||
|
|
|
|||
|
|
body, _ := io.ReadAll(resp.Body)
|
|||
|
|
var listRes ListDatasetsRes
|
|||
|
|
if err := json.Unmarshal(body, &listRes); err != nil {
|
|||
|
|
fmt.Printf("❌ 解析响应失败: %v\n", err)
|
|||
|
|
fmt.Printf("响应内容: %s\n", string(body))
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if len(listRes.Data) == 0 {
|
|||
|
|
fmt.Println("✅ 没有找到任何知识库,无需清理")
|
|||
|
|
os.Exit(0)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 显示知识库列表
|
|||
|
|
fmt.Printf("\n📚 发现 %d 个知识库:\n", len(listRes.Data))
|
|||
|
|
for i, dataset := range listRes.Data {
|
|||
|
|
fmt.Printf(" %d. ID: %s, Name: %s\n", i+1, dataset.Id, dataset.Name)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 二次确认
|
|||
|
|
fmt.Printf("\n⚠️ 警告:即将删除所有 %d 个知识库!\n", len(listRes.Data))
|
|||
|
|
fmt.Print("请输入 'YES' 确认删除: ")
|
|||
|
|
|
|||
|
|
var confirm string
|
|||
|
|
fmt.Scanln(&confirm)
|
|||
|
|
|
|||
|
|
if confirm != "YES" {
|
|||
|
|
fmt.Println("❌ 取消删除操作")
|
|||
|
|
os.Exit(0)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 2. 批量删除
|
|||
|
|
var datasetIds []string
|
|||
|
|
for _, dataset := range listRes.Data {
|
|||
|
|
datasetIds = append(datasetIds, dataset.Id)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
deleteReq := DeleteReq{Ids: datasetIds}
|
|||
|
|
reqBody, _ := json.Marshal(deleteReq)
|
|||
|
|
|
|||
|
|
deleteURL := baseURL + "/api/v1/datasets"
|
|||
|
|
delReq, err := http.NewRequest("DELETE", deleteURL, bytes.NewBuffer(reqBody))
|
|||
|
|
if err != nil {
|
|||
|
|
fmt.Printf("❌ 创建删除请求失败: %v\n", err)
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
delReq.Header.Set("Authorization", "Bearer "+apiKey)
|
|||
|
|
delReq.Header.Set("Content-Type", "application/json")
|
|||
|
|
|
|||
|
|
fmt.Println("\n🗑️ 开始删除知识库...")
|
|||
|
|
delResp, err := client.Do(delReq)
|
|||
|
|
if err != nil {
|
|||
|
|
fmt.Printf("❌ 删除失败: %v\n", err)
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
defer delResp.Body.Close()
|
|||
|
|
|
|||
|
|
delBody, _ := io.ReadAll(delResp.Body)
|
|||
|
|
var commonRes CommonResponse
|
|||
|
|
if err := json.Unmarshal(delBody, &commonRes); err != nil {
|
|||
|
|
fmt.Printf("❌ 解析删除响应失败: %v\n", err)
|
|||
|
|
fmt.Printf("响应内容: %s\n", string(delBody))
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if commonRes.Code != 0 {
|
|||
|
|
fmt.Printf("❌ 删除失败: %s\n", commonRes.Message)
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
fmt.Printf("✅ 成功删除 %d 个知识库!\n", len(datasetIds))
|
|||
|
|
fmt.Println("=" + strings.Repeat("=", 50))
|
|||
|
|
}
|