rust_cnb/
knowledge_base.rs

1//! KnowledgeBase API 客户端
2
3use crate::error::{ApiError, Result};
4use reqwest::Client;
5use serde_json::Value;
6use url::Url;
7
8/// KnowledgeBase API 客户端
9pub struct KnowledgeBaseClient {
10    base_url: String,
11    client: Client,
12}
13
14impl KnowledgeBaseClient {
15    /// 创建新的 KnowledgeBase API 客户端
16    pub fn new(base_url: String, client: Client) -> Self {
17        Self { base_url, client }
18    }
19
20    /// 设置认证信息
21    pub fn with_auth(self, token: &str) -> Self {
22        // 这里可以扩展认证逻辑
23        self
24    }
25
26    /// 查询知识库,使用文档:https://docs.cnb.cool/zh/ai/knowledge-base.html
27    pub async fn post_repo_knowledge_base_query(
28        &self,
29        repo: String,
30        query: serde_json::Value,
31    ) -> Result<Value> {
32        let path = format!("/{}/-/knowledge/base/query", repo);
33        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
34        
35
36        
37        let mut request = self.client.request(
38            reqwest::Method::POST,
39            url
40        );
41
42
43
44        request = request.json(&query);
45
46        let response = request.send().await?;
47        
48        if response.status().is_success() {
49            let json: Value = response.json().await?;
50            Ok(json)
51        } else {
52            Err(ApiError::HttpError(response.status().as_u16()))
53        }
54    }
55
56    /// 获取当前支持的 Embedding 模型列表
57    pub async fn get_repo_knowledge_embedding_models(
58        &self,
59        repo: String,
60    ) -> Result<Value> {
61        let path = format!("/{}/-/knowledge/embedding/models", repo);
62        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
63        
64
65                let request = self.client.request(
66            reqwest::Method::GET,
67            url
68        );
69        
70
71
72
73        let response = request.send().await?;
74        
75        if response.status().is_success() {
76            let json: Value = response.json().await?;
77            Ok(json)
78        } else {
79            Err(ApiError::HttpError(response.status().as_u16()))
80        }
81    }
82
83    /// 获取知识库信息
84    pub async fn get_repo_knowledge_base(
85        &self,
86        repo: String,
87    ) -> Result<Value> {
88        let path = format!("/{}/-/knowledge/base", repo);
89        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
90        
91
92                let request = self.client.request(
93            reqwest::Method::GET,
94            url
95        );
96        
97
98
99
100        let response = request.send().await?;
101        
102        if response.status().is_success() {
103            let json: Value = response.json().await?;
104            Ok(json)
105        } else {
106            Err(ApiError::HttpError(response.status().as_u16()))
107        }
108    }
109
110    /// 删除知识库
111    pub async fn delete_repo_knowledge_base(
112        &self,
113        repo: String,
114    ) -> Result<Value> {
115        let path = format!("/{}/-/knowledge/base", repo);
116        let url = Url::parse(&format!("{}{}", self.base_url, path))?;
117        
118
119                let request = self.client.request(
120            reqwest::Method::DELETE,
121            url
122        );
123        
124
125
126
127        let response = request.send().await?;
128        
129        if response.status().is_success() {
130            let json: Value = response.json().await?;
131            Ok(json)
132        } else {
133            Err(ApiError::HttpError(response.status().as_u16()))
134        }
135    }
136
137}