Skip to main content

linger_openai_sdk/
client.rs

1use crate::assistants::{
2    Assistant, AssistantDeletion, AssistantListRequest, AssistantPage, CreateAssistantRequest,
3    ModifyAssistantRequest,
4};
5use crate::audio::{
6    AudioSpeechResponse, AudioTranscription, AudioTranslation, AudioVoice, AudioVoiceConsent,
7    AudioVoiceConsentDeletion, AudioVoiceConsentListRequest, AudioVoiceConsentPage,
8    CreateSpeechRequest, CreateTranscriptionRequest, CreateTranslationRequest,
9    CreateVoiceConsentRequest, CreateVoiceRequest, UpdateVoiceConsentRequest,
10};
11use crate::batches::{Batch, BatchListPage, CreateBatchRequest};
12use crate::chat::{
13    ChatCompletion, ChatCompletionDeletion, ChatCompletionMessagePage, ChatCompletionPage,
14    CreateChatCompletionRequest, ModifyChatCompletionRequest,
15};
16use crate::chatkit::{
17    ChatKitSession, ChatKitThread, ChatKitThreadDeletion, ChatKitThreadItemPage, ChatKitThreadPage,
18    CreateChatKitSessionRequest,
19};
20use crate::completions::{Completion, CompletionStream, CreateCompletionRequest};
21use crate::config::ClientConfig;
22use crate::containers::{
23    Container, ContainerDeletion, ContainerFile, ContainerFileContent, ContainerFileDeletion,
24    ContainerFilePage, ContainerPage, CreateContainerFileRequest, CreateContainerRequest,
25};
26use crate::conversations::{
27    Conversation, ConversationDeletion, ConversationItem, ConversationItemDeletion,
28    ConversationItemPage, CreateConversationItemRequest, CreateConversationRequest,
29    ModifyConversationRequest,
30};
31use crate::embeddings::{CreateEmbeddingRequest, EmbeddingResponse};
32use crate::error::{parse_api_error, request_id_from_headers, HeaderMap, LingerError};
33use crate::evals::{
34    CreateEvalRequest, CreateEvalRunRequest, Eval, EvalDeletion, EvalPage, EvalRun,
35    EvalRunDeletion, EvalRunOutputItem, EvalRunOutputItemPage, EvalRunPage, ModifyEvalRequest,
36};
37use crate::files::{CreateFileRequest, FileContent, FileDeletion, FileObject, FilesPage};
38use crate::fine_tuning::{
39    CreateFineTuningCheckpointPermissionRequest, CreateFineTuningJobRequest,
40    FineTuningCheckpointPage, FineTuningCheckpointPermissionDeletion,
41    FineTuningCheckpointPermissionPage, FineTuningEventPage, FineTuningGraderRun,
42    FineTuningGraderValidation, FineTuningJob, FineTuningJobPage, RunFineTuningGraderRequest,
43    ValidateFineTuningGraderRequest,
44};
45use crate::images::{
46    CreateImageEditRequest, CreateImageRequest, CreateImageVariationRequest, ImagesResponse,
47};
48use crate::models::{Model, ModelDeletion, ModelsPage};
49use crate::moderations::{CreateModerationRequest, ModerationCreateResponse};
50use crate::realtime::{
51    CreateRealtimeCallReferRequest, CreateRealtimeCallRequest, CreateRealtimeClientSecretRequest,
52    CreateRealtimeSessionRequest, CreateRealtimeTranscriptionSessionRequest,
53    CreateRealtimeTranslationClientSecretRequest, RealtimeCallSdpAnswer, RealtimeClientSecret,
54    RealtimeSession, RealtimeTranscriptionSession, RealtimeTranslationClientSecret,
55    RejectRealtimeCallRequest,
56};
57use crate::responses::{
58    CompactResponseRequest, CreateResponseInputTokensRequest, CreateResponseRequest, Response,
59    ResponseCompaction, ResponseDeletion, ResponseInputItemsPage, ResponseInputTokens,
60    ResponseStream,
61};
62use crate::retry::RetryDecision;
63use crate::skills::{
64    CreateSkillRequest, CreateSkillVersionRequest, Skill, SkillContent, SkillDeletion,
65    SkillListRequest, SkillPage, SkillVersion, SkillVersionDeletion, SkillVersionListRequest,
66    SkillVersionPage, UpdateSkillRequest,
67};
68use crate::threads::{
69    CreateThreadAndRunRequest, CreateThreadMessageRequest, CreateThreadRequest,
70    CreateThreadRunRequest, ModifyThreadMessageRequest, ModifyThreadRequest,
71    ModifyThreadRunRequest, RunStep, RunStepListRequest, RunStepPage, RunStepRetrieveRequest,
72    SubmitToolOutputsRequest, Thread, ThreadDeletion, ThreadMessage, ThreadMessageDeletion,
73    ThreadMessageListRequest, ThreadMessagePage, ThreadRun, ThreadRunListRequest, ThreadRunPage,
74};
75use crate::transport::{HttpMethod, HttpRequest, SharedTransport};
76use crate::uploads::{
77    CompleteUploadRequest, CreateUploadPartRequest, CreateUploadRequest, Upload, UploadPart,
78};
79use crate::vector_stores::{
80    CreateVectorStoreFileBatchRequest, CreateVectorStoreFileRequest, CreateVectorStoreRequest,
81    CreateVectorStoreSearchRequest, ModifyVectorStoreFileRequest, ModifyVectorStoreRequest,
82    VectorStore, VectorStoreDeletion, VectorStoreFile, VectorStoreFileBatch,
83    VectorStoreFileContentPage, VectorStoreFileDeletion, VectorStoreFilePage, VectorStorePage,
84    VectorStoreSearchPage,
85};
86use crate::videos::{
87    CreateVideoCharacterRequest, CreateVideoEditRequest, CreateVideoExtensionRequest,
88    CreateVideoRemixRequest, CreateVideoRequest, Video, VideoCharacter, VideoContent,
89    VideoContentVariant, VideoDeletion, VideoPage,
90};
91use bytes::Bytes;
92
93/// EN: OpenAI SDK client.
94/// 中文:OpenAI SDK 客户端。
95#[derive(Clone, Debug)]
96pub struct Client {
97    config: ClientConfig,
98    transport: SharedTransport,
99}
100
101impl Client {
102    /// EN: Creates a client with the default transport.
103    /// 中文:使用默认传输层创建客户端。
104    #[cfg(feature = "reqwest-transport")]
105    pub fn new(api_key: impl Into<String>) -> Result<Self, LingerError> {
106        let config = ClientConfig::builder().api_key(api_key).build()?;
107        Ok(Self {
108            config,
109            transport: SharedTransport::new(crate::transport::ReqwestTransport::default()),
110        })
111    }
112
113    /// EN: Creates a client with the provided config and default transport.
114    /// 中文:使用提供的配置和默认传输层创建客户端。
115    #[cfg(feature = "reqwest-transport")]
116    pub fn with_config(config: ClientConfig) -> Result<Self, LingerError> {
117        Ok(Self {
118            config,
119            transport: SharedTransport::new(crate::transport::ReqwestTransport::default()),
120        })
121    }
122
123    /// EN: Creates a client from config and a custom transport.
124    /// 中文:通过配置和自定义传输层创建客户端。
125    pub fn with_config_and_transport(config: ClientConfig, transport: SharedTransport) -> Self {
126        Self { config, transport }
127    }
128
129    /// EN: Returns the Responses API resource.
130    /// 中文:返回 Responses API 资源。
131    pub fn responses(&self) -> ResponsesResource {
132        ResponsesResource {
133            config: self.config.clone(),
134            transport: self.transport.clone(),
135        }
136    }
137
138    /// EN: Returns the legacy Completions API resource.
139    /// 中文:返回 legacy Completions API 资源。
140    pub fn completions(&self) -> CompletionsResource {
141        CompletionsResource {
142            config: self.config.clone(),
143            transport: self.transport.clone(),
144        }
145    }
146
147    /// EN: Returns the Conversations API resource.
148    /// 中文:返回 Conversations API 资源。
149    pub fn conversations(&self) -> ConversationsResource {
150        ConversationsResource {
151            config: self.config.clone(),
152            transport: self.transport.clone(),
153        }
154    }
155
156    /// EN: Returns the Realtime API resource.
157    /// 中文:返回 Realtime API 资源。
158    pub fn realtime(&self) -> RealtimeResource {
159        RealtimeResource {
160            config: self.config.clone(),
161            transport: self.transport.clone(),
162        }
163    }
164
165    /// EN: Returns the Containers API resource.
166    /// 中文:返回 Containers API 资源。
167    pub fn containers(&self) -> ContainersResource {
168        ContainersResource {
169            config: self.config.clone(),
170            transport: self.transport.clone(),
171        }
172    }
173
174    /// EN: Returns the Evals API resource.
175    /// 中文:返回 Evals API 资源。
176    pub fn evals(&self) -> EvalsResource {
177        EvalsResource {
178            config: self.config.clone(),
179            transport: self.transport.clone(),
180        }
181    }
182
183    /// EN: Returns the Models API resource.
184    /// 中文:返回 Models API 资源。
185    pub fn models(&self) -> ModelsResource {
186        ModelsResource {
187            config: self.config.clone(),
188            transport: self.transport.clone(),
189        }
190    }
191
192    /// EN: Returns the Skills API resource.
193    /// 中文:返回 Skills API 资源。
194    pub fn skills(&self) -> SkillsResource {
195        SkillsResource {
196            config: self.config.clone(),
197            transport: self.transport.clone(),
198        }
199    }
200
201    /// EN: Returns the Videos API resource.
202    /// 中文:返回 Videos API 资源。
203    pub fn videos(&self) -> VideosResource {
204        VideosResource {
205            config: self.config.clone(),
206            transport: self.transport.clone(),
207        }
208    }
209
210    /// EN: Returns the Batches API resource.
211    /// 中文:返回 Batches API 资源。
212    pub fn batches(&self) -> BatchesResource {
213        BatchesResource {
214            config: self.config.clone(),
215            transport: self.transport.clone(),
216        }
217    }
218
219    /// EN: Returns the Files API resource.
220    /// 中文:返回 Files API 资源。
221    pub fn files(&self) -> FilesResource {
222        FilesResource {
223            config: self.config.clone(),
224            transport: self.transport.clone(),
225        }
226    }
227
228    /// EN: Returns the Uploads API resource.
229    /// 中文:返回 Uploads API 资源。
230    pub fn uploads(&self) -> UploadsResource {
231        UploadsResource {
232            config: self.config.clone(),
233            transport: self.transport.clone(),
234        }
235    }
236
237    /// EN: Returns the Vector Stores API resource.
238    /// 中文:返回 Vector Stores API 资源。
239    pub fn vector_stores(&self) -> VectorStoresResource {
240        VectorStoresResource {
241            config: self.config.clone(),
242            transport: self.transport.clone(),
243        }
244    }
245
246    /// EN: Returns the Fine-tuning API resource.
247    /// 中文:返回 Fine-tuning API 资源。
248    pub fn fine_tuning(&self) -> FineTuningResource {
249        FineTuningResource {
250            config: self.config.clone(),
251            transport: self.transport.clone(),
252        }
253    }
254
255    /// EN: Returns the Images API resource.
256    /// 中文:返回 Images API 资源。
257    pub fn images(&self) -> ImagesResource {
258        ImagesResource {
259            config: self.config.clone(),
260            transport: self.transport.clone(),
261        }
262    }
263
264    /// EN: Returns the Audio API resource.
265    /// 中文:返回 Audio API 资源。
266    pub fn audio(&self) -> AudioResource {
267        AudioResource {
268            config: self.config.clone(),
269            transport: self.transport.clone(),
270        }
271    }
272
273    /// EN: Returns the Embeddings API resource.
274    /// 中文:返回 Embeddings API 资源。
275    pub fn embeddings(&self) -> EmbeddingsResource {
276        EmbeddingsResource {
277            config: self.config.clone(),
278            transport: self.transport.clone(),
279        }
280    }
281
282    /// EN: Returns the Moderations API resource.
283    /// 中文:返回 Moderations API 资源。
284    pub fn moderations(&self) -> ModerationsResource {
285        ModerationsResource {
286            config: self.config.clone(),
287            transport: self.transport.clone(),
288        }
289    }
290
291    /// EN: Returns the Chat API resource.
292    /// 中文:返回 Chat API 资源。
293    pub fn chat(&self) -> ChatResource {
294        ChatResource {
295            config: self.config.clone(),
296            transport: self.transport.clone(),
297        }
298    }
299
300    /// EN: Returns the ChatKit beta API resource.
301    /// 中文:返回 ChatKit beta API 资源。
302    pub fn chatkit(&self) -> ChatKitResource {
303        ChatKitResource {
304            config: self.config.clone(),
305            transport: self.transport.clone(),
306        }
307    }
308
309    /// EN: Returns the Assistants API resource.
310    /// 中文:返回 Assistants API 资源。
311    pub fn assistants(&self) -> AssistantsResource {
312        AssistantsResource {
313            config: self.config.clone(),
314            transport: self.transport.clone(),
315        }
316    }
317
318    /// EN: Returns the Threads API resource.
319    /// 中文:返回 Threads API 资源。
320    pub fn threads(&self) -> ThreadsResource {
321        ThreadsResource {
322            config: self.config.clone(),
323            transport: self.transport.clone(),
324        }
325    }
326
327    fn build_json_request<T>(
328        &self,
329        method: HttpMethod,
330        path: &str,
331        body: &T,
332    ) -> Result<HttpRequest, LingerError>
333    where
334        T: serde::Serialize,
335    {
336        let mut request = HttpRequest::new(method, self.config.base_url(), path);
337        apply_auth_headers(&mut request, &self.config);
338        request.insert_header("content-type", "application/json");
339        request.set_body(serde_json::to_vec(body)?);
340        Ok(request)
341    }
342
343    fn build_empty_request(&self, method: HttpMethod, path: &str) -> HttpRequest {
344        let mut request = HttpRequest::new(method, self.config.base_url(), path);
345        apply_auth_headers(&mut request, &self.config);
346        request
347    }
348
349    async fn send_retryable_get(&self, path: &str) -> Result<(HeaderMap, Bytes), LingerError> {
350        let max_retries = self.config.retry_policy().max_retries;
351        let mut retry_attempt = 0;
352        loop {
353            let request = self.build_empty_request(HttpMethod::Get, path);
354            let response = self.transport.send(request).await?;
355            let (status, headers, body) = response.into_bytes().await?;
356            if (200..300).contains(&status) {
357                return Ok((headers, body));
358            }
359
360            let decision = self.config.retry_policy().classify_status(status, &headers);
361            let error = parse_api_error(status, headers, &body);
362            match decision {
363                RetryDecision::RetryAfter(delay) if retry_attempt < max_retries => {
364                    let delay = delay
365                        .unwrap_or_else(|| self.config.retry_policy().backoff_delay(retry_attempt));
366                    self.config.retry_sleeper().sleep(delay).await;
367                    retry_attempt += 1;
368                }
369                RetryDecision::RetryAfter(_) if max_retries > 0 => {
370                    return Err(LingerError::retry_exhausted(retry_attempt + 1, error));
371                }
372                _ => return Err(error),
373            }
374        }
375    }
376}
377
378/// EN: Threads API resource.
379/// 中文:Threads API 资源。
380#[derive(Clone, Debug)]
381pub struct ThreadsResource {
382    config: ClientConfig,
383    transport: SharedTransport,
384}
385
386impl ThreadsResource {
387    /// EN: Creates a Thread with `POST /v1/threads`.
388    /// 中文:使用 `POST /v1/threads` 创建 Thread。
389    pub async fn create(&self, request: CreateThreadRequest) -> Result<Thread, LingerError> {
390        let client = Client {
391            config: self.config.clone(),
392            transport: self.transport.clone(),
393        };
394        let mut request = client.build_json_request(HttpMethod::Post, "/v1/threads", &request)?;
395        apply_assistants_beta_header(&mut request);
396        let response = self.transport.send(request).await?;
397        let (status, headers, body) = response.into_bytes().await?;
398        if !(200..300).contains(&status) {
399            return Err(parse_api_error(status, headers, &body));
400        }
401        let request_id = request_id_from_headers(&headers);
402        let response = serde_json::from_slice::<Thread>(&body)?.with_request_id(request_id);
403        Ok(response)
404    }
405
406    /// EN: Creates a thread and run with `POST /v1/threads/runs`.
407    /// 中文:使用 `POST /v1/threads/runs` 创建线程并运行。
408    pub async fn create_and_run(
409        &self,
410        request: CreateThreadAndRunRequest,
411    ) -> Result<ThreadRun, LingerError> {
412        let client = Client {
413            config: self.config.clone(),
414            transport: self.transport.clone(),
415        };
416        let mut request =
417            client.build_json_request(HttpMethod::Post, "/v1/threads/runs", &request)?;
418        apply_assistants_beta_header(&mut request);
419        let response = self.transport.send(request).await?;
420        let (status, headers, body) = response.into_bytes().await?;
421        if !(200..300).contains(&status) {
422            return Err(parse_api_error(status, headers, &body));
423        }
424        let request_id = request_id_from_headers(&headers);
425        let response = serde_json::from_slice::<ThreadRun>(&body)?.with_request_id(request_id);
426        Ok(response)
427    }
428
429    /// EN: Retrieves a Thread with `GET /v1/threads/{thread_id}`.
430    /// 中文:使用 `GET /v1/threads/{thread_id}` 获取 Thread。
431    pub async fn retrieve(&self, thread_id: &str) -> Result<Thread, LingerError> {
432        let thread_id = validate_thread_id(thread_id)?;
433        let client = Client {
434            config: self.config.clone(),
435            transport: self.transport.clone(),
436        };
437        let path = format!("/v1/threads/{thread_id}");
438        let mut request = client.build_empty_request(HttpMethod::Get, &path);
439        apply_assistants_beta_header(&mut request);
440        let response = self.transport.send(request).await?;
441        let (status, headers, body) = response.into_bytes().await?;
442        if !(200..300).contains(&status) {
443            return Err(parse_api_error(status, headers, &body));
444        }
445        let request_id = request_id_from_headers(&headers);
446        let response = serde_json::from_slice::<Thread>(&body)?.with_request_id(request_id);
447        Ok(response)
448    }
449
450    /// EN: Modifies a Thread with `POST /v1/threads/{thread_id}`.
451    /// 中文:使用 `POST /v1/threads/{thread_id}` 修改 Thread。
452    pub async fn modify(
453        &self,
454        thread_id: &str,
455        request: ModifyThreadRequest,
456    ) -> Result<Thread, LingerError> {
457        let thread_id = validate_thread_id(thread_id)?;
458        let client = Client {
459            config: self.config.clone(),
460            transport: self.transport.clone(),
461        };
462        let path = format!("/v1/threads/{thread_id}");
463        let mut request = client.build_json_request(HttpMethod::Post, &path, &request)?;
464        apply_assistants_beta_header(&mut request);
465        let response = self.transport.send(request).await?;
466        let (status, headers, body) = response.into_bytes().await?;
467        if !(200..300).contains(&status) {
468            return Err(parse_api_error(status, headers, &body));
469        }
470        let request_id = request_id_from_headers(&headers);
471        let response = serde_json::from_slice::<Thread>(&body)?.with_request_id(request_id);
472        Ok(response)
473    }
474
475    /// EN: Deletes a Thread with `DELETE /v1/threads/{thread_id}`.
476    /// 中文:使用 `DELETE /v1/threads/{thread_id}` 删除 Thread。
477    pub async fn delete(&self, thread_id: &str) -> Result<ThreadDeletion, LingerError> {
478        let thread_id = validate_thread_id(thread_id)?;
479        let client = Client {
480            config: self.config.clone(),
481            transport: self.transport.clone(),
482        };
483        let path = format!("/v1/threads/{thread_id}");
484        let mut request = client.build_empty_request(HttpMethod::Delete, &path);
485        apply_assistants_beta_header(&mut request);
486        let response = self.transport.send(request).await?;
487        let (status, headers, body) = response.into_bytes().await?;
488        if !(200..300).contains(&status) {
489            return Err(parse_api_error(status, headers, &body));
490        }
491        let request_id = request_id_from_headers(&headers);
492        let response = serde_json::from_slice::<ThreadDeletion>(&body)?.with_request_id(request_id);
493        Ok(response)
494    }
495
496    /// EN: Returns the Thread Messages subresource for a thread id.
497    /// 中文:返回指定 Thread ID 的 Thread Messages 子资源。
498    pub fn messages(&self, thread_id: &str) -> ThreadMessagesResource {
499        ThreadMessagesResource {
500            config: self.config.clone(),
501            transport: self.transport.clone(),
502            thread_id: thread_id.to_string(),
503        }
504    }
505
506    /// EN: Returns the Thread Runs subresource for a thread id.
507    /// 中文:返回指定 Thread ID 的 Thread Runs 子资源。
508    pub fn runs(&self, thread_id: &str) -> ThreadRunsResource {
509        ThreadRunsResource {
510            config: self.config.clone(),
511            transport: self.transport.clone(),
512            thread_id: thread_id.to_string(),
513        }
514    }
515}
516
517/// EN: Thread Messages API resource.
518/// 中文:Thread Messages API 资源。
519#[derive(Clone, Debug)]
520pub struct ThreadMessagesResource {
521    config: ClientConfig,
522    transport: SharedTransport,
523    thread_id: String,
524}
525
526impl ThreadMessagesResource {
527    /// EN: Creates a thread message with `POST /v1/threads/{thread_id}/messages`.
528    /// 中文:使用 `POST /v1/threads/{thread_id}/messages` 创建线程消息。
529    pub async fn create(
530        &self,
531        request: CreateThreadMessageRequest,
532    ) -> Result<ThreadMessage, LingerError> {
533        let thread_id = validate_thread_id(&self.thread_id)?;
534        let client = Client {
535            config: self.config.clone(),
536            transport: self.transport.clone(),
537        };
538        let path = format!("/v1/threads/{thread_id}/messages");
539        let mut request = client.build_json_request(HttpMethod::Post, &path, &request)?;
540        apply_assistants_beta_header(&mut request);
541        let response = self.transport.send(request).await?;
542        let (status, headers, body) = response.into_bytes().await?;
543        if !(200..300).contains(&status) {
544            return Err(parse_api_error(status, headers, &body));
545        }
546        let request_id = request_id_from_headers(&headers);
547        let response = serde_json::from_slice::<ThreadMessage>(&body)?.with_request_id(request_id);
548        Ok(response)
549    }
550
551    /// EN: Lists thread messages.
552    /// 中文:列出线程消息。
553    pub async fn list(&self) -> Result<ThreadMessagePage, LingerError> {
554        self.list_with(ThreadMessageListRequest::default()).await
555    }
556
557    /// EN: Lists thread messages with query parameters.
558    /// 中文:使用查询参数列出线程消息。
559    pub async fn list_with(
560        &self,
561        request: ThreadMessageListRequest,
562    ) -> Result<ThreadMessagePage, LingerError> {
563        let thread_id = validate_thread_id(&self.thread_id)?;
564        let client = Client {
565            config: self.config.clone(),
566            transport: self.transport.clone(),
567        };
568        let path = request.path(thread_id);
569        let mut request = client.build_empty_request(HttpMethod::Get, &path);
570        apply_assistants_beta_header(&mut request);
571        let response = self.transport.send(request).await?;
572        let (status, headers, body) = response.into_bytes().await?;
573        if !(200..300).contains(&status) {
574            return Err(parse_api_error(status, headers, &body));
575        }
576        let request_id = request_id_from_headers(&headers);
577        let response =
578            serde_json::from_slice::<ThreadMessagePage>(&body)?.with_request_id(request_id);
579        Ok(response)
580    }
581
582    /// EN: Retrieves a thread message.
583    /// 中文:获取线程消息。
584    pub async fn retrieve(&self, message_id: &str) -> Result<ThreadMessage, LingerError> {
585        let thread_id = validate_thread_id(&self.thread_id)?;
586        let message_id = validate_message_id(message_id)?;
587        let client = Client {
588            config: self.config.clone(),
589            transport: self.transport.clone(),
590        };
591        let path = format!("/v1/threads/{thread_id}/messages/{message_id}");
592        let mut request = client.build_empty_request(HttpMethod::Get, &path);
593        apply_assistants_beta_header(&mut request);
594        let response = self.transport.send(request).await?;
595        let (status, headers, body) = response.into_bytes().await?;
596        if !(200..300).contains(&status) {
597            return Err(parse_api_error(status, headers, &body));
598        }
599        let request_id = request_id_from_headers(&headers);
600        let response = serde_json::from_slice::<ThreadMessage>(&body)?.with_request_id(request_id);
601        Ok(response)
602    }
603
604    /// EN: Modifies a thread message.
605    /// 中文:修改线程消息。
606    pub async fn modify(
607        &self,
608        message_id: &str,
609        request: ModifyThreadMessageRequest,
610    ) -> Result<ThreadMessage, LingerError> {
611        let thread_id = validate_thread_id(&self.thread_id)?;
612        let message_id = validate_message_id(message_id)?;
613        let client = Client {
614            config: self.config.clone(),
615            transport: self.transport.clone(),
616        };
617        let path = format!("/v1/threads/{thread_id}/messages/{message_id}");
618        let mut request = client.build_json_request(HttpMethod::Post, &path, &request)?;
619        apply_assistants_beta_header(&mut request);
620        let response = self.transport.send(request).await?;
621        let (status, headers, body) = response.into_bytes().await?;
622        if !(200..300).contains(&status) {
623            return Err(parse_api_error(status, headers, &body));
624        }
625        let request_id = request_id_from_headers(&headers);
626        let response = serde_json::from_slice::<ThreadMessage>(&body)?.with_request_id(request_id);
627        Ok(response)
628    }
629
630    /// EN: Deletes a thread message.
631    /// 中文:删除线程消息。
632    pub async fn delete(&self, message_id: &str) -> Result<ThreadMessageDeletion, LingerError> {
633        let thread_id = validate_thread_id(&self.thread_id)?;
634        let message_id = validate_message_id(message_id)?;
635        let client = Client {
636            config: self.config.clone(),
637            transport: self.transport.clone(),
638        };
639        let path = format!("/v1/threads/{thread_id}/messages/{message_id}");
640        let mut request = client.build_empty_request(HttpMethod::Delete, &path);
641        apply_assistants_beta_header(&mut request);
642        let response = self.transport.send(request).await?;
643        let (status, headers, body) = response.into_bytes().await?;
644        if !(200..300).contains(&status) {
645            return Err(parse_api_error(status, headers, &body));
646        }
647        let request_id = request_id_from_headers(&headers);
648        let response =
649            serde_json::from_slice::<ThreadMessageDeletion>(&body)?.with_request_id(request_id);
650        Ok(response)
651    }
652}
653
654/// EN: Thread Runs API resource.
655/// 中文:Thread Runs API 资源。
656#[derive(Clone, Debug)]
657pub struct ThreadRunsResource {
658    config: ClientConfig,
659    transport: SharedTransport,
660    thread_id: String,
661}
662
663impl ThreadRunsResource {
664    /// EN: Creates a run with `POST /v1/threads/{thread_id}/runs`.
665    /// 中文:使用 `POST /v1/threads/{thread_id}/runs` 创建 Run。
666    pub async fn create(&self, request: CreateThreadRunRequest) -> Result<ThreadRun, LingerError> {
667        let thread_id = validate_thread_id(&self.thread_id)?;
668        let client = Client {
669            config: self.config.clone(),
670            transport: self.transport.clone(),
671        };
672        let path = request.path(thread_id);
673        let mut request = client.build_json_request(HttpMethod::Post, &path, &request)?;
674        apply_assistants_beta_header(&mut request);
675        let response = self.transport.send(request).await?;
676        let (status, headers, body) = response.into_bytes().await?;
677        if !(200..300).contains(&status) {
678            return Err(parse_api_error(status, headers, &body));
679        }
680        let request_id = request_id_from_headers(&headers);
681        let response = serde_json::from_slice::<ThreadRun>(&body)?.with_request_id(request_id);
682        Ok(response)
683    }
684
685    /// EN: Lists runs for a thread.
686    /// 中文:列出线程中的 Run。
687    pub async fn list(&self) -> Result<ThreadRunPage, LingerError> {
688        self.list_with(ThreadRunListRequest::default()).await
689    }
690
691    /// EN: Lists runs for a thread with query parameters.
692    /// 中文:使用查询参数列出线程中的 Run。
693    pub async fn list_with(
694        &self,
695        request: ThreadRunListRequest,
696    ) -> Result<ThreadRunPage, LingerError> {
697        let thread_id = validate_thread_id(&self.thread_id)?;
698        let client = Client {
699            config: self.config.clone(),
700            transport: self.transport.clone(),
701        };
702        let path = request.path(thread_id);
703        let mut request = client.build_empty_request(HttpMethod::Get, &path);
704        apply_assistants_beta_header(&mut request);
705        let response = self.transport.send(request).await?;
706        let (status, headers, body) = response.into_bytes().await?;
707        if !(200..300).contains(&status) {
708            return Err(parse_api_error(status, headers, &body));
709        }
710        let request_id = request_id_from_headers(&headers);
711        let response = serde_json::from_slice::<ThreadRunPage>(&body)?.with_request_id(request_id);
712        Ok(response)
713    }
714
715    /// EN: Retrieves a run.
716    /// 中文:获取 Run。
717    pub async fn retrieve(&self, run_id: &str) -> Result<ThreadRun, LingerError> {
718        let thread_id = validate_thread_id(&self.thread_id)?;
719        let run_id = validate_run_id(run_id)?;
720        let client = Client {
721            config: self.config.clone(),
722            transport: self.transport.clone(),
723        };
724        let path = format!("/v1/threads/{thread_id}/runs/{run_id}");
725        let mut request = client.build_empty_request(HttpMethod::Get, &path);
726        apply_assistants_beta_header(&mut request);
727        let response = self.transport.send(request).await?;
728        let (status, headers, body) = response.into_bytes().await?;
729        if !(200..300).contains(&status) {
730            return Err(parse_api_error(status, headers, &body));
731        }
732        let request_id = request_id_from_headers(&headers);
733        let response = serde_json::from_slice::<ThreadRun>(&body)?.with_request_id(request_id);
734        Ok(response)
735    }
736
737    /// EN: Modifies a run.
738    /// 中文:修改 Run。
739    pub async fn modify(
740        &self,
741        run_id: &str,
742        request: ModifyThreadRunRequest,
743    ) -> Result<ThreadRun, LingerError> {
744        let thread_id = validate_thread_id(&self.thread_id)?;
745        let run_id = validate_run_id(run_id)?;
746        let client = Client {
747            config: self.config.clone(),
748            transport: self.transport.clone(),
749        };
750        let path = format!("/v1/threads/{thread_id}/runs/{run_id}");
751        let mut request = client.build_json_request(HttpMethod::Post, &path, &request)?;
752        apply_assistants_beta_header(&mut request);
753        let response = self.transport.send(request).await?;
754        let (status, headers, body) = response.into_bytes().await?;
755        if !(200..300).contains(&status) {
756            return Err(parse_api_error(status, headers, &body));
757        }
758        let request_id = request_id_from_headers(&headers);
759        let response = serde_json::from_slice::<ThreadRun>(&body)?.with_request_id(request_id);
760        Ok(response)
761    }
762
763    /// EN: Cancels a run.
764    /// 中文:取消 Run。
765    pub async fn cancel(&self, run_id: &str) -> Result<ThreadRun, LingerError> {
766        let thread_id = validate_thread_id(&self.thread_id)?;
767        let run_id = validate_run_id(run_id)?;
768        let client = Client {
769            config: self.config.clone(),
770            transport: self.transport.clone(),
771        };
772        let path = format!("/v1/threads/{thread_id}/runs/{run_id}/cancel");
773        let mut request = client.build_empty_request(HttpMethod::Post, &path);
774        apply_assistants_beta_header(&mut request);
775        let response = self.transport.send(request).await?;
776        let (status, headers, body) = response.into_bytes().await?;
777        if !(200..300).contains(&status) {
778            return Err(parse_api_error(status, headers, &body));
779        }
780        let request_id = request_id_from_headers(&headers);
781        let response = serde_json::from_slice::<ThreadRun>(&body)?.with_request_id(request_id);
782        Ok(response)
783    }
784
785    /// EN: Submits tool outputs for a run waiting on tool calls.
786    /// 中文:为等待工具调用的 Run 提交工具输出。
787    pub async fn submit_tool_outputs(
788        &self,
789        run_id: &str,
790        request: SubmitToolOutputsRequest,
791    ) -> Result<ThreadRun, LingerError> {
792        let thread_id = validate_thread_id(&self.thread_id)?;
793        let run_id = validate_run_id(run_id)?;
794        let client = Client {
795            config: self.config.clone(),
796            transport: self.transport.clone(),
797        };
798        let path = format!("/v1/threads/{thread_id}/runs/{run_id}/submit_tool_outputs");
799        let mut request = client.build_json_request(HttpMethod::Post, &path, &request)?;
800        apply_assistants_beta_header(&mut request);
801        let response = self.transport.send(request).await?;
802        let (status, headers, body) = response.into_bytes().await?;
803        if !(200..300).contains(&status) {
804            return Err(parse_api_error(status, headers, &body));
805        }
806        let request_id = request_id_from_headers(&headers);
807        let response = serde_json::from_slice::<ThreadRun>(&body)?.with_request_id(request_id);
808        Ok(response)
809    }
810
811    /// EN: Returns the Run Steps subresource for a run id.
812    /// 中文:返回指定 Run ID 的 Run Steps 子资源。
813    pub fn steps(&self, run_id: &str) -> RunStepsResource {
814        RunStepsResource {
815            config: self.config.clone(),
816            transport: self.transport.clone(),
817            thread_id: self.thread_id.clone(),
818            run_id: run_id.to_string(),
819        }
820    }
821}
822
823/// EN: Run Steps API resource.
824/// 中文:Run Steps API 资源。
825#[derive(Clone, Debug)]
826pub struct RunStepsResource {
827    config: ClientConfig,
828    transport: SharedTransport,
829    thread_id: String,
830    run_id: String,
831}
832
833impl RunStepsResource {
834    /// EN: Lists run steps.
835    /// 中文:列出 Run Step。
836    pub async fn list(&self) -> Result<RunStepPage, LingerError> {
837        self.list_with(RunStepListRequest::default()).await
838    }
839
840    /// EN: Lists run steps with query parameters.
841    /// 中文:使用查询参数列出 Run Step。
842    pub async fn list_with(&self, request: RunStepListRequest) -> Result<RunStepPage, LingerError> {
843        let thread_id = validate_thread_id(&self.thread_id)?;
844        let run_id = validate_run_id(&self.run_id)?;
845        let client = Client {
846            config: self.config.clone(),
847            transport: self.transport.clone(),
848        };
849        let path = request.path(thread_id, run_id);
850        let mut request = client.build_empty_request(HttpMethod::Get, &path);
851        apply_assistants_beta_header(&mut request);
852        let response = self.transport.send(request).await?;
853        let (status, headers, body) = response.into_bytes().await?;
854        if !(200..300).contains(&status) {
855            return Err(parse_api_error(status, headers, &body));
856        }
857        let request_id = request_id_from_headers(&headers);
858        let response = serde_json::from_slice::<RunStepPage>(&body)?.with_request_id(request_id);
859        Ok(response)
860    }
861
862    /// EN: Retrieves a run step.
863    /// 中文:获取 Run Step。
864    pub async fn retrieve(&self, step_id: &str) -> Result<RunStep, LingerError> {
865        self.retrieve_with(step_id, RunStepRetrieveRequest::default())
866            .await
867    }
868
869    /// EN: Retrieves a run step with query parameters.
870    /// 中文:使用查询参数获取 Run Step。
871    pub async fn retrieve_with(
872        &self,
873        step_id: &str,
874        request: RunStepRetrieveRequest,
875    ) -> Result<RunStep, LingerError> {
876        let thread_id = validate_thread_id(&self.thread_id)?;
877        let run_id = validate_run_id(&self.run_id)?;
878        let step_id = validate_step_id(step_id)?;
879        let client = Client {
880            config: self.config.clone(),
881            transport: self.transport.clone(),
882        };
883        let path = request.path(thread_id, run_id, step_id);
884        let mut request = client.build_empty_request(HttpMethod::Get, &path);
885        apply_assistants_beta_header(&mut request);
886        let response = self.transport.send(request).await?;
887        let (status, headers, body) = response.into_bytes().await?;
888        if !(200..300).contains(&status) {
889            return Err(parse_api_error(status, headers, &body));
890        }
891        let request_id = request_id_from_headers(&headers);
892        let response = serde_json::from_slice::<RunStep>(&body)?.with_request_id(request_id);
893        Ok(response)
894    }
895}
896
897/// EN: Assistants API resource.
898/// 中文:Assistants API 资源。
899#[derive(Clone, Debug)]
900pub struct AssistantsResource {
901    config: ClientConfig,
902    transport: SharedTransport,
903}
904
905impl AssistantsResource {
906    /// EN: Creates an Assistant with `POST /v1/assistants`.
907    /// 中文:使用 `POST /v1/assistants` 创建 Assistant。
908    pub async fn create(&self, request: CreateAssistantRequest) -> Result<Assistant, LingerError> {
909        let client = Client {
910            config: self.config.clone(),
911            transport: self.transport.clone(),
912        };
913        let mut request =
914            client.build_json_request(HttpMethod::Post, "/v1/assistants", &request)?;
915        apply_assistants_beta_header(&mut request);
916        let response = self.transport.send(request).await?;
917        let (status, headers, body) = response.into_bytes().await?;
918        if !(200..300).contains(&status) {
919            return Err(parse_api_error(status, headers, &body));
920        }
921        let request_id = request_id_from_headers(&headers);
922        let response = serde_json::from_slice::<Assistant>(&body)?.with_request_id(request_id);
923        Ok(response)
924    }
925
926    /// EN: Lists Assistants with `GET /v1/assistants`.
927    /// 中文:使用 `GET /v1/assistants` 列出 Assistant。
928    pub async fn list(&self) -> Result<AssistantPage, LingerError> {
929        self.list_with(AssistantListRequest::default()).await
930    }
931
932    /// EN: Lists Assistants with query parameters for `GET /v1/assistants`.
933    /// 中文:使用查询参数列出 `GET /v1/assistants` 的 Assistant。
934    pub async fn list_with(
935        &self,
936        request: AssistantListRequest,
937    ) -> Result<AssistantPage, LingerError> {
938        let client = Client {
939            config: self.config.clone(),
940            transport: self.transport.clone(),
941        };
942        let path = request.path();
943        let request = self.build_beta_empty_request(&client, HttpMethod::Get, &path);
944        let response = self.transport.send(request).await?;
945        let (status, headers, body) = response.into_bytes().await?;
946        if !(200..300).contains(&status) {
947            return Err(parse_api_error(status, headers, &body));
948        }
949        let request_id = request_id_from_headers(&headers);
950        let response = serde_json::from_slice::<AssistantPage>(&body)?.with_request_id(request_id);
951        Ok(response)
952    }
953
954    /// EN: Retrieves an Assistant with `GET /v1/assistants/{assistant_id}`.
955    /// 中文:使用 `GET /v1/assistants/{assistant_id}` 获取 Assistant。
956    pub async fn retrieve(&self, assistant_id: &str) -> Result<Assistant, LingerError> {
957        let assistant_id = validate_assistant_id(assistant_id)?;
958        let client = Client {
959            config: self.config.clone(),
960            transport: self.transport.clone(),
961        };
962        let path = format!("/v1/assistants/{assistant_id}");
963        let request = self.build_beta_empty_request(&client, HttpMethod::Get, &path);
964        let response = self.transport.send(request).await?;
965        let (status, headers, body) = response.into_bytes().await?;
966        if !(200..300).contains(&status) {
967            return Err(parse_api_error(status, headers, &body));
968        }
969        let request_id = request_id_from_headers(&headers);
970        let response = serde_json::from_slice::<Assistant>(&body)?.with_request_id(request_id);
971        Ok(response)
972    }
973
974    /// EN: Modifies an Assistant with `POST /v1/assistants/{assistant_id}`.
975    /// 中文:使用 `POST /v1/assistants/{assistant_id}` 修改 Assistant。
976    pub async fn modify(
977        &self,
978        assistant_id: &str,
979        request: ModifyAssistantRequest,
980    ) -> Result<Assistant, LingerError> {
981        let assistant_id = validate_assistant_id(assistant_id)?;
982        let client = Client {
983            config: self.config.clone(),
984            transport: self.transport.clone(),
985        };
986        let path = format!("/v1/assistants/{assistant_id}");
987        let mut request = client.build_json_request(HttpMethod::Post, &path, &request)?;
988        apply_assistants_beta_header(&mut request);
989        let response = self.transport.send(request).await?;
990        let (status, headers, body) = response.into_bytes().await?;
991        if !(200..300).contains(&status) {
992            return Err(parse_api_error(status, headers, &body));
993        }
994        let request_id = request_id_from_headers(&headers);
995        let response = serde_json::from_slice::<Assistant>(&body)?.with_request_id(request_id);
996        Ok(response)
997    }
998
999    /// EN: Deletes an Assistant with `DELETE /v1/assistants/{assistant_id}`.
1000    /// 中文:使用 `DELETE /v1/assistants/{assistant_id}` 删除 Assistant。
1001    pub async fn delete(&self, assistant_id: &str) -> Result<AssistantDeletion, LingerError> {
1002        let assistant_id = validate_assistant_id(assistant_id)?;
1003        let client = Client {
1004            config: self.config.clone(),
1005            transport: self.transport.clone(),
1006        };
1007        let path = format!("/v1/assistants/{assistant_id}");
1008        let request = self.build_beta_empty_request(&client, HttpMethod::Delete, &path);
1009        let response = self.transport.send(request).await?;
1010        let (status, headers, body) = response.into_bytes().await?;
1011        if !(200..300).contains(&status) {
1012            return Err(parse_api_error(status, headers, &body));
1013        }
1014        let request_id = request_id_from_headers(&headers);
1015        let response =
1016            serde_json::from_slice::<AssistantDeletion>(&body)?.with_request_id(request_id);
1017        Ok(response)
1018    }
1019
1020    fn build_beta_empty_request(
1021        &self,
1022        client: &Client,
1023        method: HttpMethod,
1024        path: &str,
1025    ) -> HttpRequest {
1026        let mut request = client.build_empty_request(method, path);
1027        apply_assistants_beta_header(&mut request);
1028        request
1029    }
1030}
1031
1032/// EN: Vector Stores API resource.
1033/// 中文:Vector Stores API 资源。
1034#[derive(Clone, Debug)]
1035pub struct VectorStoresResource {
1036    config: ClientConfig,
1037    transport: SharedTransport,
1038}
1039
1040impl VectorStoresResource {
1041    /// EN: Creates a vector store with `POST /v1/vector_stores`.
1042    /// 中文:使用 `POST /v1/vector_stores` 创建向量存储。
1043    pub async fn create(
1044        &self,
1045        request: CreateVectorStoreRequest,
1046    ) -> Result<VectorStore, LingerError> {
1047        let client = Client {
1048            config: self.config.clone(),
1049            transport: self.transport.clone(),
1050        };
1051        let request = client.build_json_request(HttpMethod::Post, "/v1/vector_stores", &request)?;
1052        let response = self.transport.send(request).await?;
1053        let (status, headers, body) = response.into_bytes().await?;
1054        if !(200..300).contains(&status) {
1055            return Err(parse_api_error(status, headers, &body));
1056        }
1057        let request_id = request_id_from_headers(&headers);
1058        let response = serde_json::from_slice::<VectorStore>(&body)?.with_request_id(request_id);
1059        Ok(response)
1060    }
1061
1062    /// EN: Lists vector stores with `GET /v1/vector_stores`.
1063    /// 中文:使用 `GET /v1/vector_stores` 列出向量存储。
1064    pub async fn list(&self) -> Result<VectorStorePage, LingerError> {
1065        let client = Client {
1066            config: self.config.clone(),
1067            transport: self.transport.clone(),
1068        };
1069        let (headers, body) = client.send_retryable_get("/v1/vector_stores").await?;
1070        let request_id = request_id_from_headers(&headers);
1071        let response =
1072            serde_json::from_slice::<VectorStorePage>(&body)?.with_request_id(request_id);
1073        Ok(response)
1074    }
1075
1076    /// EN: Retrieves a vector store with `GET /v1/vector_stores/{vector_store_id}`.
1077    /// 中文:使用 `GET /v1/vector_stores/{vector_store_id}` 获取向量存储。
1078    pub async fn retrieve(&self, vector_store_id: &str) -> Result<VectorStore, LingerError> {
1079        let vector_store_id = validate_vector_store_id(vector_store_id)?;
1080        let client = Client {
1081            config: self.config.clone(),
1082            transport: self.transport.clone(),
1083        };
1084        let path = format!("/v1/vector_stores/{vector_store_id}");
1085        let (headers, body) = client.send_retryable_get(&path).await?;
1086        let request_id = request_id_from_headers(&headers);
1087        let response = serde_json::from_slice::<VectorStore>(&body)?.with_request_id(request_id);
1088        Ok(response)
1089    }
1090
1091    /// EN: Modifies a vector store with `POST /v1/vector_stores/{vector_store_id}`.
1092    /// 中文:使用 `POST /v1/vector_stores/{vector_store_id}` 修改向量存储。
1093    pub async fn modify(
1094        &self,
1095        vector_store_id: &str,
1096        request: ModifyVectorStoreRequest,
1097    ) -> Result<VectorStore, LingerError> {
1098        let vector_store_id = validate_vector_store_id(vector_store_id)?;
1099        let client = Client {
1100            config: self.config.clone(),
1101            transport: self.transport.clone(),
1102        };
1103        let path = format!("/v1/vector_stores/{vector_store_id}");
1104        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
1105        let response = self.transport.send(request).await?;
1106        let (status, headers, body) = response.into_bytes().await?;
1107        if !(200..300).contains(&status) {
1108            return Err(parse_api_error(status, headers, &body));
1109        }
1110        let request_id = request_id_from_headers(&headers);
1111        let response = serde_json::from_slice::<VectorStore>(&body)?.with_request_id(request_id);
1112        Ok(response)
1113    }
1114
1115    /// EN: Searches a vector store with `POST /v1/vector_stores/{vector_store_id}/search`.
1116    /// 中文:使用 `POST /v1/vector_stores/{vector_store_id}/search` 搜索向量存储。
1117    pub async fn search(
1118        &self,
1119        vector_store_id: &str,
1120        request: CreateVectorStoreSearchRequest,
1121    ) -> Result<VectorStoreSearchPage, LingerError> {
1122        let vector_store_id = validate_vector_store_id(vector_store_id)?;
1123        let client = Client {
1124            config: self.config.clone(),
1125            transport: self.transport.clone(),
1126        };
1127        let path = format!("/v1/vector_stores/{vector_store_id}/search");
1128        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
1129        let response = self.transport.send(request).await?;
1130        let (status, headers, body) = response.into_bytes().await?;
1131        if !(200..300).contains(&status) {
1132            return Err(parse_api_error(status, headers, &body));
1133        }
1134        let request_id = request_id_from_headers(&headers);
1135        let response =
1136            serde_json::from_slice::<VectorStoreSearchPage>(&body)?.with_request_id(request_id);
1137        Ok(response)
1138    }
1139
1140    /// EN: Deletes a vector store with `DELETE /v1/vector_stores/{vector_store_id}`.
1141    /// 中文:使用 `DELETE /v1/vector_stores/{vector_store_id}` 删除向量存储。
1142    pub async fn delete(&self, vector_store_id: &str) -> Result<VectorStoreDeletion, LingerError> {
1143        let vector_store_id = validate_vector_store_id(vector_store_id)?;
1144        let client = Client {
1145            config: self.config.clone(),
1146            transport: self.transport.clone(),
1147        };
1148        let path = format!("/v1/vector_stores/{vector_store_id}");
1149        let request = client.build_empty_request(HttpMethod::Delete, &path);
1150        let response = self.transport.send(request).await?;
1151        let (status, headers, body) = response.into_bytes().await?;
1152        if !(200..300).contains(&status) {
1153            return Err(parse_api_error(status, headers, &body));
1154        }
1155        let request_id = request_id_from_headers(&headers);
1156        let response =
1157            serde_json::from_slice::<VectorStoreDeletion>(&body)?.with_request_id(request_id);
1158        Ok(response)
1159    }
1160
1161    /// EN: Returns the Vector Store Files subresource for a vector store id.
1162    /// 中文:返回指定向量存储 ID 的 Vector Store Files 子资源。
1163    pub fn files(&self, vector_store_id: &str) -> VectorStoreFilesResource {
1164        VectorStoreFilesResource {
1165            config: self.config.clone(),
1166            transport: self.transport.clone(),
1167            vector_store_id: vector_store_id.to_string(),
1168        }
1169    }
1170
1171    /// EN: Returns the Vector Store File Batches subresource for a vector store id.
1172    /// 中文:返回指定向量存储 ID 的 Vector Store File Batches 子资源。
1173    pub fn file_batches(&self, vector_store_id: &str) -> VectorStoreFileBatchesResource {
1174        VectorStoreFileBatchesResource {
1175            config: self.config.clone(),
1176            transport: self.transport.clone(),
1177            vector_store_id: vector_store_id.to_string(),
1178        }
1179    }
1180}
1181
1182/// EN: Vector Store Files API resource.
1183/// 中文:Vector Store Files API 资源。
1184#[derive(Clone, Debug)]
1185pub struct VectorStoreFilesResource {
1186    config: ClientConfig,
1187    transport: SharedTransport,
1188    vector_store_id: String,
1189}
1190
1191impl VectorStoreFilesResource {
1192    /// EN: Attaches a file with `POST /v1/vector_stores/{vector_store_id}/files`.
1193    /// 中文:使用 `POST /v1/vector_stores/{vector_store_id}/files` 附加文件。
1194    pub async fn create(
1195        &self,
1196        request: CreateVectorStoreFileRequest,
1197    ) -> Result<VectorStoreFile, LingerError> {
1198        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1199        let client = Client {
1200            config: self.config.clone(),
1201            transport: self.transport.clone(),
1202        };
1203        let path = format!("/v1/vector_stores/{vector_store_id}/files");
1204        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
1205        let response = self.transport.send(request).await?;
1206        let (status, headers, body) = response.into_bytes().await?;
1207        if !(200..300).contains(&status) {
1208            return Err(parse_api_error(status, headers, &body));
1209        }
1210        let request_id = request_id_from_headers(&headers);
1211        let response =
1212            serde_json::from_slice::<VectorStoreFile>(&body)?.with_request_id(request_id);
1213        Ok(response)
1214    }
1215
1216    /// EN: Lists vector store files.
1217    /// 中文:列出向量存储文件。
1218    pub async fn list(&self) -> Result<VectorStoreFilePage, LingerError> {
1219        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1220        let client = Client {
1221            config: self.config.clone(),
1222            transport: self.transport.clone(),
1223        };
1224        let path = format!("/v1/vector_stores/{vector_store_id}/files");
1225        let (headers, body) = client.send_retryable_get(&path).await?;
1226        let request_id = request_id_from_headers(&headers);
1227        let response =
1228            serde_json::from_slice::<VectorStoreFilePage>(&body)?.with_request_id(request_id);
1229        Ok(response)
1230    }
1231
1232    /// EN: Retrieves a vector store file.
1233    /// 中文:获取向量存储文件。
1234    pub async fn retrieve(&self, file_id: &str) -> Result<VectorStoreFile, LingerError> {
1235        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1236        let file_id = validate_file_id(file_id)?;
1237        let client = Client {
1238            config: self.config.clone(),
1239            transport: self.transport.clone(),
1240        };
1241        let path = format!("/v1/vector_stores/{vector_store_id}/files/{file_id}");
1242        let (headers, body) = client.send_retryable_get(&path).await?;
1243        let request_id = request_id_from_headers(&headers);
1244        let response =
1245            serde_json::from_slice::<VectorStoreFile>(&body)?.with_request_id(request_id);
1246        Ok(response)
1247    }
1248
1249    /// EN: Retrieves parsed vector store file content.
1250    /// 中文:获取向量存储文件的已解析内容。
1251    pub async fn content(&self, file_id: &str) -> Result<VectorStoreFileContentPage, LingerError> {
1252        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1253        let file_id = validate_file_id(file_id)?;
1254        let client = Client {
1255            config: self.config.clone(),
1256            transport: self.transport.clone(),
1257        };
1258        let path = format!("/v1/vector_stores/{vector_store_id}/files/{file_id}/content");
1259        let (headers, body) = client.send_retryable_get(&path).await?;
1260        let request_id = request_id_from_headers(&headers);
1261        let response = serde_json::from_slice::<VectorStoreFileContentPage>(&body)?
1262            .with_request_id(request_id);
1263        Ok(response)
1264    }
1265
1266    /// EN: Modifies vector store file attributes.
1267    /// 中文:修改向量存储文件属性。
1268    pub async fn modify(
1269        &self,
1270        file_id: &str,
1271        request: ModifyVectorStoreFileRequest,
1272    ) -> Result<VectorStoreFile, LingerError> {
1273        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1274        let file_id = validate_file_id(file_id)?;
1275        let client = Client {
1276            config: self.config.clone(),
1277            transport: self.transport.clone(),
1278        };
1279        let path = format!("/v1/vector_stores/{vector_store_id}/files/{file_id}");
1280        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
1281        let response = self.transport.send(request).await?;
1282        let (status, headers, body) = response.into_bytes().await?;
1283        if !(200..300).contains(&status) {
1284            return Err(parse_api_error(status, headers, &body));
1285        }
1286        let request_id = request_id_from_headers(&headers);
1287        let response =
1288            serde_json::from_slice::<VectorStoreFile>(&body)?.with_request_id(request_id);
1289        Ok(response)
1290    }
1291
1292    /// EN: Deletes a vector store file.
1293    /// 中文:删除向量存储文件。
1294    pub async fn delete(&self, file_id: &str) -> Result<VectorStoreFileDeletion, LingerError> {
1295        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1296        let file_id = validate_file_id(file_id)?;
1297        let client = Client {
1298            config: self.config.clone(),
1299            transport: self.transport.clone(),
1300        };
1301        let path = format!("/v1/vector_stores/{vector_store_id}/files/{file_id}");
1302        let request = client.build_empty_request(HttpMethod::Delete, &path);
1303        let response = self.transport.send(request).await?;
1304        let (status, headers, body) = response.into_bytes().await?;
1305        if !(200..300).contains(&status) {
1306            return Err(parse_api_error(status, headers, &body));
1307        }
1308        let request_id = request_id_from_headers(&headers);
1309        let response =
1310            serde_json::from_slice::<VectorStoreFileDeletion>(&body)?.with_request_id(request_id);
1311        Ok(response)
1312    }
1313}
1314
1315/// EN: Vector Store File Batches API resource.
1316/// 中文:Vector Store File Batches API 资源。
1317#[derive(Clone, Debug)]
1318pub struct VectorStoreFileBatchesResource {
1319    config: ClientConfig,
1320    transport: SharedTransport,
1321    vector_store_id: String,
1322}
1323
1324impl VectorStoreFileBatchesResource {
1325    /// EN: Creates a file batch with `POST /v1/vector_stores/{vector_store_id}/file_batches`.
1326    /// 中文:使用 `POST /v1/vector_stores/{vector_store_id}/file_batches` 创建文件批量。
1327    pub async fn create(
1328        &self,
1329        request: CreateVectorStoreFileBatchRequest,
1330    ) -> Result<VectorStoreFileBatch, LingerError> {
1331        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1332        let client = Client {
1333            config: self.config.clone(),
1334            transport: self.transport.clone(),
1335        };
1336        let path = format!("/v1/vector_stores/{vector_store_id}/file_batches");
1337        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
1338        let response = self.transport.send(request).await?;
1339        let (status, headers, body) = response.into_bytes().await?;
1340        if !(200..300).contains(&status) {
1341            return Err(parse_api_error(status, headers, &body));
1342        }
1343        let request_id = request_id_from_headers(&headers);
1344        let response =
1345            serde_json::from_slice::<VectorStoreFileBatch>(&body)?.with_request_id(request_id);
1346        Ok(response)
1347    }
1348
1349    /// EN: Retrieves a vector store file batch.
1350    /// 中文:获取向量存储文件批量。
1351    pub async fn retrieve(&self, batch_id: &str) -> Result<VectorStoreFileBatch, LingerError> {
1352        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1353        let batch_id = validate_batch_id(batch_id)?;
1354        let client = Client {
1355            config: self.config.clone(),
1356            transport: self.transport.clone(),
1357        };
1358        let path = format!("/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}");
1359        let (headers, body) = client.send_retryable_get(&path).await?;
1360        let request_id = request_id_from_headers(&headers);
1361        let response =
1362            serde_json::from_slice::<VectorStoreFileBatch>(&body)?.with_request_id(request_id);
1363        Ok(response)
1364    }
1365
1366    /// EN: Cancels a vector store file batch.
1367    /// 中文:取消向量存储文件批量。
1368    pub async fn cancel(&self, batch_id: &str) -> Result<VectorStoreFileBatch, LingerError> {
1369        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1370        let batch_id = validate_batch_id(batch_id)?;
1371        let client = Client {
1372            config: self.config.clone(),
1373            transport: self.transport.clone(),
1374        };
1375        let path = format!("/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}/cancel");
1376        let request = client.build_empty_request(HttpMethod::Post, &path);
1377        let response = self.transport.send(request).await?;
1378        let (status, headers, body) = response.into_bytes().await?;
1379        if !(200..300).contains(&status) {
1380            return Err(parse_api_error(status, headers, &body));
1381        }
1382        let request_id = request_id_from_headers(&headers);
1383        let response =
1384            serde_json::from_slice::<VectorStoreFileBatch>(&body)?.with_request_id(request_id);
1385        Ok(response)
1386    }
1387
1388    /// EN: Lists files in a vector store file batch.
1389    /// 中文:列出向量存储文件批量中的文件。
1390    pub async fn list_files(&self, batch_id: &str) -> Result<VectorStoreFilePage, LingerError> {
1391        let vector_store_id = validate_vector_store_id(&self.vector_store_id)?;
1392        let batch_id = validate_batch_id(batch_id)?;
1393        let client = Client {
1394            config: self.config.clone(),
1395            transport: self.transport.clone(),
1396        };
1397        let path = format!("/v1/vector_stores/{vector_store_id}/file_batches/{batch_id}/files");
1398        let (headers, body) = client.send_retryable_get(&path).await?;
1399        let request_id = request_id_from_headers(&headers);
1400        let response =
1401            serde_json::from_slice::<VectorStoreFilePage>(&body)?.with_request_id(request_id);
1402        Ok(response)
1403    }
1404}
1405
1406/// EN: Uploads API resource.
1407/// 中文:Uploads API 资源。
1408#[derive(Clone, Debug)]
1409pub struct UploadsResource {
1410    config: ClientConfig,
1411    transport: SharedTransport,
1412}
1413
1414impl UploadsResource {
1415    /// EN: Creates an upload with `POST /v1/uploads`.
1416    /// 中文:使用 `POST /v1/uploads` 创建上传。
1417    pub async fn create(&self, request: CreateUploadRequest) -> Result<Upload, LingerError> {
1418        let client = Client {
1419            config: self.config.clone(),
1420            transport: self.transport.clone(),
1421        };
1422        let request = client.build_json_request(HttpMethod::Post, "/v1/uploads", &request)?;
1423        let response = self.transport.send(request).await?;
1424        let (status, headers, body) = response.into_bytes().await?;
1425        if !(200..300).contains(&status) {
1426            return Err(parse_api_error(status, headers, &body));
1427        }
1428        let request_id = request_id_from_headers(&headers);
1429        let response = serde_json::from_slice::<Upload>(&body)?.with_request_id(request_id);
1430        Ok(response)
1431    }
1432
1433    /// EN: Returns the upload parts subresource for an upload id.
1434    /// 中文:返回指定上传 ID 的上传分段子资源。
1435    pub fn parts(&self, upload_id: &str) -> UploadPartsResource {
1436        UploadPartsResource {
1437            config: self.config.clone(),
1438            transport: self.transport.clone(),
1439            upload_id: upload_id.to_string(),
1440        }
1441    }
1442
1443    /// EN: Completes an upload with `POST /v1/uploads/{upload_id}/complete`.
1444    /// 中文:使用 `POST /v1/uploads/{upload_id}/complete` 完成上传。
1445    pub async fn complete(
1446        &self,
1447        upload_id: &str,
1448        request: CompleteUploadRequest,
1449    ) -> Result<Upload, LingerError> {
1450        let upload_id = validate_upload_id(upload_id)?;
1451        let client = Client {
1452            config: self.config.clone(),
1453            transport: self.transport.clone(),
1454        };
1455        let path = format!("/v1/uploads/{upload_id}/complete");
1456        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
1457        let response = self.transport.send(request).await?;
1458        let (status, headers, body) = response.into_bytes().await?;
1459        if !(200..300).contains(&status) {
1460            return Err(parse_api_error(status, headers, &body));
1461        }
1462        let request_id = request_id_from_headers(&headers);
1463        let response = serde_json::from_slice::<Upload>(&body)?.with_request_id(request_id);
1464        Ok(response)
1465    }
1466
1467    /// EN: Cancels an upload with `POST /v1/uploads/{upload_id}/cancel`.
1468    /// 中文:使用 `POST /v1/uploads/{upload_id}/cancel` 取消上传。
1469    pub async fn cancel(&self, upload_id: &str) -> Result<Upload, LingerError> {
1470        let upload_id = validate_upload_id(upload_id)?;
1471        let client = Client {
1472            config: self.config.clone(),
1473            transport: self.transport.clone(),
1474        };
1475        let path = format!("/v1/uploads/{upload_id}/cancel");
1476        let request = client.build_empty_request(HttpMethod::Post, &path);
1477        let response = self.transport.send(request).await?;
1478        let (status, headers, body) = response.into_bytes().await?;
1479        if !(200..300).contains(&status) {
1480            return Err(parse_api_error(status, headers, &body));
1481        }
1482        let request_id = request_id_from_headers(&headers);
1483        let response = serde_json::from_slice::<Upload>(&body)?.with_request_id(request_id);
1484        Ok(response)
1485    }
1486}
1487
1488/// EN: Upload Parts API resource.
1489/// 中文:Upload Parts API 资源。
1490#[derive(Clone, Debug)]
1491pub struct UploadPartsResource {
1492    config: ClientConfig,
1493    transport: SharedTransport,
1494    upload_id: String,
1495}
1496
1497impl UploadPartsResource {
1498    /// EN: Adds a part to an upload with `POST /v1/uploads/{upload_id}/parts`.
1499    /// 中文:使用 `POST /v1/uploads/{upload_id}/parts` 向上传添加分段。
1500    pub async fn create(
1501        &self,
1502        request: CreateUploadPartRequest,
1503    ) -> Result<UploadPart, LingerError> {
1504        let upload_id = validate_upload_id(&self.upload_id)?;
1505        let client = Client {
1506            config: self.config.clone(),
1507            transport: self.transport.clone(),
1508        };
1509        let path = format!("/v1/uploads/{upload_id}/parts");
1510        let mut http_request = client.build_empty_request(HttpMethod::Post, &path);
1511        request.apply_multipart_body(&mut http_request);
1512        let response = self.transport.send(http_request).await?;
1513        let (status, headers, body) = response.into_bytes().await?;
1514        if !(200..300).contains(&status) {
1515            return Err(parse_api_error(status, headers, &body));
1516        }
1517        let request_id = request_id_from_headers(&headers);
1518        let response = serde_json::from_slice::<UploadPart>(&body)?.with_request_id(request_id);
1519        Ok(response)
1520    }
1521}
1522
1523/// EN: Audio API resource.
1524/// 中文:Audio API 资源。
1525#[derive(Clone, Debug)]
1526pub struct AudioResource {
1527    config: ClientConfig,
1528    transport: SharedTransport,
1529}
1530
1531impl AudioResource {
1532    /// EN: Returns the Audio Speech API resource.
1533    /// 中文:返回 Audio Speech API 资源。
1534    pub fn speech(&self) -> AudioSpeechResource {
1535        AudioSpeechResource {
1536            config: self.config.clone(),
1537            transport: self.transport.clone(),
1538        }
1539    }
1540
1541    /// EN: Returns the Audio Transcriptions API resource.
1542    /// 中文:返回 Audio Transcriptions API 资源。
1543    pub fn transcriptions(&self) -> AudioTranscriptionsResource {
1544        AudioTranscriptionsResource {
1545            config: self.config.clone(),
1546            transport: self.transport.clone(),
1547        }
1548    }
1549
1550    /// EN: Returns the Audio Translations API resource.
1551    /// 中文:返回 Audio Translations API 资源。
1552    pub fn translations(&self) -> AudioTranslationsResource {
1553        AudioTranslationsResource {
1554            config: self.config.clone(),
1555            transport: self.transport.clone(),
1556        }
1557    }
1558
1559    /// EN: Returns the Audio Voice Consents API resource.
1560    /// 中文:返回 Audio Voice Consents API 资源。
1561    pub fn voice_consents(&self) -> AudioVoiceConsentsResource {
1562        AudioVoiceConsentsResource {
1563            config: self.config.clone(),
1564            transport: self.transport.clone(),
1565        }
1566    }
1567
1568    /// EN: Returns the Audio Voices API resource.
1569    /// 中文:返回 Audio Voices API 资源。
1570    pub fn voices(&self) -> AudioVoicesResource {
1571        AudioVoicesResource {
1572            config: self.config.clone(),
1573            transport: self.transport.clone(),
1574        }
1575    }
1576}
1577
1578/// EN: Audio Speech API resource.
1579/// 中文:Audio Speech API 资源。
1580#[derive(Clone, Debug)]
1581pub struct AudioSpeechResource {
1582    config: ClientConfig,
1583    transport: SharedTransport,
1584}
1585
1586impl AudioSpeechResource {
1587    /// EN: Creates speech audio with `POST /v1/audio/speech`.
1588    /// 中文:使用 `POST /v1/audio/speech` 创建语音音频。
1589    pub async fn create(
1590        &self,
1591        request: CreateSpeechRequest,
1592    ) -> Result<AudioSpeechResponse, LingerError> {
1593        let client = Client {
1594            config: self.config.clone(),
1595            transport: self.transport.clone(),
1596        };
1597        let request = client.build_json_request(HttpMethod::Post, "/v1/audio/speech", &request)?;
1598        let response = self.transport.send(request).await?;
1599        let status = response.status();
1600        if !(200..300).contains(&status) {
1601            let (status, headers, body) = response.into_bytes().await?;
1602            return Err(parse_api_error(status, headers, &body));
1603        }
1604        let request_id = request_id_from_headers(response.headers());
1605        let content_type = response.headers().get("content-type").map(str::to_string);
1606        Ok(AudioSpeechResponse::new(
1607            request_id,
1608            content_type,
1609            response.into_body_stream(),
1610        ))
1611    }
1612}
1613
1614/// EN: Audio Transcriptions API resource.
1615/// 中文:Audio Transcriptions API 资源。
1616#[derive(Clone, Debug)]
1617pub struct AudioTranscriptionsResource {
1618    config: ClientConfig,
1619    transport: SharedTransport,
1620}
1621
1622impl AudioTranscriptionsResource {
1623    /// EN: Creates a transcription with `POST /v1/audio/transcriptions`.
1624    /// 中文:使用 `POST /v1/audio/transcriptions` 创建转写。
1625    pub async fn create(
1626        &self,
1627        request: CreateTranscriptionRequest,
1628    ) -> Result<AudioTranscription, LingerError> {
1629        let client = Client {
1630            config: self.config.clone(),
1631            transport: self.transport.clone(),
1632        };
1633        let mut http_request =
1634            client.build_empty_request(HttpMethod::Post, "/v1/audio/transcriptions");
1635        request.apply_multipart_body(&mut http_request);
1636        let response = self.transport.send(http_request).await?;
1637        let (status, headers, body) = response.into_bytes().await?;
1638        if !(200..300).contains(&status) {
1639            return Err(parse_api_error(status, headers, &body));
1640        }
1641        let request_id = request_id_from_headers(&headers);
1642        let response =
1643            serde_json::from_slice::<AudioTranscription>(&body)?.with_request_id(request_id);
1644        Ok(response)
1645    }
1646}
1647
1648/// EN: Audio Translations API resource.
1649/// 中文:Audio Translations API 资源。
1650#[derive(Clone, Debug)]
1651pub struct AudioTranslationsResource {
1652    config: ClientConfig,
1653    transport: SharedTransport,
1654}
1655
1656impl AudioTranslationsResource {
1657    /// EN: Creates a translation with `POST /v1/audio/translations`.
1658    /// 中文:使用 `POST /v1/audio/translations` 创建翻译。
1659    pub async fn create(
1660        &self,
1661        request: CreateTranslationRequest,
1662    ) -> Result<AudioTranslation, LingerError> {
1663        let client = Client {
1664            config: self.config.clone(),
1665            transport: self.transport.clone(),
1666        };
1667        let mut http_request =
1668            client.build_empty_request(HttpMethod::Post, "/v1/audio/translations");
1669        request.apply_multipart_body(&mut http_request);
1670        let response = self.transport.send(http_request).await?;
1671        let (status, headers, body) = response.into_bytes().await?;
1672        if !(200..300).contains(&status) {
1673            return Err(parse_api_error(status, headers, &body));
1674        }
1675        let request_id = request_id_from_headers(&headers);
1676        let response =
1677            serde_json::from_slice::<AudioTranslation>(&body)?.with_request_id(request_id);
1678        Ok(response)
1679    }
1680}
1681
1682/// EN: Audio Voice Consents API resource.
1683/// 中文:Audio Voice Consents API 资源。
1684#[derive(Clone, Debug)]
1685pub struct AudioVoiceConsentsResource {
1686    config: ClientConfig,
1687    transport: SharedTransport,
1688}
1689
1690impl AudioVoiceConsentsResource {
1691    /// EN: Creates a voice consent recording with `POST /v1/audio/voice_consents`.
1692    /// 中文:使用 `POST /v1/audio/voice_consents` 创建 voice consent 录音。
1693    pub async fn create(
1694        &self,
1695        request: CreateVoiceConsentRequest,
1696    ) -> Result<AudioVoiceConsent, LingerError> {
1697        let client = Client {
1698            config: self.config.clone(),
1699            transport: self.transport.clone(),
1700        };
1701        let mut http_request =
1702            client.build_empty_request(HttpMethod::Post, "/v1/audio/voice_consents");
1703        request.apply_multipart_body(&mut http_request);
1704        let response = self.transport.send(http_request).await?;
1705        let (status, headers, body) = response.into_bytes().await?;
1706        if !(200..300).contains(&status) {
1707            return Err(parse_api_error(status, headers, &body));
1708        }
1709        let request_id = request_id_from_headers(&headers);
1710        let response =
1711            serde_json::from_slice::<AudioVoiceConsent>(&body)?.with_request_id(request_id);
1712        Ok(response)
1713    }
1714
1715    /// EN: Lists voice consent recordings with `GET /v1/audio/voice_consents`.
1716    /// 中文:使用 `GET /v1/audio/voice_consents` 列出 voice consent 录音。
1717    pub async fn list(&self) -> Result<AudioVoiceConsentPage, LingerError> {
1718        self.list_with(AudioVoiceConsentListRequest::default())
1719            .await
1720    }
1721
1722    /// EN: Lists voice consent recordings with query parameters for `GET /v1/audio/voice_consents`.
1723    /// 中文:使用查询参数列出 `GET /v1/audio/voice_consents` 的 voice consent 录音。
1724    pub async fn list_with(
1725        &self,
1726        request: AudioVoiceConsentListRequest,
1727    ) -> Result<AudioVoiceConsentPage, LingerError> {
1728        let client = Client {
1729            config: self.config.clone(),
1730            transport: self.transport.clone(),
1731        };
1732        let path = request.path();
1733        let (headers, body) = client.send_retryable_get(&path).await?;
1734        let request_id = request_id_from_headers(&headers);
1735        let response =
1736            serde_json::from_slice::<AudioVoiceConsentPage>(&body)?.with_request_id(request_id);
1737        Ok(response)
1738    }
1739
1740    /// EN: Retrieves a voice consent recording.
1741    /// 中文:获取 voice consent 录音。
1742    pub async fn retrieve(&self, voice_consent_id: &str) -> Result<AudioVoiceConsent, LingerError> {
1743        let voice_consent_id = validate_voice_consent_id(voice_consent_id)?;
1744        let client = Client {
1745            config: self.config.clone(),
1746            transport: self.transport.clone(),
1747        };
1748        let path = format!("/v1/audio/voice_consents/{voice_consent_id}");
1749        let (headers, body) = client.send_retryable_get(&path).await?;
1750        let request_id = request_id_from_headers(&headers);
1751        let response =
1752            serde_json::from_slice::<AudioVoiceConsent>(&body)?.with_request_id(request_id);
1753        Ok(response)
1754    }
1755
1756    /// EN: Updates voice consent metadata with `POST /v1/audio/voice_consents/{consent_id}`.
1757    /// 中文:使用 `POST /v1/audio/voice_consents/{consent_id}` 更新 voice consent 元数据。
1758    pub async fn update(
1759        &self,
1760        voice_consent_id: &str,
1761        request: UpdateVoiceConsentRequest,
1762    ) -> Result<AudioVoiceConsent, LingerError> {
1763        let voice_consent_id = validate_voice_consent_id(voice_consent_id)?;
1764        let client = Client {
1765            config: self.config.clone(),
1766            transport: self.transport.clone(),
1767        };
1768        let path = format!("/v1/audio/voice_consents/{voice_consent_id}");
1769        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
1770        let response = self.transport.send(request).await?;
1771        let (status, headers, body) = response.into_bytes().await?;
1772        if !(200..300).contains(&status) {
1773            return Err(parse_api_error(status, headers, &body));
1774        }
1775        let request_id = request_id_from_headers(&headers);
1776        let response =
1777            serde_json::from_slice::<AudioVoiceConsent>(&body)?.with_request_id(request_id);
1778        Ok(response)
1779    }
1780
1781    /// EN: Deletes a voice consent recording.
1782    /// 中文:删除 voice consent 录音。
1783    pub async fn delete(
1784        &self,
1785        voice_consent_id: &str,
1786    ) -> Result<AudioVoiceConsentDeletion, LingerError> {
1787        let voice_consent_id = validate_voice_consent_id(voice_consent_id)?;
1788        let client = Client {
1789            config: self.config.clone(),
1790            transport: self.transport.clone(),
1791        };
1792        let path = format!("/v1/audio/voice_consents/{voice_consent_id}");
1793        let request = client.build_empty_request(HttpMethod::Delete, &path);
1794        let response = self.transport.send(request).await?;
1795        let (status, headers, body) = response.into_bytes().await?;
1796        if !(200..300).contains(&status) {
1797            return Err(parse_api_error(status, headers, &body));
1798        }
1799        let request_id = request_id_from_headers(&headers);
1800        let response =
1801            serde_json::from_slice::<AudioVoiceConsentDeletion>(&body)?.with_request_id(request_id);
1802        Ok(response)
1803    }
1804}
1805
1806/// EN: Audio Voices API resource.
1807/// 中文:Audio Voices API 资源。
1808#[derive(Clone, Debug)]
1809pub struct AudioVoicesResource {
1810    config: ClientConfig,
1811    transport: SharedTransport,
1812}
1813
1814impl AudioVoicesResource {
1815    /// EN: Creates a custom voice with `POST /v1/audio/voices`.
1816    /// 中文:使用 `POST /v1/audio/voices` 创建自定义 voice。
1817    pub async fn create(&self, request: CreateVoiceRequest) -> Result<AudioVoice, LingerError> {
1818        let client = Client {
1819            config: self.config.clone(),
1820            transport: self.transport.clone(),
1821        };
1822        let mut http_request = client.build_empty_request(HttpMethod::Post, "/v1/audio/voices");
1823        request.apply_multipart_body(&mut http_request);
1824        let response = self.transport.send(http_request).await?;
1825        let (status, headers, body) = response.into_bytes().await?;
1826        if !(200..300).contains(&status) {
1827            return Err(parse_api_error(status, headers, &body));
1828        }
1829        let request_id = request_id_from_headers(&headers);
1830        let response = serde_json::from_slice::<AudioVoice>(&body)?.with_request_id(request_id);
1831        Ok(response)
1832    }
1833}
1834
1835/// EN: Images API resource.
1836/// 中文:Images API 资源。
1837#[derive(Clone, Debug)]
1838pub struct ImagesResource {
1839    config: ClientConfig,
1840    transport: SharedTransport,
1841}
1842
1843impl ImagesResource {
1844    /// EN: Generates images with `POST /v1/images/generations`.
1845    /// 中文:使用 `POST /v1/images/generations` 生成图像。
1846    pub async fn generate(
1847        &self,
1848        request: CreateImageRequest,
1849    ) -> Result<ImagesResponse, LingerError> {
1850        let client = Client {
1851            config: self.config.clone(),
1852            transport: self.transport.clone(),
1853        };
1854        let request =
1855            client.build_json_request(HttpMethod::Post, "/v1/images/generations", &request)?;
1856        let response = self.transport.send(request).await?;
1857        let (status, headers, body) = response.into_bytes().await?;
1858        if !(200..300).contains(&status) {
1859            return Err(parse_api_error(status, headers, &body));
1860        }
1861        let request_id = request_id_from_headers(&headers);
1862        let response = serde_json::from_slice::<ImagesResponse>(&body)?.with_request_id(request_id);
1863        Ok(response)
1864    }
1865
1866    /// EN: Edits images with `POST /v1/images/edits`.
1867    /// 中文:使用 `POST /v1/images/edits` 编辑图像。
1868    pub async fn edit(
1869        &self,
1870        request: CreateImageEditRequest,
1871    ) -> Result<ImagesResponse, LingerError> {
1872        let client = Client {
1873            config: self.config.clone(),
1874            transport: self.transport.clone(),
1875        };
1876        let request = client.build_json_request(HttpMethod::Post, "/v1/images/edits", &request)?;
1877        let response = self.transport.send(request).await?;
1878        let (status, headers, body) = response.into_bytes().await?;
1879        if !(200..300).contains(&status) {
1880            return Err(parse_api_error(status, headers, &body));
1881        }
1882        let request_id = request_id_from_headers(&headers);
1883        let response = serde_json::from_slice::<ImagesResponse>(&body)?.with_request_id(request_id);
1884        Ok(response)
1885    }
1886
1887    /// EN: Creates image variations with `POST /v1/images/variations`.
1888    /// 中文:使用 `POST /v1/images/variations` 创建图像变体。
1889    pub async fn variation(
1890        &self,
1891        request: CreateImageVariationRequest,
1892    ) -> Result<ImagesResponse, LingerError> {
1893        let client = Client {
1894            config: self.config.clone(),
1895            transport: self.transport.clone(),
1896        };
1897        let mut http_request =
1898            client.build_empty_request(HttpMethod::Post, "/v1/images/variations");
1899        request.apply_multipart_body(&mut http_request);
1900        let response = self.transport.send(http_request).await?;
1901        let (status, headers, body) = response.into_bytes().await?;
1902        if !(200..300).contains(&status) {
1903            return Err(parse_api_error(status, headers, &body));
1904        }
1905        let request_id = request_id_from_headers(&headers);
1906        let response = serde_json::from_slice::<ImagesResponse>(&body)?.with_request_id(request_id);
1907        Ok(response)
1908    }
1909}
1910
1911/// EN: Fine-tuning API resource.
1912/// 中文:Fine-tuning API 资源。
1913#[derive(Clone, Debug)]
1914pub struct FineTuningResource {
1915    config: ClientConfig,
1916    transport: SharedTransport,
1917}
1918
1919impl FineTuningResource {
1920    /// EN: Returns the Fine-tuning Alpha API resource.
1921    /// 中文:返回 Fine-tuning Alpha API 资源。
1922    pub fn alpha(&self) -> FineTuningAlphaResource {
1923        FineTuningAlphaResource {
1924            config: self.config.clone(),
1925            transport: self.transport.clone(),
1926        }
1927    }
1928
1929    /// EN: Returns the Fine-tuning Jobs API resource.
1930    /// 中文:返回 Fine-tuning Jobs API 资源。
1931    pub fn jobs(&self) -> FineTuningJobsResource {
1932        FineTuningJobsResource {
1933            config: self.config.clone(),
1934            transport: self.transport.clone(),
1935        }
1936    }
1937
1938    /// EN: Returns the Fine-tuning Checkpoints API resource.
1939    /// 中文:返回 Fine-tuning Checkpoints API 资源。
1940    pub fn checkpoints(&self) -> FineTuningCheckpointsResource {
1941        FineTuningCheckpointsResource {
1942            config: self.config.clone(),
1943            transport: self.transport.clone(),
1944        }
1945    }
1946}
1947
1948/// EN: Fine-tuning Alpha API resource.
1949/// 中文:Fine-tuning Alpha API 资源。
1950#[derive(Clone, Debug)]
1951pub struct FineTuningAlphaResource {
1952    config: ClientConfig,
1953    transport: SharedTransport,
1954}
1955
1956impl FineTuningAlphaResource {
1957    /// EN: Returns the Fine-tuning Alpha Graders API resource.
1958    /// 中文:返回 Fine-tuning Alpha Graders API 资源。
1959    pub fn graders(&self) -> FineTuningAlphaGradersResource {
1960        FineTuningAlphaGradersResource {
1961            config: self.config.clone(),
1962            transport: self.transport.clone(),
1963        }
1964    }
1965}
1966
1967/// EN: Fine-tuning Alpha Graders API resource.
1968/// 中文:Fine-tuning Alpha Graders API 资源。
1969#[derive(Clone, Debug)]
1970pub struct FineTuningAlphaGradersResource {
1971    config: ClientConfig,
1972    transport: SharedTransport,
1973}
1974
1975impl FineTuningAlphaGradersResource {
1976    /// EN: Runs a grader with `POST /v1/fine_tuning/alpha/graders/run`.
1977    /// 中文:使用 `POST /v1/fine_tuning/alpha/graders/run` 运行 grader。
1978    pub async fn run(
1979        &self,
1980        request: RunFineTuningGraderRequest,
1981    ) -> Result<FineTuningGraderRun, LingerError> {
1982        let client = Client {
1983            config: self.config.clone(),
1984            transport: self.transport.clone(),
1985        };
1986        let request = client.build_json_request(
1987            HttpMethod::Post,
1988            "/v1/fine_tuning/alpha/graders/run",
1989            &request,
1990        )?;
1991        let response = self.transport.send(request).await?;
1992        let (status, headers, body) = response.into_bytes().await?;
1993        if !(200..300).contains(&status) {
1994            return Err(parse_api_error(status, headers, &body));
1995        }
1996        let request_id = request_id_from_headers(&headers);
1997        let response =
1998            serde_json::from_slice::<FineTuningGraderRun>(&body)?.with_request_id(request_id);
1999        Ok(response)
2000    }
2001
2002    /// EN: Validates a grader with `POST /v1/fine_tuning/alpha/graders/validate`.
2003    /// 中文:使用 `POST /v1/fine_tuning/alpha/graders/validate` 校验 grader。
2004    pub async fn validate(
2005        &self,
2006        request: ValidateFineTuningGraderRequest,
2007    ) -> Result<FineTuningGraderValidation, LingerError> {
2008        let client = Client {
2009            config: self.config.clone(),
2010            transport: self.transport.clone(),
2011        };
2012        let request = client.build_json_request(
2013            HttpMethod::Post,
2014            "/v1/fine_tuning/alpha/graders/validate",
2015            &request,
2016        )?;
2017        let response = self.transport.send(request).await?;
2018        let (status, headers, body) = response.into_bytes().await?;
2019        if !(200..300).contains(&status) {
2020            return Err(parse_api_error(status, headers, &body));
2021        }
2022        let request_id = request_id_from_headers(&headers);
2023        let response = serde_json::from_slice::<FineTuningGraderValidation>(&body)?
2024            .with_request_id(request_id);
2025        Ok(response)
2026    }
2027}
2028
2029/// EN: Fine-tuning Checkpoints API resource.
2030/// 中文:Fine-tuning Checkpoints API 资源。
2031#[derive(Clone, Debug)]
2032pub struct FineTuningCheckpointsResource {
2033    config: ClientConfig,
2034    transport: SharedTransport,
2035}
2036
2037impl FineTuningCheckpointsResource {
2038    /// EN: Returns the permissions resource for a fine-tuned model checkpoint.
2039    /// 中文:返回微调模型 checkpoint 的 permissions 资源。
2040    pub fn permissions(
2041        &self,
2042        fine_tuned_model_checkpoint: impl Into<String>,
2043    ) -> FineTuningCheckpointPermissionsResource {
2044        FineTuningCheckpointPermissionsResource {
2045            config: self.config.clone(),
2046            transport: self.transport.clone(),
2047            fine_tuned_model_checkpoint: fine_tuned_model_checkpoint.into(),
2048        }
2049    }
2050}
2051
2052/// EN: Fine-tuning Checkpoint Permissions API resource.
2053/// 中文:Fine-tuning Checkpoint Permissions API 资源。
2054#[derive(Clone, Debug)]
2055pub struct FineTuningCheckpointPermissionsResource {
2056    config: ClientConfig,
2057    transport: SharedTransport,
2058    fine_tuned_model_checkpoint: String,
2059}
2060
2061impl FineTuningCheckpointPermissionsResource {
2062    /// EN: Creates checkpoint permissions.
2063    /// 中文:创建 checkpoint permissions。
2064    pub async fn create<I, T>(
2065        &self,
2066        project_ids: I,
2067    ) -> Result<FineTuningCheckpointPermissionPage, LingerError>
2068    where
2069        I: IntoIterator<Item = T>,
2070        T: Into<String>,
2071    {
2072        let checkpoint = validate_fine_tuned_model_checkpoint(&self.fine_tuned_model_checkpoint)?;
2073        let body = CreateFineTuningCheckpointPermissionRequest::new(project_ids)?;
2074        let client = Client {
2075            config: self.config.clone(),
2076            transport: self.transport.clone(),
2077        };
2078        let path = format!("/v1/fine_tuning/checkpoints/{checkpoint}/permissions");
2079        let request = client.build_json_request(HttpMethod::Post, &path, &body)?;
2080        let response = self.transport.send(request).await?;
2081        let (status, headers, body) = response.into_bytes().await?;
2082        if !(200..300).contains(&status) {
2083            return Err(parse_api_error(status, headers, &body));
2084        }
2085        let request_id = request_id_from_headers(&headers);
2086        let response = serde_json::from_slice::<FineTuningCheckpointPermissionPage>(&body)?
2087            .with_request_id(request_id);
2088        Ok(response)
2089    }
2090
2091    /// EN: Lists checkpoint permissions.
2092    /// 中文:列出 checkpoint permissions。
2093    pub async fn list(&self) -> Result<FineTuningCheckpointPermissionPage, LingerError> {
2094        let checkpoint = validate_fine_tuned_model_checkpoint(&self.fine_tuned_model_checkpoint)?;
2095        let client = Client {
2096            config: self.config.clone(),
2097            transport: self.transport.clone(),
2098        };
2099        let path = format!("/v1/fine_tuning/checkpoints/{checkpoint}/permissions");
2100        let (headers, body) = client.send_retryable_get(&path).await?;
2101        let request_id = request_id_from_headers(&headers);
2102        let response = serde_json::from_slice::<FineTuningCheckpointPermissionPage>(&body)?
2103            .with_request_id(request_id);
2104        Ok(response)
2105    }
2106
2107    /// EN: Retrieves checkpoint permissions using the deprecated retrieve endpoint.
2108    /// 中文:使用已弃用的 retrieve 端点获取 checkpoint permissions。
2109    pub async fn retrieve(&self) -> Result<FineTuningCheckpointPermissionPage, LingerError> {
2110        self.list().await
2111    }
2112
2113    /// EN: Deletes a checkpoint permission.
2114    /// 中文:删除 checkpoint permission。
2115    pub async fn delete(
2116        &self,
2117        permission_id: &str,
2118    ) -> Result<FineTuningCheckpointPermissionDeletion, LingerError> {
2119        let checkpoint = validate_fine_tuned_model_checkpoint(&self.fine_tuned_model_checkpoint)?;
2120        let permission_id = validate_checkpoint_permission_id(permission_id)?;
2121        let client = Client {
2122            config: self.config.clone(),
2123            transport: self.transport.clone(),
2124        };
2125        let path = format!("/v1/fine_tuning/checkpoints/{checkpoint}/permissions/{permission_id}");
2126        let request = client.build_empty_request(HttpMethod::Delete, &path);
2127        let response = self.transport.send(request).await?;
2128        let (status, headers, body) = response.into_bytes().await?;
2129        if !(200..300).contains(&status) {
2130            return Err(parse_api_error(status, headers, &body));
2131        }
2132        let request_id = request_id_from_headers(&headers);
2133        let response = serde_json::from_slice::<FineTuningCheckpointPermissionDeletion>(&body)?
2134            .with_request_id(request_id);
2135        Ok(response)
2136    }
2137}
2138
2139/// EN: Fine-tuning Jobs API resource.
2140/// 中文:Fine-tuning Jobs API 资源。
2141#[derive(Clone, Debug)]
2142pub struct FineTuningJobsResource {
2143    config: ClientConfig,
2144    transport: SharedTransport,
2145}
2146
2147impl FineTuningJobsResource {
2148    /// EN: Creates a fine-tuning job with `POST /v1/fine_tuning/jobs`.
2149    /// 中文:使用 `POST /v1/fine_tuning/jobs` 创建 fine-tuning job。
2150    pub async fn create(
2151        &self,
2152        request: CreateFineTuningJobRequest,
2153    ) -> Result<FineTuningJob, LingerError> {
2154        let client = Client {
2155            config: self.config.clone(),
2156            transport: self.transport.clone(),
2157        };
2158        let request =
2159            client.build_json_request(HttpMethod::Post, "/v1/fine_tuning/jobs", &request)?;
2160        let response = self.transport.send(request).await?;
2161        let (status, headers, body) = response.into_bytes().await?;
2162        if !(200..300).contains(&status) {
2163            return Err(parse_api_error(status, headers, &body));
2164        }
2165        let request_id = request_id_from_headers(&headers);
2166        let response = serde_json::from_slice::<FineTuningJob>(&body)?.with_request_id(request_id);
2167        Ok(response)
2168    }
2169
2170    /// EN: Lists fine-tuning jobs with `GET /v1/fine_tuning/jobs`.
2171    /// 中文:使用 `GET /v1/fine_tuning/jobs` 列出 fine-tuning job。
2172    pub async fn list(&self) -> Result<FineTuningJobPage, LingerError> {
2173        let client = Client {
2174            config: self.config.clone(),
2175            transport: self.transport.clone(),
2176        };
2177        let (headers, body) = client.send_retryable_get("/v1/fine_tuning/jobs").await?;
2178        let request_id = request_id_from_headers(&headers);
2179        let response =
2180            serde_json::from_slice::<FineTuningJobPage>(&body)?.with_request_id(request_id);
2181        Ok(response)
2182    }
2183
2184    /// EN: Retrieves a fine-tuning job with `GET /v1/fine_tuning/jobs/{fine_tuning_job_id}`.
2185    /// 中文:使用 `GET /v1/fine_tuning/jobs/{fine_tuning_job_id}` 获取 fine-tuning job。
2186    pub async fn retrieve(&self, fine_tuning_job_id: &str) -> Result<FineTuningJob, LingerError> {
2187        let fine_tuning_job_id = validate_fine_tuning_job_id(fine_tuning_job_id)?;
2188        let client = Client {
2189            config: self.config.clone(),
2190            transport: self.transport.clone(),
2191        };
2192        let path = format!("/v1/fine_tuning/jobs/{fine_tuning_job_id}");
2193        let (headers, body) = client.send_retryable_get(&path).await?;
2194        let request_id = request_id_from_headers(&headers);
2195        let response = serde_json::from_slice::<FineTuningJob>(&body)?.with_request_id(request_id);
2196        Ok(response)
2197    }
2198
2199    /// EN: Lists fine-tuning job events.
2200    /// 中文:列出 fine-tuning job 事件。
2201    pub async fn list_events(
2202        &self,
2203        fine_tuning_job_id: &str,
2204    ) -> Result<FineTuningEventPage, LingerError> {
2205        let fine_tuning_job_id = validate_fine_tuning_job_id(fine_tuning_job_id)?;
2206        let client = Client {
2207            config: self.config.clone(),
2208            transport: self.transport.clone(),
2209        };
2210        let path = format!("/v1/fine_tuning/jobs/{fine_tuning_job_id}/events");
2211        let (headers, body) = client.send_retryable_get(&path).await?;
2212        let request_id = request_id_from_headers(&headers);
2213        let response =
2214            serde_json::from_slice::<FineTuningEventPage>(&body)?.with_request_id(request_id);
2215        Ok(response)
2216    }
2217
2218    /// EN: Lists fine-tuning job checkpoints.
2219    /// 中文:列出 fine-tuning job 检查点。
2220    pub async fn list_checkpoints(
2221        &self,
2222        fine_tuning_job_id: &str,
2223    ) -> Result<FineTuningCheckpointPage, LingerError> {
2224        let fine_tuning_job_id = validate_fine_tuning_job_id(fine_tuning_job_id)?;
2225        let client = Client {
2226            config: self.config.clone(),
2227            transport: self.transport.clone(),
2228        };
2229        let path = format!("/v1/fine_tuning/jobs/{fine_tuning_job_id}/checkpoints");
2230        let (headers, body) = client.send_retryable_get(&path).await?;
2231        let request_id = request_id_from_headers(&headers);
2232        let response =
2233            serde_json::from_slice::<FineTuningCheckpointPage>(&body)?.with_request_id(request_id);
2234        Ok(response)
2235    }
2236
2237    /// EN: Cancels a fine-tuning job.
2238    /// 中文:取消 fine-tuning job。
2239    pub async fn cancel(&self, fine_tuning_job_id: &str) -> Result<FineTuningJob, LingerError> {
2240        self.post_state_change(fine_tuning_job_id, "cancel").await
2241    }
2242
2243    /// EN: Pauses a fine-tuning job.
2244    /// 中文:暂停 fine-tuning job。
2245    pub async fn pause(&self, fine_tuning_job_id: &str) -> Result<FineTuningJob, LingerError> {
2246        self.post_state_change(fine_tuning_job_id, "pause").await
2247    }
2248
2249    /// EN: Resumes a fine-tuning job.
2250    /// 中文:恢复 fine-tuning job。
2251    pub async fn resume(&self, fine_tuning_job_id: &str) -> Result<FineTuningJob, LingerError> {
2252        self.post_state_change(fine_tuning_job_id, "resume").await
2253    }
2254
2255    async fn post_state_change(
2256        &self,
2257        fine_tuning_job_id: &str,
2258        action: &str,
2259    ) -> Result<FineTuningJob, LingerError> {
2260        let fine_tuning_job_id = validate_fine_tuning_job_id(fine_tuning_job_id)?;
2261        let client = Client {
2262            config: self.config.clone(),
2263            transport: self.transport.clone(),
2264        };
2265        let path = format!("/v1/fine_tuning/jobs/{fine_tuning_job_id}/{action}");
2266        let request = client.build_empty_request(HttpMethod::Post, &path);
2267        let response = self.transport.send(request).await?;
2268        let (status, headers, body) = response.into_bytes().await?;
2269        if !(200..300).contains(&status) {
2270            return Err(parse_api_error(status, headers, &body));
2271        }
2272        let request_id = request_id_from_headers(&headers);
2273        let response = serde_json::from_slice::<FineTuningJob>(&body)?.with_request_id(request_id);
2274        Ok(response)
2275    }
2276}
2277
2278/// EN: Batches API resource.
2279/// 中文:Batches API 资源。
2280#[derive(Clone, Debug)]
2281pub struct BatchesResource {
2282    config: ClientConfig,
2283    transport: SharedTransport,
2284}
2285
2286impl BatchesResource {
2287    /// EN: Creates a batch with `POST /v1/batches`.
2288    /// 中文:使用 `POST /v1/batches` 创建 batch。
2289    pub async fn create(&self, request: CreateBatchRequest) -> Result<Batch, LingerError> {
2290        let client = Client {
2291            config: self.config.clone(),
2292            transport: self.transport.clone(),
2293        };
2294        let request = client.build_json_request(HttpMethod::Post, "/v1/batches", &request)?;
2295        let response = self.transport.send(request).await?;
2296        let (status, headers, body) = response.into_bytes().await?;
2297        if !(200..300).contains(&status) {
2298            return Err(parse_api_error(status, headers, &body));
2299        }
2300        let request_id = request_id_from_headers(&headers);
2301        let response = serde_json::from_slice::<Batch>(&body)?.with_request_id(request_id);
2302        Ok(response)
2303    }
2304
2305    /// EN: Lists batches with `GET /v1/batches`.
2306    /// 中文:使用 `GET /v1/batches` 列出 batch。
2307    pub async fn list(&self) -> Result<BatchListPage, LingerError> {
2308        let client = Client {
2309            config: self.config.clone(),
2310            transport: self.transport.clone(),
2311        };
2312        let (headers, body) = client.send_retryable_get("/v1/batches").await?;
2313        let request_id = request_id_from_headers(&headers);
2314        let response = serde_json::from_slice::<BatchListPage>(&body)?.with_request_id(request_id);
2315        Ok(response)
2316    }
2317
2318    /// EN: Retrieves a batch with `GET /v1/batches/{batch_id}`.
2319    /// 中文:使用 `GET /v1/batches/{batch_id}` 获取 batch。
2320    pub async fn retrieve(&self, batch_id: &str) -> Result<Batch, LingerError> {
2321        let batch_id = batch_id.trim();
2322        if batch_id.is_empty() {
2323            return Err(LingerError::invalid_config("batch_id is required"));
2324        }
2325        let client = Client {
2326            config: self.config.clone(),
2327            transport: self.transport.clone(),
2328        };
2329        let path = format!("/v1/batches/{batch_id}");
2330        let (headers, body) = client.send_retryable_get(&path).await?;
2331        let request_id = request_id_from_headers(&headers);
2332        let response = serde_json::from_slice::<Batch>(&body)?.with_request_id(request_id);
2333        Ok(response)
2334    }
2335
2336    /// EN: Cancels a batch with `POST /v1/batches/{batch_id}/cancel`.
2337    /// 中文:使用 `POST /v1/batches/{batch_id}/cancel` 取消 batch。
2338    pub async fn cancel(&self, batch_id: &str) -> Result<Batch, LingerError> {
2339        let batch_id = batch_id.trim();
2340        if batch_id.is_empty() {
2341            return Err(LingerError::invalid_config("batch_id is required"));
2342        }
2343        let client = Client {
2344            config: self.config.clone(),
2345            transport: self.transport.clone(),
2346        };
2347        let path = format!("/v1/batches/{batch_id}/cancel");
2348        let request = client.build_empty_request(HttpMethod::Post, &path);
2349        let response = self.transport.send(request).await?;
2350        let (status, headers, body) = response.into_bytes().await?;
2351        if !(200..300).contains(&status) {
2352            return Err(parse_api_error(status, headers, &body));
2353        }
2354        let request_id = request_id_from_headers(&headers);
2355        let response = serde_json::from_slice::<Batch>(&body)?.with_request_id(request_id);
2356        Ok(response)
2357    }
2358}
2359
2360/// EN: Files API resource.
2361/// 中文:Files API 资源。
2362#[derive(Clone, Debug)]
2363pub struct FilesResource {
2364    config: ClientConfig,
2365    transport: SharedTransport,
2366}
2367
2368impl FilesResource {
2369    /// EN: Uploads a file with `POST /v1/files`.
2370    /// 中文:使用 `POST /v1/files` 上传文件。
2371    pub async fn create(&self, request: CreateFileRequest) -> Result<FileObject, LingerError> {
2372        let client = Client {
2373            config: self.config.clone(),
2374            transport: self.transport.clone(),
2375        };
2376        let mut http_request = client.build_empty_request(HttpMethod::Post, "/v1/files");
2377        request.apply_multipart_body(&mut http_request);
2378        let response = self.transport.send(http_request).await?;
2379        let (status, headers, body) = response.into_bytes().await?;
2380        if !(200..300).contains(&status) {
2381            return Err(parse_api_error(status, headers, &body));
2382        }
2383        let request_id = request_id_from_headers(&headers);
2384        let response = serde_json::from_slice::<FileObject>(&body)?.with_request_id(request_id);
2385        Ok(response)
2386    }
2387
2388    /// EN: Lists files with `GET /v1/files`.
2389    /// 中文:使用 `GET /v1/files` 列出文件。
2390    pub async fn list(&self) -> Result<FilesPage, LingerError> {
2391        let client = Client {
2392            config: self.config.clone(),
2393            transport: self.transport.clone(),
2394        };
2395        let (headers, body) = client.send_retryable_get("/v1/files").await?;
2396        let request_id = request_id_from_headers(&headers);
2397        let response = serde_json::from_slice::<FilesPage>(&body)?.with_request_id(request_id);
2398        Ok(response)
2399    }
2400
2401    /// EN: Retrieves a file with `GET /v1/files/{file_id}`.
2402    /// 中文:使用 `GET /v1/files/{file_id}` 获取文件。
2403    pub async fn retrieve(&self, file_id: &str) -> Result<FileObject, LingerError> {
2404        let file_id = file_id.trim();
2405        if file_id.is_empty() {
2406            return Err(LingerError::invalid_config("file_id is required"));
2407        }
2408        let client = Client {
2409            config: self.config.clone(),
2410            transport: self.transport.clone(),
2411        };
2412        let path = format!("/v1/files/{file_id}");
2413        let (headers, body) = client.send_retryable_get(&path).await?;
2414        let request_id = request_id_from_headers(&headers);
2415        let response = serde_json::from_slice::<FileObject>(&body)?.with_request_id(request_id);
2416        Ok(response)
2417    }
2418
2419    /// EN: Deletes a file with `DELETE /v1/files/{file_id}`.
2420    /// 中文:使用 `DELETE /v1/files/{file_id}` 删除文件。
2421    pub async fn delete(&self, file_id: &str) -> Result<FileDeletion, LingerError> {
2422        let file_id = file_id.trim();
2423        if file_id.is_empty() {
2424            return Err(LingerError::invalid_config("file_id is required"));
2425        }
2426        let client = Client {
2427            config: self.config.clone(),
2428            transport: self.transport.clone(),
2429        };
2430        let path = format!("/v1/files/{file_id}");
2431        let request = client.build_empty_request(HttpMethod::Delete, &path);
2432        let response = self.transport.send(request).await?;
2433        let (status, headers, body) = response.into_bytes().await?;
2434        if !(200..300).contains(&status) {
2435            return Err(parse_api_error(status, headers, &body));
2436        }
2437        let request_id = request_id_from_headers(&headers);
2438        let response = serde_json::from_slice::<FileDeletion>(&body)?.with_request_id(request_id);
2439        Ok(response)
2440    }
2441
2442    /// EN: Downloads file content with `GET /v1/files/{file_id}/content`.
2443    /// 中文:使用 `GET /v1/files/{file_id}/content` 下载文件内容。
2444    pub async fn content(&self, file_id: &str) -> Result<FileContent, LingerError> {
2445        let file_id = file_id.trim();
2446        if file_id.is_empty() {
2447            return Err(LingerError::invalid_config("file_id is required"));
2448        }
2449        let client = Client {
2450            config: self.config.clone(),
2451            transport: self.transport.clone(),
2452        };
2453        let path = format!("/v1/files/{file_id}/content");
2454        let request = client.build_empty_request(HttpMethod::Get, &path);
2455        let response = self.transport.send(request).await?;
2456        let status = response.status();
2457        if !(200..300).contains(&status) {
2458            let (status, headers, body) = response.into_bytes().await?;
2459            return Err(parse_api_error(status, headers, &body));
2460        }
2461        let request_id = request_id_from_headers(response.headers());
2462        Ok(FileContent::new(request_id, response.into_body_stream()))
2463    }
2464}
2465
2466/// EN: Moderations API resource.
2467/// 中文:Moderations API 资源。
2468#[derive(Clone, Debug)]
2469pub struct ModerationsResource {
2470    config: ClientConfig,
2471    transport: SharedTransport,
2472}
2473
2474impl ModerationsResource {
2475    /// EN: Creates a moderation with `POST /v1/moderations`.
2476    /// 中文:使用 `POST /v1/moderations` 创建 moderation。
2477    pub async fn create(
2478        &self,
2479        request: CreateModerationRequest,
2480    ) -> Result<ModerationCreateResponse, LingerError> {
2481        let client = Client {
2482            config: self.config.clone(),
2483            transport: self.transport.clone(),
2484        };
2485        let request = client.build_json_request(HttpMethod::Post, "/v1/moderations", &request)?;
2486        let response = self.transport.send(request).await?;
2487        let (status, headers, body) = response.into_bytes().await?;
2488        if !(200..300).contains(&status) {
2489            return Err(parse_api_error(status, headers, &body));
2490        }
2491        let request_id = request_id_from_headers(&headers);
2492        let response =
2493            serde_json::from_slice::<ModerationCreateResponse>(&body)?.with_request_id(request_id);
2494        Ok(response)
2495    }
2496}
2497
2498/// EN: Containers API resource.
2499/// 中文:Containers API 资源。
2500#[derive(Clone, Debug)]
2501pub struct ContainersResource {
2502    config: ClientConfig,
2503    transport: SharedTransport,
2504}
2505
2506impl ContainersResource {
2507    /// EN: Creates a container with `POST /v1/containers`.
2508    /// 中文:使用 `POST /v1/containers` 创建容器。
2509    pub async fn create(&self, request: CreateContainerRequest) -> Result<Container, LingerError> {
2510        let client = Client {
2511            config: self.config.clone(),
2512            transport: self.transport.clone(),
2513        };
2514        let request = client.build_json_request(HttpMethod::Post, "/v1/containers", &request)?;
2515        let response = self.transport.send(request).await?;
2516        let (status, headers, body) = response.into_bytes().await?;
2517        if !(200..300).contains(&status) {
2518            return Err(parse_api_error(status, headers, &body));
2519        }
2520        let request_id = request_id_from_headers(&headers);
2521        let response = serde_json::from_slice::<Container>(&body)?.with_request_id(request_id);
2522        Ok(response)
2523    }
2524
2525    /// EN: Lists containers with `GET /v1/containers`.
2526    /// 中文:使用 `GET /v1/containers` 列出容器。
2527    pub async fn list(&self) -> Result<ContainerPage, LingerError> {
2528        let client = Client {
2529            config: self.config.clone(),
2530            transport: self.transport.clone(),
2531        };
2532        let (headers, body) = client.send_retryable_get("/v1/containers").await?;
2533        let request_id = request_id_from_headers(&headers);
2534        let response = serde_json::from_slice::<ContainerPage>(&body)?.with_request_id(request_id);
2535        Ok(response)
2536    }
2537
2538    /// EN: Retrieves a container with `GET /v1/containers/{container_id}`.
2539    /// 中文:使用 `GET /v1/containers/{container_id}` 获取容器。
2540    pub async fn retrieve(&self, container_id: &str) -> Result<Container, LingerError> {
2541        let container_id = validate_container_id(container_id)?;
2542        let client = Client {
2543            config: self.config.clone(),
2544            transport: self.transport.clone(),
2545        };
2546        let path = format!("/v1/containers/{container_id}");
2547        let (headers, body) = client.send_retryable_get(&path).await?;
2548        let request_id = request_id_from_headers(&headers);
2549        let response = serde_json::from_slice::<Container>(&body)?.with_request_id(request_id);
2550        Ok(response)
2551    }
2552
2553    /// EN: Deletes a container with `DELETE /v1/containers/{container_id}`.
2554    /// 中文:使用 `DELETE /v1/containers/{container_id}` 删除容器。
2555    pub async fn delete(&self, container_id: &str) -> Result<ContainerDeletion, LingerError> {
2556        let container_id = validate_container_id(container_id)?;
2557        let client = Client {
2558            config: self.config.clone(),
2559            transport: self.transport.clone(),
2560        };
2561        let path = format!("/v1/containers/{container_id}");
2562        let request = client.build_empty_request(HttpMethod::Delete, &path);
2563        let response = self.transport.send(request).await?;
2564        let (status, headers, body) = response.into_bytes().await?;
2565        if !(200..300).contains(&status) {
2566            return Err(parse_api_error(status, headers, &body));
2567        }
2568        let request_id = request_id_from_headers(&headers);
2569        let response =
2570            serde_json::from_slice::<ContainerDeletion>(&body)?.with_request_id(request_id);
2571        Ok(response)
2572    }
2573
2574    /// EN: Returns the Container Files subresource for a container id.
2575    /// 中文:返回指定容器 ID 的 Container Files 子资源。
2576    pub fn files(&self, container_id: &str) -> ContainerFilesResource {
2577        ContainerFilesResource {
2578            config: self.config.clone(),
2579            transport: self.transport.clone(),
2580            container_id: container_id.to_string(),
2581        }
2582    }
2583}
2584
2585/// EN: Container Files API resource.
2586/// 中文:Container Files API 资源。
2587#[derive(Clone, Debug)]
2588pub struct ContainerFilesResource {
2589    config: ClientConfig,
2590    transport: SharedTransport,
2591    container_id: String,
2592}
2593
2594impl ContainerFilesResource {
2595    /// EN: Creates a container file with `POST /v1/containers/{container_id}/files`.
2596    /// 中文:使用 `POST /v1/containers/{container_id}/files` 创建容器文件。
2597    pub async fn create(
2598        &self,
2599        request: CreateContainerFileRequest,
2600    ) -> Result<ContainerFile, LingerError> {
2601        let container_id = validate_container_id(&self.container_id)?;
2602        let client = Client {
2603            config: self.config.clone(),
2604            transport: self.transport.clone(),
2605        };
2606        let path = format!("/v1/containers/{container_id}/files");
2607        let mut http_request = client.build_empty_request(HttpMethod::Post, &path);
2608        request.apply_body(&mut http_request)?;
2609        let response = self.transport.send(http_request).await?;
2610        let (status, headers, body) = response.into_bytes().await?;
2611        if !(200..300).contains(&status) {
2612            return Err(parse_api_error(status, headers, &body));
2613        }
2614        let request_id = request_id_from_headers(&headers);
2615        let response = serde_json::from_slice::<ContainerFile>(&body)?.with_request_id(request_id);
2616        Ok(response)
2617    }
2618
2619    /// EN: Lists files in a container.
2620    /// 中文:列出容器中的文件。
2621    pub async fn list(&self) -> Result<ContainerFilePage, LingerError> {
2622        let container_id = validate_container_id(&self.container_id)?;
2623        let client = Client {
2624            config: self.config.clone(),
2625            transport: self.transport.clone(),
2626        };
2627        let path = format!("/v1/containers/{container_id}/files");
2628        let (headers, body) = client.send_retryable_get(&path).await?;
2629        let request_id = request_id_from_headers(&headers);
2630        let response =
2631            serde_json::from_slice::<ContainerFilePage>(&body)?.with_request_id(request_id);
2632        Ok(response)
2633    }
2634
2635    /// EN: Retrieves a container file.
2636    /// 中文:获取容器文件。
2637    pub async fn retrieve(&self, file_id: &str) -> Result<ContainerFile, LingerError> {
2638        let container_id = validate_container_id(&self.container_id)?;
2639        let file_id = validate_container_file_id(file_id)?;
2640        let client = Client {
2641            config: self.config.clone(),
2642            transport: self.transport.clone(),
2643        };
2644        let path = format!("/v1/containers/{container_id}/files/{file_id}");
2645        let (headers, body) = client.send_retryable_get(&path).await?;
2646        let request_id = request_id_from_headers(&headers);
2647        let response = serde_json::from_slice::<ContainerFile>(&body)?.with_request_id(request_id);
2648        Ok(response)
2649    }
2650
2651    /// EN: Deletes a container file.
2652    /// 中文:删除容器文件。
2653    pub async fn delete(&self, file_id: &str) -> Result<ContainerFileDeletion, LingerError> {
2654        let container_id = validate_container_id(&self.container_id)?;
2655        let file_id = validate_container_file_id(file_id)?;
2656        let client = Client {
2657            config: self.config.clone(),
2658            transport: self.transport.clone(),
2659        };
2660        let path = format!("/v1/containers/{container_id}/files/{file_id}");
2661        let request = client.build_empty_request(HttpMethod::Delete, &path);
2662        let response = self.transport.send(request).await?;
2663        let (status, headers, body) = response.into_bytes().await?;
2664        if !(200..300).contains(&status) {
2665            return Err(parse_api_error(status, headers, &body));
2666        }
2667        let request_id = request_id_from_headers(&headers);
2668        let response =
2669            serde_json::from_slice::<ContainerFileDeletion>(&body)?.with_request_id(request_id);
2670        Ok(response)
2671    }
2672
2673    /// EN: Streams container file content.
2674    /// 中文:流式读取容器文件内容。
2675    pub async fn content(&self, file_id: &str) -> Result<ContainerFileContent, LingerError> {
2676        let container_id = validate_container_id(&self.container_id)?;
2677        let file_id = validate_container_file_id(file_id)?;
2678        let client = Client {
2679            config: self.config.clone(),
2680            transport: self.transport.clone(),
2681        };
2682        let path = format!("/v1/containers/{container_id}/files/{file_id}/content");
2683        let request = client.build_empty_request(HttpMethod::Get, &path);
2684        let response = self.transport.send(request).await?;
2685        let status = response.status();
2686        if !(200..300).contains(&status) {
2687            let (status, headers, body) = response.into_bytes().await?;
2688            return Err(parse_api_error(status, headers, &body));
2689        }
2690        let request_id = request_id_from_headers(response.headers());
2691        let (_, _, body) = response.into_parts();
2692        Ok(ContainerFileContent::new(request_id, body))
2693    }
2694}
2695
2696/// EN: Legacy Completions API resource.
2697/// 中文:Legacy Completions API 资源。
2698#[derive(Clone, Debug)]
2699pub struct CompletionsResource {
2700    config: ClientConfig,
2701    transport: SharedTransport,
2702}
2703
2704impl CompletionsResource {
2705    /// EN: Creates a completion with `POST /v1/completions`.
2706    /// 中文:使用 `POST /v1/completions` 创建 completion。
2707    pub async fn create(
2708        &self,
2709        request: CreateCompletionRequest,
2710    ) -> Result<Completion, LingerError> {
2711        let client = Client {
2712            config: self.config.clone(),
2713            transport: self.transport.clone(),
2714        };
2715        let request = client.build_json_request(HttpMethod::Post, "/v1/completions", &request)?;
2716        let response = self.transport.send(request).await?;
2717        let (status, headers, body) = response.into_bytes().await?;
2718        if !(200..300).contains(&status) {
2719            return Err(parse_api_error(status, headers, &body));
2720        }
2721        let request_id = request_id_from_headers(&headers);
2722        let response = serde_json::from_slice::<Completion>(&body)?.with_request_id(request_id);
2723        Ok(response)
2724    }
2725
2726    /// EN: Creates a streaming completion with `POST /v1/completions`.
2727    /// 中文:使用 `POST /v1/completions` 创建流式 completion。
2728    pub async fn create_stream(
2729        &self,
2730        request: CreateCompletionRequest,
2731    ) -> Result<CompletionStream, LingerError> {
2732        let client = Client {
2733            config: self.config.clone(),
2734            transport: self.transport.clone(),
2735        };
2736        let request = request.into_streaming();
2737        let request = client.build_json_request(HttpMethod::Post, "/v1/completions", &request)?;
2738        let response = self.transport.send(request).await?;
2739        let status = response.status();
2740        if !(200..300).contains(&status) {
2741            let (status, headers, body) = response.into_bytes().await?;
2742            return Err(parse_api_error(status, headers, &body));
2743        }
2744        Ok(CompletionStream::new(response.into_body_stream()))
2745    }
2746}
2747
2748/// EN: Chat API resource.
2749/// 中文:Chat API 资源。
2750#[derive(Clone, Debug)]
2751pub struct ChatResource {
2752    config: ClientConfig,
2753    transport: SharedTransport,
2754}
2755
2756impl ChatResource {
2757    /// EN: Returns the Chat Completions API resource.
2758    /// 中文:返回 Chat Completions API 资源。
2759    pub fn completions(&self) -> ChatCompletionsResource {
2760        ChatCompletionsResource {
2761            config: self.config.clone(),
2762            transport: self.transport.clone(),
2763        }
2764    }
2765}
2766
2767/// EN: Chat Completions API resource.
2768/// 中文:Chat Completions API 资源。
2769#[derive(Clone, Debug)]
2770pub struct ChatCompletionsResource {
2771    config: ClientConfig,
2772    transport: SharedTransport,
2773}
2774
2775impl ChatCompletionsResource {
2776    /// EN: Creates a chat completion with `POST /v1/chat/completions`.
2777    /// 中文:使用 `POST /v1/chat/completions` 创建 chat completion。
2778    pub async fn create(
2779        &self,
2780        request: CreateChatCompletionRequest,
2781    ) -> Result<ChatCompletion, LingerError> {
2782        let client = Client {
2783            config: self.config.clone(),
2784            transport: self.transport.clone(),
2785        };
2786        let request =
2787            client.build_json_request(HttpMethod::Post, "/v1/chat/completions", &request)?;
2788        let response = self.transport.send(request).await?;
2789        let (status, headers, body) = response.into_bytes().await?;
2790        if !(200..300).contains(&status) {
2791            return Err(parse_api_error(status, headers, &body));
2792        }
2793        let request_id = request_id_from_headers(&headers);
2794        let response = serde_json::from_slice::<ChatCompletion>(&body)?.with_request_id(request_id);
2795        Ok(response)
2796    }
2797
2798    /// EN: Lists stored chat completions with `GET /v1/chat/completions`.
2799    /// 中文:使用 `GET /v1/chat/completions` 列出已存储的 chat completion。
2800    pub async fn list(&self) -> Result<ChatCompletionPage, LingerError> {
2801        let client = Client {
2802            config: self.config.clone(),
2803            transport: self.transport.clone(),
2804        };
2805        let (headers, body) = client.send_retryable_get("/v1/chat/completions").await?;
2806        let request_id = request_id_from_headers(&headers);
2807        let response =
2808            serde_json::from_slice::<ChatCompletionPage>(&body)?.with_request_id(request_id);
2809        Ok(response)
2810    }
2811
2812    /// EN: Retrieves a stored chat completion with `GET /v1/chat/completions/{completion_id}`.
2813    /// 中文:使用 `GET /v1/chat/completions/{completion_id}` 获取已存储的 chat completion。
2814    pub async fn retrieve(&self, completion_id: &str) -> Result<ChatCompletion, LingerError> {
2815        let completion_id = validate_chat_completion_id(completion_id)?;
2816        let client = Client {
2817            config: self.config.clone(),
2818            transport: self.transport.clone(),
2819        };
2820        let path = format!("/v1/chat/completions/{completion_id}");
2821        let (headers, body) = client.send_retryable_get(&path).await?;
2822        let request_id = request_id_from_headers(&headers);
2823        let response = serde_json::from_slice::<ChatCompletion>(&body)?.with_request_id(request_id);
2824        Ok(response)
2825    }
2826
2827    /// EN: Modifies a stored chat completion with `POST /v1/chat/completions/{completion_id}`.
2828    /// 中文:使用 `POST /v1/chat/completions/{completion_id}` 修改已存储的 chat completion。
2829    pub async fn modify(
2830        &self,
2831        completion_id: &str,
2832        request: ModifyChatCompletionRequest,
2833    ) -> Result<ChatCompletion, LingerError> {
2834        let completion_id = validate_chat_completion_id(completion_id)?;
2835        let client = Client {
2836            config: self.config.clone(),
2837            transport: self.transport.clone(),
2838        };
2839        let path = format!("/v1/chat/completions/{completion_id}");
2840        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
2841        let response = self.transport.send(request).await?;
2842        let (status, headers, body) = response.into_bytes().await?;
2843        if !(200..300).contains(&status) {
2844            return Err(parse_api_error(status, headers, &body));
2845        }
2846        let request_id = request_id_from_headers(&headers);
2847        let response = serde_json::from_slice::<ChatCompletion>(&body)?.with_request_id(request_id);
2848        Ok(response)
2849    }
2850
2851    /// EN: Deletes a stored chat completion with `DELETE /v1/chat/completions/{completion_id}`.
2852    /// 中文:使用 `DELETE /v1/chat/completions/{completion_id}` 删除已存储的 chat completion。
2853    pub async fn delete(&self, completion_id: &str) -> Result<ChatCompletionDeletion, LingerError> {
2854        let completion_id = validate_chat_completion_id(completion_id)?;
2855        let client = Client {
2856            config: self.config.clone(),
2857            transport: self.transport.clone(),
2858        };
2859        let path = format!("/v1/chat/completions/{completion_id}");
2860        let request = client.build_empty_request(HttpMethod::Delete, &path);
2861        let response = self.transport.send(request).await?;
2862        let (status, headers, body) = response.into_bytes().await?;
2863        if !(200..300).contains(&status) {
2864            return Err(parse_api_error(status, headers, &body));
2865        }
2866        let request_id = request_id_from_headers(&headers);
2867        let response =
2868            serde_json::from_slice::<ChatCompletionDeletion>(&body)?.with_request_id(request_id);
2869        Ok(response)
2870    }
2871
2872    /// EN: Returns the stored chat completion messages subresource.
2873    /// 中文:返回已存储 chat completion 消息子资源。
2874    pub fn messages(&self) -> ChatCompletionMessagesResource {
2875        ChatCompletionMessagesResource {
2876            config: self.config.clone(),
2877            transport: self.transport.clone(),
2878        }
2879    }
2880}
2881
2882/// EN: Stored Chat Completion Messages API resource.
2883/// 中文:已存储 Chat Completion Messages API 资源。
2884#[derive(Clone, Debug)]
2885pub struct ChatCompletionMessagesResource {
2886    config: ClientConfig,
2887    transport: SharedTransport,
2888}
2889
2890impl ChatCompletionMessagesResource {
2891    /// EN: Lists stored chat completion messages.
2892    /// 中文:列出已存储 chat completion 的消息。
2893    pub async fn list(
2894        &self,
2895        completion_id: &str,
2896    ) -> Result<ChatCompletionMessagePage, LingerError> {
2897        let completion_id = validate_chat_completion_id(completion_id)?;
2898        let client = Client {
2899            config: self.config.clone(),
2900            transport: self.transport.clone(),
2901        };
2902        let path = format!("/v1/chat/completions/{completion_id}/messages");
2903        let (headers, body) = client.send_retryable_get(&path).await?;
2904        let request_id = request_id_from_headers(&headers);
2905        let response =
2906            serde_json::from_slice::<ChatCompletionMessagePage>(&body)?.with_request_id(request_id);
2907        Ok(response)
2908    }
2909}
2910
2911/// EN: ChatKit beta API resource.
2912/// 中文:ChatKit beta API 资源。
2913#[derive(Clone, Debug)]
2914pub struct ChatKitResource {
2915    config: ClientConfig,
2916    transport: SharedTransport,
2917}
2918
2919impl ChatKitResource {
2920    /// EN: Returns the ChatKit Sessions subresource.
2921    /// 中文:返回 ChatKit Sessions 子资源。
2922    pub fn sessions(&self) -> ChatKitSessionsResource {
2923        ChatKitSessionsResource {
2924            config: self.config.clone(),
2925            transport: self.transport.clone(),
2926        }
2927    }
2928
2929    /// EN: Returns the ChatKit Threads subresource.
2930    /// 中文:返回 ChatKit Threads 子资源。
2931    pub fn threads(&self) -> ChatKitThreadsResource {
2932        ChatKitThreadsResource {
2933            config: self.config.clone(),
2934            transport: self.transport.clone(),
2935        }
2936    }
2937}
2938
2939/// EN: ChatKit Sessions beta API resource.
2940/// 中文:ChatKit Sessions beta API 资源。
2941#[derive(Clone, Debug)]
2942pub struct ChatKitSessionsResource {
2943    config: ClientConfig,
2944    transport: SharedTransport,
2945}
2946
2947impl ChatKitSessionsResource {
2948    /// EN: Creates a ChatKit session with `POST /v1/chatkit/sessions`.
2949    /// 中文:使用 `POST /v1/chatkit/sessions` 创建 ChatKit session。
2950    pub async fn create(
2951        &self,
2952        request: CreateChatKitSessionRequest,
2953    ) -> Result<ChatKitSession, LingerError> {
2954        let client = Client {
2955            config: self.config.clone(),
2956            transport: self.transport.clone(),
2957        };
2958        let mut request =
2959            client.build_json_request(HttpMethod::Post, "/v1/chatkit/sessions", &request)?;
2960        apply_chatkit_beta_header(&mut request);
2961        let response = self.transport.send(request).await?;
2962        let (status, headers, body) = response.into_bytes().await?;
2963        if !(200..300).contains(&status) {
2964            return Err(parse_api_error(status, headers, &body));
2965        }
2966        let request_id = request_id_from_headers(&headers);
2967        let response = serde_json::from_slice::<ChatKitSession>(&body)?.with_request_id(request_id);
2968        Ok(response)
2969    }
2970
2971    /// EN: Cancels a ChatKit session with `POST /v1/chatkit/sessions/{session_id}/cancel`.
2972    /// 中文:使用 `POST /v1/chatkit/sessions/{session_id}/cancel` 取消 ChatKit session。
2973    pub async fn cancel(&self, session_id: &str) -> Result<ChatKitSession, LingerError> {
2974        let session_id = validate_chatkit_session_id(session_id)?;
2975        let client = Client {
2976            config: self.config.clone(),
2977            transport: self.transport.clone(),
2978        };
2979        let path = format!("/v1/chatkit/sessions/{session_id}/cancel");
2980        let mut request = client.build_empty_request(HttpMethod::Post, &path);
2981        apply_chatkit_beta_header(&mut request);
2982        let response = self.transport.send(request).await?;
2983        let (status, headers, body) = response.into_bytes().await?;
2984        if !(200..300).contains(&status) {
2985            return Err(parse_api_error(status, headers, &body));
2986        }
2987        let request_id = request_id_from_headers(&headers);
2988        let response = serde_json::from_slice::<ChatKitSession>(&body)?.with_request_id(request_id);
2989        Ok(response)
2990    }
2991}
2992
2993/// EN: ChatKit Threads beta API resource.
2994/// 中文:ChatKit Threads beta API 资源。
2995#[derive(Clone, Debug)]
2996pub struct ChatKitThreadsResource {
2997    config: ClientConfig,
2998    transport: SharedTransport,
2999}
3000
3001impl ChatKitThreadsResource {
3002    /// EN: Lists ChatKit threads with `GET /v1/chatkit/threads`.
3003    /// 中文:使用 `GET /v1/chatkit/threads` 列出 ChatKit threads。
3004    pub async fn list(&self) -> Result<ChatKitThreadPage, LingerError> {
3005        let client = Client {
3006            config: self.config.clone(),
3007            transport: self.transport.clone(),
3008        };
3009        let mut request = client.build_empty_request(HttpMethod::Get, "/v1/chatkit/threads");
3010        apply_chatkit_beta_header(&mut request);
3011        let response = self.transport.send(request).await?;
3012        let (status, headers, body) = response.into_bytes().await?;
3013        if !(200..300).contains(&status) {
3014            return Err(parse_api_error(status, headers, &body));
3015        }
3016        let request_id = request_id_from_headers(&headers);
3017        let response =
3018            serde_json::from_slice::<ChatKitThreadPage>(&body)?.with_request_id(request_id);
3019        Ok(response)
3020    }
3021
3022    /// EN: Lists items for a ChatKit thread with `GET /v1/chatkit/threads/{thread_id}/items`.
3023    /// 中文:使用 `GET /v1/chatkit/threads/{thread_id}/items` 列出 ChatKit thread items。
3024    pub async fn list_items(&self, thread_id: &str) -> Result<ChatKitThreadItemPage, LingerError> {
3025        let thread_id = validate_chatkit_thread_id(thread_id)?;
3026        let client = Client {
3027            config: self.config.clone(),
3028            transport: self.transport.clone(),
3029        };
3030        let path = format!("/v1/chatkit/threads/{thread_id}/items");
3031        let mut request = client.build_empty_request(HttpMethod::Get, &path);
3032        apply_chatkit_beta_header(&mut request);
3033        let response = self.transport.send(request).await?;
3034        let (status, headers, body) = response.into_bytes().await?;
3035        if !(200..300).contains(&status) {
3036            return Err(parse_api_error(status, headers, &body));
3037        }
3038        let request_id = request_id_from_headers(&headers);
3039        let response =
3040            serde_json::from_slice::<ChatKitThreadItemPage>(&body)?.with_request_id(request_id);
3041        Ok(response)
3042    }
3043
3044    /// EN: Retrieves a ChatKit thread with `GET /v1/chatkit/threads/{thread_id}`.
3045    /// 中文:使用 `GET /v1/chatkit/threads/{thread_id}` 获取 ChatKit thread。
3046    pub async fn retrieve(&self, thread_id: &str) -> Result<ChatKitThread, LingerError> {
3047        let thread_id = validate_chatkit_thread_id(thread_id)?;
3048        let client = Client {
3049            config: self.config.clone(),
3050            transport: self.transport.clone(),
3051        };
3052        let path = format!("/v1/chatkit/threads/{thread_id}");
3053        let mut request = client.build_empty_request(HttpMethod::Get, &path);
3054        apply_chatkit_beta_header(&mut request);
3055        let response = self.transport.send(request).await?;
3056        let (status, headers, body) = response.into_bytes().await?;
3057        if !(200..300).contains(&status) {
3058            return Err(parse_api_error(status, headers, &body));
3059        }
3060        let request_id = request_id_from_headers(&headers);
3061        let response = serde_json::from_slice::<ChatKitThread>(&body)?.with_request_id(request_id);
3062        Ok(response)
3063    }
3064
3065    /// EN: Deletes a ChatKit thread with `DELETE /v1/chatkit/threads/{thread_id}`.
3066    /// 中文:使用 `DELETE /v1/chatkit/threads/{thread_id}` 删除 ChatKit thread。
3067    pub async fn delete(&self, thread_id: &str) -> Result<ChatKitThreadDeletion, LingerError> {
3068        let thread_id = validate_chatkit_thread_id(thread_id)?;
3069        let client = Client {
3070            config: self.config.clone(),
3071            transport: self.transport.clone(),
3072        };
3073        let path = format!("/v1/chatkit/threads/{thread_id}");
3074        let mut request = client.build_empty_request(HttpMethod::Delete, &path);
3075        apply_chatkit_beta_header(&mut request);
3076        let response = self.transport.send(request).await?;
3077        let (status, headers, body) = response.into_bytes().await?;
3078        if !(200..300).contains(&status) {
3079            return Err(parse_api_error(status, headers, &body));
3080        }
3081        let request_id = request_id_from_headers(&headers);
3082        let response =
3083            serde_json::from_slice::<ChatKitThreadDeletion>(&body)?.with_request_id(request_id);
3084        Ok(response)
3085    }
3086}
3087
3088/// EN: Embeddings API resource.
3089/// 中文:Embeddings API 资源。
3090#[derive(Clone, Debug)]
3091pub struct EmbeddingsResource {
3092    config: ClientConfig,
3093    transport: SharedTransport,
3094}
3095
3096impl EmbeddingsResource {
3097    /// EN: Creates embeddings with `POST /v1/embeddings`.
3098    /// 中文:使用 `POST /v1/embeddings` 创建 embeddings。
3099    pub async fn create(
3100        &self,
3101        request: CreateEmbeddingRequest,
3102    ) -> Result<EmbeddingResponse, LingerError> {
3103        let client = Client {
3104            config: self.config.clone(),
3105            transport: self.transport.clone(),
3106        };
3107        let request = client.build_json_request(HttpMethod::Post, "/v1/embeddings", &request)?;
3108        let response = self.transport.send(request).await?;
3109        let (status, headers, body) = response.into_bytes().await?;
3110        if !(200..300).contains(&status) {
3111            return Err(parse_api_error(status, headers, &body));
3112        }
3113        let request_id = request_id_from_headers(&headers);
3114        let response =
3115            serde_json::from_slice::<EmbeddingResponse>(&body)?.with_request_id(request_id);
3116        Ok(response)
3117    }
3118}
3119
3120/// EN: Realtime API resource.
3121/// 中文:Realtime API 资源。
3122#[derive(Clone, Debug)]
3123pub struct RealtimeResource {
3124    config: ClientConfig,
3125    transport: SharedTransport,
3126}
3127
3128impl RealtimeResource {
3129    /// EN: Returns the Realtime Calls API resource.
3130    /// 中文:返回 Realtime Calls API 资源。
3131    pub fn calls(&self) -> RealtimeCallsResource {
3132        RealtimeCallsResource {
3133            config: self.config.clone(),
3134            transport: self.transport.clone(),
3135        }
3136    }
3137
3138    /// EN: Returns the Realtime Sessions API resource.
3139    /// 中文:返回 Realtime Sessions API 资源。
3140    pub fn sessions(&self) -> RealtimeSessionsResource {
3141        RealtimeSessionsResource {
3142            config: self.config.clone(),
3143            transport: self.transport.clone(),
3144        }
3145    }
3146
3147    /// EN: Returns the Realtime Transcription Sessions API resource.
3148    /// 中文:返回 Realtime Transcription Sessions API 资源。
3149    pub fn transcription_sessions(&self) -> RealtimeTranscriptionSessionsResource {
3150        RealtimeTranscriptionSessionsResource {
3151            config: self.config.clone(),
3152            transport: self.transport.clone(),
3153        }
3154    }
3155
3156    /// EN: Returns the Realtime Translations API resource.
3157    /// 中文:返回 Realtime Translations API 资源。
3158    pub fn translations(&self) -> RealtimeTranslationsResource {
3159        RealtimeTranslationsResource {
3160            config: self.config.clone(),
3161            transport: self.transport.clone(),
3162        }
3163    }
3164
3165    /// EN: Returns the Realtime Client Secrets subresource.
3166    /// 中文:返回 Realtime Client Secrets 子资源。
3167    pub fn client_secrets(&self) -> RealtimeClientSecretsResource {
3168        RealtimeClientSecretsResource {
3169            config: self.config.clone(),
3170            transport: self.transport.clone(),
3171        }
3172    }
3173}
3174
3175/// EN: Realtime Calls API resource.
3176/// 中文:Realtime Calls API 资源。
3177#[derive(Clone, Debug)]
3178pub struct RealtimeCallsResource {
3179    config: ClientConfig,
3180    transport: SharedTransport,
3181}
3182
3183impl RealtimeCallsResource {
3184    /// EN: Creates a realtime call with `POST /v1/realtime/calls`.
3185    /// 中文:使用 `POST /v1/realtime/calls` 创建 realtime call。
3186    pub async fn create(
3187        &self,
3188        request: CreateRealtimeCallRequest,
3189    ) -> Result<RealtimeCallSdpAnswer, LingerError> {
3190        let client = Client {
3191            config: self.config.clone(),
3192            transport: self.transport.clone(),
3193        };
3194        let mut http_request = client.build_empty_request(HttpMethod::Post, "/v1/realtime/calls");
3195        request.apply_body(&mut http_request)?;
3196        let response = self.transport.send(http_request).await?;
3197        let (status, headers, body) = response.into_bytes().await?;
3198        if !(200..300).contains(&status) {
3199            return Err(parse_api_error(status, headers, &body));
3200        }
3201        let request_id = request_id_from_headers(&headers);
3202        RealtimeCallSdpAnswer::from_parts(&headers, request_id, body)
3203    }
3204
3205    /// EN: Accepts an incoming realtime call with `POST /v1/realtime/calls/{call_id}/accept`.
3206    /// 中文:使用 `POST /v1/realtime/calls/{call_id}/accept` 接听传入的 realtime call。
3207    pub async fn accept(
3208        &self,
3209        call_id: &str,
3210        request: CreateRealtimeSessionRequest,
3211    ) -> Result<(), LingerError> {
3212        let call_id = validate_realtime_call_id(call_id)?;
3213        let client = Client {
3214            config: self.config.clone(),
3215            transport: self.transport.clone(),
3216        };
3217        let path = format!("/v1/realtime/calls/{call_id}/accept");
3218        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
3219        let response = self.transport.send(request).await?;
3220        let (status, headers, body) = response.into_bytes().await?;
3221        if !(200..300).contains(&status) {
3222            return Err(parse_api_error(status, headers, &body));
3223        }
3224        Ok(())
3225    }
3226
3227    /// EN: Hangs up a realtime call with `POST /v1/realtime/calls/{call_id}/hangup`.
3228    /// 中文:使用 `POST /v1/realtime/calls/{call_id}/hangup` 挂断 realtime call。
3229    pub async fn hangup(&self, call_id: &str) -> Result<(), LingerError> {
3230        let call_id = validate_realtime_call_id(call_id)?;
3231        let client = Client {
3232            config: self.config.clone(),
3233            transport: self.transport.clone(),
3234        };
3235        let path = format!("/v1/realtime/calls/{call_id}/hangup");
3236        let request = client.build_empty_request(HttpMethod::Post, &path);
3237        let response = self.transport.send(request).await?;
3238        let (status, headers, body) = response.into_bytes().await?;
3239        if !(200..300).contains(&status) {
3240            return Err(parse_api_error(status, headers, &body));
3241        }
3242        Ok(())
3243    }
3244
3245    /// EN: Rejects an incoming realtime call with `POST /v1/realtime/calls/{call_id}/reject`.
3246    /// 中文:使用 `POST /v1/realtime/calls/{call_id}/reject` 拒绝传入的 realtime call。
3247    pub async fn reject(&self, call_id: &str) -> Result<(), LingerError> {
3248        let call_id = validate_realtime_call_id(call_id)?;
3249        let client = Client {
3250            config: self.config.clone(),
3251            transport: self.transport.clone(),
3252        };
3253        let path = format!("/v1/realtime/calls/{call_id}/reject");
3254        let request = client.build_empty_request(HttpMethod::Post, &path);
3255        let response = self.transport.send(request).await?;
3256        let (status, headers, body) = response.into_bytes().await?;
3257        if !(200..300).contains(&status) {
3258            return Err(parse_api_error(status, headers, &body));
3259        }
3260        Ok(())
3261    }
3262
3263    /// EN: Rejects an incoming realtime call with an optional SIP status code.
3264    /// 中文:使用可选 SIP 状态码拒绝传入的 realtime call。
3265    pub async fn reject_with(
3266        &self,
3267        call_id: &str,
3268        request: RejectRealtimeCallRequest,
3269    ) -> Result<(), LingerError> {
3270        let call_id = validate_realtime_call_id(call_id)?;
3271        let client = Client {
3272            config: self.config.clone(),
3273            transport: self.transport.clone(),
3274        };
3275        let path = format!("/v1/realtime/calls/{call_id}/reject");
3276        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
3277        let response = self.transport.send(request).await?;
3278        let (status, headers, body) = response.into_bytes().await?;
3279        if !(200..300).contains(&status) {
3280            return Err(parse_api_error(status, headers, &body));
3281        }
3282        Ok(())
3283    }
3284
3285    /// EN: Refers an active realtime call with `POST /v1/realtime/calls/{call_id}/refer`.
3286    /// 中文:使用 `POST /v1/realtime/calls/{call_id}/refer` 转接活跃的 realtime call。
3287    pub async fn refer(
3288        &self,
3289        call_id: &str,
3290        request: CreateRealtimeCallReferRequest,
3291    ) -> Result<(), LingerError> {
3292        let call_id = validate_realtime_call_id(call_id)?;
3293        let client = Client {
3294            config: self.config.clone(),
3295            transport: self.transport.clone(),
3296        };
3297        let path = format!("/v1/realtime/calls/{call_id}/refer");
3298        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
3299        let response = self.transport.send(request).await?;
3300        let (status, headers, body) = response.into_bytes().await?;
3301        if !(200..300).contains(&status) {
3302            return Err(parse_api_error(status, headers, &body));
3303        }
3304        Ok(())
3305    }
3306}
3307
3308/// EN: Realtime Sessions API resource.
3309/// 中文:Realtime Sessions API 资源。
3310#[derive(Clone, Debug)]
3311pub struct RealtimeSessionsResource {
3312    config: ClientConfig,
3313    transport: SharedTransport,
3314}
3315
3316impl RealtimeSessionsResource {
3317    /// EN: Creates a realtime session with `POST /v1/realtime/sessions`.
3318    /// 中文:使用 `POST /v1/realtime/sessions` 创建 realtime session。
3319    pub async fn create(
3320        &self,
3321        request: CreateRealtimeSessionRequest,
3322    ) -> Result<RealtimeSession, LingerError> {
3323        let client = Client {
3324            config: self.config.clone(),
3325            transport: self.transport.clone(),
3326        };
3327        let request =
3328            client.build_json_request(HttpMethod::Post, "/v1/realtime/sessions", &request)?;
3329        let response = self.transport.send(request).await?;
3330        let (status, headers, body) = response.into_bytes().await?;
3331        if !(200..300).contains(&status) {
3332            return Err(parse_api_error(status, headers, &body));
3333        }
3334        let request_id = request_id_from_headers(&headers);
3335        let response =
3336            serde_json::from_slice::<RealtimeSession>(&body)?.with_request_id(request_id);
3337        Ok(response)
3338    }
3339}
3340
3341/// EN: Realtime Transcription Sessions API resource.
3342/// 中文:Realtime Transcription Sessions API 资源。
3343#[derive(Clone, Debug)]
3344pub struct RealtimeTranscriptionSessionsResource {
3345    config: ClientConfig,
3346    transport: SharedTransport,
3347}
3348
3349impl RealtimeTranscriptionSessionsResource {
3350    /// EN: Creates a realtime transcription session with `POST /v1/realtime/transcription_sessions`.
3351    /// 中文:使用 `POST /v1/realtime/transcription_sessions` 创建 realtime transcription session。
3352    pub async fn create(
3353        &self,
3354        request: CreateRealtimeTranscriptionSessionRequest,
3355    ) -> Result<RealtimeTranscriptionSession, LingerError> {
3356        let client = Client {
3357            config: self.config.clone(),
3358            transport: self.transport.clone(),
3359        };
3360        let request = client.build_json_request(
3361            HttpMethod::Post,
3362            "/v1/realtime/transcription_sessions",
3363            &request,
3364        )?;
3365        let response = self.transport.send(request).await?;
3366        let (status, headers, body) = response.into_bytes().await?;
3367        if !(200..300).contains(&status) {
3368            return Err(parse_api_error(status, headers, &body));
3369        }
3370        let request_id = request_id_from_headers(&headers);
3371        let response = serde_json::from_slice::<RealtimeTranscriptionSession>(&body)?
3372            .with_request_id(request_id);
3373        Ok(response)
3374    }
3375}
3376
3377/// EN: Realtime Translations API resource.
3378/// 中文:Realtime Translations API 资源。
3379#[derive(Clone, Debug)]
3380pub struct RealtimeTranslationsResource {
3381    config: ClientConfig,
3382    transport: SharedTransport,
3383}
3384
3385impl RealtimeTranslationsResource {
3386    /// EN: Returns the Realtime Translation Client Secrets API resource.
3387    /// 中文:返回 Realtime Translation Client Secrets API 资源。
3388    pub fn client_secrets(&self) -> RealtimeTranslationClientSecretsResource {
3389        RealtimeTranslationClientSecretsResource {
3390            config: self.config.clone(),
3391            transport: self.transport.clone(),
3392        }
3393    }
3394}
3395
3396/// EN: Realtime Translation Client Secrets API resource.
3397/// 中文:Realtime Translation Client Secrets API 资源。
3398#[derive(Clone, Debug)]
3399pub struct RealtimeTranslationClientSecretsResource {
3400    config: ClientConfig,
3401    transport: SharedTransport,
3402}
3403
3404impl RealtimeTranslationClientSecretsResource {
3405    /// EN: Creates a realtime translation client secret with `POST /v1/realtime/translations/client_secrets`.
3406    /// 中文:使用 `POST /v1/realtime/translations/client_secrets` 创建 realtime translation client secret。
3407    pub async fn create(
3408        &self,
3409        request: CreateRealtimeTranslationClientSecretRequest,
3410    ) -> Result<RealtimeTranslationClientSecret, LingerError> {
3411        let client = Client {
3412            config: self.config.clone(),
3413            transport: self.transport.clone(),
3414        };
3415        let request = client.build_json_request(
3416            HttpMethod::Post,
3417            "/v1/realtime/translations/client_secrets",
3418            &request,
3419        )?;
3420        let response = self.transport.send(request).await?;
3421        let (status, headers, body) = response.into_bytes().await?;
3422        if !(200..300).contains(&status) {
3423            return Err(parse_api_error(status, headers, &body));
3424        }
3425        let request_id = request_id_from_headers(&headers);
3426        let response = serde_json::from_slice::<RealtimeTranslationClientSecret>(&body)?
3427            .with_request_id(request_id);
3428        Ok(response)
3429    }
3430}
3431
3432/// EN: Realtime Client Secrets API resource.
3433/// 中文:Realtime Client Secrets API 资源。
3434#[derive(Clone, Debug)]
3435pub struct RealtimeClientSecretsResource {
3436    config: ClientConfig,
3437    transport: SharedTransport,
3438}
3439
3440impl RealtimeClientSecretsResource {
3441    /// EN: Creates a realtime client secret with `POST /v1/realtime/client_secrets`.
3442    /// 中文:使用 `POST /v1/realtime/client_secrets` 创建 realtime client secret。
3443    pub async fn create(
3444        &self,
3445        request: CreateRealtimeClientSecretRequest,
3446    ) -> Result<RealtimeClientSecret, LingerError> {
3447        let client = Client {
3448            config: self.config.clone(),
3449            transport: self.transport.clone(),
3450        };
3451        let request =
3452            client.build_json_request(HttpMethod::Post, "/v1/realtime/client_secrets", &request)?;
3453        let response = self.transport.send(request).await?;
3454        let (status, headers, body) = response.into_bytes().await?;
3455        if !(200..300).contains(&status) {
3456            return Err(parse_api_error(status, headers, &body));
3457        }
3458        let request_id = request_id_from_headers(&headers);
3459        let response =
3460            serde_json::from_slice::<RealtimeClientSecret>(&body)?.with_request_id(request_id);
3461        Ok(response)
3462    }
3463}
3464
3465/// EN: Evals API resource.
3466/// 中文:Evals API 资源。
3467#[derive(Clone, Debug)]
3468pub struct EvalsResource {
3469    config: ClientConfig,
3470    transport: SharedTransport,
3471}
3472
3473impl EvalsResource {
3474    /// EN: Creates an eval with `POST /v1/evals`.
3475    /// 中文:使用 `POST /v1/evals` 创建 eval。
3476    pub async fn create(&self, request: CreateEvalRequest) -> Result<Eval, LingerError> {
3477        let client = Client {
3478            config: self.config.clone(),
3479            transport: self.transport.clone(),
3480        };
3481        let request = client.build_json_request(HttpMethod::Post, "/v1/evals", &request)?;
3482        let response = self.transport.send(request).await?;
3483        let (status, headers, body) = response.into_bytes().await?;
3484        if !(200..300).contains(&status) {
3485            return Err(parse_api_error(status, headers, &body));
3486        }
3487        let request_id = request_id_from_headers(&headers);
3488        let response = serde_json::from_slice::<Eval>(&body)?.with_request_id(request_id);
3489        Ok(response)
3490    }
3491
3492    /// EN: Lists evals with `GET /v1/evals`.
3493    /// 中文:使用 `GET /v1/evals` 列出 eval。
3494    pub async fn list(&self) -> Result<EvalPage, LingerError> {
3495        let client = Client {
3496            config: self.config.clone(),
3497            transport: self.transport.clone(),
3498        };
3499        let (headers, body) = client.send_retryable_get("/v1/evals").await?;
3500        let request_id = request_id_from_headers(&headers);
3501        let response = serde_json::from_slice::<EvalPage>(&body)?.with_request_id(request_id);
3502        Ok(response)
3503    }
3504
3505    /// EN: Retrieves an eval with `GET /v1/evals/{eval_id}`.
3506    /// 中文:使用 `GET /v1/evals/{eval_id}` 获取 eval。
3507    pub async fn retrieve(&self, eval_id: &str) -> Result<Eval, LingerError> {
3508        let eval_id = validate_eval_id(eval_id)?;
3509        let client = Client {
3510            config: self.config.clone(),
3511            transport: self.transport.clone(),
3512        };
3513        let path = format!("/v1/evals/{eval_id}");
3514        let (headers, body) = client.send_retryable_get(&path).await?;
3515        let request_id = request_id_from_headers(&headers);
3516        let response = serde_json::from_slice::<Eval>(&body)?.with_request_id(request_id);
3517        Ok(response)
3518    }
3519
3520    /// EN: Modifies an eval with `POST /v1/evals/{eval_id}`.
3521    /// 中文:使用 `POST /v1/evals/{eval_id}` 修改 eval。
3522    pub async fn modify(
3523        &self,
3524        eval_id: &str,
3525        request: ModifyEvalRequest,
3526    ) -> Result<Eval, LingerError> {
3527        let eval_id = validate_eval_id(eval_id)?;
3528        let client = Client {
3529            config: self.config.clone(),
3530            transport: self.transport.clone(),
3531        };
3532        let path = format!("/v1/evals/{eval_id}");
3533        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
3534        let response = self.transport.send(request).await?;
3535        let (status, headers, body) = response.into_bytes().await?;
3536        if !(200..300).contains(&status) {
3537            return Err(parse_api_error(status, headers, &body));
3538        }
3539        let request_id = request_id_from_headers(&headers);
3540        let response = serde_json::from_slice::<Eval>(&body)?.with_request_id(request_id);
3541        Ok(response)
3542    }
3543
3544    /// EN: Deletes an eval with `DELETE /v1/evals/{eval_id}`.
3545    /// 中文:使用 `DELETE /v1/evals/{eval_id}` 删除 eval。
3546    pub async fn delete(&self, eval_id: &str) -> Result<EvalDeletion, LingerError> {
3547        let eval_id = validate_eval_id(eval_id)?;
3548        let client = Client {
3549            config: self.config.clone(),
3550            transport: self.transport.clone(),
3551        };
3552        let path = format!("/v1/evals/{eval_id}");
3553        let request = client.build_empty_request(HttpMethod::Delete, &path);
3554        let response = self.transport.send(request).await?;
3555        let (status, headers, body) = response.into_bytes().await?;
3556        if !(200..300).contains(&status) {
3557            return Err(parse_api_error(status, headers, &body));
3558        }
3559        let request_id = request_id_from_headers(&headers);
3560        let response = serde_json::from_slice::<EvalDeletion>(&body)?.with_request_id(request_id);
3561        Ok(response)
3562    }
3563
3564    /// EN: Returns the Eval Runs subresource for an eval id.
3565    /// 中文:返回指定 eval ID 的 Eval Runs 子资源。
3566    pub fn runs(&self, eval_id: &str) -> EvalRunsResource {
3567        EvalRunsResource {
3568            config: self.config.clone(),
3569            transport: self.transport.clone(),
3570            eval_id: eval_id.to_string(),
3571        }
3572    }
3573}
3574
3575/// EN: Eval Runs API resource.
3576/// 中文:Eval Runs API 资源。
3577#[derive(Clone, Debug)]
3578pub struct EvalRunsResource {
3579    config: ClientConfig,
3580    transport: SharedTransport,
3581    eval_id: String,
3582}
3583
3584impl EvalRunsResource {
3585    /// EN: Creates an eval run with `POST /v1/evals/{eval_id}/runs`.
3586    /// 中文:使用 `POST /v1/evals/{eval_id}/runs` 创建 eval run。
3587    pub async fn create(&self, request: CreateEvalRunRequest) -> Result<EvalRun, LingerError> {
3588        let eval_id = validate_eval_id(&self.eval_id)?;
3589        let client = Client {
3590            config: self.config.clone(),
3591            transport: self.transport.clone(),
3592        };
3593        let path = format!("/v1/evals/{eval_id}/runs");
3594        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
3595        let response = self.transport.send(request).await?;
3596        let (status, headers, body) = response.into_bytes().await?;
3597        if !(200..300).contains(&status) {
3598            return Err(parse_api_error(status, headers, &body));
3599        }
3600        let request_id = request_id_from_headers(&headers);
3601        let response = serde_json::from_slice::<EvalRun>(&body)?.with_request_id(request_id);
3602        Ok(response)
3603    }
3604
3605    /// EN: Lists eval runs with `GET /v1/evals/{eval_id}/runs`.
3606    /// 中文:使用 `GET /v1/evals/{eval_id}/runs` 列出 eval run。
3607    pub async fn list(&self) -> Result<EvalRunPage, LingerError> {
3608        let eval_id = validate_eval_id(&self.eval_id)?;
3609        let client = Client {
3610            config: self.config.clone(),
3611            transport: self.transport.clone(),
3612        };
3613        let path = format!("/v1/evals/{eval_id}/runs");
3614        let (headers, body) = client.send_retryable_get(&path).await?;
3615        let request_id = request_id_from_headers(&headers);
3616        let response = serde_json::from_slice::<EvalRunPage>(&body)?.with_request_id(request_id);
3617        Ok(response)
3618    }
3619
3620    /// EN: Retrieves an eval run with `GET /v1/evals/{eval_id}/runs/{run_id}`.
3621    /// 中文:使用 `GET /v1/evals/{eval_id}/runs/{run_id}` 获取 eval run。
3622    pub async fn retrieve(&self, run_id: &str) -> Result<EvalRun, LingerError> {
3623        let eval_id = validate_eval_id(&self.eval_id)?;
3624        let run_id = validate_eval_run_id(run_id)?;
3625        let client = Client {
3626            config: self.config.clone(),
3627            transport: self.transport.clone(),
3628        };
3629        let path = format!("/v1/evals/{eval_id}/runs/{run_id}");
3630        let (headers, body) = client.send_retryable_get(&path).await?;
3631        let request_id = request_id_from_headers(&headers);
3632        let response = serde_json::from_slice::<EvalRun>(&body)?.with_request_id(request_id);
3633        Ok(response)
3634    }
3635
3636    /// EN: Cancels an eval run with `POST /v1/evals/{eval_id}/runs/{run_id}/cancel`.
3637    /// 中文:使用 `POST /v1/evals/{eval_id}/runs/{run_id}/cancel` 取消 eval run。
3638    pub async fn cancel(&self, run_id: &str) -> Result<EvalRun, LingerError> {
3639        let eval_id = validate_eval_id(&self.eval_id)?;
3640        let run_id = validate_eval_run_id(run_id)?;
3641        let client = Client {
3642            config: self.config.clone(),
3643            transport: self.transport.clone(),
3644        };
3645        let path = format!("/v1/evals/{eval_id}/runs/{run_id}/cancel");
3646        let request = client.build_empty_request(HttpMethod::Post, &path);
3647        let response = self.transport.send(request).await?;
3648        let (status, headers, body) = response.into_bytes().await?;
3649        if !(200..300).contains(&status) {
3650            return Err(parse_api_error(status, headers, &body));
3651        }
3652        let request_id = request_id_from_headers(&headers);
3653        let response = serde_json::from_slice::<EvalRun>(&body)?.with_request_id(request_id);
3654        Ok(response)
3655    }
3656
3657    /// EN: Deletes an eval run with `DELETE /v1/evals/{eval_id}/runs/{run_id}`.
3658    /// 中文:使用 `DELETE /v1/evals/{eval_id}/runs/{run_id}` 删除 eval run。
3659    pub async fn delete(&self, run_id: &str) -> Result<EvalRunDeletion, LingerError> {
3660        let eval_id = validate_eval_id(&self.eval_id)?;
3661        let run_id = validate_eval_run_id(run_id)?;
3662        let client = Client {
3663            config: self.config.clone(),
3664            transport: self.transport.clone(),
3665        };
3666        let path = format!("/v1/evals/{eval_id}/runs/{run_id}");
3667        let request = client.build_empty_request(HttpMethod::Delete, &path);
3668        let response = self.transport.send(request).await?;
3669        let (status, headers, body) = response.into_bytes().await?;
3670        if !(200..300).contains(&status) {
3671            return Err(parse_api_error(status, headers, &body));
3672        }
3673        let request_id = request_id_from_headers(&headers);
3674        let response =
3675            serde_json::from_slice::<EvalRunDeletion>(&body)?.with_request_id(request_id);
3676        Ok(response)
3677    }
3678
3679    /// EN: Returns the Eval Run Output Items subresource for a run id.
3680    /// 中文:返回指定 run ID 的 Eval Run Output Items 子资源。
3681    pub fn output_items(&self, run_id: &str) -> EvalRunOutputItemsResource {
3682        EvalRunOutputItemsResource {
3683            config: self.config.clone(),
3684            transport: self.transport.clone(),
3685            eval_id: self.eval_id.clone(),
3686            run_id: run_id.to_string(),
3687        }
3688    }
3689}
3690
3691/// EN: Eval Run Output Items API resource.
3692/// 中文:Eval Run Output Items API 资源。
3693#[derive(Clone, Debug)]
3694pub struct EvalRunOutputItemsResource {
3695    config: ClientConfig,
3696    transport: SharedTransport,
3697    eval_id: String,
3698    run_id: String,
3699}
3700
3701impl EvalRunOutputItemsResource {
3702    /// EN: Lists eval run output items.
3703    /// 中文:列出 eval run output item。
3704    pub async fn list(&self) -> Result<EvalRunOutputItemPage, LingerError> {
3705        let eval_id = validate_eval_id(&self.eval_id)?;
3706        let run_id = validate_eval_run_id(&self.run_id)?;
3707        let client = Client {
3708            config: self.config.clone(),
3709            transport: self.transport.clone(),
3710        };
3711        let path = format!("/v1/evals/{eval_id}/runs/{run_id}/output_items");
3712        let (headers, body) = client.send_retryable_get(&path).await?;
3713        let request_id = request_id_from_headers(&headers);
3714        let response =
3715            serde_json::from_slice::<EvalRunOutputItemPage>(&body)?.with_request_id(request_id);
3716        Ok(response)
3717    }
3718
3719    /// EN: Retrieves an eval run output item.
3720    /// 中文:获取 eval run output item。
3721    pub async fn retrieve(&self, output_item_id: &str) -> Result<EvalRunOutputItem, LingerError> {
3722        let eval_id = validate_eval_id(&self.eval_id)?;
3723        let run_id = validate_eval_run_id(&self.run_id)?;
3724        let output_item_id = validate_eval_run_output_item_id(output_item_id)?;
3725        let client = Client {
3726            config: self.config.clone(),
3727            transport: self.transport.clone(),
3728        };
3729        let path = format!("/v1/evals/{eval_id}/runs/{run_id}/output_items/{output_item_id}");
3730        let (headers, body) = client.send_retryable_get(&path).await?;
3731        let request_id = request_id_from_headers(&headers);
3732        let response =
3733            serde_json::from_slice::<EvalRunOutputItem>(&body)?.with_request_id(request_id);
3734        Ok(response)
3735    }
3736}
3737
3738/// EN: Conversations API resource.
3739/// 中文:Conversations API 资源。
3740#[derive(Clone, Debug)]
3741pub struct ConversationsResource {
3742    config: ClientConfig,
3743    transport: SharedTransport,
3744}
3745
3746impl ConversationsResource {
3747    /// EN: Creates a conversation with `POST /v1/conversations`.
3748    /// 中文:使用 `POST /v1/conversations` 创建会话。
3749    pub async fn create(
3750        &self,
3751        request: CreateConversationRequest,
3752    ) -> Result<Conversation, LingerError> {
3753        let client = Client {
3754            config: self.config.clone(),
3755            transport: self.transport.clone(),
3756        };
3757        let request = client.build_json_request(HttpMethod::Post, "/v1/conversations", &request)?;
3758        let response = self.transport.send(request).await?;
3759        let (status, headers, body) = response.into_bytes().await?;
3760        if !(200..300).contains(&status) {
3761            return Err(parse_api_error(status, headers, &body));
3762        }
3763        let request_id = request_id_from_headers(&headers);
3764        let response = serde_json::from_slice::<Conversation>(&body)?.with_request_id(request_id);
3765        Ok(response)
3766    }
3767
3768    /// EN: Retrieves a conversation with `GET /v1/conversations/{conversation_id}`.
3769    /// 中文:使用 `GET /v1/conversations/{conversation_id}` 获取会话。
3770    pub async fn retrieve(&self, conversation_id: &str) -> Result<Conversation, LingerError> {
3771        let conversation_id = validate_conversation_id(conversation_id)?;
3772        let client = Client {
3773            config: self.config.clone(),
3774            transport: self.transport.clone(),
3775        };
3776        let path = format!("/v1/conversations/{conversation_id}");
3777        let (headers, body) = client.send_retryable_get(&path).await?;
3778        let request_id = request_id_from_headers(&headers);
3779        let response = serde_json::from_slice::<Conversation>(&body)?.with_request_id(request_id);
3780        Ok(response)
3781    }
3782
3783    /// EN: Modifies a conversation with `POST /v1/conversations/{conversation_id}`.
3784    /// 中文:使用 `POST /v1/conversations/{conversation_id}` 修改会话。
3785    pub async fn modify(
3786        &self,
3787        conversation_id: &str,
3788        request: ModifyConversationRequest,
3789    ) -> Result<Conversation, LingerError> {
3790        let conversation_id = validate_conversation_id(conversation_id)?;
3791        let client = Client {
3792            config: self.config.clone(),
3793            transport: self.transport.clone(),
3794        };
3795        let path = format!("/v1/conversations/{conversation_id}");
3796        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
3797        let response = self.transport.send(request).await?;
3798        let (status, headers, body) = response.into_bytes().await?;
3799        if !(200..300).contains(&status) {
3800            return Err(parse_api_error(status, headers, &body));
3801        }
3802        let request_id = request_id_from_headers(&headers);
3803        let response = serde_json::from_slice::<Conversation>(&body)?.with_request_id(request_id);
3804        Ok(response)
3805    }
3806
3807    /// EN: Deletes a conversation with `DELETE /v1/conversations/{conversation_id}`.
3808    /// 中文:使用 `DELETE /v1/conversations/{conversation_id}` 删除会话。
3809    pub async fn delete(&self, conversation_id: &str) -> Result<ConversationDeletion, LingerError> {
3810        let conversation_id = validate_conversation_id(conversation_id)?;
3811        let client = Client {
3812            config: self.config.clone(),
3813            transport: self.transport.clone(),
3814        };
3815        let path = format!("/v1/conversations/{conversation_id}");
3816        let request = client.build_empty_request(HttpMethod::Delete, &path);
3817        let response = self.transport.send(request).await?;
3818        let (status, headers, body) = response.into_bytes().await?;
3819        if !(200..300).contains(&status) {
3820            return Err(parse_api_error(status, headers, &body));
3821        }
3822        let request_id = request_id_from_headers(&headers);
3823        let response =
3824            serde_json::from_slice::<ConversationDeletion>(&body)?.with_request_id(request_id);
3825        Ok(response)
3826    }
3827
3828    /// EN: Returns the Conversation Items subresource for a conversation id.
3829    /// 中文:返回指定 Conversation ID 的 Conversation Items 子资源。
3830    pub fn items(&self, conversation_id: &str) -> ConversationItemsResource {
3831        ConversationItemsResource {
3832            config: self.config.clone(),
3833            transport: self.transport.clone(),
3834            conversation_id: conversation_id.to_string(),
3835        }
3836    }
3837}
3838
3839/// EN: Conversation Items API resource.
3840/// 中文:Conversation Items API 资源。
3841#[derive(Clone, Debug)]
3842pub struct ConversationItemsResource {
3843    config: ClientConfig,
3844    transport: SharedTransport,
3845    conversation_id: String,
3846}
3847
3848impl ConversationItemsResource {
3849    /// EN: Creates a conversation item with `POST /v1/conversations/{conversation_id}/items`.
3850    /// 中文:使用 `POST /v1/conversations/{conversation_id}/items` 创建会话项。
3851    pub async fn create(
3852        &self,
3853        request: CreateConversationItemRequest,
3854    ) -> Result<ConversationItem, LingerError> {
3855        let conversation_id = validate_conversation_id(&self.conversation_id)?;
3856        let client = Client {
3857            config: self.config.clone(),
3858            transport: self.transport.clone(),
3859        };
3860        let path = format!("/v1/conversations/{conversation_id}/items");
3861        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
3862        let response = self.transport.send(request).await?;
3863        let (status, headers, body) = response.into_bytes().await?;
3864        if !(200..300).contains(&status) {
3865            return Err(parse_api_error(status, headers, &body));
3866        }
3867        let request_id = request_id_from_headers(&headers);
3868        let response =
3869            serde_json::from_slice::<ConversationItem>(&body)?.with_request_id(request_id);
3870        Ok(response)
3871    }
3872
3873    /// EN: Lists conversation items.
3874    /// 中文:列出会话项。
3875    pub async fn list(&self) -> Result<ConversationItemPage, LingerError> {
3876        let conversation_id = validate_conversation_id(&self.conversation_id)?;
3877        let client = Client {
3878            config: self.config.clone(),
3879            transport: self.transport.clone(),
3880        };
3881        let path = format!("/v1/conversations/{conversation_id}/items");
3882        let (headers, body) = client.send_retryable_get(&path).await?;
3883        let request_id = request_id_from_headers(&headers);
3884        let response =
3885            serde_json::from_slice::<ConversationItemPage>(&body)?.with_request_id(request_id);
3886        Ok(response)
3887    }
3888
3889    /// EN: Retrieves a conversation item.
3890    /// 中文:获取会话项。
3891    pub async fn retrieve(&self, item_id: &str) -> Result<ConversationItem, LingerError> {
3892        let conversation_id = validate_conversation_id(&self.conversation_id)?;
3893        let item_id = validate_conversation_item_id(item_id)?;
3894        let client = Client {
3895            config: self.config.clone(),
3896            transport: self.transport.clone(),
3897        };
3898        let path = format!("/v1/conversations/{conversation_id}/items/{item_id}");
3899        let (headers, body) = client.send_retryable_get(&path).await?;
3900        let request_id = request_id_from_headers(&headers);
3901        let response =
3902            serde_json::from_slice::<ConversationItem>(&body)?.with_request_id(request_id);
3903        Ok(response)
3904    }
3905
3906    /// EN: Deletes a conversation item.
3907    /// 中文:删除会话项。
3908    pub async fn delete(&self, item_id: &str) -> Result<ConversationItemDeletion, LingerError> {
3909        let conversation_id = validate_conversation_id(&self.conversation_id)?;
3910        let item_id = validate_conversation_item_id(item_id)?;
3911        let client = Client {
3912            config: self.config.clone(),
3913            transport: self.transport.clone(),
3914        };
3915        let path = format!("/v1/conversations/{conversation_id}/items/{item_id}");
3916        let request = client.build_empty_request(HttpMethod::Delete, &path);
3917        let response = self.transport.send(request).await?;
3918        let (status, headers, body) = response.into_bytes().await?;
3919        if !(200..300).contains(&status) {
3920            return Err(parse_api_error(status, headers, &body));
3921        }
3922        let request_id = request_id_from_headers(&headers);
3923        let response =
3924            serde_json::from_slice::<ConversationItemDeletion>(&body)?.with_request_id(request_id);
3925        Ok(response)
3926    }
3927}
3928
3929/// EN: Models API resource.
3930/// 中文:Models API 资源。
3931#[derive(Clone, Debug)]
3932pub struct ModelsResource {
3933    config: ClientConfig,
3934    transport: SharedTransport,
3935}
3936
3937impl ModelsResource {
3938    /// EN: Lists currently available models with `GET /v1/models`.
3939    /// 中文:使用 `GET /v1/models` 列出当前可用模型。
3940    pub async fn list(&self) -> Result<ModelsPage, LingerError> {
3941        let client = Client {
3942            config: self.config.clone(),
3943            transport: self.transport.clone(),
3944        };
3945        let (headers, body) = client.send_retryable_get("/v1/models").await?;
3946        let request_id = request_id_from_headers(&headers);
3947        let response = serde_json::from_slice::<ModelsPage>(&body)?.with_request_id(request_id);
3948        Ok(response)
3949    }
3950
3951    /// EN: Retrieves a model with `GET /v1/models/{model}`.
3952    /// 中文:使用 `GET /v1/models/{model}` 获取模型。
3953    pub async fn retrieve(&self, model: &str) -> Result<Model, LingerError> {
3954        let model = model.trim();
3955        if model.is_empty() {
3956            return Err(LingerError::invalid_config("model is required"));
3957        }
3958        let client = Client {
3959            config: self.config.clone(),
3960            transport: self.transport.clone(),
3961        };
3962        let path = format!("/v1/models/{model}");
3963        let (headers, body) = client.send_retryable_get(&path).await?;
3964        let request_id = request_id_from_headers(&headers);
3965        let response = serde_json::from_slice::<Model>(&body)?.with_request_id(request_id);
3966        Ok(response)
3967    }
3968
3969    /// EN: Deletes a fine-tuned model with `DELETE /v1/models/{model}`.
3970    /// 中文:使用 `DELETE /v1/models/{model}` 删除微调模型。
3971    pub async fn delete(&self, model: &str) -> Result<ModelDeletion, LingerError> {
3972        let model = model.trim();
3973        if model.is_empty() {
3974            return Err(LingerError::invalid_config("model is required"));
3975        }
3976        let client = Client {
3977            config: self.config.clone(),
3978            transport: self.transport.clone(),
3979        };
3980        let path = format!("/v1/models/{model}");
3981        let request = client.build_empty_request(HttpMethod::Delete, &path);
3982        let response = self.transport.send(request).await?;
3983        let (status, headers, body) = response.into_bytes().await?;
3984        if !(200..300).contains(&status) {
3985            return Err(parse_api_error(status, headers, &body));
3986        }
3987        let request_id = request_id_from_headers(&headers);
3988        let response = serde_json::from_slice::<ModelDeletion>(&body)?.with_request_id(request_id);
3989        Ok(response)
3990    }
3991}
3992
3993/// EN: Videos API resource.
3994/// 中文:Videos API 资源。
3995#[derive(Clone, Debug)]
3996pub struct VideosResource {
3997    config: ClientConfig,
3998    transport: SharedTransport,
3999}
4000
4001impl VideosResource {
4002    /// EN: Creates a video with `POST /v1/videos`.
4003    /// 中文:使用 `POST /v1/videos` 创建 video。
4004    pub async fn create(&self, request: CreateVideoRequest) -> Result<Video, LingerError> {
4005        let client = Client {
4006            config: self.config.clone(),
4007            transport: self.transport.clone(),
4008        };
4009        let request = client.build_json_request(HttpMethod::Post, "/v1/videos", &request)?;
4010        let response = self.transport.send(request).await?;
4011        let (status, headers, body) = response.into_bytes().await?;
4012        if !(200..300).contains(&status) {
4013            return Err(parse_api_error(status, headers, &body));
4014        }
4015        let request_id = request_id_from_headers(&headers);
4016        let response = serde_json::from_slice::<Video>(&body)?.with_request_id(request_id);
4017        Ok(response)
4018    }
4019
4020    /// EN: Creates a video edit with `POST /v1/videos/edits`.
4021    /// 中文:使用 `POST /v1/videos/edits` 创建 video edit。
4022    pub async fn edit(&self, request: CreateVideoEditRequest) -> Result<Video, LingerError> {
4023        let client = Client {
4024            config: self.config.clone(),
4025            transport: self.transport.clone(),
4026        };
4027        let request = client.build_json_request(HttpMethod::Post, "/v1/videos/edits", &request)?;
4028        let response = self.transport.send(request).await?;
4029        let (status, headers, body) = response.into_bytes().await?;
4030        if !(200..300).contains(&status) {
4031            return Err(parse_api_error(status, headers, &body));
4032        }
4033        let request_id = request_id_from_headers(&headers);
4034        let response = serde_json::from_slice::<Video>(&body)?.with_request_id(request_id);
4035        Ok(response)
4036    }
4037
4038    /// EN: Creates a video extension with `POST /v1/videos/extensions`.
4039    /// 中文:使用 `POST /v1/videos/extensions` 创建 video extension。
4040    pub async fn extend(&self, request: CreateVideoExtensionRequest) -> Result<Video, LingerError> {
4041        let client = Client {
4042            config: self.config.clone(),
4043            transport: self.transport.clone(),
4044        };
4045        let request =
4046            client.build_json_request(HttpMethod::Post, "/v1/videos/extensions", &request)?;
4047        let response = self.transport.send(request).await?;
4048        let (status, headers, body) = response.into_bytes().await?;
4049        if !(200..300).contains(&status) {
4050            return Err(parse_api_error(status, headers, &body));
4051        }
4052        let request_id = request_id_from_headers(&headers);
4053        let response = serde_json::from_slice::<Video>(&body)?.with_request_id(request_id);
4054        Ok(response)
4055    }
4056
4057    /// EN: Lists videos with `GET /v1/videos`.
4058    /// 中文:使用 `GET /v1/videos` 列出 videos。
4059    pub async fn list(&self) -> Result<VideoPage, LingerError> {
4060        let client = Client {
4061            config: self.config.clone(),
4062            transport: self.transport.clone(),
4063        };
4064        let (headers, body) = client.send_retryable_get("/v1/videos").await?;
4065        let request_id = request_id_from_headers(&headers);
4066        let response = serde_json::from_slice::<VideoPage>(&body)?.with_request_id(request_id);
4067        Ok(response)
4068    }
4069
4070    /// EN: Retrieves a video with `GET /v1/videos/{video_id}`.
4071    /// 中文:使用 `GET /v1/videos/{video_id}` 获取 video。
4072    pub async fn retrieve(&self, video_id: &str) -> Result<Video, LingerError> {
4073        let video_id = validate_video_id(video_id)?;
4074        let client = Client {
4075            config: self.config.clone(),
4076            transport: self.transport.clone(),
4077        };
4078        let path = format!("/v1/videos/{video_id}");
4079        let (headers, body) = client.send_retryable_get(&path).await?;
4080        let request_id = request_id_from_headers(&headers);
4081        let response = serde_json::from_slice::<Video>(&body)?.with_request_id(request_id);
4082        Ok(response)
4083    }
4084
4085    /// EN: Downloads generated video content with `GET /v1/videos/{video_id}/content`.
4086    /// 中文:使用 `GET /v1/videos/{video_id}/content` 下载生成的视频内容。
4087    pub async fn content(
4088        &self,
4089        video_id: &str,
4090        variant: Option<VideoContentVariant>,
4091    ) -> Result<VideoContent, LingerError> {
4092        let video_id = validate_video_id(video_id)?;
4093        let client = Client {
4094            config: self.config.clone(),
4095            transport: self.transport.clone(),
4096        };
4097        let path = if let Some(variant) = variant {
4098            format!(
4099                "/v1/videos/{video_id}/content?variant={}",
4100                variant.as_query_value()
4101            )
4102        } else {
4103            format!("/v1/videos/{video_id}/content")
4104        };
4105        let request = client.build_empty_request(HttpMethod::Get, &path);
4106        let response = self.transport.send(request).await?;
4107        let status = response.status();
4108        if !(200..300).contains(&status) {
4109            let (status, headers, body) = response.into_bytes().await?;
4110            return Err(parse_api_error(status, headers, &body));
4111        }
4112        let request_id = request_id_from_headers(response.headers());
4113        Ok(VideoContent::new(request_id, response.into_body_stream()))
4114    }
4115
4116    /// EN: Deletes a video with `DELETE /v1/videos/{video_id}`.
4117    /// 中文:使用 `DELETE /v1/videos/{video_id}` 删除 video。
4118    pub async fn delete(&self, video_id: &str) -> Result<VideoDeletion, LingerError> {
4119        let video_id = validate_video_id(video_id)?;
4120        let client = Client {
4121            config: self.config.clone(),
4122            transport: self.transport.clone(),
4123        };
4124        let path = format!("/v1/videos/{video_id}");
4125        let request = client.build_empty_request(HttpMethod::Delete, &path);
4126        let response = self.transport.send(request).await?;
4127        let (status, headers, body) = response.into_bytes().await?;
4128        if !(200..300).contains(&status) {
4129            return Err(parse_api_error(status, headers, &body));
4130        }
4131        let request_id = request_id_from_headers(&headers);
4132        let response = serde_json::from_slice::<VideoDeletion>(&body)?.with_request_id(request_id);
4133        Ok(response)
4134    }
4135
4136    /// EN: Creates a remix with `POST /v1/videos/{video_id}/remix`.
4137    /// 中文:使用 `POST /v1/videos/{video_id}/remix` 创建 remix。
4138    pub async fn remix(
4139        &self,
4140        video_id: &str,
4141        request: CreateVideoRemixRequest,
4142    ) -> Result<Video, LingerError> {
4143        let video_id = validate_video_id(video_id)?;
4144        let client = Client {
4145            config: self.config.clone(),
4146            transport: self.transport.clone(),
4147        };
4148        let path = format!("/v1/videos/{video_id}/remix");
4149        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
4150        let response = self.transport.send(request).await?;
4151        let (status, headers, body) = response.into_bytes().await?;
4152        if !(200..300).contains(&status) {
4153            return Err(parse_api_error(status, headers, &body));
4154        }
4155        let request_id = request_id_from_headers(&headers);
4156        let response = serde_json::from_slice::<Video>(&body)?.with_request_id(request_id);
4157        Ok(response)
4158    }
4159
4160    /// EN: Returns the Video Characters subresource.
4161    /// 中文:返回 Video Characters 子资源。
4162    pub fn characters(&self) -> VideoCharactersResource {
4163        VideoCharactersResource {
4164            config: self.config.clone(),
4165            transport: self.transport.clone(),
4166        }
4167    }
4168}
4169
4170/// EN: Video Characters API resource.
4171/// 中文:Video Characters API 资源。
4172#[derive(Clone, Debug)]
4173pub struct VideoCharactersResource {
4174    config: ClientConfig,
4175    transport: SharedTransport,
4176}
4177
4178impl VideoCharactersResource {
4179    /// EN: Creates a video character with `POST /v1/videos/characters`.
4180    /// 中文:使用 `POST /v1/videos/characters` 创建 video character。
4181    pub async fn create(
4182        &self,
4183        request: CreateVideoCharacterRequest,
4184    ) -> Result<VideoCharacter, LingerError> {
4185        let client = Client {
4186            config: self.config.clone(),
4187            transport: self.transport.clone(),
4188        };
4189        let mut http_request =
4190            client.build_empty_request(HttpMethod::Post, "/v1/videos/characters");
4191        request.apply_multipart_body(&mut http_request);
4192        let response = self.transport.send(http_request).await?;
4193        let (status, headers, body) = response.into_bytes().await?;
4194        if !(200..300).contains(&status) {
4195            return Err(parse_api_error(status, headers, &body));
4196        }
4197        let request_id = request_id_from_headers(&headers);
4198        let response = serde_json::from_slice::<VideoCharacter>(&body)?.with_request_id(request_id);
4199        Ok(response)
4200    }
4201
4202    /// EN: Retrieves a video character with `GET /v1/videos/characters/{character_id}`.
4203    /// 中文:使用 `GET /v1/videos/characters/{character_id}` 获取 video character。
4204    pub async fn retrieve(&self, character_id: &str) -> Result<VideoCharacter, LingerError> {
4205        let character_id = validate_video_character_id(character_id)?;
4206        let client = Client {
4207            config: self.config.clone(),
4208            transport: self.transport.clone(),
4209        };
4210        let path = format!("/v1/videos/characters/{character_id}");
4211        let (headers, body) = client.send_retryable_get(&path).await?;
4212        let request_id = request_id_from_headers(&headers);
4213        let response = serde_json::from_slice::<VideoCharacter>(&body)?.with_request_id(request_id);
4214        Ok(response)
4215    }
4216}
4217
4218/// EN: Skills API resource.
4219/// 中文:Skills API 资源。
4220#[derive(Clone, Debug)]
4221pub struct SkillsResource {
4222    config: ClientConfig,
4223    transport: SharedTransport,
4224}
4225
4226impl SkillsResource {
4227    /// EN: Creates a skill with `POST /v1/skills`.
4228    /// 中文:使用 `POST /v1/skills` 创建 skill。
4229    pub async fn create(&self, request: CreateSkillRequest) -> Result<Skill, LingerError> {
4230        let client = Client {
4231            config: self.config.clone(),
4232            transport: self.transport.clone(),
4233        };
4234        let mut http_request = client.build_empty_request(HttpMethod::Post, "/v1/skills");
4235        request.apply_multipart_body(&mut http_request);
4236        let response = self.transport.send(http_request).await?;
4237        let (status, headers, body) = response.into_bytes().await?;
4238        if !(200..300).contains(&status) {
4239            return Err(parse_api_error(status, headers, &body));
4240        }
4241        let request_id = request_id_from_headers(&headers);
4242        let response = serde_json::from_slice::<Skill>(&body)?.with_request_id(request_id);
4243        Ok(response)
4244    }
4245
4246    /// EN: Lists skills with `GET /v1/skills`.
4247    /// 中文:使用 `GET /v1/skills` 列出 skills。
4248    pub async fn list(&self) -> Result<SkillPage, LingerError> {
4249        self.list_with(SkillListRequest::default()).await
4250    }
4251
4252    /// EN: Lists skills with query parameters for `GET /v1/skills`.
4253    /// 中文:使用查询参数调用 `GET /v1/skills` 列出 skills。
4254    pub async fn list_with(&self, request: SkillListRequest) -> Result<SkillPage, LingerError> {
4255        let client = Client {
4256            config: self.config.clone(),
4257            transport: self.transport.clone(),
4258        };
4259        let path = request.path();
4260        let (headers, body) = client.send_retryable_get(&path).await?;
4261        let request_id = request_id_from_headers(&headers);
4262        let response = serde_json::from_slice::<SkillPage>(&body)?.with_request_id(request_id);
4263        Ok(response)
4264    }
4265
4266    /// EN: Retrieves a skill with `GET /v1/skills/{skill_id}`.
4267    /// 中文:使用 `GET /v1/skills/{skill_id}` 获取 skill。
4268    pub async fn retrieve(&self, skill_id: &str) -> Result<Skill, LingerError> {
4269        let skill_id = validate_skill_id(skill_id)?;
4270        let client = Client {
4271            config: self.config.clone(),
4272            transport: self.transport.clone(),
4273        };
4274        let path = format!("/v1/skills/{skill_id}");
4275        let (headers, body) = client.send_retryable_get(&path).await?;
4276        let request_id = request_id_from_headers(&headers);
4277        let response = serde_json::from_slice::<Skill>(&body)?.with_request_id(request_id);
4278        Ok(response)
4279    }
4280
4281    /// EN: Updates a skill default version with `POST /v1/skills/{skill_id}`.
4282    /// 中文:使用 `POST /v1/skills/{skill_id}` 更新 skill 默认版本。
4283    pub async fn update(
4284        &self,
4285        skill_id: &str,
4286        request: UpdateSkillRequest,
4287    ) -> Result<Skill, LingerError> {
4288        let skill_id = validate_skill_id(skill_id)?;
4289        let client = Client {
4290            config: self.config.clone(),
4291            transport: self.transport.clone(),
4292        };
4293        let path = format!("/v1/skills/{skill_id}");
4294        let request = client.build_json_request(HttpMethod::Post, &path, &request)?;
4295        let response = self.transport.send(request).await?;
4296        let (status, headers, body) = response.into_bytes().await?;
4297        if !(200..300).contains(&status) {
4298            return Err(parse_api_error(status, headers, &body));
4299        }
4300        let request_id = request_id_from_headers(&headers);
4301        let response = serde_json::from_slice::<Skill>(&body)?.with_request_id(request_id);
4302        Ok(response)
4303    }
4304
4305    /// EN: Deletes a skill with `DELETE /v1/skills/{skill_id}`.
4306    /// 中文:使用 `DELETE /v1/skills/{skill_id}` 删除 skill。
4307    pub async fn delete(&self, skill_id: &str) -> Result<SkillDeletion, LingerError> {
4308        let skill_id = validate_skill_id(skill_id)?;
4309        let client = Client {
4310            config: self.config.clone(),
4311            transport: self.transport.clone(),
4312        };
4313        let path = format!("/v1/skills/{skill_id}");
4314        let request = client.build_empty_request(HttpMethod::Delete, &path);
4315        let response = self.transport.send(request).await?;
4316        let (status, headers, body) = response.into_bytes().await?;
4317        if !(200..300).contains(&status) {
4318            return Err(parse_api_error(status, headers, &body));
4319        }
4320        let request_id = request_id_from_headers(&headers);
4321        let response = serde_json::from_slice::<SkillDeletion>(&body)?.with_request_id(request_id);
4322        Ok(response)
4323    }
4324
4325    /// EN: Downloads skill bundle content with `GET /v1/skills/{skill_id}/content`.
4326    /// 中文:使用 `GET /v1/skills/{skill_id}/content` 下载 skill bundle 内容。
4327    pub async fn content(&self, skill_id: &str) -> Result<SkillContent, LingerError> {
4328        let skill_id = validate_skill_id(skill_id)?;
4329        let client = Client {
4330            config: self.config.clone(),
4331            transport: self.transport.clone(),
4332        };
4333        let path = format!("/v1/skills/{skill_id}/content");
4334        let request = client.build_empty_request(HttpMethod::Get, &path);
4335        let response = self.transport.send(request).await?;
4336        let status = response.status();
4337        if !(200..300).contains(&status) {
4338            let (status, headers, body) = response.into_bytes().await?;
4339            return Err(parse_api_error(status, headers, &body));
4340        }
4341        let request_id = request_id_from_headers(response.headers());
4342        Ok(SkillContent::new(request_id, response.into_body_stream()))
4343    }
4344
4345    /// EN: Returns the Skill Versions subresource for a skill id.
4346    /// 中文:返回指定 skill ID 的 Skill Versions 子资源。
4347    pub fn versions(&self, skill_id: &str) -> SkillVersionsResource {
4348        SkillVersionsResource {
4349            config: self.config.clone(),
4350            transport: self.transport.clone(),
4351            skill_id: skill_id.to_string(),
4352        }
4353    }
4354}
4355
4356/// EN: Skill Versions API resource.
4357/// 中文:Skill Versions API 资源。
4358#[derive(Clone, Debug)]
4359pub struct SkillVersionsResource {
4360    config: ClientConfig,
4361    transport: SharedTransport,
4362    skill_id: String,
4363}
4364
4365impl SkillVersionsResource {
4366    /// EN: Creates a skill version with `POST /v1/skills/{skill_id}/versions`.
4367    /// 中文:使用 `POST /v1/skills/{skill_id}/versions` 创建 skill version。
4368    pub async fn create(
4369        &self,
4370        request: CreateSkillVersionRequest,
4371    ) -> Result<SkillVersion, LingerError> {
4372        let skill_id = validate_skill_id(&self.skill_id)?;
4373        let client = Client {
4374            config: self.config.clone(),
4375            transport: self.transport.clone(),
4376        };
4377        let path = format!("/v1/skills/{skill_id}/versions");
4378        let mut http_request = client.build_empty_request(HttpMethod::Post, &path);
4379        request.apply_multipart_body(&mut http_request);
4380        let response = self.transport.send(http_request).await?;
4381        let (status, headers, body) = response.into_bytes().await?;
4382        if !(200..300).contains(&status) {
4383            return Err(parse_api_error(status, headers, &body));
4384        }
4385        let request_id = request_id_from_headers(&headers);
4386        let response = serde_json::from_slice::<SkillVersion>(&body)?.with_request_id(request_id);
4387        Ok(response)
4388    }
4389
4390    /// EN: Lists skill versions with `GET /v1/skills/{skill_id}/versions`.
4391    /// 中文:使用 `GET /v1/skills/{skill_id}/versions` 列出 skill versions。
4392    pub async fn list(&self) -> Result<SkillVersionPage, LingerError> {
4393        self.list_with(SkillVersionListRequest::default()).await
4394    }
4395
4396    /// EN: Lists skill versions with query parameters for `GET /v1/skills/{skill_id}/versions`.
4397    /// 中文:使用查询参数调用 `GET /v1/skills/{skill_id}/versions` 列出 skill versions。
4398    pub async fn list_with(
4399        &self,
4400        request: SkillVersionListRequest,
4401    ) -> Result<SkillVersionPage, LingerError> {
4402        let skill_id = validate_skill_id(&self.skill_id)?;
4403        let client = Client {
4404            config: self.config.clone(),
4405            transport: self.transport.clone(),
4406        };
4407        let path = request.path(skill_id);
4408        let (headers, body) = client.send_retryable_get(&path).await?;
4409        let request_id = request_id_from_headers(&headers);
4410        let response =
4411            serde_json::from_slice::<SkillVersionPage>(&body)?.with_request_id(request_id);
4412        Ok(response)
4413    }
4414
4415    /// EN: Retrieves a skill version with `GET /v1/skills/{skill_id}/versions/{version}`.
4416    /// 中文:使用 `GET /v1/skills/{skill_id}/versions/{version}` 获取 skill version。
4417    pub async fn retrieve(&self, version: &str) -> Result<SkillVersion, LingerError> {
4418        let skill_id = validate_skill_id(&self.skill_id)?;
4419        let version = validate_skill_version(version)?;
4420        let client = Client {
4421            config: self.config.clone(),
4422            transport: self.transport.clone(),
4423        };
4424        let path = format!("/v1/skills/{skill_id}/versions/{version}");
4425        let (headers, body) = client.send_retryable_get(&path).await?;
4426        let request_id = request_id_from_headers(&headers);
4427        let response = serde_json::from_slice::<SkillVersion>(&body)?.with_request_id(request_id);
4428        Ok(response)
4429    }
4430
4431    /// EN: Deletes a skill version with `DELETE /v1/skills/{skill_id}/versions/{version}`.
4432    /// 中文:使用 `DELETE /v1/skills/{skill_id}/versions/{version}` 删除 skill version。
4433    pub async fn delete(&self, version: &str) -> Result<SkillVersionDeletion, LingerError> {
4434        let skill_id = validate_skill_id(&self.skill_id)?;
4435        let version = validate_skill_version(version)?;
4436        let client = Client {
4437            config: self.config.clone(),
4438            transport: self.transport.clone(),
4439        };
4440        let path = format!("/v1/skills/{skill_id}/versions/{version}");
4441        let request = client.build_empty_request(HttpMethod::Delete, &path);
4442        let response = self.transport.send(request).await?;
4443        let (status, headers, body) = response.into_bytes().await?;
4444        if !(200..300).contains(&status) {
4445            return Err(parse_api_error(status, headers, &body));
4446        }
4447        let request_id = request_id_from_headers(&headers);
4448        let response =
4449            serde_json::from_slice::<SkillVersionDeletion>(&body)?.with_request_id(request_id);
4450        Ok(response)
4451    }
4452
4453    /// EN: Downloads skill version bundle content with `GET /v1/skills/{skill_id}/versions/{version}/content`.
4454    /// 中文:使用 `GET /v1/skills/{skill_id}/versions/{version}/content` 下载 skill version bundle 内容。
4455    pub async fn content(&self, version: &str) -> Result<SkillContent, LingerError> {
4456        let skill_id = validate_skill_id(&self.skill_id)?;
4457        let version = validate_skill_version(version)?;
4458        let client = Client {
4459            config: self.config.clone(),
4460            transport: self.transport.clone(),
4461        };
4462        let path = format!("/v1/skills/{skill_id}/versions/{version}/content");
4463        let request = client.build_empty_request(HttpMethod::Get, &path);
4464        let response = self.transport.send(request).await?;
4465        let status = response.status();
4466        if !(200..300).contains(&status) {
4467            let (status, headers, body) = response.into_bytes().await?;
4468            return Err(parse_api_error(status, headers, &body));
4469        }
4470        let request_id = request_id_from_headers(response.headers());
4471        Ok(SkillContent::new(request_id, response.into_body_stream()))
4472    }
4473}
4474
4475/// EN: Responses API resource.
4476/// 中文:Responses API 资源。
4477#[derive(Clone, Debug)]
4478pub struct ResponsesResource {
4479    config: ClientConfig,
4480    transport: SharedTransport,
4481}
4482
4483impl ResponsesResource {
4484    /// EN: Creates a response with `POST /v1/responses`.
4485    /// 中文:使用 `POST /v1/responses` 创建响应。
4486    pub async fn create(&self, request: CreateResponseRequest) -> Result<Response, LingerError> {
4487        let client = Client {
4488            config: self.config.clone(),
4489            transport: self.transport.clone(),
4490        };
4491        let request = client.build_json_request(HttpMethod::Post, "/v1/responses", &request)?;
4492        let response = self.transport.send(request).await?;
4493        let (status, headers, body) = response.into_bytes().await?;
4494        if !(200..300).contains(&status) {
4495            return Err(parse_api_error(status, headers, &body));
4496        }
4497        let request_id = request_id_from_headers(&headers);
4498        let response = serde_json::from_slice::<Response>(&body)?.with_request_id(request_id);
4499        Ok(response)
4500    }
4501
4502    /// EN: Retrieves a response with `GET /v1/responses/{response_id}`.
4503    /// 中文:使用 `GET /v1/responses/{response_id}` 获取响应。
4504    pub async fn retrieve(&self, response_id: &str) -> Result<Response, LingerError> {
4505        let response_id = response_id.trim();
4506        if response_id.is_empty() {
4507            return Err(LingerError::invalid_config("response_id is required"));
4508        }
4509        let client = Client {
4510            config: self.config.clone(),
4511            transport: self.transport.clone(),
4512        };
4513        let path = format!("/v1/responses/{response_id}");
4514        let (headers, body) = client.send_retryable_get(&path).await?;
4515        let request_id = request_id_from_headers(&headers);
4516        let response = serde_json::from_slice::<Response>(&body)?.with_request_id(request_id);
4517        Ok(response)
4518    }
4519
4520    /// EN: Cancels an in-progress response with `POST /v1/responses/{response_id}/cancel`.
4521    /// 中文:使用 `POST /v1/responses/{response_id}/cancel` 取消进行中的响应。
4522    pub async fn cancel(&self, response_id: &str) -> Result<Response, LingerError> {
4523        let response_id = response_id.trim();
4524        if response_id.is_empty() {
4525            return Err(LingerError::invalid_config("response_id is required"));
4526        }
4527        let client = Client {
4528            config: self.config.clone(),
4529            transport: self.transport.clone(),
4530        };
4531        let path = format!("/v1/responses/{response_id}/cancel");
4532        let request = client.build_empty_request(HttpMethod::Post, &path);
4533        let response = self.transport.send(request).await?;
4534        let (status, headers, body) = response.into_bytes().await?;
4535        if !(200..300).contains(&status) {
4536            return Err(parse_api_error(status, headers, &body));
4537        }
4538        let request_id = request_id_from_headers(&headers);
4539        let response = serde_json::from_slice::<Response>(&body)?.with_request_id(request_id);
4540        Ok(response)
4541    }
4542
4543    /// EN: Deletes a response with `DELETE /v1/responses/{response_id}`.
4544    /// 中文:使用 `DELETE /v1/responses/{response_id}` 删除响应。
4545    pub async fn delete(&self, response_id: &str) -> Result<ResponseDeletion, LingerError> {
4546        let response_id = response_id.trim();
4547        if response_id.is_empty() {
4548            return Err(LingerError::invalid_config("response_id is required"));
4549        }
4550        let client = Client {
4551            config: self.config.clone(),
4552            transport: self.transport.clone(),
4553        };
4554        let path = format!("/v1/responses/{response_id}");
4555        let request = client.build_empty_request(HttpMethod::Delete, &path);
4556        let response = self.transport.send(request).await?;
4557        let (status, headers, body) = response.into_bytes().await?;
4558        if !(200..300).contains(&status) {
4559            return Err(parse_api_error(status, headers, &body));
4560        }
4561        let request_id = request_id_from_headers(&headers);
4562        let response =
4563            serde_json::from_slice::<ResponseDeletion>(&body)?.with_request_id(request_id);
4564        Ok(response)
4565    }
4566
4567    /// EN: Lists input items with `GET /v1/responses/{response_id}/input_items`.
4568    /// 中文:使用 `GET /v1/responses/{response_id}/input_items` 列出输入项。
4569    pub async fn list_input_items(
4570        &self,
4571        response_id: &str,
4572    ) -> Result<ResponseInputItemsPage, LingerError> {
4573        let response_id = response_id.trim();
4574        if response_id.is_empty() {
4575            return Err(LingerError::invalid_config("response_id is required"));
4576        }
4577        let client = Client {
4578            config: self.config.clone(),
4579            transport: self.transport.clone(),
4580        };
4581        let path = format!("/v1/responses/{response_id}/input_items");
4582        let (headers, body) = client.send_retryable_get(&path).await?;
4583        let request_id = request_id_from_headers(&headers);
4584        let response =
4585            serde_json::from_slice::<ResponseInputItemsPage>(&body)?.with_request_id(request_id);
4586        Ok(response)
4587    }
4588
4589    /// EN: Counts input tokens with `POST /v1/responses/input_tokens`.
4590    /// 中文:使用 `POST /v1/responses/input_tokens` 统计输入 token。
4591    pub async fn count_input_tokens(
4592        &self,
4593        request: CreateResponseInputTokensRequest,
4594    ) -> Result<ResponseInputTokens, LingerError> {
4595        let client = Client {
4596            config: self.config.clone(),
4597            transport: self.transport.clone(),
4598        };
4599        let request =
4600            client.build_json_request(HttpMethod::Post, "/v1/responses/input_tokens", &request)?;
4601        let response = self.transport.send(request).await?;
4602        let (status, headers, body) = response.into_bytes().await?;
4603        if !(200..300).contains(&status) {
4604            return Err(parse_api_error(status, headers, &body));
4605        }
4606        let request_id = request_id_from_headers(&headers);
4607        let response =
4608            serde_json::from_slice::<ResponseInputTokens>(&body)?.with_request_id(request_id);
4609        Ok(response)
4610    }
4611
4612    /// EN: Compacts response context with `POST /v1/responses/compact`.
4613    /// 中文:使用 `POST /v1/responses/compact` 压缩响应上下文。
4614    pub async fn compact(
4615        &self,
4616        request: CompactResponseRequest,
4617    ) -> Result<ResponseCompaction, LingerError> {
4618        let client = Client {
4619            config: self.config.clone(),
4620            transport: self.transport.clone(),
4621        };
4622        let request =
4623            client.build_json_request(HttpMethod::Post, "/v1/responses/compact", &request)?;
4624        let response = self.transport.send(request).await?;
4625        let (status, headers, body) = response.into_bytes().await?;
4626        if !(200..300).contains(&status) {
4627            return Err(parse_api_error(status, headers, &body));
4628        }
4629        let request_id = request_id_from_headers(&headers);
4630        let response =
4631            serde_json::from_slice::<ResponseCompaction>(&body)?.with_request_id(request_id);
4632        Ok(response)
4633    }
4634
4635    /// EN: Creates a streaming response with `POST /v1/responses`.
4636    /// 中文:使用 `POST /v1/responses` 创建流式响应。
4637    pub async fn create_stream(
4638        &self,
4639        request: CreateResponseRequest,
4640    ) -> Result<ResponseStream, LingerError> {
4641        let client = Client {
4642            config: self.config.clone(),
4643            transport: self.transport.clone(),
4644        };
4645        let request = request.into_streaming();
4646        let request = client.build_json_request(HttpMethod::Post, "/v1/responses", &request)?;
4647        let response = self.transport.send(request).await?;
4648        let status = response.status();
4649        if !(200..300).contains(&status) {
4650            let (status, headers, body) = response.into_bytes().await?;
4651            return Err(parse_api_error(status, headers, &body));
4652        }
4653        Ok(ResponseStream::new(response.into_body_stream()))
4654    }
4655}
4656
4657fn apply_auth_headers(request: &mut HttpRequest, config: &ClientConfig) {
4658    request.insert_header("authorization", format!("Bearer {}", config.api_key()));
4659    if let Some(organization) = config.organization() {
4660        request.insert_header("openai-organization", organization);
4661    }
4662    if let Some(project) = config.project() {
4663        request.insert_header("openai-project", project);
4664    }
4665}
4666
4667fn apply_assistants_beta_header(request: &mut HttpRequest) {
4668    request.insert_header("openai-beta", "assistants=v2");
4669}
4670
4671fn apply_chatkit_beta_header(request: &mut HttpRequest) {
4672    request.insert_header("openai-beta", "chatkit_beta=v1");
4673}
4674
4675fn validate_fine_tuning_job_id(value: &str) -> Result<&str, LingerError> {
4676    let value = value.trim();
4677    if value.is_empty() {
4678        return Err(LingerError::invalid_config(
4679            "fine_tuning_job_id is required",
4680        ));
4681    }
4682    Ok(value)
4683}
4684
4685fn validate_fine_tuned_model_checkpoint(value: &str) -> Result<&str, LingerError> {
4686    let value = value.trim();
4687    if value.is_empty() {
4688        return Err(LingerError::invalid_config(
4689            "fine_tuned_model_checkpoint is required",
4690        ));
4691    }
4692    Ok(value)
4693}
4694
4695fn validate_checkpoint_permission_id(value: &str) -> Result<&str, LingerError> {
4696    let value = value.trim();
4697    if value.is_empty() {
4698        return Err(LingerError::invalid_config("permission_id is required"));
4699    }
4700    Ok(value)
4701}
4702
4703fn validate_upload_id(value: &str) -> Result<&str, LingerError> {
4704    let value = value.trim();
4705    if value.is_empty() {
4706        return Err(LingerError::invalid_config("upload_id is required"));
4707    }
4708    Ok(value)
4709}
4710
4711fn validate_vector_store_id(value: &str) -> Result<&str, LingerError> {
4712    let value = value.trim();
4713    if value.is_empty() {
4714        return Err(LingerError::invalid_config("vector_store_id is required"));
4715    }
4716    Ok(value)
4717}
4718
4719fn validate_container_id(value: &str) -> Result<&str, LingerError> {
4720    let value = value.trim();
4721    if value.is_empty() {
4722        return Err(LingerError::invalid_config("container_id is required"));
4723    }
4724    Ok(value)
4725}
4726
4727fn validate_container_file_id(value: &str) -> Result<&str, LingerError> {
4728    let value = value.trim();
4729    if value.is_empty() {
4730        return Err(LingerError::invalid_config("container_file_id is required"));
4731    }
4732    Ok(value)
4733}
4734
4735fn validate_voice_consent_id(value: &str) -> Result<&str, LingerError> {
4736    let value = value.trim();
4737    if value.is_empty() {
4738        return Err(LingerError::invalid_config("voice_consent_id is required"));
4739    }
4740    Ok(value)
4741}
4742
4743fn validate_eval_id(value: &str) -> Result<&str, LingerError> {
4744    let value = value.trim();
4745    if value.is_empty() {
4746        return Err(LingerError::invalid_config("eval_id is required"));
4747    }
4748    Ok(value)
4749}
4750
4751fn validate_eval_run_id(value: &str) -> Result<&str, LingerError> {
4752    let value = value.trim();
4753    if value.is_empty() {
4754        return Err(LingerError::invalid_config("run_id is required"));
4755    }
4756    Ok(value)
4757}
4758
4759fn validate_eval_run_output_item_id(value: &str) -> Result<&str, LingerError> {
4760    let value = value.trim();
4761    if value.is_empty() {
4762        return Err(LingerError::invalid_config("output_item_id is required"));
4763    }
4764    Ok(value)
4765}
4766
4767fn validate_conversation_id(value: &str) -> Result<&str, LingerError> {
4768    let value = value.trim();
4769    if value.is_empty() {
4770        return Err(LingerError::invalid_config("conversation_id is required"));
4771    }
4772    Ok(value)
4773}
4774
4775fn validate_conversation_item_id(value: &str) -> Result<&str, LingerError> {
4776    let value = value.trim();
4777    if value.is_empty() {
4778        return Err(LingerError::invalid_config(
4779            "conversation_item_id is required",
4780        ));
4781    }
4782    Ok(value)
4783}
4784
4785fn validate_file_id(value: &str) -> Result<&str, LingerError> {
4786    let value = value.trim();
4787    if value.is_empty() {
4788        return Err(LingerError::invalid_config("file_id is required"));
4789    }
4790    Ok(value)
4791}
4792
4793fn validate_chat_completion_id(value: &str) -> Result<&str, LingerError> {
4794    let value = value.trim();
4795    if value.is_empty() {
4796        return Err(LingerError::invalid_config("completion_id is required"));
4797    }
4798    Ok(value)
4799}
4800
4801fn validate_chatkit_session_id(value: &str) -> Result<&str, LingerError> {
4802    let value = value.trim();
4803    if value.is_empty() {
4804        return Err(LingerError::invalid_config("session_id is required"));
4805    }
4806    Ok(value)
4807}
4808
4809fn validate_chatkit_thread_id(value: &str) -> Result<&str, LingerError> {
4810    let value = value.trim();
4811    if value.is_empty() {
4812        return Err(LingerError::invalid_config("thread_id is required"));
4813    }
4814    Ok(value)
4815}
4816
4817fn validate_realtime_call_id(value: &str) -> Result<&str, LingerError> {
4818    let value = value.trim();
4819    if value.is_empty() {
4820        return Err(LingerError::invalid_config("call_id is required"));
4821    }
4822    Ok(value)
4823}
4824
4825fn validate_batch_id(value: &str) -> Result<&str, LingerError> {
4826    let value = value.trim();
4827    if value.is_empty() {
4828        return Err(LingerError::invalid_config("batch_id is required"));
4829    }
4830    Ok(value)
4831}
4832
4833fn validate_video_id(value: &str) -> Result<&str, LingerError> {
4834    let value = value.trim();
4835    if value.is_empty() {
4836        return Err(LingerError::invalid_config("video_id is required"));
4837    }
4838    Ok(value)
4839}
4840
4841fn validate_video_character_id(value: &str) -> Result<&str, LingerError> {
4842    let value = value.trim();
4843    if value.is_empty() {
4844        return Err(LingerError::invalid_config("character_id is required"));
4845    }
4846    Ok(value)
4847}
4848
4849fn validate_skill_id(value: &str) -> Result<&str, LingerError> {
4850    let value = value.trim();
4851    if value.is_empty() {
4852        return Err(LingerError::invalid_config("skill_id is required"));
4853    }
4854    Ok(value)
4855}
4856
4857fn validate_skill_version(value: &str) -> Result<&str, LingerError> {
4858    let value = value.trim();
4859    if value.is_empty() {
4860        return Err(LingerError::invalid_config("version is required"));
4861    }
4862    Ok(value)
4863}
4864
4865fn validate_assistant_id(value: &str) -> Result<&str, LingerError> {
4866    let value = value.trim();
4867    if value.is_empty() {
4868        return Err(LingerError::invalid_config("assistant_id is required"));
4869    }
4870    Ok(value)
4871}
4872
4873fn validate_thread_id(value: &str) -> Result<&str, LingerError> {
4874    let value = value.trim();
4875    if value.is_empty() {
4876        return Err(LingerError::invalid_config("thread_id is required"));
4877    }
4878    Ok(value)
4879}
4880
4881fn validate_message_id(value: &str) -> Result<&str, LingerError> {
4882    let value = value.trim();
4883    if value.is_empty() {
4884        return Err(LingerError::invalid_config("message_id is required"));
4885    }
4886    Ok(value)
4887}
4888
4889fn validate_run_id(value: &str) -> Result<&str, LingerError> {
4890    let value = value.trim();
4891    if value.is_empty() {
4892        return Err(LingerError::invalid_config("run_id is required"));
4893    }
4894    Ok(value)
4895}
4896
4897fn validate_step_id(value: &str) -> Result<&str, LingerError> {
4898    let value = value.trim();
4899    if value.is_empty() {
4900        return Err(LingerError::invalid_config("step_id is required"));
4901    }
4902    Ok(value)
4903}