uarp_sdk/generated/api/knowledge.rs
1// Code generated by @uarp/codegen from spec/openapi.json. DO NOT EDIT.
2//!
3//! Knowledge base management
4
5#![allow(unused_imports, clippy::too_many_arguments)]
6
7use reqwest::Method;
8use serde::{Deserialize, Serialize};
9
10use crate::client::{Client, Request, NO_BODY, NO_QUERY};
11use crate::error::Result;
12use crate::generated::models;
13use crate::multipart::{field_text, FilePart};
14use crate::util::encode_path;
15
16/// Knowledge base management
17#[derive(Debug, Clone)]
18pub struct KnowledgeApi {
19 pub(crate) client: Client,
20}
21
22impl Client {
23 /// Knowledge base management
24 pub fn knowledge(&self) -> KnowledgeApi {
25 KnowledgeApi { client: self.clone() }
26 }
27}
28
29impl KnowledgeApi {
30 /// Create a knowledge base
31 ///
32 /// `POST /api/v1/knowledge-bases`
33 ///
34 /// Required scopes: `memory:write`.
35 pub async fn create_knowledge_base(&self, body: &models::KnowledgeBaseCreate) -> Result<models::KnowledgeBase> {
36 self.client
37 .request_json(Request {
38 method: Method::POST,
39 path: "/api/v1/knowledge-bases".to_string(),
40 query: NO_QUERY,
41 body: Some(body),
42 headers: Vec::new(),
43 idempotent: true,
44 })
45 .await
46 }
47
48 /// Delete document
49 ///
50 /// `DELETE /api/v1/knowledge-bases/{id}/documents/{docId}`
51 ///
52 /// Required scopes: `memory:write`.
53 pub async fn delete_kb_document(&self, id: &str, doc_id: &str) -> Result<models::DeleteKbDocumentResponse> {
54 self.client
55 .request_json(Request {
56 method: Method::DELETE,
57 path: format!("/api/v1/knowledge-bases/{}/documents/{}", encode_path(id), encode_path(doc_id)),
58 query: NO_QUERY,
59 body: NO_BODY,
60 headers: Vec::new(),
61 idempotent: true,
62 })
63 .await
64 }
65
66 /// Delete knowledge base
67 ///
68 /// `DELETE /api/v1/knowledge-bases/{id}`
69 ///
70 /// Required scopes: `memory:write`.
71 pub async fn delete_knowledge_base(&self, id: &str) -> Result<models::DeleteKnowledgeBaseResponse> {
72 self.client
73 .request_json(Request {
74 method: Method::DELETE,
75 path: format!("/api/v1/knowledge-bases/{}", encode_path(id)),
76 query: NO_QUERY,
77 body: NO_BODY,
78 headers: Vec::new(),
79 idempotent: true,
80 })
81 .await
82 }
83
84 /// Get knowledge base
85 ///
86 /// `GET /api/v1/knowledge-bases/{id}`
87 ///
88 /// Required scopes: `memory:read`.
89 pub async fn get_knowledge_base(&self, id: &str) -> Result<models::KnowledgeBase> {
90 self.client
91 .request_json(Request {
92 method: Method::GET,
93 path: format!("/api/v1/knowledge-bases/{}", encode_path(id)),
94 query: NO_QUERY,
95 body: NO_BODY,
96 headers: Vec::new(),
97 idempotent: false,
98 })
99 .await
100 }
101
102 /// Ingest document into knowledge base
103 ///
104 /// `POST /api/v1/knowledge-bases/{kbId}/documents`
105 ///
106 /// Required scopes: `memory:write`.
107 pub async fn ingest_kb_document(&self, kb_id: &str, body: &models::IngestKbDocumentRequest) -> Result<models::IngestKbDocumentResponse> {
108 self.client
109 .request_json(Request {
110 method: Method::POST,
111 path: format!("/api/v1/knowledge-bases/{}/documents", encode_path(kb_id)),
112 query: NO_QUERY,
113 body: Some(body),
114 headers: Vec::new(),
115 idempotent: true,
116 })
117 .await
118 }
119
120 /// List documents in knowledge base
121 ///
122 /// `GET /api/v1/knowledge-bases/{kbId}/documents`
123 ///
124 /// Required scopes: `memory:read`.
125 pub async fn list_kb_documents(&self, kb_id: &str) -> Result<models::ListKbDocumentsResponse> {
126 self.client
127 .request_json(Request {
128 method: Method::GET,
129 path: format!("/api/v1/knowledge-bases/{}/documents", encode_path(kb_id)),
130 query: NO_QUERY,
131 body: NO_BODY,
132 headers: Vec::new(),
133 idempotent: false,
134 })
135 .await
136 }
137
138 /// List knowledge bases
139 ///
140 /// `GET /api/v1/knowledge-bases`
141 ///
142 /// Required scopes: `memory:read`.
143 pub async fn list_knowledge_bases(&self) -> Result<models::ListKnowledgeBasesResponse> {
144 self.client
145 .request_json(Request {
146 method: Method::GET,
147 path: "/api/v1/knowledge-bases".to_string(),
148 query: NO_QUERY,
149 body: NO_BODY,
150 headers: Vec::new(),
151 idempotent: false,
152 })
153 .await
154 }
155
156 /// Re-embed every chunk with the current model
157 ///
158 /// Recovers a knowledge base that was indexed without embeddings (keyword-only) and clears
159 /// embedding drift after a model change. Requires an embeddings backend: without one the answer
160 /// is 503 and nothing is written.
161 ///
162 /// `POST /api/v1/knowledge-bases/{kbId}/reindex`
163 ///
164 /// Required scopes: `memory:write`.
165 pub async fn reindex_knowledge_base(&self, kb_id: &str) -> Result<models::ReindexKnowledgeBaseResponse> {
166 self.client
167 .request_json(Request {
168 method: Method::POST,
169 path: format!("/api/v1/knowledge-bases/{}/reindex", encode_path(kb_id)),
170 query: NO_QUERY,
171 body: NO_BODY,
172 headers: Vec::new(),
173 idempotent: true,
174 })
175 .await
176 }
177
178 /// Retrieve chunks from one knowledge base
179 ///
180 /// Vector search when an embeddings backend is configured, keyword scoring when it is not —
181 /// `mode` says which ran, and a vector pass that matches nothing falls back to keyword rather
182 /// than answering empty. `status` distinguishes the three outcomes a caller must render
183 /// differently: `KB_EMPTY` (nothing indexed yet), `NO_MATCHES` (indexed, nothing matched) and
184 /// `RESULTS_FOUND`. All three are 200: an empty result is an answer here, not a failure.
185 ///
186 /// `POST /api/v1/knowledge-bases/{kbId}/search`
187 ///
188 /// Required scopes: `memory:write`.
189 pub async fn search_knowledge_base(&self, kb_id: &str, body: &models::SearchKnowledgeBaseRequest) -> Result<models::KnowledgeBaseSearchResult> {
190 self.client
191 .request_json(Request {
192 method: Method::POST,
193 path: format!("/api/v1/knowledge-bases/{}/search", encode_path(kb_id)),
194 query: NO_QUERY,
195 body: Some(body),
196 headers: Vec::new(),
197 idempotent: true,
198 })
199 .await
200 }
201
202 /// Update knowledge base
203 ///
204 /// WRITE SEMANTICS: merges. Measured 2026-08-31 on the wire: `{name}` left `description` intact
205 /// and vice versa, and `chunk_size` and `embedding_model` survived both. Note this is the
206 /// OPPOSITE of `PUT /agents/{id}/schedule`, which replaces — the verb decides nothing here, see
207 /// docs/WRITE_SEMANTICS.md.
208 ///
209 /// `PUT /api/v1/knowledge-bases/{id}`
210 ///
211 /// Required scopes: `memory:write`.
212 pub async fn update_knowledge_base(&self, id: &str, body: &models::KnowledgeBaseUpdate) -> Result<models::KnowledgeBase> {
213 self.client
214 .request_json(Request {
215 method: Method::PUT,
216 path: format!("/api/v1/knowledge-bases/{}", encode_path(id)),
217 query: NO_QUERY,
218 body: Some(body),
219 headers: Vec::new(),
220 idempotent: true,
221 })
222 .await
223 }
224}