Skip to main content

timeweb_rs/apis/
ai_agents_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 _};
13
14use super::{ContentType, Error, configuration};
15use crate::{apis::ResponseContent, models};
16
17/// struct for typed errors of method [`add_additional_token_package`]
18#[derive(Debug, Clone, Serialize, Deserialize)]
19#[serde(untagged)]
20pub enum AddAdditionalTokenPackageError {
21    Status400(models::GetFinances400Response),
22    Status401(models::GetFinances401Response),
23    Status403(models::GetAccountStatus403Response),
24    Status404(models::GetImage404Response),
25    Status429(models::GetFinances429Response),
26    Status500(models::GetFinances500Response),
27    UnknownValue(serde_json::Value)
28}
29
30/// struct for typed errors of method [`create_agent`]
31#[derive(Debug, Clone, Serialize, Deserialize)]
32#[serde(untagged)]
33pub enum CreateAgentError {
34    Status400(models::GetFinances400Response),
35    Status401(models::GetFinances401Response),
36    Status403(models::GetAccountStatus403Response),
37    Status429(models::GetFinances429Response),
38    Status500(models::GetFinances500Response),
39    UnknownValue(serde_json::Value)
40}
41
42/// struct for typed errors of method [`delete_agent`]
43#[derive(Debug, Clone, Serialize, Deserialize)]
44#[serde(untagged)]
45pub enum DeleteAgentError {
46    Status400(models::GetFinances400Response),
47    Status401(models::GetFinances401Response),
48    Status403(models::GetAccountStatus403Response),
49    Status404(models::GetImage404Response),
50    Status429(models::GetFinances429Response),
51    Status500(models::GetFinances500Response),
52    UnknownValue(serde_json::Value)
53}
54
55/// struct for typed errors of method [`get_agent`]
56#[derive(Debug, Clone, Serialize, Deserialize)]
57#[serde(untagged)]
58pub enum GetAgentError {
59    Status400(models::GetFinances400Response),
60    Status401(models::GetFinances401Response),
61    Status403(models::GetAccountStatus403Response),
62    Status404(models::GetImage404Response),
63    Status429(models::GetFinances429Response),
64    Status500(models::GetFinances500Response),
65    UnknownValue(serde_json::Value)
66}
67
68/// struct for typed errors of method [`get_agent_statistics`]
69#[derive(Debug, Clone, Serialize, Deserialize)]
70#[serde(untagged)]
71pub enum GetAgentStatisticsError {
72    Status400(models::GetFinances400Response),
73    Status401(models::GetFinances401Response),
74    Status403(models::GetAccountStatus403Response),
75    Status404(models::GetImage404Response),
76    Status429(models::GetFinances429Response),
77    Status500(models::GetFinances500Response),
78    UnknownValue(serde_json::Value)
79}
80
81/// struct for typed errors of method [`get_agents`]
82#[derive(Debug, Clone, Serialize, Deserialize)]
83#[serde(untagged)]
84pub enum GetAgentsError {
85    Status400(models::GetFinances400Response),
86    Status401(models::GetFinances401Response),
87    Status403(models::GetAccountStatus403Response),
88    Status404(models::GetImage404Response),
89    Status429(models::GetFinances429Response),
90    Status500(models::GetFinances500Response),
91    UnknownValue(serde_json::Value)
92}
93
94/// struct for typed errors of method [`get_agents_token_packages`]
95#[derive(Debug, Clone, Serialize, Deserialize)]
96#[serde(untagged)]
97pub enum GetAgentsTokenPackagesError {
98    Status400(models::GetFinances400Response),
99    Status401(models::GetFinances401Response),
100    Status403(models::GetAccountStatus403Response),
101    Status404(models::GetImage404Response),
102    Status429(models::GetFinances429Response),
103    Status500(models::GetFinances500Response),
104    UnknownValue(serde_json::Value)
105}
106
107/// struct for typed errors of method [`get_knowledgebases_token_packages`]
108#[derive(Debug, Clone, Serialize, Deserialize)]
109#[serde(untagged)]
110pub enum GetKnowledgebasesTokenPackagesError {
111    Status400(models::GetFinances400Response),
112    Status401(models::GetFinances401Response),
113    Status403(models::GetAccountStatus403Response),
114    Status404(models::GetImage404Response),
115    Status429(models::GetFinances429Response),
116    Status500(models::GetFinances500Response),
117    UnknownValue(serde_json::Value)
118}
119
120/// struct for typed errors of method [`get_models`]
121#[derive(Debug, Clone, Serialize, Deserialize)]
122#[serde(untagged)]
123pub enum GetModelsError {
124    Status400(models::GetFinances400Response),
125    Status401(models::GetFinances401Response),
126    Status403(models::GetAccountStatus403Response),
127    Status404(models::GetImage404Response),
128    Status429(models::GetFinances429Response),
129    Status500(models::GetFinances500Response),
130    UnknownValue(serde_json::Value)
131}
132
133/// struct for typed errors of method [`update_agent`]
134#[derive(Debug, Clone, Serialize, Deserialize)]
135#[serde(untagged)]
136pub enum UpdateAgentError {
137    Status400(models::GetFinances400Response),
138    Status401(models::GetFinances401Response),
139    Status403(models::GetAccountStatus403Response),
140    Status404(models::GetImage404Response),
141    Status429(models::GetFinances429Response),
142    Status500(models::GetFinances500Response),
143    UnknownValue(serde_json::Value)
144}
145
146/// Чтобы добавить дополнительный пакет токенов для AI агента, отправьте
147/// POST-запрос на `/api/v1/cloud-ai/agents/{id}/add-additional-token-package`.
148pub async fn add_additional_token_package(
149    configuration: &configuration::Configuration,
150    id: i32,
151    add_token_package: Option<models::AddTokenPackage>
152) -> Result<(), Error<AddAdditionalTokenPackageError>> {
153    // add a prefix to parameters to efficiently prevent name collisions
154    let p_path_id = id;
155    let p_body_add_token_package = add_token_package;
156
157    let uri_str = format!(
158        "{}/api/v1/cloud-ai/agents/{id}/add-additional-token-package",
159        configuration.base_path,
160        id = p_path_id
161    );
162    let mut req_builder = configuration
163        .client
164        .request(reqwest::Method::POST, &uri_str);
165
166    if let Some(ref user_agent) = configuration.user_agent {
167        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
168    }
169    if let Some(ref token) = configuration.bearer_access_token {
170        req_builder = req_builder.bearer_auth(token.to_owned());
171    };
172    req_builder = req_builder.json(&p_body_add_token_package);
173
174    let req = req_builder.build()?;
175    let resp = configuration.client.execute(req).await?;
176
177    let status = resp.status();
178
179    if !status.is_client_error() && !status.is_server_error() {
180        Ok(())
181    } else {
182        let content = resp.text().await?;
183        let entity: Option<AddAdditionalTokenPackageError> = serde_json::from_str(&content).ok();
184        Err(Error::ResponseError(ResponseContent {
185            status,
186            content,
187            entity
188        }))
189    }
190}
191
192/// Чтобы создать AI агента, отправьте POST-запрос на `/api/v1/cloud-ai/agents`,
193/// задав необходимые атрибуты.  Агент будет создан с использованием
194/// предоставленной информации. Тело ответа будет содержать объект JSON с
195/// информацией о созданном агенте.
196pub async fn create_agent(
197    configuration: &configuration::Configuration,
198    create_agent: models::CreateAgent
199) -> Result<models::CreateAgent201Response, Error<CreateAgentError>> {
200    // add a prefix to parameters to efficiently prevent name collisions
201    let p_body_create_agent = create_agent;
202
203    let uri_str = format!("{}/api/v1/cloud-ai/agents", configuration.base_path);
204    let mut req_builder = configuration
205        .client
206        .request(reqwest::Method::POST, &uri_str);
207
208    if let Some(ref user_agent) = configuration.user_agent {
209        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
210    }
211    if let Some(ref token) = configuration.bearer_access_token {
212        req_builder = req_builder.bearer_auth(token.to_owned());
213    };
214    req_builder = req_builder.json(&p_body_create_agent);
215
216    let req = req_builder.build()?;
217    let resp = configuration.client.execute(req).await?;
218
219    let status = resp.status();
220    let content_type = resp
221        .headers()
222        .get("content-type")
223        .and_then(|v| v.to_str().ok())
224        .unwrap_or("application/octet-stream");
225    let content_type = super::ContentType::from(content_type);
226
227    if !status.is_client_error() && !status.is_server_error() {
228        let content = resp.text().await?;
229        match content_type {
230            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
231            ContentType::Text => {
232                return Err(Error::from(serde_json::Error::custom(
233                    "Received `text/plain` content type response that cannot be converted to `models::CreateAgent201Response`"
234                )));
235            }
236            ContentType::Unsupported(unknown_type) => {
237                return Err(Error::from(serde_json::Error::custom(format!(
238                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateAgent201Response`"
239                ))));
240            }
241        }
242    } else {
243        let content = resp.text().await?;
244        let entity: Option<CreateAgentError> = serde_json::from_str(&content).ok();
245        Err(Error::ResponseError(ResponseContent {
246            status,
247            content,
248            entity
249        }))
250    }
251}
252
253/// Чтобы удалить AI агента, отправьте DELETE-запрос на
254/// `/api/v1/cloud-ai/agents/{id}`.
255pub async fn delete_agent(
256    configuration: &configuration::Configuration,
257    id: i32
258) -> Result<(), Error<DeleteAgentError>> {
259    // add a prefix to parameters to efficiently prevent name collisions
260    let p_path_id = id;
261
262    let uri_str = format!(
263        "{}/api/v1/cloud-ai/agents/{id}",
264        configuration.base_path,
265        id = p_path_id
266    );
267    let mut req_builder = configuration
268        .client
269        .request(reqwest::Method::DELETE, &uri_str);
270
271    if let Some(ref user_agent) = configuration.user_agent {
272        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
273    }
274    if let Some(ref token) = configuration.bearer_access_token {
275        req_builder = req_builder.bearer_auth(token.to_owned());
276    };
277
278    let req = req_builder.build()?;
279    let resp = configuration.client.execute(req).await?;
280
281    let status = resp.status();
282
283    if !status.is_client_error() && !status.is_server_error() {
284        Ok(())
285    } else {
286        let content = resp.text().await?;
287        let entity: Option<DeleteAgentError> = serde_json::from_str(&content).ok();
288        Err(Error::ResponseError(ResponseContent {
289            status,
290            content,
291            entity
292        }))
293    }
294}
295
296/// Чтобы получить информацию об AI агенте, отправьте GET-запрос на
297/// `/api/v1/cloud-ai/agents/{id}`.
298pub async fn get_agent(
299    configuration: &configuration::Configuration,
300    id: i32
301) -> Result<models::CreateAgent201Response, Error<GetAgentError>> {
302    // add a prefix to parameters to efficiently prevent name collisions
303    let p_path_id = id;
304
305    let uri_str = format!(
306        "{}/api/v1/cloud-ai/agents/{id}",
307        configuration.base_path,
308        id = p_path_id
309    );
310    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
311
312    if let Some(ref user_agent) = configuration.user_agent {
313        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
314    }
315    if let Some(ref token) = configuration.bearer_access_token {
316        req_builder = req_builder.bearer_auth(token.to_owned());
317    };
318
319    let req = req_builder.build()?;
320    let resp = configuration.client.execute(req).await?;
321
322    let status = resp.status();
323    let content_type = resp
324        .headers()
325        .get("content-type")
326        .and_then(|v| v.to_str().ok())
327        .unwrap_or("application/octet-stream");
328    let content_type = super::ContentType::from(content_type);
329
330    if !status.is_client_error() && !status.is_server_error() {
331        let content = resp.text().await?;
332        match content_type {
333            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
334            ContentType::Text => {
335                return Err(Error::from(serde_json::Error::custom(
336                    "Received `text/plain` content type response that cannot be converted to `models::CreateAgent201Response`"
337                )));
338            }
339            ContentType::Unsupported(unknown_type) => {
340                return Err(Error::from(serde_json::Error::custom(format!(
341                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateAgent201Response`"
342                ))));
343            }
344        }
345    } else {
346        let content = resp.text().await?;
347        let entity: Option<GetAgentError> = serde_json::from_str(&content).ok();
348        Err(Error::ResponseError(ResponseContent {
349            status,
350            content,
351            entity
352        }))
353    }
354}
355
356/// Чтобы получить статистику использования токенов AI агента, отправьте
357/// GET-запрос на `/api/v1/cloud-ai/agents/{id}/statistic`.  Можно указать
358/// временной диапазон и интервал агрегации.
359pub async fn get_agent_statistics(
360    configuration: &configuration::Configuration,
361    id: i32,
362    start_time: Option<chrono::DateTime<chrono::FixedOffset>>,
363    end_time: Option<chrono::DateTime<chrono::FixedOffset>>,
364    interval: Option<f64>
365) -> Result<models::GetAgentStatistics200Response, Error<GetAgentStatisticsError>> {
366    // add a prefix to parameters to efficiently prevent name collisions
367    let p_path_id = id;
368    let p_query_start_time = start_time;
369    let p_query_end_time = end_time;
370    let p_query_interval = interval;
371
372    let uri_str = format!(
373        "{}/api/v1/cloud-ai/agents/{id}/statistic",
374        configuration.base_path,
375        id = p_path_id
376    );
377    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
378
379    if let Some(ref param_value) = p_query_start_time {
380        req_builder = req_builder.query(&[("startTime", &param_value.to_string())]);
381    }
382    if let Some(ref param_value) = p_query_end_time {
383        req_builder = req_builder.query(&[("endTime", &param_value.to_string())]);
384    }
385    if let Some(ref param_value) = p_query_interval {
386        req_builder = req_builder.query(&[("interval", &param_value.to_string())]);
387    }
388    if let Some(ref user_agent) = configuration.user_agent {
389        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
390    }
391    if let Some(ref token) = configuration.bearer_access_token {
392        req_builder = req_builder.bearer_auth(token.to_owned());
393    };
394
395    let req = req_builder.build()?;
396    let resp = configuration.client.execute(req).await?;
397
398    let status = resp.status();
399    let content_type = resp
400        .headers()
401        .get("content-type")
402        .and_then(|v| v.to_str().ok())
403        .unwrap_or("application/octet-stream");
404    let content_type = super::ContentType::from(content_type);
405
406    if !status.is_client_error() && !status.is_server_error() {
407        let content = resp.text().await?;
408        match content_type {
409            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
410            ContentType::Text => {
411                return Err(Error::from(serde_json::Error::custom(
412                    "Received `text/plain` content type response that cannot be converted to `models::GetAgentStatistics200Response`"
413                )));
414            }
415            ContentType::Unsupported(unknown_type) => {
416                return Err(Error::from(serde_json::Error::custom(format!(
417                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetAgentStatistics200Response`"
418                ))));
419            }
420        }
421    } else {
422        let content = resp.text().await?;
423        let entity: Option<GetAgentStatisticsError> = serde_json::from_str(&content).ok();
424        Err(Error::ResponseError(ResponseContent {
425            status,
426            content,
427            entity
428        }))
429    }
430}
431
432/// Чтобы получить список AI агентов, отправьте GET-запрос на
433/// `/api/v1/cloud-ai/agents`.  Тело ответа будет представлять собой объект JSON
434/// с ключом `agents`.
435pub async fn get_agents(
436    configuration: &configuration::Configuration
437) -> Result<models::GetAgents200Response, Error<GetAgentsError>> {
438    let uri_str = format!("{}/api/v1/cloud-ai/agents", configuration.base_path);
439    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
440
441    if let Some(ref user_agent) = configuration.user_agent {
442        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
443    }
444    if let Some(ref token) = configuration.bearer_access_token {
445        req_builder = req_builder.bearer_auth(token.to_owned());
446    };
447
448    let req = req_builder.build()?;
449    let resp = configuration.client.execute(req).await?;
450
451    let status = resp.status();
452    let content_type = resp
453        .headers()
454        .get("content-type")
455        .and_then(|v| v.to_str().ok())
456        .unwrap_or("application/octet-stream");
457    let content_type = super::ContentType::from(content_type);
458
459    if !status.is_client_error() && !status.is_server_error() {
460        let content = resp.text().await?;
461        match content_type {
462            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
463            ContentType::Text => {
464                return Err(Error::from(serde_json::Error::custom(
465                    "Received `text/plain` content type response that cannot be converted to `models::GetAgents200Response`"
466                )));
467            }
468            ContentType::Unsupported(unknown_type) => {
469                return Err(Error::from(serde_json::Error::custom(format!(
470                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetAgents200Response`"
471                ))));
472            }
473        }
474    } else {
475        let content = resp.text().await?;
476        let entity: Option<GetAgentsError> = serde_json::from_str(&content).ok();
477        Err(Error::ResponseError(ResponseContent {
478            status,
479            content,
480            entity
481        }))
482    }
483}
484
485/// Чтобы получить список доступных пакетов токенов для AI агентов, отправьте
486/// GET-запрос на `/api/v1/cloud-ai/token-packages/agents`.  Тело ответа будет
487/// представлять собой объект JSON с ключом `token_packages`.
488pub async fn get_agents_token_packages(
489    configuration: &configuration::Configuration
490) -> Result<models::GetAgentsTokenPackages200Response, Error<GetAgentsTokenPackagesError>> {
491    let uri_str = format!(
492        "{}/api/v1/cloud-ai/token-packages/agents",
493        configuration.base_path
494    );
495    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
496
497    if let Some(ref user_agent) = configuration.user_agent {
498        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
499    }
500    if let Some(ref token) = configuration.bearer_access_token {
501        req_builder = req_builder.bearer_auth(token.to_owned());
502    };
503
504    let req = req_builder.build()?;
505    let resp = configuration.client.execute(req).await?;
506
507    let status = resp.status();
508    let content_type = resp
509        .headers()
510        .get("content-type")
511        .and_then(|v| v.to_str().ok())
512        .unwrap_or("application/octet-stream");
513    let content_type = super::ContentType::from(content_type);
514
515    if !status.is_client_error() && !status.is_server_error() {
516        let content = resp.text().await?;
517        match content_type {
518            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
519            ContentType::Text => {
520                return Err(Error::from(serde_json::Error::custom(
521                    "Received `text/plain` content type response that cannot be converted to `models::GetAgentsTokenPackages200Response`"
522                )));
523            }
524            ContentType::Unsupported(unknown_type) => {
525                return Err(Error::from(serde_json::Error::custom(format!(
526                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetAgentsTokenPackages200Response`"
527                ))));
528            }
529        }
530    } else {
531        let content = resp.text().await?;
532        let entity: Option<GetAgentsTokenPackagesError> = serde_json::from_str(&content).ok();
533        Err(Error::ResponseError(ResponseContent {
534            status,
535            content,
536            entity
537        }))
538    }
539}
540
541/// Чтобы получить список доступных пакетов токенов для баз знаний, отправьте
542/// GET-запрос на `/api/v1/cloud-ai/token-packages/knowledge-bases`.  Тело
543/// ответа будет представлять собой объект JSON с ключом `token_packages`.
544pub async fn get_knowledgebases_token_packages(
545    configuration: &configuration::Configuration
546) -> Result<models::GetAgentsTokenPackages200Response, Error<GetKnowledgebasesTokenPackagesError>>
547{
548    let uri_str = format!(
549        "{}/api/v1/cloud-ai/token-packages/knowledge-bases",
550        configuration.base_path
551    );
552    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
553
554    if let Some(ref user_agent) = configuration.user_agent {
555        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
556    }
557    if let Some(ref token) = configuration.bearer_access_token {
558        req_builder = req_builder.bearer_auth(token.to_owned());
559    };
560
561    let req = req_builder.build()?;
562    let resp = configuration.client.execute(req).await?;
563
564    let status = resp.status();
565    let content_type = resp
566        .headers()
567        .get("content-type")
568        .and_then(|v| v.to_str().ok())
569        .unwrap_or("application/octet-stream");
570    let content_type = super::ContentType::from(content_type);
571
572    if !status.is_client_error() && !status.is_server_error() {
573        let content = resp.text().await?;
574        match content_type {
575            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
576            ContentType::Text => {
577                return Err(Error::from(serde_json::Error::custom(
578                    "Received `text/plain` content type response that cannot be converted to `models::GetAgentsTokenPackages200Response`"
579                )));
580            }
581            ContentType::Unsupported(unknown_type) => {
582                return Err(Error::from(serde_json::Error::custom(format!(
583                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetAgentsTokenPackages200Response`"
584                ))));
585            }
586        }
587    } else {
588        let content = resp.text().await?;
589        let entity: Option<GetKnowledgebasesTokenPackagesError> =
590            serde_json::from_str(&content).ok();
591        Err(Error::ResponseError(ResponseContent {
592            status,
593            content,
594            entity
595        }))
596    }
597}
598
599/// Чтобы получить список доступных AI моделей, отправьте GET-запрос на
600/// `/api/v1/cloud-ai/models`.  Тело ответа будет представлять собой объект JSON
601/// с ключом `models`.
602pub async fn get_models(
603    configuration: &configuration::Configuration
604) -> Result<models::GetModels200Response, Error<GetModelsError>> {
605    let uri_str = format!("{}/api/v1/cloud-ai/models", configuration.base_path);
606    let mut req_builder = configuration.client.request(reqwest::Method::GET, &uri_str);
607
608    if let Some(ref user_agent) = configuration.user_agent {
609        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
610    }
611    if let Some(ref token) = configuration.bearer_access_token {
612        req_builder = req_builder.bearer_auth(token.to_owned());
613    };
614
615    let req = req_builder.build()?;
616    let resp = configuration.client.execute(req).await?;
617
618    let status = resp.status();
619    let content_type = resp
620        .headers()
621        .get("content-type")
622        .and_then(|v| v.to_str().ok())
623        .unwrap_or("application/octet-stream");
624    let content_type = super::ContentType::from(content_type);
625
626    if !status.is_client_error() && !status.is_server_error() {
627        let content = resp.text().await?;
628        match content_type {
629            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
630            ContentType::Text => {
631                return Err(Error::from(serde_json::Error::custom(
632                    "Received `text/plain` content type response that cannot be converted to `models::GetModels200Response`"
633                )));
634            }
635            ContentType::Unsupported(unknown_type) => {
636                return Err(Error::from(serde_json::Error::custom(format!(
637                    "Received `{unknown_type}` content type response that cannot be converted to `models::GetModels200Response`"
638                ))));
639            }
640        }
641    } else {
642        let content = resp.text().await?;
643        let entity: Option<GetModelsError> = serde_json::from_str(&content).ok();
644        Err(Error::ResponseError(ResponseContent {
645            status,
646            content,
647            entity
648        }))
649    }
650}
651
652/// Чтобы обновить AI агента, отправьте PATCH-запрос на
653/// `/api/v1/cloud-ai/agents/{id}`.
654pub async fn update_agent(
655    configuration: &configuration::Configuration,
656    id: i32,
657    update_agent: models::UpdateAgent
658) -> Result<models::CreateAgent201Response, Error<UpdateAgentError>> {
659    // add a prefix to parameters to efficiently prevent name collisions
660    let p_path_id = id;
661    let p_body_update_agent = update_agent;
662
663    let uri_str = format!(
664        "{}/api/v1/cloud-ai/agents/{id}",
665        configuration.base_path,
666        id = p_path_id
667    );
668    let mut req_builder = configuration
669        .client
670        .request(reqwest::Method::PATCH, &uri_str);
671
672    if let Some(ref user_agent) = configuration.user_agent {
673        req_builder = req_builder.header(reqwest::header::USER_AGENT, user_agent.clone());
674    }
675    if let Some(ref token) = configuration.bearer_access_token {
676        req_builder = req_builder.bearer_auth(token.to_owned());
677    };
678    req_builder = req_builder.json(&p_body_update_agent);
679
680    let req = req_builder.build()?;
681    let resp = configuration.client.execute(req).await?;
682
683    let status = resp.status();
684    let content_type = resp
685        .headers()
686        .get("content-type")
687        .and_then(|v| v.to_str().ok())
688        .unwrap_or("application/octet-stream");
689    let content_type = super::ContentType::from(content_type);
690
691    if !status.is_client_error() && !status.is_server_error() {
692        let content = resp.text().await?;
693        match content_type {
694            ContentType::Json => serde_json::from_str(&content).map_err(Error::from),
695            ContentType::Text => {
696                return Err(Error::from(serde_json::Error::custom(
697                    "Received `text/plain` content type response that cannot be converted to `models::CreateAgent201Response`"
698                )));
699            }
700            ContentType::Unsupported(unknown_type) => {
701                return Err(Error::from(serde_json::Error::custom(format!(
702                    "Received `{unknown_type}` content type response that cannot be converted to `models::CreateAgent201Response`"
703                ))));
704            }
705        }
706    } else {
707        let content = resp.text().await?;
708        let entity: Option<UpdateAgentError> = serde_json::from_str(&content).ok();
709        Err(Error::ResponseError(ResponseContent {
710            status,
711            content,
712            entity
713        }))
714    }
715}