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#[derive(Clone, Debug)]
96pub struct Client {
97 config: ClientConfig,
98 transport: SharedTransport,
99}
100
101impl Client {
102 #[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 #[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 pub fn with_config_and_transport(config: ClientConfig, transport: SharedTransport) -> Self {
126 Self { config, transport }
127 }
128
129 pub fn responses(&self) -> ResponsesResource {
132 ResponsesResource {
133 config: self.config.clone(),
134 transport: self.transport.clone(),
135 }
136 }
137
138 pub fn completions(&self) -> CompletionsResource {
141 CompletionsResource {
142 config: self.config.clone(),
143 transport: self.transport.clone(),
144 }
145 }
146
147 pub fn conversations(&self) -> ConversationsResource {
150 ConversationsResource {
151 config: self.config.clone(),
152 transport: self.transport.clone(),
153 }
154 }
155
156 pub fn realtime(&self) -> RealtimeResource {
159 RealtimeResource {
160 config: self.config.clone(),
161 transport: self.transport.clone(),
162 }
163 }
164
165 pub fn containers(&self) -> ContainersResource {
168 ContainersResource {
169 config: self.config.clone(),
170 transport: self.transport.clone(),
171 }
172 }
173
174 pub fn evals(&self) -> EvalsResource {
177 EvalsResource {
178 config: self.config.clone(),
179 transport: self.transport.clone(),
180 }
181 }
182
183 pub fn models(&self) -> ModelsResource {
186 ModelsResource {
187 config: self.config.clone(),
188 transport: self.transport.clone(),
189 }
190 }
191
192 pub fn skills(&self) -> SkillsResource {
195 SkillsResource {
196 config: self.config.clone(),
197 transport: self.transport.clone(),
198 }
199 }
200
201 pub fn videos(&self) -> VideosResource {
204 VideosResource {
205 config: self.config.clone(),
206 transport: self.transport.clone(),
207 }
208 }
209
210 pub fn batches(&self) -> BatchesResource {
213 BatchesResource {
214 config: self.config.clone(),
215 transport: self.transport.clone(),
216 }
217 }
218
219 pub fn files(&self) -> FilesResource {
222 FilesResource {
223 config: self.config.clone(),
224 transport: self.transport.clone(),
225 }
226 }
227
228 pub fn uploads(&self) -> UploadsResource {
231 UploadsResource {
232 config: self.config.clone(),
233 transport: self.transport.clone(),
234 }
235 }
236
237 pub fn vector_stores(&self) -> VectorStoresResource {
240 VectorStoresResource {
241 config: self.config.clone(),
242 transport: self.transport.clone(),
243 }
244 }
245
246 pub fn fine_tuning(&self) -> FineTuningResource {
249 FineTuningResource {
250 config: self.config.clone(),
251 transport: self.transport.clone(),
252 }
253 }
254
255 pub fn images(&self) -> ImagesResource {
258 ImagesResource {
259 config: self.config.clone(),
260 transport: self.transport.clone(),
261 }
262 }
263
264 pub fn audio(&self) -> AudioResource {
267 AudioResource {
268 config: self.config.clone(),
269 transport: self.transport.clone(),
270 }
271 }
272
273 pub fn embeddings(&self) -> EmbeddingsResource {
276 EmbeddingsResource {
277 config: self.config.clone(),
278 transport: self.transport.clone(),
279 }
280 }
281
282 pub fn moderations(&self) -> ModerationsResource {
285 ModerationsResource {
286 config: self.config.clone(),
287 transport: self.transport.clone(),
288 }
289 }
290
291 pub fn chat(&self) -> ChatResource {
294 ChatResource {
295 config: self.config.clone(),
296 transport: self.transport.clone(),
297 }
298 }
299
300 pub fn chatkit(&self) -> ChatKitResource {
303 ChatKitResource {
304 config: self.config.clone(),
305 transport: self.transport.clone(),
306 }
307 }
308
309 pub fn assistants(&self) -> AssistantsResource {
312 AssistantsResource {
313 config: self.config.clone(),
314 transport: self.transport.clone(),
315 }
316 }
317
318 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#[derive(Clone, Debug)]
381pub struct ThreadsResource {
382 config: ClientConfig,
383 transport: SharedTransport,
384}
385
386impl ThreadsResource {
387 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 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 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 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 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 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 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#[derive(Clone, Debug)]
520pub struct ThreadMessagesResource {
521 config: ClientConfig,
522 transport: SharedTransport,
523 thread_id: String,
524}
525
526impl ThreadMessagesResource {
527 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 pub async fn list(&self) -> Result<ThreadMessagePage, LingerError> {
554 self.list_with(ThreadMessageListRequest::default()).await
555 }
556
557 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 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 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 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#[derive(Clone, Debug)]
657pub struct ThreadRunsResource {
658 config: ClientConfig,
659 transport: SharedTransport,
660 thread_id: String,
661}
662
663impl ThreadRunsResource {
664 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 pub async fn list(&self) -> Result<ThreadRunPage, LingerError> {
688 self.list_with(ThreadRunListRequest::default()).await
689 }
690
691 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 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 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 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 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 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#[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 pub async fn list(&self) -> Result<RunStepPage, LingerError> {
837 self.list_with(RunStepListRequest::default()).await
838 }
839
840 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 pub async fn retrieve(&self, step_id: &str) -> Result<RunStep, LingerError> {
865 self.retrieve_with(step_id, RunStepRetrieveRequest::default())
866 .await
867 }
868
869 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#[derive(Clone, Debug)]
900pub struct AssistantsResource {
901 config: ClientConfig,
902 transport: SharedTransport,
903}
904
905impl AssistantsResource {
906 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 pub async fn list(&self) -> Result<AssistantPage, LingerError> {
929 self.list_with(AssistantListRequest::default()).await
930 }
931
932 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 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 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 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#[derive(Clone, Debug)]
1035pub struct VectorStoresResource {
1036 config: ClientConfig,
1037 transport: SharedTransport,
1038}
1039
1040impl VectorStoresResource {
1041 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 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 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 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 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 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 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 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#[derive(Clone, Debug)]
1185pub struct VectorStoreFilesResource {
1186 config: ClientConfig,
1187 transport: SharedTransport,
1188 vector_store_id: String,
1189}
1190
1191impl VectorStoreFilesResource {
1192 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 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 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 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 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 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#[derive(Clone, Debug)]
1318pub struct VectorStoreFileBatchesResource {
1319 config: ClientConfig,
1320 transport: SharedTransport,
1321 vector_store_id: String,
1322}
1323
1324impl VectorStoreFileBatchesResource {
1325 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 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 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 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#[derive(Clone, Debug)]
1409pub struct UploadsResource {
1410 config: ClientConfig,
1411 transport: SharedTransport,
1412}
1413
1414impl UploadsResource {
1415 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 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 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 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#[derive(Clone, Debug)]
1491pub struct UploadPartsResource {
1492 config: ClientConfig,
1493 transport: SharedTransport,
1494 upload_id: String,
1495}
1496
1497impl UploadPartsResource {
1498 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#[derive(Clone, Debug)]
1526pub struct AudioResource {
1527 config: ClientConfig,
1528 transport: SharedTransport,
1529}
1530
1531impl AudioResource {
1532 pub fn speech(&self) -> AudioSpeechResource {
1535 AudioSpeechResource {
1536 config: self.config.clone(),
1537 transport: self.transport.clone(),
1538 }
1539 }
1540
1541 pub fn transcriptions(&self) -> AudioTranscriptionsResource {
1544 AudioTranscriptionsResource {
1545 config: self.config.clone(),
1546 transport: self.transport.clone(),
1547 }
1548 }
1549
1550 pub fn translations(&self) -> AudioTranslationsResource {
1553 AudioTranslationsResource {
1554 config: self.config.clone(),
1555 transport: self.transport.clone(),
1556 }
1557 }
1558
1559 pub fn voice_consents(&self) -> AudioVoiceConsentsResource {
1562 AudioVoiceConsentsResource {
1563 config: self.config.clone(),
1564 transport: self.transport.clone(),
1565 }
1566 }
1567
1568 pub fn voices(&self) -> AudioVoicesResource {
1571 AudioVoicesResource {
1572 config: self.config.clone(),
1573 transport: self.transport.clone(),
1574 }
1575 }
1576}
1577
1578#[derive(Clone, Debug)]
1581pub struct AudioSpeechResource {
1582 config: ClientConfig,
1583 transport: SharedTransport,
1584}
1585
1586impl AudioSpeechResource {
1587 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#[derive(Clone, Debug)]
1617pub struct AudioTranscriptionsResource {
1618 config: ClientConfig,
1619 transport: SharedTransport,
1620}
1621
1622impl AudioTranscriptionsResource {
1623 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#[derive(Clone, Debug)]
1651pub struct AudioTranslationsResource {
1652 config: ClientConfig,
1653 transport: SharedTransport,
1654}
1655
1656impl AudioTranslationsResource {
1657 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#[derive(Clone, Debug)]
1685pub struct AudioVoiceConsentsResource {
1686 config: ClientConfig,
1687 transport: SharedTransport,
1688}
1689
1690impl AudioVoiceConsentsResource {
1691 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 pub async fn list(&self) -> Result<AudioVoiceConsentPage, LingerError> {
1718 self.list_with(AudioVoiceConsentListRequest::default())
1719 .await
1720 }
1721
1722 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 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 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 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#[derive(Clone, Debug)]
1809pub struct AudioVoicesResource {
1810 config: ClientConfig,
1811 transport: SharedTransport,
1812}
1813
1814impl AudioVoicesResource {
1815 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#[derive(Clone, Debug)]
1838pub struct ImagesResource {
1839 config: ClientConfig,
1840 transport: SharedTransport,
1841}
1842
1843impl ImagesResource {
1844 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 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 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#[derive(Clone, Debug)]
1914pub struct FineTuningResource {
1915 config: ClientConfig,
1916 transport: SharedTransport,
1917}
1918
1919impl FineTuningResource {
1920 pub fn alpha(&self) -> FineTuningAlphaResource {
1923 FineTuningAlphaResource {
1924 config: self.config.clone(),
1925 transport: self.transport.clone(),
1926 }
1927 }
1928
1929 pub fn jobs(&self) -> FineTuningJobsResource {
1932 FineTuningJobsResource {
1933 config: self.config.clone(),
1934 transport: self.transport.clone(),
1935 }
1936 }
1937
1938 pub fn checkpoints(&self) -> FineTuningCheckpointsResource {
1941 FineTuningCheckpointsResource {
1942 config: self.config.clone(),
1943 transport: self.transport.clone(),
1944 }
1945 }
1946}
1947
1948#[derive(Clone, Debug)]
1951pub struct FineTuningAlphaResource {
1952 config: ClientConfig,
1953 transport: SharedTransport,
1954}
1955
1956impl FineTuningAlphaResource {
1957 pub fn graders(&self) -> FineTuningAlphaGradersResource {
1960 FineTuningAlphaGradersResource {
1961 config: self.config.clone(),
1962 transport: self.transport.clone(),
1963 }
1964 }
1965}
1966
1967#[derive(Clone, Debug)]
1970pub struct FineTuningAlphaGradersResource {
1971 config: ClientConfig,
1972 transport: SharedTransport,
1973}
1974
1975impl FineTuningAlphaGradersResource {
1976 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 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#[derive(Clone, Debug)]
2032pub struct FineTuningCheckpointsResource {
2033 config: ClientConfig,
2034 transport: SharedTransport,
2035}
2036
2037impl FineTuningCheckpointsResource {
2038 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#[derive(Clone, Debug)]
2055pub struct FineTuningCheckpointPermissionsResource {
2056 config: ClientConfig,
2057 transport: SharedTransport,
2058 fine_tuned_model_checkpoint: String,
2059}
2060
2061impl FineTuningCheckpointPermissionsResource {
2062 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 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 pub async fn retrieve(&self) -> Result<FineTuningCheckpointPermissionPage, LingerError> {
2110 self.list().await
2111 }
2112
2113 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#[derive(Clone, Debug)]
2142pub struct FineTuningJobsResource {
2143 config: ClientConfig,
2144 transport: SharedTransport,
2145}
2146
2147impl FineTuningJobsResource {
2148 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 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 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 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 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 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 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 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#[derive(Clone, Debug)]
2281pub struct BatchesResource {
2282 config: ClientConfig,
2283 transport: SharedTransport,
2284}
2285
2286impl BatchesResource {
2287 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 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 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 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#[derive(Clone, Debug)]
2363pub struct FilesResource {
2364 config: ClientConfig,
2365 transport: SharedTransport,
2366}
2367
2368impl FilesResource {
2369 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 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 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 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 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#[derive(Clone, Debug)]
2469pub struct ModerationsResource {
2470 config: ClientConfig,
2471 transport: SharedTransport,
2472}
2473
2474impl ModerationsResource {
2475 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#[derive(Clone, Debug)]
2501pub struct ContainersResource {
2502 config: ClientConfig,
2503 transport: SharedTransport,
2504}
2505
2506impl ContainersResource {
2507 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 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 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 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 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#[derive(Clone, Debug)]
2588pub struct ContainerFilesResource {
2589 config: ClientConfig,
2590 transport: SharedTransport,
2591 container_id: String,
2592}
2593
2594impl ContainerFilesResource {
2595 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 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 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 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 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#[derive(Clone, Debug)]
2699pub struct CompletionsResource {
2700 config: ClientConfig,
2701 transport: SharedTransport,
2702}
2703
2704impl CompletionsResource {
2705 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 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#[derive(Clone, Debug)]
2751pub struct ChatResource {
2752 config: ClientConfig,
2753 transport: SharedTransport,
2754}
2755
2756impl ChatResource {
2757 pub fn completions(&self) -> ChatCompletionsResource {
2760 ChatCompletionsResource {
2761 config: self.config.clone(),
2762 transport: self.transport.clone(),
2763 }
2764 }
2765}
2766
2767#[derive(Clone, Debug)]
2770pub struct ChatCompletionsResource {
2771 config: ClientConfig,
2772 transport: SharedTransport,
2773}
2774
2775impl ChatCompletionsResource {
2776 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 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 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 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 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 pub fn messages(&self) -> ChatCompletionMessagesResource {
2875 ChatCompletionMessagesResource {
2876 config: self.config.clone(),
2877 transport: self.transport.clone(),
2878 }
2879 }
2880}
2881
2882#[derive(Clone, Debug)]
2885pub struct ChatCompletionMessagesResource {
2886 config: ClientConfig,
2887 transport: SharedTransport,
2888}
2889
2890impl ChatCompletionMessagesResource {
2891 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#[derive(Clone, Debug)]
2914pub struct ChatKitResource {
2915 config: ClientConfig,
2916 transport: SharedTransport,
2917}
2918
2919impl ChatKitResource {
2920 pub fn sessions(&self) -> ChatKitSessionsResource {
2923 ChatKitSessionsResource {
2924 config: self.config.clone(),
2925 transport: self.transport.clone(),
2926 }
2927 }
2928
2929 pub fn threads(&self) -> ChatKitThreadsResource {
2932 ChatKitThreadsResource {
2933 config: self.config.clone(),
2934 transport: self.transport.clone(),
2935 }
2936 }
2937}
2938
2939#[derive(Clone, Debug)]
2942pub struct ChatKitSessionsResource {
2943 config: ClientConfig,
2944 transport: SharedTransport,
2945}
2946
2947impl ChatKitSessionsResource {
2948 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 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#[derive(Clone, Debug)]
2996pub struct ChatKitThreadsResource {
2997 config: ClientConfig,
2998 transport: SharedTransport,
2999}
3000
3001impl ChatKitThreadsResource {
3002 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 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 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 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#[derive(Clone, Debug)]
3091pub struct EmbeddingsResource {
3092 config: ClientConfig,
3093 transport: SharedTransport,
3094}
3095
3096impl EmbeddingsResource {
3097 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#[derive(Clone, Debug)]
3123pub struct RealtimeResource {
3124 config: ClientConfig,
3125 transport: SharedTransport,
3126}
3127
3128impl RealtimeResource {
3129 pub fn calls(&self) -> RealtimeCallsResource {
3132 RealtimeCallsResource {
3133 config: self.config.clone(),
3134 transport: self.transport.clone(),
3135 }
3136 }
3137
3138 pub fn sessions(&self) -> RealtimeSessionsResource {
3141 RealtimeSessionsResource {
3142 config: self.config.clone(),
3143 transport: self.transport.clone(),
3144 }
3145 }
3146
3147 pub fn transcription_sessions(&self) -> RealtimeTranscriptionSessionsResource {
3150 RealtimeTranscriptionSessionsResource {
3151 config: self.config.clone(),
3152 transport: self.transport.clone(),
3153 }
3154 }
3155
3156 pub fn translations(&self) -> RealtimeTranslationsResource {
3159 RealtimeTranslationsResource {
3160 config: self.config.clone(),
3161 transport: self.transport.clone(),
3162 }
3163 }
3164
3165 pub fn client_secrets(&self) -> RealtimeClientSecretsResource {
3168 RealtimeClientSecretsResource {
3169 config: self.config.clone(),
3170 transport: self.transport.clone(),
3171 }
3172 }
3173}
3174
3175#[derive(Clone, Debug)]
3178pub struct RealtimeCallsResource {
3179 config: ClientConfig,
3180 transport: SharedTransport,
3181}
3182
3183impl RealtimeCallsResource {
3184 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 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 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 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 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 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#[derive(Clone, Debug)]
3311pub struct RealtimeSessionsResource {
3312 config: ClientConfig,
3313 transport: SharedTransport,
3314}
3315
3316impl RealtimeSessionsResource {
3317 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#[derive(Clone, Debug)]
3344pub struct RealtimeTranscriptionSessionsResource {
3345 config: ClientConfig,
3346 transport: SharedTransport,
3347}
3348
3349impl RealtimeTranscriptionSessionsResource {
3350 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#[derive(Clone, Debug)]
3380pub struct RealtimeTranslationsResource {
3381 config: ClientConfig,
3382 transport: SharedTransport,
3383}
3384
3385impl RealtimeTranslationsResource {
3386 pub fn client_secrets(&self) -> RealtimeTranslationClientSecretsResource {
3389 RealtimeTranslationClientSecretsResource {
3390 config: self.config.clone(),
3391 transport: self.transport.clone(),
3392 }
3393 }
3394}
3395
3396#[derive(Clone, Debug)]
3399pub struct RealtimeTranslationClientSecretsResource {
3400 config: ClientConfig,
3401 transport: SharedTransport,
3402}
3403
3404impl RealtimeTranslationClientSecretsResource {
3405 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#[derive(Clone, Debug)]
3435pub struct RealtimeClientSecretsResource {
3436 config: ClientConfig,
3437 transport: SharedTransport,
3438}
3439
3440impl RealtimeClientSecretsResource {
3441 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#[derive(Clone, Debug)]
3468pub struct EvalsResource {
3469 config: ClientConfig,
3470 transport: SharedTransport,
3471}
3472
3473impl EvalsResource {
3474 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 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 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 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 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 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#[derive(Clone, Debug)]
3578pub struct EvalRunsResource {
3579 config: ClientConfig,
3580 transport: SharedTransport,
3581 eval_id: String,
3582}
3583
3584impl EvalRunsResource {
3585 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 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 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 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 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 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#[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 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 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#[derive(Clone, Debug)]
3741pub struct ConversationsResource {
3742 config: ClientConfig,
3743 transport: SharedTransport,
3744}
3745
3746impl ConversationsResource {
3747 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 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 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 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 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#[derive(Clone, Debug)]
3842pub struct ConversationItemsResource {
3843 config: ClientConfig,
3844 transport: SharedTransport,
3845 conversation_id: String,
3846}
3847
3848impl ConversationItemsResource {
3849 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 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 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 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#[derive(Clone, Debug)]
3932pub struct ModelsResource {
3933 config: ClientConfig,
3934 transport: SharedTransport,
3935}
3936
3937impl ModelsResource {
3938 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 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 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#[derive(Clone, Debug)]
3996pub struct VideosResource {
3997 config: ClientConfig,
3998 transport: SharedTransport,
3999}
4000
4001impl VideosResource {
4002 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 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 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 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 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 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 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 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 pub fn characters(&self) -> VideoCharactersResource {
4163 VideoCharactersResource {
4164 config: self.config.clone(),
4165 transport: self.transport.clone(),
4166 }
4167 }
4168}
4169
4170#[derive(Clone, Debug)]
4173pub struct VideoCharactersResource {
4174 config: ClientConfig,
4175 transport: SharedTransport,
4176}
4177
4178impl VideoCharactersResource {
4179 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 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#[derive(Clone, Debug)]
4221pub struct SkillsResource {
4222 config: ClientConfig,
4223 transport: SharedTransport,
4224}
4225
4226impl SkillsResource {
4227 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 pub async fn list(&self) -> Result<SkillPage, LingerError> {
4249 self.list_with(SkillListRequest::default()).await
4250 }
4251
4252 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 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 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 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 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 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#[derive(Clone, Debug)]
4359pub struct SkillVersionsResource {
4360 config: ClientConfig,
4361 transport: SharedTransport,
4362 skill_id: String,
4363}
4364
4365impl SkillVersionsResource {
4366 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 pub async fn list(&self) -> Result<SkillVersionPage, LingerError> {
4393 self.list_with(SkillVersionListRequest::default()).await
4394 }
4395
4396 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 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 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 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#[derive(Clone, Debug)]
4478pub struct ResponsesResource {
4479 config: ClientConfig,
4480 transport: SharedTransport,
4481}
4482
4483impl ResponsesResource {
4484 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 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 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 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 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 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 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 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}