Skip to main content

timeweb_rs/apis/
knowledge_bases_api.rs

1/*
2 * Документация публичного API
3 *
4 * # Введение API Timeweb Cloud позволяет вам управлять ресурсами в облаке программным способом с использованием обычных HTTP-запросов.  Множество функций, которые доступны в панели управления Timeweb Cloud, также доступны через API, что позволяет вам автоматизировать ваши собственные сценарии.  В этой документации сперва будет описан общий дизайн и принципы работы API, а после этого конкретные конечные точки. Также будут приведены примеры запросов к ним.   ## Запросы Запросы должны выполняться по протоколу `HTTPS`, чтобы гарантировать шифрование транзакций. Поддерживаются следующие методы запроса: |Метод|Применение| |--- |--- | |GET|Извлекает данные о коллекциях и отдельных ресурсах.| |POST|Для коллекций создает новый ресурс этого типа. Также используется для выполнения действий с конкретным ресурсом.| |PUT|Обновляет существующий ресурс.| |PATCH|Некоторые ресурсы поддерживают частичное обновление, то есть обновление только части атрибутов ресурса, в этом случае вместо метода PUT будет использован PATCH.| |DELETE|Удаляет ресурс.|  Методы `POST`, `PUT` и `PATCH` могут включать объект в тело запроса с типом содержимого `application/json`.  ### Параметры в запросах Некоторые коллекции поддерживают пагинацию, поиск или сортировку в запросах. В параметрах запроса требуется передать: - `limit` — обозначает количество записей, которое необходимо вернуть  - `offset` — указывает на смещение, относительно начала списка  - `search` — позволяет указать набор символов для поиска  - `sort` — можно задать правило сортировки коллекции  ## Ответы Запросы вернут один из следующих кодов состояния ответа HTTP:  |Статус|Описание| |--- |--- | |200 OK|Действие с ресурсом было выполнено успешно.| |201 Created|Ресурс был успешно создан. При этом ресурс может быть как уже готовым к использованию, так и находиться в процессе запуска.| |204 No Content|Действие с ресурсом было выполнено успешно, и ответ не содержит дополнительной информации в теле.| |400 Bad Request|Был отправлен неверный запрос, например, в нем отсутствуют обязательные параметры и т. д. Тело ответа будет содержать дополнительную информацию об ошибке.| |401 Unauthorized|Ошибка аутентификации.| |403 Forbidden|Аутентификация прошла успешно, но недостаточно прав для выполнения действия.| |404 Not Found|Запрашиваемый ресурс не найден.| |409 Conflict|Запрос конфликтует с текущим состоянием.| |423 Locked|Ресурс из запроса заблокирован от применения к нему указанного метода.| |429 Too Many Requests|Был достигнут лимит по количеству запросов в единицу времени.| |500 Internal Server Error|При выполнении запроса произошла какая-то внутренняя ошибка. Чтобы решить эту проблему, лучше всего создать тикет в панели управления.|  ### Структура успешного ответа Все конечные точки будут возвращать данные в формате `JSON`. Ответы на `GET`-запросы будут иметь на верхнем уровне следующую структуру атрибутов:  |Название поля|Тип|Описание| |--- |--- |--- | |[entity_name]|object, object[], string[], number[], boolean|Динамическое поле, которое будет меняться в зависимости от запрашиваемого ресурса и будет содержать все атрибуты, необходимые для описания этого ресурса. Например, при запросе списка баз данных будет возвращаться поле `dbs`, а при запросе конкретного облачного сервера `server`. Для некоторых конечных точек в ответе может возвращаться сразу несколько ресурсов.| |meta|object|Опционально. Объект, который содержит вспомогательную информацию о ресурсе. Чаще всего будет встречаться при запросе коллекций и содержать поле `total`, которое будет указывать на количество элементов в коллекции.| |response_id|string|Опционально. В большинстве случаев в ответе будет содержаться ID ответа в формате UUIDv4, который однозначно указывает на ваш запрос внутри нашей системы. Если вам потребуется задать вопрос нашей поддержке, приложите к вопросу этот ID— так мы сможем найти ответ на него намного быстрее. Также вы можете использовать этот ID, чтобы убедиться, что это новый ответ на запрос и результат не был получен из кэша.|  Пример запроса на получение списка SSH-ключей: ```     HTTP/2.0 200 OK     {       \"ssh_keys\":[           {             \"body\":\"ssh-rsa AAAAB3NzaC1sdfghjkOAsBwWhs= example@device.local\",             \"created_at\":\"2021-09-15T19:52:27Z\",             \"expired_at\":null,             \"id\":5297,             \"is_default\":false,             \"name\":\"example@device.local\",             \"used_at\":null,             \"used_by\":[]           }       ],       \"meta\":{           \"total\":1       },       \"response_id\":\"94608d15-8672-4eed-8ab6-28bd6fa3cdf7\"     } ```  ### Структура ответа с ошибкой |Название поля|Тип|Описание| |--- |--- |--- | |status_code|number|Короткий числовой идентификатор ошибки.| |error_code|string|Короткий текстовый идентификатор ошибки, который уточняет числовой идентификатор и удобен для программной обработки. Самый простой пример — это код `not_found` для ошибки 404.| |message|string, string[]|Опционально. В большинстве случаев в ответе будет содержаться человекочитаемое подробное описание ошибки или ошибок, которые помогут понять, что нужно исправить.| |response_id|string|Опционально. В большинстве случае в ответе будет содержаться ID ответа в формате UUIDv4, который однозначно указывает на ваш запрос внутри нашей системы. Если вам потребуется задать вопрос нашей поддержке, приложите к вопросу этот ID — так мы сможем найти ответ на него намного быстрее.|  Пример: ```     HTTP/2.0 403 Forbidden     {       \"status_code\": 403,       \"error_code\":  \"forbidden\",       \"message\":     \"You do not have access for the attempted action\",       \"response_id\": \"94608d15-8672-4eed-8ab6-28bd6fa3cdf7\"     } ```  ## Статусы ресурсов Важно учесть, что при создании большинства ресурсов внутри платформы вам будет сразу возвращен ответ от сервера со статусом `200 OK` или `201 Created` и ID созданного ресурса в теле ответа, но при этом этот ресурс может быть ещё в *состоянии запуска*.  Для того чтобы понять, в каком состоянии сейчас находится ваш ресурс, мы добавили поле `status` в ответ на получение информации о ресурсе.  Список статусов будет отличаться в зависимости от типа ресурса. Увидеть поддерживаемый список статусов вы сможете в описании каждого конкретного ресурса.     ## Ограничение скорости запросов (Rate Limiting) Чтобы обеспечить стабильность для всех пользователей, Timeweb Cloud защищает API от всплесков входящего трафика, анализируя количество запросов c каждого аккаунта к каждой конечной точке.  Если ваше приложение отправляет более 20 запросов в секунду на одну конечную точку, то для этого запроса API может вернуть код состояния HTTP `429 Too Many Requests`.   ## Аутентификация Доступ к API осуществляется с помощью JWT-токена. Токенами можно управлять внутри панели управления Timeweb Cloud в разделе *API и Terraform*.  Токен необходимо передавать в заголовке каждого запроса в формате: ```   Authorization: Bearer $TIMEWEB_CLOUD_TOKEN ```  ## Формат примеров API Примеры в этой документации описаны с помощью `curl`, HTTP-клиента командной строки. На компьютерах `Linux` и `macOS` обычно по умолчанию установлен `curl`, и он доступен для загрузки на всех популярных платформах, включая `Windows`.  Каждый пример разделен на несколько строк символом `\\`, который совместим с `bash`. Типичный пример выглядит так: ```   curl -X PATCH      -H \"Content-Type: application/json\"      -H \"Authorization: Bearer $TIMEWEB_CLOUD_TOKEN\"      -d '{\"name\":\"Cute Corvus\",\"comment\":\"Development Server\"}'      \"https://api.timeweb.cloud/api/v1/dedicated/1051\" ``` - Параметр `-X` задает метод запроса. Для согласованности метод будет указан во всех примерах, даже если он явно не требуется для методов `GET`. - Строки `-H` задают требуемые HTTP-заголовки. - Примеры, для которых требуется объект JSON в теле запроса, передают требуемые данные через параметр `-d`.  Чтобы использовать приведенные примеры, не подставляя каждый раз в них свой токен, вы можете добавить токен один раз в переменные окружения в вашей консоли. Например, на `Linux` это можно сделать с помощью команды:  ``` TIMEWEB_CLOUD_TOKEN=\"token\" ```  После этого токен будет автоматически подставляться в ваши запросы.  Обратите внимание, что все значения в этой документации являются примерами. Не полагайтесь на IDы операционных систем, тарифов и т.д., используемые в примерах. Используйте соответствующую конечную точку для получения значений перед созданием ресурсов.   ## Версионирование API построено согласно принципам [семантического версионирования](https://semver.org/lang/ru). Это значит, что мы гарантируем обратную совместимость всех изменений в пределах одной мажорной версии.  Мажорная версия каждой конечной точки обозначается в пути запроса, например, запрос `/api/v1/servers` указывает, что этот метод имеет версию 1.
5 *
6 * The version of the OpenAPI document: 1.0.0
7 * Contact: info@timeweb.cloud
8 * Generated by: https://openapi-generator.tech
9 */
10
11use reqwest;
12use serde::{Deserialize, Serialize, de::Error as _};
13use tokio::fs::File as TokioFile;
14use tokio_util::codec::{BytesCodec, FramedRead};
15
16use super::{ContentType, Error, configuration};
17use crate::{apis::ResponseContent, models};
18
19/// struct for typed errors of method
20/// [`add_additional_token_package_to_knowledgebase`]
21#[derive(Debug, Clone, Serialize, Deserialize)]
22#[serde(untagged)]
23pub enum AddAdditionalTokenPackageToKnowledgebaseError {
24    Status400(models::GetFinances400Response),
25    Status401(models::GetFinances401Response),
26    Status403(models::GetAccountStatus403Response),
27    Status404(models::GetImage404Response),
28    Status429(models::GetFinances429Response),
29    Status500(models::GetFinances500Response),
30    UnknownValue(serde_json::Value)
31}
32
33/// struct for typed errors of method [`create_knowledgebase`]
34#[derive(Debug, Clone, Serialize, Deserialize)]
35#[serde(untagged)]
36pub enum CreateKnowledgebaseError {
37    Status400(models::GetFinances400Response),
38    Status401(models::GetFinances401Response),
39    Status403(models::GetAccountStatus403Response),
40    Status429(models::GetFinances429Response),
41    Status500(models::GetFinances500Response),
42    UnknownValue(serde_json::Value)
43}
44
45/// struct for typed errors of method [`delete_document`]
46#[derive(Debug, Clone, Serialize, Deserialize)]
47#[serde(untagged)]
48pub enum DeleteDocumentError {
49    Status400(models::GetFinances400Response),
50    Status401(models::GetFinances401Response),
51    Status403(models::GetAccountStatus403Response),
52    Status404(models::GetImage404Response),
53    Status429(models::GetFinances429Response),
54    Status500(models::GetFinances500Response),
55    UnknownValue(serde_json::Value)
56}
57
58/// struct for typed errors of method [`delete_knowledgebase`]
59#[derive(Debug, Clone, Serialize, Deserialize)]
60#[serde(untagged)]
61pub enum DeleteKnowledgebaseError {
62    Status400(models::GetFinances400Response),
63    Status401(models::GetFinances401Response),
64    Status403(models::GetAccountStatus403Response),
65    Status404(models::GetImage404Response),
66    Status429(models::GetFinances429Response),
67    Status500(models::GetFinances500Response),
68    UnknownValue(serde_json::Value)
69}
70
71/// struct for typed errors of method [`download_document`]
72#[derive(Debug, Clone, Serialize, Deserialize)]
73#[serde(untagged)]
74pub enum DownloadDocumentError {
75    Status400(models::GetFinances400Response),
76    Status401(models::GetFinances401Response),
77    Status404(models::GetImage404Response),
78    Status429(models::GetFinances429Response),
79    Status500(models::GetFinances500Response),
80    UnknownValue(serde_json::Value)
81}
82
83/// struct for typed errors of method [`get_knowledgebase`]
84#[derive(Debug, Clone, Serialize, Deserialize)]
85#[serde(untagged)]
86pub enum GetKnowledgebaseError {
87    Status400(models::GetFinances400Response),
88    Status401(models::GetFinances401Response),
89    Status403(models::GetAccountStatus403Response),
90    Status404(models::GetImage404Response),
91    Status429(models::GetFinances429Response),
92    Status500(models::GetFinances500Response),
93    UnknownValue(serde_json::Value)
94}
95
96/// struct for typed errors of method [`get_knowledgebase_documents_v2`]
97#[derive(Debug, Clone, Serialize, Deserialize)]
98#[serde(untagged)]
99pub enum GetKnowledgebaseDocumentsV2Error {
100    Status400(models::GetFinances400Response),
101    Status401(models::GetFinances401Response),
102    Status403(models::GetAccountStatus403Response),
103    Status404(models::GetImage404Response),
104    Status429(models::GetFinances429Response),
105    Status500(models::GetFinances500Response),
106    UnknownValue(serde_json::Value)
107}
108
109/// struct for typed errors of method [`get_knowledgebase_statistics`]
110#[derive(Debug, Clone, Serialize, Deserialize)]
111#[serde(untagged)]
112pub enum GetKnowledgebaseStatisticsError {
113    Status400(models::GetFinances400Response),
114    Status401(models::GetFinances401Response),
115    Status403(models::GetAccountStatus403Response),
116    Status404(models::GetImage404Response),
117    Status429(models::GetFinances429Response),
118    Status500(models::GetFinances500Response),
119    UnknownValue(serde_json::Value)
120}
121
122/// struct for typed errors of method [`get_knowledgebases`]
123#[derive(Debug, Clone, Serialize, Deserialize)]
124#[serde(untagged)]
125pub enum GetKnowledgebasesError {
126    Status400(models::GetFinances400Response),
127    Status401(models::GetFinances401Response),
128    Status403(models::GetAccountStatus403Response),
129    Status404(models::GetImage404Response),
130    Status429(models::GetFinances429Response),
131    Status500(models::GetFinances500Response),
132    UnknownValue(serde_json::Value)
133}
134
135/// struct for typed errors of method [`get_knowledgebases_v2`]
136#[derive(Debug, Clone, Serialize, Deserialize)]
137#[serde(untagged)]
138pub enum GetKnowledgebasesV2Error {
139    Status400(models::GetFinances400Response),
140    Status401(models::GetFinances401Response),
141    Status403(models::GetAccountStatus403Response),
142    Status404(models::GetImage404Response),
143    Status429(models::GetFinances429Response),
144    Status500(models::GetFinances500Response),
145    UnknownValue(serde_json::Value)
146}
147
148/// struct for typed errors of method [`link_knowledgebase_to_agent`]
149#[derive(Debug, Clone, Serialize, Deserialize)]
150#[serde(untagged)]
151pub enum LinkKnowledgebaseToAgentError {
152    Status400(models::GetFinances400Response),
153    Status401(models::GetFinances401Response),
154    Status403(models::GetAccountStatus403Response),
155    Status404(models::GetImage404Response),
156    Status429(models::GetFinances429Response),
157    Status500(models::GetFinances500Response),
158    UnknownValue(serde_json::Value)
159}
160
161/// struct for typed errors of method [`reindex_document`]
162#[derive(Debug, Clone, Serialize, Deserialize)]
163#[serde(untagged)]
164pub enum ReindexDocumentError {
165    Status400(models::GetFinances400Response),
166    Status401(models::GetFinances401Response),
167    Status403(models::GetAccountStatus403Response),
168    Status404(models::GetImage404Response),
169    Status429(models::GetFinances429Response),
170    Status500(models::GetFinances500Response),
171    UnknownValue(serde_json::Value)
172}
173
174/// struct for typed errors of method [`unlink_knowledgebase_from_agent`]
175#[derive(Debug, Clone, Serialize, Deserialize)]
176#[serde(untagged)]
177pub enum UnlinkKnowledgebaseFromAgentError {
178    Status400(models::GetFinances400Response),
179    Status401(models::GetFinances401Response),
180    Status403(models::GetAccountStatus403Response),
181    Status404(models::GetImage404Response),
182    Status429(models::GetFinances429Response),
183    Status500(models::GetFinances500Response),
184    UnknownValue(serde_json::Value)
185}
186
187/// struct for typed errors of method [`update_knowledgebase`]
188#[derive(Debug, Clone, Serialize, Deserialize)]
189#[serde(untagged)]
190pub enum UpdateKnowledgebaseError {
191    Status400(models::GetFinances400Response),
192    Status401(models::GetFinances401Response),
193    Status403(models::GetAccountStatus403Response),
194    Status404(models::GetImage404Response),
195    Status429(models::GetFinances429Response),
196    Status500(models::GetFinances500Response),
197    UnknownValue(serde_json::Value)
198}
199
200/// struct for typed errors of method [`upload_files_to_knowledgebase`]
201#[derive(Debug, Clone, Serialize, Deserialize)]
202#[serde(untagged)]
203pub enum UploadFilesToKnowledgebaseError {
204    Status400(models::GetFinances400Response),
205    Status401(models::GetFinances401Response),
206    Status403(models::GetAccountStatus403Response),
207    Status404(models::GetImage404Response),
208    Status429(models::GetFinances429Response),
209    Status500(models::GetFinances500Response),
210    UnknownValue(serde_json::Value)
211}
212
213/// Чтобы добавить дополнительный пакет токенов для базы знаний, отправьте
214/// POST-запрос на
215/// `/api/v1/cloud-ai/knowledge-bases/{id}/add-additional-token-package`.
216pub async fn add_additional_token_package_to_knowledgebase(
217    configuration: &configuration::Configuration,
218    id: i32,
219    add_token_package: Option<models::AddTokenPackage>
220) -> Result<(), Error<AddAdditionalTokenPackageToKnowledgebaseError>> {
221    // add a prefix to parameters to efficiently prevent name collisions
222    let p_path_id = id;
223    let p_body_add_token_package = add_token_package;
224
225    let uri_str = format!(
226        "{}/api/v1/cloud-ai/knowledge-bases/{id}/add-additional-token-package",
227        configuration.base_path,
228        id = p_path_id
229    );
230    let mut req_builder = configuration
231        .client
232        .request(reqwest::Method::POST, &uri_str);
233
234    if let Some(ref user_agent) = configuration.user_agent {
235        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
236    }
237    if let Some(ref token) = configuration.bearer_access_token {
238        req_builder = req_builder.bearer_auth(token.to_owned());
239    };
240    req_builder = req_builder.json(&p_body_add_token_package);
241
242    let req = req_builder.build()?;
243    let resp = configuration.client.execute(req).await?;
244
245    let status = resp.status();
246
247    if !status.is_client_error() && !status.is_server_error() {
248        Ok(())
249    } else {
250        let content = resp.text().await?;
251        let entity: Option<AddAdditionalTokenPackageToKnowledgebaseError> =
252            serde_json::from_str(&content).ok();
253        Err(Error::ResponseError(ResponseContent {
254            status,
255            content,
256            entity
257        }))
258    }
259}
260
261/// Чтобы создать базу знаний, отправьте POST-запрос на
262/// `/api/v1/cloud-ai/knowledge-bases`, задав необходимые атрибуты.  База знаний
263/// будет создана с использованием предоставленной информации. Тело ответа будет
264/// содержать объект JSON с информацией о созданной базе знаний.
265pub async fn create_knowledgebase(
266    configuration: &configuration::Configuration,
267    create_knowledgebase: models::CreateKnowledgebase
268) -> Result<models::CreateKnowledgebase201Response, Error<CreateKnowledgebaseError>> {
269    // add a prefix to parameters to efficiently prevent name collisions
270    let p_body_create_knowledgebase = create_knowledgebase;
271
272    let uri_str = format!(
273        "{}/api/v1/cloud-ai/knowledge-bases",
274        configuration.base_path
275    );
276    let mut req_builder = configuration
277        .client
278        .request(reqwest::Method::POST, &uri_str);
279
280    if let Some(ref user_agent) = configuration.user_agent {
281        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
282    }
283    if let Some(ref token) = configuration.bearer_access_token {
284        req_builder = req_builder.bearer_auth(token.to_owned());
285    };
286    req_builder = req_builder.json(&p_body_create_knowledgebase);
287
288    let req = req_builder.build()?;
289    let resp = configuration.client.execute(req).await?;
290
291    let status = resp.status();
292    let content_type = resp
293        .headers()
294        .get("content-type")
295        .and_then(|v| v.to_str().ok())
296        .unwrap_or("application/octet-stream");
297    let content_type = super::ContentType::from(content_type);
298
299    if !status.is_client_error() && !status.is_server_error() {
300        let content = resp.text().await?;
301        match content_type {
302            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
303            ContentType::Text => {
304                return Err(Error::from(serde_json::Error::custom(
305                    "Received `text/plain` content type response that cannot be converted to `models::CreateKnowledgebase201Response`"
306                )));
307            }
308            ContentType::Unsupported(unknown_type) => {
309                return Err(Error::from(serde_json::Error::custom(format!(
310                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateKnowledgebase201Response`"
311                ))));
312            }
313        }
314    } else {
315        let content = resp.text().await?;
316        let entity: Option<CreateKnowledgebaseError> = serde_json::from_str(&content).ok();
317        Err(Error::ResponseError(ResponseContent {
318            status,
319            content,
320            entity
321        }))
322    }
323}
324
325/// Чтобы удалить документ из базы знаний, отправьте DELETE-запрос на
326/// `/api/v1/cloud-ai/knowledge-bases/{id}/documents/{document_id}`.
327pub async fn delete_document(
328    configuration: &configuration::Configuration,
329    id: i32,
330    document_id: i32
331) -> Result<(), Error<DeleteDocumentError>> {
332    // add a prefix to parameters to efficiently prevent name collisions
333    let p_path_id = id;
334    let p_path_document_id = document_id;
335
336    let uri_str = format!(
337        "{}/api/v1/cloud-ai/knowledge-bases/{id}/documents/{document_id}",
338        configuration.base_path,
339        id = p_path_id,
340        document_id = p_path_document_id
341    );
342    let mut req_builder = configuration
343        .client
344        .request(reqwest::Method::DELETE, &uri_str);
345
346    if let Some(ref user_agent) = configuration.user_agent {
347        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
348    }
349    if let Some(ref token) = configuration.bearer_access_token {
350        req_builder = req_builder.bearer_auth(token.to_owned());
351    };
352
353    let req = req_builder.build()?;
354    let resp = configuration.client.execute(req).await?;
355
356    let status = resp.status();
357
358    if !status.is_client_error() && !status.is_server_error() {
359        Ok(())
360    } else {
361        let content = resp.text().await?;
362        let entity: Option<DeleteDocumentError> = serde_json::from_str(&content).ok();
363        Err(Error::ResponseError(ResponseContent {
364            status,
365            content,
366            entity
367        }))
368    }
369}
370
371/// Чтобы удалить базу знаний, отправьте DELETE-запрос на
372/// `/api/v1/cloud-ai/knowledge-bases/{id}`.
373pub async fn delete_knowledgebase(
374    configuration: &configuration::Configuration,
375    id: i32
376) -> Result<(), Error<DeleteKnowledgebaseError>> {
377    // add a prefix to parameters to efficiently prevent name collisions
378    let p_path_id = id;
379
380    let uri_str = format!(
381        "{}/api/v1/cloud-ai/knowledge-bases/{id}",
382        configuration.base_path,
383        id = p_path_id
384    );
385    let mut req_builder = configuration
386        .client
387        .request(reqwest::Method::DELETE, &uri_str);
388
389    if let Some(ref user_agent) = configuration.user_agent {
390        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
391    }
392    if let Some(ref token) = configuration.bearer_access_token {
393        req_builder = req_builder.bearer_auth(token.to_owned());
394    };
395
396    let req = req_builder.build()?;
397    let resp = configuration.client.execute(req).await?;
398
399    let status = resp.status();
400
401    if !status.is_client_error() && !status.is_server_error() {
402        Ok(())
403    } else {
404        let content = resp.text().await?;
405        let entity: Option<DeleteKnowledgebaseError> = serde_json::from_str(&content).ok();
406        Err(Error::ResponseError(ResponseContent {
407            status,
408            content,
409            entity
410        }))
411    }
412}
413
414/// Чтобы скачать документ из базы знаний, отправьте GET-запрос на
415/// `/api/v1/cloud-ai/knowledge-bases/{id}/documents/{document_id}/download`.
416pub async fn download_document(
417    configuration: &configuration::Configuration,
418    id: i32,
419    document_id: i32
420) -> Result<reqwest::Response, Error<DownloadDocumentError>> {
421    // add a prefix to parameters to efficiently prevent name collisions
422    let p_path_id = id;
423    let p_path_document_id = document_id;
424
425    let uri_str = format!(
426        "{}/api/v1/cloud-ai/knowledge-bases/{id}/documents/{document_id}/download",
427        configuration.base_path,
428        id = p_path_id,
429        document_id = p_path_document_id
430    );
431    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
432
433    if let Some(ref user_agent) = configuration.user_agent {
434        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
435    }
436    if let Some(ref token) = configuration.bearer_access_token {
437        req_builder = req_builder.bearer_auth(token.to_owned());
438    };
439
440    let req = req_builder.build()?;
441    let resp = configuration.client.execute(req).await?;
442
443    let status = resp.status();
444
445    if !status.is_client_error() && !status.is_server_error() {
446        Ok(resp)
447    } else {
448        let content = resp.text().await?;
449        let entity: Option<DownloadDocumentError> = serde_json::from_str(&content).ok();
450        Err(Error::ResponseError(ResponseContent {
451            status,
452            content,
453            entity
454        }))
455    }
456}
457
458/// Чтобы получить информацию о базе знаний, отправьте GET-запрос на
459/// `/api/v1/cloud-ai/knowledge-bases/{id}`.
460pub async fn get_knowledgebase(
461    configuration: &configuration::Configuration,
462    id: i32
463) -> Result<models::CreateKnowledgebase201Response, Error<GetKnowledgebaseError>> {
464    // add a prefix to parameters to efficiently prevent name collisions
465    let p_path_id = id;
466
467    let uri_str = format!(
468        "{}/api/v1/cloud-ai/knowledge-bases/{id}",
469        configuration.base_path,
470        id = p_path_id
471    );
472    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
473
474    if let Some(ref user_agent) = configuration.user_agent {
475        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
476    }
477    if let Some(ref token) = configuration.bearer_access_token {
478        req_builder = req_builder.bearer_auth(token.to_owned());
479    };
480
481    let req = req_builder.build()?;
482    let resp = configuration.client.execute(req).await?;
483
484    let status = resp.status();
485    let content_type = resp
486        .headers()
487        .get("content-type")
488        .and_then(|v| v.to_str().ok())
489        .unwrap_or("application/octet-stream");
490    let content_type = super::ContentType::from(content_type);
491
492    if !status.is_client_error() && !status.is_server_error() {
493        let content = resp.text().await?;
494        match content_type {
495            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
496            ContentType::Text => {
497                return Err(Error::from(serde_json::Error::custom(
498                    "Received `text/plain` content type response that cannot be converted to `models::CreateKnowledgebase201Response`"
499                )));
500            }
501            ContentType::Unsupported(unknown_type) => {
502                return Err(Error::from(serde_json::Error::custom(format!(
503                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateKnowledgebase201Response`"
504                ))));
505            }
506        }
507    } else {
508        let content = resp.text().await?;
509        let entity: Option<GetKnowledgebaseError> = serde_json::from_str(&content).ok();
510        Err(Error::ResponseError(ResponseContent {
511            status,
512            content,
513            entity
514        }))
515    }
516}
517
518/// Чтобы получить список документов базы знаний, отправьте GET-запрос на
519/// `/api/v2/cloud-ai/knowledge-bases/{id}/documents`.  Тело ответа будет
520/// представлять собой объект JSON с ключами `knowledgebase_documents` и `meta`.
521pub async fn get_knowledgebase_documents_v2(
522    configuration: &configuration::Configuration,
523    id: i32,
524    limit: Option<i32>,
525    offset: Option<i32>,
526    sort_by: Option<&str>,
527    sort_order: Option<&str>
528) -> Result<models::GetKnowledgebaseDocumentsV2200Response, Error<GetKnowledgebaseDocumentsV2Error>>
529{
530    // add a prefix to parameters to efficiently prevent name collisions
531    let p_path_id = id;
532    let p_query_limit = limit;
533    let p_query_offset = offset;
534    let p_query_sort_by = sort_by;
535    let p_query_sort_order = sort_order;
536
537    let uri_str = format!(
538        "{}/api/v2/cloud-ai/knowledge-bases/{id}/documents",
539        configuration.base_path,
540        id = p_path_id
541    );
542    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
543
544    if let Some(ref param_value) = p_query_limit {
545        req_builder = req_builder.query(&[("limit", &param_value.to_string())]);
546    }
547    if let Some(ref param_value) = p_query_offset {
548        req_builder = req_builder.query(&[("offset", &param_value.to_string())]);
549    }
550    if let Some(ref param_value) = p_query_sort_by {
551        req_builder = req_builder.query(&[("sort_by", &param_value.to_string())]);
552    }
553    if let Some(ref param_value) = p_query_sort_order {
554        req_builder = req_builder.query(&[("sort_order", &param_value.to_string())]);
555    }
556    if let Some(ref user_agent) = configuration.user_agent {
557        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
558    }
559    if let Some(ref token) = configuration.bearer_access_token {
560        req_builder = req_builder.bearer_auth(token.to_owned());
561    };
562
563    let req = req_builder.build()?;
564    let resp = configuration.client.execute(req).await?;
565
566    let status = resp.status();
567    let content_type = resp
568        .headers()
569        .get("content-type")
570        .and_then(|v| v.to_str().ok())
571        .unwrap_or("application/octet-stream");
572    let content_type = super::ContentType::from(content_type);
573
574    if !status.is_client_error() && !status.is_server_error() {
575        let content = resp.text().await?;
576        match content_type {
577            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
578            ContentType::Text => {
579                return Err(Error::from(serde_json::Error::custom(
580                    "Received `text/plain` content type response that cannot be converted to `models::GetKnowledgebaseDocumentsV2200Response`"
581                )));
582            }
583            ContentType::Unsupported(unknown_type) => {
584                return Err(Error::from(serde_json::Error::custom(format!(
585                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetKnowledgebaseDocumentsV2200Response`"
586                ))));
587            }
588        }
589    } else {
590        let content = resp.text().await?;
591        let entity: Option<GetKnowledgebaseDocumentsV2Error> = serde_json::from_str(&content).ok();
592        Err(Error::ResponseError(ResponseContent {
593            status,
594            content,
595            entity
596        }))
597    }
598}
599
600/// Чтобы получить статистику использования токенов базы знаний, отправьте
601/// GET-запрос на `/api/v1/cloud-ai/knowledge-bases/{id}/statistic`.  Можно
602/// указать временной диапазон и интервал агрегации.
603pub async fn get_knowledgebase_statistics(
604    configuration: &configuration::Configuration,
605    id: i32,
606    start_time: Option<chrono::DateTime<chrono::FixedOffset>>,
607    end_time: Option<chrono::DateTime<chrono::FixedOffset>>,
608    interval: Option<f64>
609) -> Result<models::GetKnowledgebaseStatistics200Response, Error<GetKnowledgebaseStatisticsError>>
610{
611    // add a prefix to parameters to efficiently prevent name collisions
612    let p_path_id = id;
613    let p_query_start_time = start_time;
614    let p_query_end_time = end_time;
615    let p_query_interval = interval;
616
617    let uri_str = format!(
618        "{}/api/v1/cloud-ai/knowledge-bases/{id}/statistic",
619        configuration.base_path,
620        id = p_path_id
621    );
622    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
623
624    if let Some(ref param_value) = p_query_start_time {
625        req_builder = req_builder.query(&[("startTime", &param_value.to_string())]);
626    }
627    if let Some(ref param_value) = p_query_end_time {
628        req_builder = req_builder.query(&[("endTime", &param_value.to_string())]);
629    }
630    if let Some(ref param_value) = p_query_interval {
631        req_builder = req_builder.query(&[("interval", &param_value.to_string())]);
632    }
633    if let Some(ref user_agent) = configuration.user_agent {
634        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
635    }
636    if let Some(ref token) = configuration.bearer_access_token {
637        req_builder = req_builder.bearer_auth(token.to_owned());
638    };
639
640    let req = req_builder.build()?;
641    let resp = configuration.client.execute(req).await?;
642
643    let status = resp.status();
644    let content_type = resp
645        .headers()
646        .get("content-type")
647        .and_then(|v| v.to_str().ok())
648        .unwrap_or("application/octet-stream");
649    let content_type = super::ContentType::from(content_type);
650
651    if !status.is_client_error() && !status.is_server_error() {
652        let content = resp.text().await?;
653        match content_type {
654            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
655            ContentType::Text => {
656                return Err(Error::from(serde_json::Error::custom(
657                    "Received `text/plain` content type response that cannot be converted to `models::GetKnowledgebaseStatistics200Response`"
658                )));
659            }
660            ContentType::Unsupported(unknown_type) => {
661                return Err(Error::from(serde_json::Error::custom(format!(
662                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetKnowledgebaseStatistics200Response`"
663                ))));
664            }
665        }
666    } else {
667        let content = resp.text().await?;
668        let entity: Option<GetKnowledgebaseStatisticsError> = serde_json::from_str(&content).ok();
669        Err(Error::ResponseError(ResponseContent {
670            status,
671            content,
672            entity
673        }))
674    }
675}
676
677/// Чтобы получить список баз знаний, отправьте GET-запрос на
678/// `/api/v1/cloud-ai/knowledge-bases`.  Тело ответа будет представлять собой
679/// объект JSON с ключом `knowledgebases`.
680#[deprecated]
681pub async fn get_knowledgebases(
682    configuration: &configuration::Configuration
683) -> Result<models::GetKnowledgebases200Response, Error<GetKnowledgebasesError>> {
684    let uri_str = format!(
685        "{}/api/v1/cloud-ai/knowledge-bases",
686        configuration.base_path
687    );
688    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
689
690    if let Some(ref user_agent) = configuration.user_agent {
691        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
692    }
693    if let Some(ref token) = configuration.bearer_access_token {
694        req_builder = req_builder.bearer_auth(token.to_owned());
695    };
696
697    let req = req_builder.build()?;
698    let resp = configuration.client.execute(req).await?;
699
700    let status = resp.status();
701    let content_type = resp
702        .headers()
703        .get("content-type")
704        .and_then(|v| v.to_str().ok())
705        .unwrap_or("application/octet-stream");
706    let content_type = super::ContentType::from(content_type);
707
708    if !status.is_client_error() && !status.is_server_error() {
709        let content = resp.text().await?;
710        match content_type {
711            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
712            ContentType::Text => {
713                return Err(Error::from(serde_json::Error::custom(
714                    "Received `text/plain` content type response that cannot be converted to `models::GetKnowledgebases200Response`"
715                )));
716            }
717            ContentType::Unsupported(unknown_type) => {
718                return Err(Error::from(serde_json::Error::custom(format!(
719                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetKnowledgebases200Response`"
720                ))));
721            }
722        }
723    } else {
724        let content = resp.text().await?;
725        let entity: Option<GetKnowledgebasesError> = serde_json::from_str(&content).ok();
726        Err(Error::ResponseError(ResponseContent {
727            status,
728            content,
729            entity
730        }))
731    }
732}
733
734/// Чтобы получить список баз знаний, отправьте GET-запрос на
735/// `/api/v2/cloud-ai/knowledge-bases`.  Версия API v2 возвращает
736/// оптимизированный ответ с количеством документов вместо полного списка
737/// документов.  Тело ответа будет представлять собой объект JSON с ключом
738/// `knowledgebases`.
739pub async fn get_knowledgebases_v2(
740    configuration: &configuration::Configuration
741) -> Result<models::GetKnowledgebasesV2200Response, Error<GetKnowledgebasesV2Error>> {
742    let uri_str = format!(
743        "{}/api/v2/cloud-ai/knowledge-bases",
744        configuration.base_path
745    );
746    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
747
748    if let Some(ref user_agent) = configuration.user_agent {
749        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
750    }
751    if let Some(ref token) = configuration.bearer_access_token {
752        req_builder = req_builder.bearer_auth(token.to_owned());
753    };
754
755    let req = req_builder.build()?;
756    let resp = configuration.client.execute(req).await?;
757
758    let status = resp.status();
759    let content_type = resp
760        .headers()
761        .get("content-type")
762        .and_then(|v| v.to_str().ok())
763        .unwrap_or("application/octet-stream");
764    let content_type = super::ContentType::from(content_type);
765
766    if !status.is_client_error() && !status.is_server_error() {
767        let content = resp.text().await?;
768        match content_type {
769            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
770            ContentType::Text => {
771                return Err(Error::from(serde_json::Error::custom(
772                    "Received `text/plain` content type response that cannot be converted to `models::GetKnowledgebasesV2200Response`"
773                )));
774            }
775            ContentType::Unsupported(unknown_type) => {
776                return Err(Error::from(serde_json::Error::custom(format!(
777                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetKnowledgebasesV2200Response`"
778                ))));
779            }
780        }
781    } else {
782        let content = resp.text().await?;
783        let entity: Option<GetKnowledgebasesV2Error> = serde_json::from_str(&content).ok();
784        Err(Error::ResponseError(ResponseContent {
785            status,
786            content,
787            entity
788        }))
789    }
790}
791
792/// Чтобы привязать базу знаний к AI агенту, отправьте POST-запрос на
793/// `/api/v1/cloud-ai/knowledge-bases/{id}/link/{agent_id}`.
794pub async fn link_knowledgebase_to_agent(
795    configuration: &configuration::Configuration,
796    id: i32,
797    agent_id: i32
798) -> Result<(), Error<LinkKnowledgebaseToAgentError>> {
799    // add a prefix to parameters to efficiently prevent name collisions
800    let p_path_id = id;
801    let p_path_agent_id = agent_id;
802
803    let uri_str = format!(
804        "{}/api/v1/cloud-ai/knowledge-bases/{id}/link/{agent_id}",
805        configuration.base_path,
806        id = p_path_id,
807        agent_id = p_path_agent_id
808    );
809    let mut req_builder = configuration
810        .client
811        .request(reqwest::Method::POST, &uri_str);
812
813    if let Some(ref user_agent) = configuration.user_agent {
814        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
815    }
816    if let Some(ref token) = configuration.bearer_access_token {
817        req_builder = req_builder.bearer_auth(token.to_owned());
818    };
819
820    let req = req_builder.build()?;
821    let resp = configuration.client.execute(req).await?;
822
823    let status = resp.status();
824
825    if !status.is_client_error() && !status.is_server_error() {
826        Ok(())
827    } else {
828        let content = resp.text().await?;
829        let entity: Option<LinkKnowledgebaseToAgentError> = serde_json::from_str(&content).ok();
830        Err(Error::ResponseError(ResponseContent {
831            status,
832            content,
833            entity
834        }))
835    }
836}
837
838/// Чтобы переиндексировать документ в базе знаний, отправьте POST-запрос на
839/// `/api/v1/cloud-ai/knowledge-bases/{id}/documents/{document_id}/reindex`.
840pub async fn reindex_document(
841    configuration: &configuration::Configuration,
842    id: i32,
843    document_id: i32
844) -> Result<(), Error<ReindexDocumentError>> {
845    // add a prefix to parameters to efficiently prevent name collisions
846    let p_path_id = id;
847    let p_path_document_id = document_id;
848
849    let uri_str = format!(
850        "{}/api/v1/cloud-ai/knowledge-bases/{id}/documents/{document_id}/reindex",
851        configuration.base_path,
852        id = p_path_id,
853        document_id = p_path_document_id
854    );
855    let mut req_builder = configuration
856        .client
857        .request(reqwest::Method::POST, &uri_str);
858
859    if let Some(ref user_agent) = configuration.user_agent {
860        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
861    }
862    if let Some(ref token) = configuration.bearer_access_token {
863        req_builder = req_builder.bearer_auth(token.to_owned());
864    };
865
866    let req = req_builder.build()?;
867    let resp = configuration.client.execute(req).await?;
868
869    let status = resp.status();
870
871    if !status.is_client_error() && !status.is_server_error() {
872        Ok(())
873    } else {
874        let content = resp.text().await?;
875        let entity: Option<ReindexDocumentError> = serde_json::from_str(&content).ok();
876        Err(Error::ResponseError(ResponseContent {
877            status,
878            content,
879            entity
880        }))
881    }
882}
883
884/// Чтобы отвязать базу знаний от AI агента, отправьте DELETE-запрос на
885/// `/api/v1/cloud-ai/knowledge-bases/{id}/link/{agent_id}`.
886pub async fn unlink_knowledgebase_from_agent(
887    configuration: &configuration::Configuration,
888    id: i32,
889    agent_id: i32
890) -> Result<(), Error<UnlinkKnowledgebaseFromAgentError>> {
891    // add a prefix to parameters to efficiently prevent name collisions
892    let p_path_id = id;
893    let p_path_agent_id = agent_id;
894
895    let uri_str = format!(
896        "{}/api/v1/cloud-ai/knowledge-bases/{id}/link/{agent_id}",
897        configuration.base_path,
898        id = p_path_id,
899        agent_id = p_path_agent_id
900    );
901    let mut req_builder = configuration
902        .client
903        .request(reqwest::Method::DELETE, &uri_str);
904
905    if let Some(ref user_agent) = configuration.user_agent {
906        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
907    }
908    if let Some(ref token) = configuration.bearer_access_token {
909        req_builder = req_builder.bearer_auth(token.to_owned());
910    };
911
912    let req = req_builder.build()?;
913    let resp = configuration.client.execute(req).await?;
914
915    let status = resp.status();
916
917    if !status.is_client_error() && !status.is_server_error() {
918        Ok(())
919    } else {
920        let content = resp.text().await?;
921        let entity: Option<UnlinkKnowledgebaseFromAgentError> =
922            serde_json::from_str(&content).ok();
923        Err(Error::ResponseError(ResponseContent {
924            status,
925            content,
926            entity
927        }))
928    }
929}
930
931/// Чтобы обновить базу знаний, отправьте PATCH-запрос на
932/// `/api/v1/cloud-ai/knowledge-bases/{id}`.
933pub async fn update_knowledgebase(
934    configuration: &configuration::Configuration,
935    id: i32,
936    update_knowledgebase: models::UpdateKnowledgebase
937) -> Result<models::CreateKnowledgebase201Response, Error<UpdateKnowledgebaseError>> {
938    // add a prefix to parameters to efficiently prevent name collisions
939    let p_path_id = id;
940    let p_body_update_knowledgebase = update_knowledgebase;
941
942    let uri_str = format!(
943        "{}/api/v1/cloud-ai/knowledge-bases/{id}",
944        configuration.base_path,
945        id = p_path_id
946    );
947    let mut req_builder = configuration
948        .client
949        .request(reqwest::Method::PATCH, &uri_str);
950
951    if let Some(ref user_agent) = configuration.user_agent {
952        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
953    }
954    if let Some(ref token) = configuration.bearer_access_token {
955        req_builder = req_builder.bearer_auth(token.to_owned());
956    };
957    req_builder = req_builder.json(&p_body_update_knowledgebase);
958
959    let req = req_builder.build()?;
960    let resp = configuration.client.execute(req).await?;
961
962    let status = resp.status();
963    let content_type = resp
964        .headers()
965        .get("content-type")
966        .and_then(|v| v.to_str().ok())
967        .unwrap_or("application/octet-stream");
968    let content_type = super::ContentType::from(content_type);
969
970    if !status.is_client_error() && !status.is_server_error() {
971        let content = resp.text().await?;
972        match content_type {
973            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
974            ContentType::Text => {
975                return Err(Error::from(serde_json::Error::custom(
976                    "Received `text/plain` content type response that cannot be converted to `models::CreateKnowledgebase201Response`"
977                )));
978            }
979            ContentType::Unsupported(unknown_type) => {
980                return Err(Error::from(serde_json::Error::custom(format!(
981                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateKnowledgebase201Response`"
982                ))));
983            }
984        }
985    } else {
986        let content = resp.text().await?;
987        let entity: Option<UpdateKnowledgebaseError> = serde_json::from_str(&content).ok();
988        Err(Error::ResponseError(ResponseContent {
989            status,
990            content,
991            entity
992        }))
993    }
994}
995
996/// Чтобы загрузить файлы в базу знаний, отправьте POST-запрос на
997/// `/api/v1/cloud-ai/knowledge-bases/{id}/upload` с файлами в формате
998/// multipart/form-data.  Поддерживаемые форматы: CSV, XML, Markdown (md), HTML,
999/// TXT. JSON не поддерживается. Максимум 10 файлов, до 10 МБ каждый.
1000pub async fn upload_files_to_knowledgebase(
1001    configuration: &configuration::Configuration,
1002    id: i32,
1003    files: Vec<std::path::PathBuf>
1004) -> Result<models::UploadFilesToKnowledgebase200Response, Error<UploadFilesToKnowledgebaseError>>
1005{
1006    // add a prefix to parameters to efficiently prevent name collisions
1007    let p_path_id = id;
1008    let p_form_files = files;
1009
1010    let uri_str = format!(
1011        "{}/api/v1/cloud-ai/knowledge-bases/{id}/upload",
1012        configuration.base_path,
1013        id = p_path_id
1014    );
1015    let mut req_builder = configuration
1016        .client
1017        .request(reqwest::Method::POST, &uri_str);
1018
1019    if let Some(ref user_agent) = configuration.user_agent {
1020        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
1021    }
1022    if let Some(ref token) = configuration.bearer_access_token {
1023        req_builder = req_builder.bearer_auth(token.to_owned());
1024    };
1025    let mut multipart_form = reqwest::multipart::Form::new();
1026    for value in &p_form_files {
1027        let file = TokioFile::open(value).await?;
1028        let stream = FramedRead::new(file, BytesCodec::new());
1029        let file_name = value
1030            .file_name()
1031            .map(|n| n.to_string_lossy().to_string())
1032            .unwrap_or_default();
1033        let file_part = reqwest::multipart::Part::stream(reqwest::Body::wrap_stream(stream))
1034            .file_name(file_name);
1035        multipart_form = multipart_form.part("files", file_part);
1036    }
1037    req_builder = req_builder.multipart(multipart_form);
1038
1039    let req = req_builder.build()?;
1040    let resp = configuration.client.execute(req).await?;
1041
1042    let status = resp.status();
1043    let content_type = resp
1044        .headers()
1045        .get("content-type")
1046        .and_then(|v| v.to_str().ok())
1047        .unwrap_or("application/octet-stream");
1048    let content_type = super::ContentType::from(content_type);
1049
1050    if !status.is_client_error() && !status.is_server_error() {
1051        let content = resp.text().await?;
1052        match content_type {
1053            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
1054            ContentType::Text => {
1055                return Err(Error::from(serde_json::Error::custom(
1056                    "Received `text/plain` content type response that cannot be converted to `models::UploadFilesToKnowledgebase200Response`"
1057                )));
1058            }
1059            ContentType::Unsupported(unknown_type) => {
1060                return Err(Error::from(serde_json::Error::custom(format!(
1061                    "Received `{unknown_type}` content type response that cannot be converted to `models::UploadFilesToKnowledgebase200Response`"
1062                ))));
1063            }
1064        }
1065    } else {
1066        let content = resp.text().await?;
1067        let entity: Option<UploadFilesToKnowledgebaseError> = serde_json::from_str(&content).ok();
1068        Err(Error::ResponseError(ResponseContent {
1069            status,
1070            content,
1071            entity
1072        }))
1073    }
1074}