1use std::time::Duration;
2
3use bytes::Bytes;
4use http::Method;
5use tokio_util::sync::CancellationToken;
6
7use super::*;
8use crate::files::UploadSource;
9use crate::generated::endpoints;
10use crate::json_payload::JsonPayload;
11use crate::response_meta::ApiResponse;
12use crate::stream::{RawSseStream, SseStream};
13use crate::transport::RequestSpec;
14
15macro_rules! json_payload_wrapper {
16 ($(#[$meta:meta])* $name:ident) => {
17 $(#[$meta])*
18 #[derive(Debug, Clone, Serialize, Deserialize)]
19 #[serde(transparent)]
20 pub struct $name(Value);
21
22 impl Default for $name {
23 fn default() -> Self {
24 Self(Value::Null)
25 }
26 }
27
28 impl From<Value> for $name {
29 fn from(value: Value) -> Self {
30 Self(value)
31 }
32 }
33
34 impl From<$name> for Value {
35 fn from(value: $name) -> Self {
36 value.0
37 }
38 }
39
40 impl $name {
41 pub fn as_raw(&self) -> &Value {
43 &self.0
44 }
45
46 pub fn into_raw(self) -> Value {
48 self.0
49 }
50
51 pub fn kind(&self) -> Option<&str> {
53 self.0.get("type").and_then(Value::as_str)
54 }
55 }
56 };
57}
58
59json_payload_wrapper!(
60 ConversationContentPart
62);
63json_payload_wrapper!(
64 ConversationInputItem
66);
67json_payload_wrapper!(
68 EvalDataSourceConfig
70);
71json_payload_wrapper!(
72 EvalTestingCriterion
74);
75json_payload_wrapper!(
76 EvalRunInput
78);
79json_payload_wrapper!(
80 EvalOutput
82);
83json_payload_wrapper!(
84 SkillVersionContent
86);
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
90#[serde(untagged)]
91pub enum AudioTranscriptionSegmentId {
92 Number(u64),
94 String(String),
96}
97
98#[derive(Debug, Clone, Serialize, Deserialize, Default)]
100pub struct AudioTranscriptionSegment {
101 #[serde(skip_serializing_if = "Option::is_none")]
103 pub id: Option<AudioTranscriptionSegmentId>,
104 #[serde(skip_serializing_if = "Option::is_none")]
106 pub avg_logprob: Option<f64>,
107 #[serde(skip_serializing_if = "Option::is_none")]
109 pub compression_ratio: Option<f64>,
110 #[serde(skip_serializing_if = "Option::is_none")]
112 pub end: Option<f64>,
113 #[serde(skip_serializing_if = "Option::is_none")]
115 pub no_speech_prob: Option<f64>,
116 #[serde(skip_serializing_if = "Option::is_none")]
118 pub seek: Option<u64>,
119 #[serde(skip_serializing_if = "Option::is_none")]
121 pub speaker: Option<String>,
122 #[serde(skip_serializing_if = "Option::is_none")]
124 pub start: Option<f64>,
125 #[serde(skip_serializing_if = "Option::is_none")]
127 pub temperature: Option<f64>,
128 #[serde(skip_serializing_if = "Option::is_none")]
130 pub text: Option<String>,
131 #[serde(default)]
133 pub tokens: Vec<u64>,
134 #[serde(rename = "type")]
136 #[serde(skip_serializing_if = "Option::is_none")]
137 pub segment_type: Option<String>,
138 #[serde(flatten)]
140 pub extra: BTreeMap<String, Value>,
141}
142
143#[derive(Debug, Clone, Serialize, Deserialize, Default)]
145pub struct AudioTranscriptionWord {
146 #[serde(skip_serializing_if = "Option::is_none")]
148 pub word: Option<String>,
149 #[serde(skip_serializing_if = "Option::is_none")]
151 pub start: Option<f64>,
152 #[serde(skip_serializing_if = "Option::is_none")]
154 pub end: Option<f64>,
155 #[serde(skip_serializing_if = "Option::is_none")]
157 pub probability: Option<f64>,
158 #[serde(flatten)]
160 pub extra: BTreeMap<String, Value>,
161}
162
163#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
165#[serde(untagged)]
166pub enum FineTuningHyperparameterValue {
167 Text(String),
169 Integer(u64),
171 Float(f64),
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize, Default)]
177pub struct FineTuningJobHyperparameters {
178 #[serde(skip_serializing_if = "Option::is_none")]
180 pub batch_size: Option<FineTuningHyperparameterValue>,
181 #[serde(skip_serializing_if = "Option::is_none")]
183 pub learning_rate_multiplier: Option<FineTuningHyperparameterValue>,
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub n_epochs: Option<FineTuningHyperparameterValue>,
187 #[serde(flatten)]
189 pub extra: BTreeMap<String, Value>,
190}
191
192#[derive(Debug, Clone, Serialize, Deserialize, Default)]
194pub struct FineTuningJobError {
195 #[serde(skip_serializing_if = "Option::is_none")]
197 pub code: Option<String>,
198 #[serde(skip_serializing_if = "Option::is_none")]
200 pub message: Option<String>,
201 #[serde(skip_serializing_if = "Option::is_none")]
203 pub param: Option<String>,
204 #[serde(flatten)]
206 pub extra: BTreeMap<String, Value>,
207}
208
209#[derive(Debug, Clone, Serialize, Deserialize, Default)]
211pub struct FineTuningMetrics {
212 #[serde(skip_serializing_if = "Option::is_none")]
214 pub full_valid_loss: Option<f64>,
215 #[serde(skip_serializing_if = "Option::is_none")]
217 pub full_valid_mean_token_accuracy: Option<f64>,
218 #[serde(skip_serializing_if = "Option::is_none")]
220 pub step: Option<u64>,
221 #[serde(skip_serializing_if = "Option::is_none")]
223 pub train_loss: Option<f64>,
224 #[serde(skip_serializing_if = "Option::is_none")]
226 pub train_mean_token_accuracy: Option<f64>,
227 #[serde(skip_serializing_if = "Option::is_none")]
229 pub valid_loss: Option<f64>,
230 #[serde(skip_serializing_if = "Option::is_none")]
232 pub valid_mean_token_accuracy: Option<f64>,
233 #[serde(flatten)]
235 pub extra: BTreeMap<String, Value>,
236}
237
238#[derive(Debug, Clone, Serialize, Deserialize, Default)]
240pub struct FineTuningWandbIntegration {
241 #[serde(skip_serializing_if = "Option::is_none")]
243 pub project: Option<String>,
244 #[serde(skip_serializing_if = "Option::is_none")]
246 pub entity: Option<String>,
247 #[serde(skip_serializing_if = "Option::is_none")]
249 pub name: Option<String>,
250 #[serde(default)]
252 #[serde(skip_serializing_if = "Vec::is_empty")]
253 pub tags: Vec<String>,
254 #[serde(flatten)]
256 pub extra: BTreeMap<String, Value>,
257}
258
259#[derive(Debug, Clone, Serialize, Deserialize, Default)]
261pub struct FineTuningJobIntegration {
262 #[serde(rename = "type")]
264 #[serde(skip_serializing_if = "Option::is_none")]
265 pub integration_type: Option<String>,
266 #[serde(skip_serializing_if = "Option::is_none")]
268 pub wandb: Option<FineTuningWandbIntegration>,
269 #[serde(flatten)]
271 pub extra: BTreeMap<String, Value>,
272}
273
274#[derive(Debug, Clone, Serialize, Deserialize, Default)]
276pub struct ContainerExpiresAfter {
277 #[serde(skip_serializing_if = "Option::is_none")]
279 pub anchor: Option<String>,
280 #[serde(skip_serializing_if = "Option::is_none")]
282 pub minutes: Option<u64>,
283 #[serde(flatten)]
285 pub extra: BTreeMap<String, Value>,
286}
287
288#[derive(Debug, Clone, Serialize, Deserialize, Default)]
290pub struct ImageData {
291 pub url: Option<String>,
293 pub b64_json: Option<String>,
295 pub revised_prompt: Option<String>,
297 #[serde(flatten)]
299 pub extra: BTreeMap<String, Value>,
300}
301
302#[derive(Debug, Clone, Serialize, Deserialize, Default)]
304pub struct ImageGenerationResponse {
305 pub created: Option<u64>,
307 #[serde(default)]
309 pub data: Vec<ImageData>,
310 #[serde(flatten)]
312 pub extra: BTreeMap<String, Value>,
313}
314
315#[derive(Debug, Clone, Serialize, Deserialize, Default)]
317pub struct ImageGenerateParams {
318 #[serde(skip_serializing_if = "Option::is_none")]
320 pub model: Option<String>,
321 #[serde(skip_serializing_if = "Option::is_none")]
323 pub prompt: Option<String>,
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub n: Option<u32>,
327 #[serde(skip_serializing_if = "Option::is_none")]
329 pub size: Option<String>,
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub quality: Option<String>,
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub response_format: Option<String>,
336 #[serde(skip_serializing_if = "Option::is_none")]
338 pub background: Option<String>,
339 #[serde(skip_serializing_if = "Option::is_none")]
341 pub output_format: Option<String>,
342 #[serde(skip_serializing_if = "Option::is_none")]
344 pub moderation: Option<String>,
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub stream: Option<bool>,
348 #[serde(skip_serializing_if = "Option::is_none")]
350 pub partial_images: Option<u32>,
351 #[serde(skip_serializing_if = "Option::is_none")]
353 pub user: Option<String>,
354 #[serde(default, skip_serializing_if = "metadata_is_empty")]
356 pub metadata: BTreeMap<String, String>,
357 #[serde(flatten)]
359 pub extra: BTreeMap<String, Value>,
360}
361
362#[derive(Debug, Clone, Serialize, Deserialize, Default)]
364pub struct AudioSpeechCreateParams {
365 #[serde(skip_serializing_if = "Option::is_none")]
367 pub model: Option<String>,
368 #[serde(skip_serializing_if = "Option::is_none")]
370 pub voice: Option<String>,
371 #[serde(skip_serializing_if = "Option::is_none")]
373 pub input: Option<String>,
374 #[serde(skip_serializing_if = "Option::is_none")]
376 pub instructions: Option<String>,
377 #[serde(skip_serializing_if = "Option::is_none")]
379 pub format: Option<String>,
380 #[serde(skip_serializing_if = "Option::is_none")]
382 pub speed: Option<f32>,
383 #[serde(flatten)]
385 pub extra: BTreeMap<String, Value>,
386}
387
388#[derive(Debug, Clone, Serialize, Deserialize, Default)]
390pub struct AudioTranscription {
391 #[serde(default)]
393 pub text: String,
394 pub language: Option<String>,
396 pub duration: Option<f64>,
398 #[serde(default)]
400 pub segments: Vec<AudioTranscriptionSegment>,
401 #[serde(default)]
403 pub words: Vec<AudioTranscriptionWord>,
404 #[serde(flatten)]
406 pub extra: BTreeMap<String, Value>,
407}
408
409#[derive(Debug, Clone, Serialize, Deserialize, Default)]
411pub struct AudioTranslation {
412 #[serde(default)]
414 pub text: String,
415 pub language: Option<String>,
417 pub duration: Option<f64>,
419 #[serde(default)]
421 pub segments: Vec<AudioTranscriptionSegment>,
422 #[serde(default)]
424 pub words: Vec<AudioTranscriptionWord>,
425 #[serde(flatten)]
427 pub extra: BTreeMap<String, Value>,
428}
429
430#[derive(Debug, Clone, Serialize, Deserialize, Default)]
432pub struct FineTuningJob {
433 pub id: String,
435 #[serde(default)]
437 pub object: String,
438 pub model: Option<String>,
440 pub fine_tuned_model: Option<String>,
442 pub status: Option<String>,
444 pub training_file: Option<String>,
446 pub validation_file: Option<String>,
448 pub created_at: Option<u64>,
450 pub finished_at: Option<u64>,
452 pub trained_tokens: Option<u64>,
454 #[serde(default)]
456 pub metadata: BTreeMap<String, String>,
457 pub hyperparameters: Option<FineTuningJobHyperparameters>,
459 #[serde(default)]
461 pub result_files: Vec<String>,
462 pub error: Option<FineTuningJobError>,
464 #[serde(flatten)]
466 pub extra: BTreeMap<String, Value>,
467}
468
469#[derive(Debug, Clone, Serialize, Deserialize, Default)]
471pub struct FineTuningJobEvent {
472 pub id: Option<String>,
474 #[serde(default)]
476 pub object: String,
477 #[serde(rename = "type")]
479 pub event_type: Option<String>,
480 pub level: Option<String>,
482 pub message: Option<String>,
484 pub created_at: Option<u64>,
486 pub data: Option<FineTuningMetrics>,
488 #[serde(flatten)]
490 pub extra: BTreeMap<String, Value>,
491}
492
493#[derive(Debug, Clone, Serialize, Deserialize, Default)]
495pub struct FineTuningCheckpoint {
496 pub id: String,
498 #[serde(default)]
500 pub object: String,
501 pub fine_tuning_job_id: Option<String>,
503 pub fine_tuned_model_checkpoint: Option<String>,
505 pub step_number: Option<u64>,
507 pub created_at: Option<u64>,
509 pub metrics: Option<FineTuningMetrics>,
511 #[serde(flatten)]
513 pub extra: BTreeMap<String, Value>,
514}
515
516#[derive(Debug, Clone, Serialize, Deserialize, Default)]
518pub struct FineTuningCheckpointPermission {
519 pub id: String,
521 #[serde(default)]
523 pub object: String,
524 pub project_id: Option<String>,
526 pub fine_tuning_checkpoint_id: Option<String>,
528 pub created_at: Option<u64>,
530 #[serde(flatten)]
532 pub extra: BTreeMap<String, Value>,
533}
534
535#[derive(Debug, Clone, Serialize, Deserialize, Default)]
537pub struct FineTuningJobCreateParams {
538 #[serde(skip_serializing_if = "Option::is_none")]
540 pub model: Option<String>,
541 #[serde(skip_serializing_if = "Option::is_none")]
543 pub training_file: Option<String>,
544 #[serde(skip_serializing_if = "Option::is_none")]
546 pub validation_file: Option<String>,
547 #[serde(skip_serializing_if = "Option::is_none")]
549 pub suffix: Option<String>,
550 #[serde(skip_serializing_if = "Option::is_none")]
552 pub seed: Option<u64>,
553 #[serde(skip_serializing_if = "Option::is_none")]
555 pub hyperparameters: Option<FineTuningJobHyperparameters>,
556 #[serde(default, skip_serializing_if = "Vec::is_empty")]
558 pub integrations: Vec<FineTuningJobIntegration>,
559 #[serde(default, skip_serializing_if = "metadata_is_empty")]
561 pub metadata: BTreeMap<String, String>,
562 #[serde(flatten)]
564 pub extra: BTreeMap<String, Value>,
565}
566
567#[derive(Debug, Clone, Serialize, Deserialize, Default)]
569pub struct Batch {
570 pub id: String,
572 #[serde(default)]
574 pub object: String,
575 pub endpoint: Option<String>,
577 pub status: Option<String>,
579 pub input_file_id: Option<String>,
581 pub output_file_id: Option<String>,
583 pub error_file_id: Option<String>,
585 pub completion_window: Option<String>,
587 pub created_at: Option<u64>,
589 pub cancelled_at: Option<u64>,
591 pub cancelling_at: Option<u64>,
593 pub completed_at: Option<u64>,
595 pub expired_at: Option<u64>,
597 pub expires_at: Option<u64>,
599 pub failed_at: Option<u64>,
601 pub finalizing_at: Option<u64>,
603 pub in_progress_at: Option<u64>,
605 #[serde(default)]
607 pub metadata: BTreeMap<String, String>,
608 pub model: Option<String>,
610 pub request_counts: Option<BatchRequestCounts>,
612 pub errors: Option<BatchErrors>,
614 pub usage: Option<BatchUsage>,
616 #[serde(flatten)]
618 pub extra: BTreeMap<String, Value>,
619}
620
621#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
623pub struct BatchError {
624 pub code: Option<String>,
626 pub line: Option<u64>,
628 pub message: Option<String>,
630 pub param: Option<String>,
632 #[serde(flatten)]
634 pub extra: BTreeMap<String, Value>,
635}
636
637#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
639pub struct BatchErrors {
640 #[serde(default)]
642 pub data: Vec<BatchError>,
643 pub object: Option<String>,
645 #[serde(flatten)]
647 pub extra: BTreeMap<String, Value>,
648}
649
650#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
652pub struct BatchRequestCounts {
653 #[serde(default)]
655 pub completed: u64,
656 #[serde(default)]
658 pub failed: u64,
659 #[serde(default)]
661 pub total: u64,
662 #[serde(flatten)]
664 pub extra: BTreeMap<String, Value>,
665}
666
667#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
669pub struct BatchUsageInputTokensDetails {
670 pub cached_tokens: Option<u64>,
672 #[serde(flatten)]
674 pub extra: BTreeMap<String, Value>,
675}
676
677#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
679pub struct BatchUsageOutputTokensDetails {
680 pub reasoning_tokens: Option<u64>,
682 #[serde(flatten)]
684 pub extra: BTreeMap<String, Value>,
685}
686
687#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
689pub struct BatchUsage {
690 #[serde(default)]
692 pub input_tokens: u64,
693 pub input_tokens_details: Option<BatchUsageInputTokensDetails>,
695 #[serde(default)]
697 pub output_tokens: u64,
698 pub output_tokens_details: Option<BatchUsageOutputTokensDetails>,
700 #[serde(default)]
702 pub total_tokens: u64,
703 #[serde(flatten)]
705 pub extra: BTreeMap<String, Value>,
706}
707
708#[derive(Debug, Clone, Serialize, Deserialize, Default)]
710pub struct BatchCreateParams {
711 #[serde(skip_serializing_if = "Option::is_none")]
713 pub input_file_id: Option<String>,
714 #[serde(skip_serializing_if = "Option::is_none")]
716 pub endpoint: Option<String>,
717 #[serde(skip_serializing_if = "Option::is_none")]
719 pub completion_window: Option<String>,
720 #[serde(default, skip_serializing_if = "metadata_is_empty")]
722 pub metadata: BTreeMap<String, String>,
723 #[serde(flatten)]
725 pub extra: BTreeMap<String, Value>,
726}
727
728#[derive(Debug, Clone, Serialize, Deserialize, Default)]
730pub struct Conversation {
731 pub id: String,
733 #[serde(default)]
735 pub object: String,
736 pub name: Option<String>,
738 pub created_at: Option<u64>,
740 #[serde(default)]
742 pub metadata: BTreeMap<String, String>,
743 #[serde(flatten)]
745 pub extra: BTreeMap<String, Value>,
746}
747
748#[derive(Debug, Clone, Serialize, Deserialize, Default)]
750pub struct ConversationItem {
751 pub id: String,
753 #[serde(default)]
755 pub object: String,
756 #[serde(rename = "type")]
758 pub item_type: Option<String>,
759 pub status: Option<String>,
761 pub role: Option<String>,
763 #[serde(default)]
765 pub content: Vec<ConversationContentPart>,
766 #[serde(default)]
768 pub metadata: BTreeMap<String, String>,
769 #[serde(flatten)]
771 pub extra: BTreeMap<String, Value>,
772}
773
774#[derive(Debug, Clone, Serialize, Deserialize, Default)]
776pub struct ConversationCreateParams {
777 #[serde(skip_serializing_if = "Option::is_none")]
779 pub name: Option<String>,
780 #[serde(default, skip_serializing_if = "Vec::is_empty")]
782 pub items: Vec<ConversationInputItem>,
783 #[serde(default, skip_serializing_if = "metadata_is_empty")]
785 pub metadata: BTreeMap<String, String>,
786 #[serde(flatten)]
788 pub extra: BTreeMap<String, Value>,
789}
790
791#[derive(Debug, Clone, Serialize, Deserialize, Default)]
793pub struct ConversationUpdateParams {
794 #[serde(skip_serializing_if = "Option::is_none")]
796 pub name: Option<String>,
797 #[serde(default, skip_serializing_if = "metadata_is_empty")]
799 pub metadata: BTreeMap<String, String>,
800 #[serde(flatten)]
802 pub extra: BTreeMap<String, Value>,
803}
804
805#[derive(Debug, Clone, Serialize, Deserialize, Default)]
807pub struct ConversationItemCreateParams {
808 #[serde(rename = "type", skip_serializing_if = "Option::is_none")]
810 pub item_type: Option<String>,
811 #[serde(skip_serializing_if = "Option::is_none")]
813 pub role: Option<String>,
814 #[serde(default, skip_serializing_if = "Vec::is_empty")]
816 pub content: Vec<ConversationContentPart>,
817 #[serde(default, skip_serializing_if = "metadata_is_empty")]
819 pub metadata: BTreeMap<String, String>,
820 #[serde(flatten)]
822 pub extra: BTreeMap<String, Value>,
823}
824
825#[derive(Debug, Clone, Serialize, Deserialize, Default)]
827pub struct Eval {
828 pub id: String,
830 #[serde(default)]
832 pub object: String,
833 pub name: Option<String>,
835 pub status: Option<String>,
837 pub created_at: Option<u64>,
839 #[serde(default)]
841 pub metadata: BTreeMap<String, String>,
842 #[serde(flatten)]
844 pub extra: BTreeMap<String, Value>,
845}
846
847#[derive(Debug, Clone, Serialize, Deserialize, Default)]
849pub struct EvalRun {
850 pub id: String,
852 #[serde(default)]
854 pub object: String,
855 pub eval_id: Option<String>,
857 pub status: Option<String>,
859 pub created_at: Option<u64>,
861 #[serde(default)]
863 pub metadata: BTreeMap<String, String>,
864 #[serde(flatten)]
866 pub extra: BTreeMap<String, Value>,
867}
868
869#[derive(Debug, Clone, Serialize, Deserialize, Default)]
871pub struct EvalOutputItem {
872 pub id: String,
874 #[serde(default)]
876 pub object: String,
877 pub status: Option<String>,
879 pub output: Option<EvalOutput>,
881 #[serde(flatten)]
883 pub extra: BTreeMap<String, Value>,
884}
885
886#[derive(Debug, Clone, Serialize, Deserialize, Default)]
888pub struct EvalCreateParams {
889 #[serde(skip_serializing_if = "Option::is_none")]
891 pub name: Option<String>,
892 #[serde(skip_serializing_if = "Option::is_none")]
894 pub data_source: Option<EvalDataSourceConfig>,
895 #[serde(default, skip_serializing_if = "Vec::is_empty")]
897 pub testing_criteria: Vec<EvalTestingCriterion>,
898 #[serde(default, skip_serializing_if = "metadata_is_empty")]
900 pub metadata: BTreeMap<String, String>,
901 #[serde(flatten)]
903 pub extra: BTreeMap<String, Value>,
904}
905
906#[derive(Debug, Clone, Serialize, Deserialize, Default)]
908pub struct EvalUpdateParams {
909 #[serde(skip_serializing_if = "Option::is_none")]
911 pub name: Option<String>,
912 #[serde(skip_serializing_if = "Option::is_none")]
914 pub data_source: Option<EvalDataSourceConfig>,
915 #[serde(default, skip_serializing_if = "Vec::is_empty")]
917 pub testing_criteria: Vec<EvalTestingCriterion>,
918 #[serde(default, skip_serializing_if = "metadata_is_empty")]
920 pub metadata: BTreeMap<String, String>,
921 #[serde(flatten)]
923 pub extra: BTreeMap<String, Value>,
924}
925
926#[derive(Debug, Clone, Serialize, Deserialize, Default)]
928pub struct EvalRunCreateParams {
929 #[serde(skip_serializing_if = "Option::is_none")]
931 pub input: Option<EvalRunInput>,
932 #[serde(skip_serializing_if = "Option::is_none")]
934 pub data_source: Option<EvalDataSourceConfig>,
935 #[serde(default, skip_serializing_if = "metadata_is_empty")]
937 pub metadata: BTreeMap<String, String>,
938 #[serde(flatten)]
940 pub extra: BTreeMap<String, Value>,
941}
942
943#[derive(Debug, Clone, Serialize, Deserialize, Default)]
945pub struct Container {
946 pub id: String,
948 #[serde(default)]
950 pub object: String,
951 pub name: Option<String>,
953 pub status: Option<String>,
955 pub created_at: Option<u64>,
957 #[serde(default)]
959 pub metadata: BTreeMap<String, String>,
960 #[serde(flatten)]
962 pub extra: BTreeMap<String, Value>,
963}
964
965#[derive(Debug, Clone, Serialize, Deserialize, Default)]
967pub struct ContainerFile {
968 pub id: String,
970 #[serde(default)]
972 pub object: String,
973 pub container_id: Option<String>,
975 pub file_id: Option<String>,
977 pub filename: Option<String>,
979 pub status: Option<String>,
981 #[serde(default)]
983 pub metadata: BTreeMap<String, String>,
984 #[serde(flatten)]
986 pub extra: BTreeMap<String, Value>,
987}
988
989#[derive(Debug, Clone, Serialize, Deserialize, Default)]
991pub struct ContainerCreateParams {
992 #[serde(skip_serializing_if = "Option::is_none")]
994 pub name: Option<String>,
995 #[serde(skip_serializing_if = "Option::is_none")]
997 pub expires_after: Option<ContainerExpiresAfter>,
998 #[serde(default, skip_serializing_if = "metadata_is_empty")]
1000 pub metadata: BTreeMap<String, String>,
1001 #[serde(flatten)]
1003 pub extra: BTreeMap<String, Value>,
1004}
1005
1006#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1008pub struct ContainerFileCreateParams {
1009 #[serde(skip_serializing_if = "Option::is_none")]
1011 pub file_id: Option<String>,
1012 #[serde(skip_serializing_if = "Option::is_none")]
1014 pub path: Option<String>,
1015 #[serde(default, skip_serializing_if = "metadata_is_empty")]
1017 pub metadata: BTreeMap<String, String>,
1018 #[serde(flatten)]
1020 pub extra: BTreeMap<String, Value>,
1021}
1022
1023#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1025pub struct Skill {
1026 pub id: String,
1028 #[serde(default)]
1030 pub object: String,
1031 pub name: Option<String>,
1033 pub description: Option<String>,
1035 pub model: Option<String>,
1037 pub status: Option<String>,
1039 #[serde(default)]
1041 pub metadata: BTreeMap<String, String>,
1042 #[serde(flatten)]
1044 pub extra: BTreeMap<String, Value>,
1045}
1046
1047#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1049pub struct SkillVersion {
1050 pub id: String,
1052 #[serde(default)]
1054 pub object: String,
1055 pub skill_id: Option<String>,
1057 pub status: Option<String>,
1059 #[serde(default)]
1061 pub metadata: BTreeMap<String, String>,
1062 #[serde(flatten)]
1064 pub extra: BTreeMap<String, Value>,
1065}
1066
1067#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1069pub struct SkillCreateParams {
1070 #[serde(skip_serializing_if = "Option::is_none")]
1072 pub name: Option<String>,
1073 #[serde(skip_serializing_if = "Option::is_none")]
1075 pub description: Option<String>,
1076 #[serde(skip_serializing_if = "Option::is_none")]
1078 pub model: Option<String>,
1079 #[serde(skip_serializing_if = "Option::is_none")]
1081 pub instructions: Option<String>,
1082 #[serde(default, skip_serializing_if = "metadata_is_empty")]
1084 pub metadata: BTreeMap<String, String>,
1085 #[serde(flatten)]
1087 pub extra: BTreeMap<String, Value>,
1088}
1089
1090#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1092pub struct SkillUpdateParams {
1093 #[serde(skip_serializing_if = "Option::is_none")]
1095 pub name: Option<String>,
1096 #[serde(skip_serializing_if = "Option::is_none")]
1098 pub description: Option<String>,
1099 #[serde(skip_serializing_if = "Option::is_none")]
1101 pub model: Option<String>,
1102 #[serde(skip_serializing_if = "Option::is_none")]
1104 pub instructions: Option<String>,
1105 #[serde(default, skip_serializing_if = "metadata_is_empty")]
1107 pub metadata: BTreeMap<String, String>,
1108 #[serde(flatten)]
1110 pub extra: BTreeMap<String, Value>,
1111}
1112
1113#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1115pub struct SkillVersionCreateParams {
1116 #[serde(skip_serializing_if = "Option::is_none")]
1118 pub description: Option<String>,
1119 #[serde(skip_serializing_if = "Option::is_none")]
1121 pub content: Option<SkillVersionContent>,
1122 #[serde(default, skip_serializing_if = "metadata_is_empty")]
1124 pub metadata: BTreeMap<String, String>,
1125 #[serde(flatten)]
1127 pub extra: BTreeMap<String, Value>,
1128}
1129
1130#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1132pub struct Video {
1133 pub id: String,
1135 #[serde(default)]
1137 pub object: String,
1138 pub model: Option<String>,
1140 pub prompt: Option<String>,
1142 pub status: Option<String>,
1144 pub created_at: Option<u64>,
1146 #[serde(default)]
1148 pub metadata: BTreeMap<String, String>,
1149 #[serde(flatten)]
1151 pub extra: BTreeMap<String, Value>,
1152}
1153
1154#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1156pub struct VideoCharacter {
1157 pub id: String,
1159 #[serde(default)]
1161 pub object: String,
1162 pub name: Option<String>,
1164 pub status: Option<String>,
1166 #[serde(default)]
1168 pub metadata: BTreeMap<String, String>,
1169 #[serde(flatten)]
1171 pub extra: BTreeMap<String, Value>,
1172}
1173
1174#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1176pub struct VideoCreateParams {
1177 #[serde(skip_serializing_if = "Option::is_none")]
1179 pub model: Option<String>,
1180 #[serde(skip_serializing_if = "Option::is_none")]
1182 pub prompt: Option<String>,
1183 #[serde(skip_serializing_if = "Option::is_none")]
1185 pub image: Option<String>,
1186 #[serde(skip_serializing_if = "Option::is_none")]
1188 pub size: Option<String>,
1189 #[serde(skip_serializing_if = "Option::is_none")]
1191 pub duration: Option<String>,
1192 #[serde(default, skip_serializing_if = "metadata_is_empty")]
1194 pub metadata: BTreeMap<String, String>,
1195 #[serde(flatten)]
1197 pub extra: BTreeMap<String, Value>,
1198}
1199
1200#[derive(Debug, Clone, Serialize, Deserialize, Default)]
1202pub struct VideoCharacterCreateParams {
1203 #[serde(skip_serializing_if = "Option::is_none")]
1205 pub name: Option<String>,
1206 #[serde(skip_serializing_if = "Option::is_none")]
1208 pub image: Option<String>,
1209 #[serde(default, skip_serializing_if = "metadata_is_empty")]
1211 pub metadata: BTreeMap<String, String>,
1212 #[serde(flatten)]
1214 pub extra: BTreeMap<String, Value>,
1215}
1216
1217#[derive(Debug, Clone)]
1219pub struct ImageGenerateRequestBuilder {
1220 state: TypedJsonRequestState<ImageGenerateParams>,
1221}
1222
1223impl ImageGenerateRequestBuilder {
1224 pub(crate) fn new(client: Client) -> Self {
1225 Self {
1226 state: TypedJsonRequestState::new(client, ImageGenerateParams::default()),
1227 }
1228 }
1229
1230 pub fn model(mut self, model: impl Into<String>) -> Self {
1231 self.state.params.model = Some(model.into());
1232 self
1233 }
1234
1235 pub fn prompt(mut self, prompt: impl Into<String>) -> Self {
1236 self.state.params.prompt = Some(prompt.into());
1237 self
1238 }
1239
1240 pub fn n(mut self, n: u32) -> Self {
1241 self.state.params.n = Some(n);
1242 self
1243 }
1244
1245 pub fn size(mut self, size: impl Into<String>) -> Self {
1246 self.state.params.size = Some(size.into());
1247 self
1248 }
1249
1250 pub fn quality(mut self, quality: impl Into<String>) -> Self {
1251 self.state.params.quality = Some(quality.into());
1252 self
1253 }
1254
1255 pub fn response_format(mut self, response_format: impl Into<String>) -> Self {
1256 self.state.params.response_format = Some(response_format.into());
1257 self
1258 }
1259
1260 pub fn background(mut self, background: impl Into<String>) -> Self {
1261 self.state.params.background = Some(background.into());
1262 self
1263 }
1264
1265 pub fn output_format(mut self, output_format: impl Into<String>) -> Self {
1266 self.state.params.output_format = Some(output_format.into());
1267 self
1268 }
1269
1270 pub fn moderation(mut self, moderation: impl Into<String>) -> Self {
1271 self.state.params.moderation = Some(moderation.into());
1272 self
1273 }
1274
1275 pub fn partial_images(mut self, partial_images: u32) -> Self {
1276 self.state.params.partial_images = Some(partial_images);
1277 self
1278 }
1279
1280 pub fn stream(mut self, stream: bool) -> Self {
1281 self.state.params.stream = Some(stream);
1282 self
1283 }
1284
1285 pub fn user(mut self, user: impl Into<String>) -> Self {
1286 self.state.params.user = Some(user.into());
1287 self
1288 }
1289
1290 pub fn metadata(mut self, metadata: BTreeMap<String, String>) -> Self {
1291 self.state.params.metadata = metadata;
1292 self
1293 }
1294
1295 pub fn params(mut self, params: ImageGenerateParams) -> Self {
1296 self.state.params = params;
1297 self
1298 }
1299
1300 pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
1301 self.state = self.state.body_value(body);
1302 self
1303 }
1304
1305 pub fn json_body<U>(mut self, body: &U) -> Result<Self>
1306 where
1307 U: Serialize,
1308 {
1309 self.state = self.state.body_value(value_from(body)?);
1310 Ok(self)
1311 }
1312
1313 pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1314 self.state = self.state.extra_header(key, value);
1315 self
1316 }
1317
1318 pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1319 self.state = self.state.extra_query(key, value);
1320 self
1321 }
1322
1323 pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
1324 self.state = self.state.extra_body(key, value);
1325 self
1326 }
1327
1328 pub fn provider_option(
1329 mut self,
1330 key: impl Into<String>,
1331 value: impl Into<JsonPayload>,
1332 ) -> Self {
1333 self.state = self.state.provider_option(key, value);
1334 self
1335 }
1336
1337 pub fn timeout(mut self, timeout: Duration) -> Self {
1338 self.state = self.state.timeout(timeout);
1339 self
1340 }
1341
1342 pub fn max_retries(mut self, max_retries: u32) -> Self {
1343 self.state = self.state.max_retries(max_retries);
1344 self
1345 }
1346
1347 pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
1348 self.state = self.state.cancellation_token(token);
1349 self
1350 }
1351
1352 fn build_spec(self) -> Result<(Client, RequestSpec)> {
1353 if self.state.body_override.is_none() {
1354 if self
1355 .state
1356 .params
1357 .model
1358 .as_deref()
1359 .unwrap_or_default()
1360 .is_empty()
1361 {
1362 return Err(Error::MissingRequiredField { field: "model" });
1363 }
1364 if self
1365 .state
1366 .params
1367 .prompt
1368 .as_deref()
1369 .unwrap_or_default()
1370 .is_empty()
1371 {
1372 return Err(Error::MissingRequiredField { field: "prompt" });
1373 }
1374 }
1375 self.state
1376 .build_spec("images.generate", "/images/generations")
1377 }
1378
1379 pub async fn send(self) -> Result<ImageGenerationResponse> {
1380 Ok(self.send_with_meta().await?.data)
1381 }
1382
1383 pub async fn send_with_meta(self) -> Result<ApiResponse<ImageGenerationResponse>> {
1384 let (client, spec) = self.build_spec()?;
1385 client.execute_json(spec).await
1386 }
1387
1388 pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
1389 let (client, spec) = self.build_spec()?;
1390 client.execute_raw_http(spec).await
1391 }
1392
1393 pub async fn send_sse(mut self) -> Result<SseStream<Value>> {
1394 self.state.params.stream = Some(true);
1395 let (client, mut spec) = self.build_spec()?;
1396 spec.options.insert_header("accept", "text/event-stream");
1397 client.execute_sse(spec).await
1398 }
1399
1400 pub async fn send_raw_sse(mut self) -> Result<RawSseStream> {
1401 self.state.params.stream = Some(true);
1402 let (client, mut spec) = self.build_spec()?;
1403 spec.options.insert_header("accept", "text/event-stream");
1404 client.execute_raw_sse(spec).await
1405 }
1406}
1407
1408#[derive(Debug, Clone)]
1410pub struct AudioSpeechRequestBuilder {
1411 inner: BytesRequestBuilder,
1412}
1413
1414impl AudioSpeechRequestBuilder {
1415 pub(crate) fn new(client: Client) -> Self {
1416 Self {
1417 inner: BytesRequestBuilder::new(
1418 client,
1419 "audio.speech.create",
1420 Method::POST,
1421 "/audio/speech",
1422 ),
1423 }
1424 }
1425
1426 pub(crate) fn stream(client: Client) -> Self {
1427 Self::new(client).extra_body("stream_format", Value::String("sse".into()))
1428 }
1429
1430 pub fn model(mut self, model: impl Into<String>) -> Self {
1431 self.inner = self.inner.extra_body("model", Value::String(model.into()));
1432 self
1433 }
1434
1435 pub fn voice(mut self, voice: impl Into<String>) -> Self {
1436 self.inner = self.inner.extra_body("voice", Value::String(voice.into()));
1437 self
1438 }
1439
1440 pub fn input(mut self, input: impl Into<String>) -> Self {
1441 self.inner = self.inner.extra_body("input", Value::String(input.into()));
1442 self
1443 }
1444
1445 pub fn instructions(mut self, instructions: impl Into<String>) -> Self {
1446 self.inner = self
1447 .inner
1448 .extra_body("instructions", Value::String(instructions.into()));
1449 self
1450 }
1451
1452 pub fn audio_format(mut self, format: impl Into<String>) -> Self {
1453 self.inner = self
1454 .inner
1455 .extra_body("format", Value::String(format.into()));
1456 self
1457 }
1458
1459 pub fn speed(mut self, speed: f32) -> Self {
1460 self.inner = self.inner.extra_body("speed", Value::from(speed));
1461 self
1462 }
1463
1464 pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
1465 self.inner = self.inner.body_value(body);
1466 self
1467 }
1468
1469 pub fn json_body<U>(mut self, body: &U) -> Result<Self>
1470 where
1471 U: Serialize,
1472 {
1473 self.inner = self.inner.json_body(body)?;
1474 Ok(self)
1475 }
1476
1477 pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1478 self.inner = self.inner.extra_header(key, value);
1479 self
1480 }
1481
1482 pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1483 self.inner = self.inner.extra_query(key, value);
1484 self
1485 }
1486
1487 pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
1488 self.inner = self.inner.extra_body(key, value);
1489 self
1490 }
1491
1492 pub fn provider_option(
1493 mut self,
1494 key: impl Into<String>,
1495 value: impl Into<JsonPayload>,
1496 ) -> Self {
1497 self.inner = self.inner.provider_option(key, value);
1498 self
1499 }
1500
1501 pub fn timeout(mut self, timeout: Duration) -> Self {
1502 self.inner = self.inner.timeout(timeout);
1503 self
1504 }
1505
1506 pub fn max_retries(mut self, max_retries: u32) -> Self {
1507 self.inner = self.inner.max_retries(max_retries);
1508 self
1509 }
1510
1511 pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
1512 self.inner = self.inner.cancellation_token(token);
1513 self
1514 }
1515
1516 pub async fn send(self) -> Result<Bytes> {
1517 self.inner.send().await
1518 }
1519
1520 pub async fn send_with_meta(self) -> Result<ApiResponse<Bytes>> {
1521 self.inner.send_with_meta().await
1522 }
1523
1524 pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
1525 self.inner.send_raw().await
1526 }
1527
1528 pub async fn send_raw_sse(self) -> Result<RawSseStream> {
1529 self.inner.send_raw_sse().await
1530 }
1531
1532 pub async fn send_sse(self) -> Result<SseStream<Value>> {
1533 self.inner.send_sse().await
1534 }
1535}
1536
1537#[derive(Debug, Clone)]
1539pub struct AudioTranscriptionRequestBuilder {
1540 inner: JsonRequestBuilder<AudioTranscription>,
1541}
1542
1543impl AudioTranscriptionRequestBuilder {
1544 pub(crate) fn new(client: Client, stream: bool) -> Self {
1545 let inner = JsonRequestBuilder::new(
1546 client,
1547 "audio.transcriptions.create",
1548 Method::POST,
1549 "/audio/transcriptions",
1550 );
1551 Self {
1552 inner: if stream {
1553 inner.extra_body("stream", Value::Bool(true))
1554 } else {
1555 inner
1556 },
1557 }
1558 }
1559
1560 pub fn model(mut self, model: impl Into<String>) -> Self {
1561 self.inner = self.inner.multipart_text("model", model);
1562 self
1563 }
1564
1565 pub fn file(mut self, file: UploadSource) -> Self {
1566 self.inner = self.inner.multipart_file("file", file);
1567 self
1568 }
1569
1570 pub fn language(mut self, language: impl Into<String>) -> Self {
1571 self.inner = self.inner.multipart_text("language", language);
1572 self
1573 }
1574
1575 pub fn prompt(mut self, prompt: impl Into<String>) -> Self {
1576 self.inner = self.inner.multipart_text("prompt", prompt);
1577 self
1578 }
1579
1580 pub fn response_format(mut self, response_format: impl Into<String>) -> Self {
1581 self.inner = self
1582 .inner
1583 .multipart_text("response_format", response_format);
1584 self
1585 }
1586
1587 pub fn temperature(mut self, temperature: f32) -> Self {
1588 self.inner = self
1589 .inner
1590 .multipart_text("temperature", temperature.to_string());
1591 self
1592 }
1593
1594 pub fn timestamp_granularity(mut self, granularity: impl Into<String>) -> Self {
1595 self.inner = self
1596 .inner
1597 .multipart_text("timestamp_granularities[]", granularity);
1598 self
1599 }
1600
1601 pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
1602 self.inner = self.inner.body_value(body);
1603 self
1604 }
1605
1606 pub fn json_body<U>(mut self, body: &U) -> Result<Self>
1607 where
1608 U: Serialize,
1609 {
1610 self.inner = self.inner.json_body(body)?;
1611 Ok(self)
1612 }
1613
1614 pub fn multipart_text(mut self, name: impl Into<String>, value: impl Into<String>) -> Self {
1615 self.inner = self.inner.multipart_text(name, value);
1616 self
1617 }
1618
1619 pub fn multipart_file(mut self, name: impl Into<String>, file: UploadSource) -> Self {
1620 self.inner = self.inner.multipart_file(name, file);
1621 self
1622 }
1623
1624 pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1625 self.inner = self.inner.extra_header(key, value);
1626 self
1627 }
1628
1629 pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1630 self.inner = self.inner.extra_query(key, value);
1631 self
1632 }
1633
1634 pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
1635 self.inner = self.inner.extra_body(key, value);
1636 self
1637 }
1638
1639 pub fn provider_option(
1640 mut self,
1641 key: impl Into<String>,
1642 value: impl Into<JsonPayload>,
1643 ) -> Self {
1644 self.inner = self.inner.provider_option(key, value);
1645 self
1646 }
1647
1648 pub fn timeout(mut self, timeout: Duration) -> Self {
1649 self.inner = self.inner.timeout(timeout);
1650 self
1651 }
1652
1653 pub fn max_retries(mut self, max_retries: u32) -> Self {
1654 self.inner = self.inner.max_retries(max_retries);
1655 self
1656 }
1657
1658 pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
1659 self.inner = self.inner.cancellation_token(token);
1660 self
1661 }
1662
1663 pub async fn send(self) -> Result<AudioTranscription> {
1664 self.inner.send().await
1665 }
1666
1667 pub async fn send_with_meta(self) -> Result<ApiResponse<AudioTranscription>> {
1668 self.inner.send_with_meta().await
1669 }
1670
1671 pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
1672 self.inner.send_raw().await
1673 }
1674
1675 pub async fn send_raw_sse(self) -> Result<RawSseStream> {
1676 let client = self.inner.client.clone();
1677 let mut spec = self.inner.into_spec();
1678 spec.options.insert_header("accept", "text/event-stream");
1679 client.execute_raw_sse(spec).await
1680 }
1681
1682 pub async fn send_sse(self) -> Result<SseStream<Value>> {
1683 let client = self.inner.client.clone();
1684 let mut spec = self.inner.into_spec();
1685 spec.options.insert_header("accept", "text/event-stream");
1686 client.execute_sse(spec).await
1687 }
1688}
1689
1690#[derive(Debug, Clone)]
1692pub struct AudioTranslationRequestBuilder {
1693 inner: JsonRequestBuilder<AudioTranslation>,
1694}
1695
1696impl AudioTranslationRequestBuilder {
1697 pub(crate) fn new(client: Client) -> Self {
1698 Self {
1699 inner: JsonRequestBuilder::new(
1700 client,
1701 "audio.translations.create",
1702 Method::POST,
1703 "/audio/translations",
1704 ),
1705 }
1706 }
1707
1708 pub fn model(mut self, model: impl Into<String>) -> Self {
1709 self.inner = self.inner.multipart_text("model", model);
1710 self
1711 }
1712
1713 pub fn file(mut self, file: UploadSource) -> Self {
1714 self.inner = self.inner.multipart_file("file", file);
1715 self
1716 }
1717
1718 pub fn prompt(mut self, prompt: impl Into<String>) -> Self {
1719 self.inner = self.inner.multipart_text("prompt", prompt);
1720 self
1721 }
1722
1723 pub fn response_format(mut self, response_format: impl Into<String>) -> Self {
1724 self.inner = self
1725 .inner
1726 .multipart_text("response_format", response_format);
1727 self
1728 }
1729
1730 pub fn temperature(mut self, temperature: f32) -> Self {
1731 self.inner = self
1732 .inner
1733 .multipart_text("temperature", temperature.to_string());
1734 self
1735 }
1736
1737 pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
1738 self.inner = self.inner.body_value(body);
1739 self
1740 }
1741
1742 pub fn json_body<U>(mut self, body: &U) -> Result<Self>
1743 where
1744 U: Serialize,
1745 {
1746 self.inner = self.inner.json_body(body)?;
1747 Ok(self)
1748 }
1749
1750 pub fn multipart_text(mut self, name: impl Into<String>, value: impl Into<String>) -> Self {
1751 self.inner = self.inner.multipart_text(name, value);
1752 self
1753 }
1754
1755 pub fn multipart_file(mut self, name: impl Into<String>, file: UploadSource) -> Self {
1756 self.inner = self.inner.multipart_file(name, file);
1757 self
1758 }
1759
1760 pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1761 self.inner = self.inner.extra_header(key, value);
1762 self
1763 }
1764
1765 pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1766 self.inner = self.inner.extra_query(key, value);
1767 self
1768 }
1769
1770 pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
1771 self.inner = self.inner.extra_body(key, value);
1772 self
1773 }
1774
1775 pub fn provider_option(
1776 mut self,
1777 key: impl Into<String>,
1778 value: impl Into<JsonPayload>,
1779 ) -> Self {
1780 self.inner = self.inner.provider_option(key, value);
1781 self
1782 }
1783
1784 pub fn timeout(mut self, timeout: Duration) -> Self {
1785 self.inner = self.inner.timeout(timeout);
1786 self
1787 }
1788
1789 pub fn max_retries(mut self, max_retries: u32) -> Self {
1790 self.inner = self.inner.max_retries(max_retries);
1791 self
1792 }
1793
1794 pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
1795 self.inner = self.inner.cancellation_token(token);
1796 self
1797 }
1798
1799 pub async fn send(self) -> Result<AudioTranslation> {
1800 self.inner.send().await
1801 }
1802
1803 pub async fn send_with_meta(self) -> Result<ApiResponse<AudioTranslation>> {
1804 self.inner.send_with_meta().await
1805 }
1806
1807 pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
1808 self.inner.send_raw().await
1809 }
1810}
1811
1812#[derive(Debug, Clone)]
1814pub struct FineTuningJobCreateRequestBuilder {
1815 state: TypedJsonRequestState<FineTuningJobCreateParams>,
1816}
1817
1818impl FineTuningJobCreateRequestBuilder {
1819 pub(crate) fn new(client: Client) -> Self {
1820 Self {
1821 state: TypedJsonRequestState::new(client, FineTuningJobCreateParams::default()),
1822 }
1823 }
1824
1825 pub fn model(mut self, model: impl Into<String>) -> Self {
1826 self.state.params.model = Some(model.into());
1827 self
1828 }
1829
1830 pub fn training_file(mut self, training_file: impl Into<String>) -> Self {
1831 self.state.params.training_file = Some(training_file.into());
1832 self
1833 }
1834
1835 pub fn validation_file(mut self, validation_file: impl Into<String>) -> Self {
1836 self.state.params.validation_file = Some(validation_file.into());
1837 self
1838 }
1839
1840 pub fn suffix(mut self, suffix: impl Into<String>) -> Self {
1841 self.state.params.suffix = Some(suffix.into());
1842 self
1843 }
1844
1845 pub fn seed(mut self, seed: u64) -> Self {
1846 self.state.params.seed = Some(seed);
1847 self
1848 }
1849
1850 pub fn hyperparameters(
1851 mut self,
1852 hyperparameters: impl Into<FineTuningJobHyperparameters>,
1853 ) -> Self {
1854 self.state.params.hyperparameters = Some(hyperparameters.into());
1855 self
1856 }
1857
1858 pub fn integration(mut self, integration: impl Into<FineTuningJobIntegration>) -> Self {
1859 self.state.params.integrations.push(integration.into());
1860 self
1861 }
1862
1863 pub fn metadata(mut self, metadata: BTreeMap<String, String>) -> Self {
1864 self.state.params.metadata = metadata;
1865 self
1866 }
1867
1868 pub fn params(mut self, params: FineTuningJobCreateParams) -> Self {
1869 self.state.params = params;
1870 self
1871 }
1872
1873 pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
1874 self.state = self.state.body_value(body);
1875 self
1876 }
1877
1878 pub fn json_body<U>(mut self, body: &U) -> Result<Self>
1879 where
1880 U: Serialize,
1881 {
1882 self.state = self.state.body_value(value_from(body)?);
1883 Ok(self)
1884 }
1885
1886 pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1887 self.state = self.state.extra_header(key, value);
1888 self
1889 }
1890
1891 pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
1892 self.state = self.state.extra_query(key, value);
1893 self
1894 }
1895
1896 pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
1897 self.state = self.state.extra_body(key, value);
1898 self
1899 }
1900
1901 pub fn provider_option(
1902 mut self,
1903 key: impl Into<String>,
1904 value: impl Into<JsonPayload>,
1905 ) -> Self {
1906 self.state = self.state.provider_option(key, value);
1907 self
1908 }
1909
1910 pub fn timeout(mut self, timeout: Duration) -> Self {
1911 self.state = self.state.timeout(timeout);
1912 self
1913 }
1914
1915 pub fn max_retries(mut self, max_retries: u32) -> Self {
1916 self.state = self.state.max_retries(max_retries);
1917 self
1918 }
1919
1920 pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
1921 self.state = self.state.cancellation_token(token);
1922 self
1923 }
1924
1925 fn build_spec(self) -> Result<(Client, RequestSpec)> {
1926 if self.state.body_override.is_none() {
1927 if self
1928 .state
1929 .params
1930 .model
1931 .as_deref()
1932 .unwrap_or_default()
1933 .is_empty()
1934 {
1935 return Err(Error::MissingRequiredField { field: "model" });
1936 }
1937 if self
1938 .state
1939 .params
1940 .training_file
1941 .as_deref()
1942 .unwrap_or_default()
1943 .is_empty()
1944 {
1945 return Err(Error::MissingRequiredField {
1946 field: "training_file",
1947 });
1948 }
1949 }
1950 self.state
1951 .build_spec("fine_tuning.jobs.create", "/fine_tuning/jobs")
1952 }
1953
1954 pub async fn send(self) -> Result<FineTuningJob> {
1955 Ok(self.send_with_meta().await?.data)
1956 }
1957
1958 pub async fn send_with_meta(self) -> Result<ApiResponse<FineTuningJob>> {
1959 let (client, spec) = self.build_spec()?;
1960 client.execute_json(spec).await
1961 }
1962
1963 pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
1964 let (client, spec) = self.build_spec()?;
1965 client.execute_raw_http(spec).await
1966 }
1967}
1968
1969#[derive(Debug, Clone)]
1971pub struct BatchCreateRequestBuilder {
1972 state: TypedJsonRequestState<BatchCreateParams>,
1973}
1974
1975impl BatchCreateRequestBuilder {
1976 pub(crate) fn new(client: Client) -> Self {
1977 Self {
1978 state: TypedJsonRequestState::new(client, BatchCreateParams::default()),
1979 }
1980 }
1981
1982 pub fn input_file_id(mut self, input_file_id: impl Into<String>) -> Self {
1983 self.state.params.input_file_id = Some(input_file_id.into());
1984 self
1985 }
1986
1987 pub fn endpoint(mut self, endpoint: impl Into<String>) -> Self {
1988 self.state.params.endpoint = Some(endpoint.into());
1989 self
1990 }
1991
1992 pub fn completion_window(mut self, completion_window: impl Into<String>) -> Self {
1993 self.state.params.completion_window = Some(completion_window.into());
1994 self
1995 }
1996
1997 pub fn metadata(mut self, metadata: BTreeMap<String, String>) -> Self {
1998 self.state.params.metadata = metadata;
1999 self
2000 }
2001
2002 pub fn params(mut self, params: BatchCreateParams) -> Self {
2003 self.state.params = params;
2004 self
2005 }
2006
2007 pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
2008 self.state = self.state.body_value(body);
2009 self
2010 }
2011
2012 pub fn json_body<U>(mut self, body: &U) -> Result<Self>
2013 where
2014 U: Serialize,
2015 {
2016 self.state = self.state.body_value(value_from(body)?);
2017 Ok(self)
2018 }
2019
2020 pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
2021 self.state = self.state.extra_header(key, value);
2022 self
2023 }
2024
2025 pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
2026 self.state = self.state.extra_query(key, value);
2027 self
2028 }
2029
2030 pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
2031 self.state = self.state.extra_body(key, value);
2032 self
2033 }
2034
2035 pub fn provider_option(
2036 mut self,
2037 key: impl Into<String>,
2038 value: impl Into<JsonPayload>,
2039 ) -> Self {
2040 self.state = self.state.provider_option(key, value);
2041 self
2042 }
2043
2044 pub fn timeout(mut self, timeout: Duration) -> Self {
2045 self.state = self.state.timeout(timeout);
2046 self
2047 }
2048
2049 pub fn max_retries(mut self, max_retries: u32) -> Self {
2050 self.state = self.state.max_retries(max_retries);
2051 self
2052 }
2053
2054 pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
2055 self.state = self.state.cancellation_token(token);
2056 self
2057 }
2058
2059 fn build_spec(self) -> Result<(Client, RequestSpec)> {
2060 if self.state.body_override.is_none() {
2061 if self
2062 .state
2063 .params
2064 .input_file_id
2065 .as_deref()
2066 .unwrap_or_default()
2067 .is_empty()
2068 {
2069 return Err(Error::MissingRequiredField {
2070 field: "input_file_id",
2071 });
2072 }
2073 if self
2074 .state
2075 .params
2076 .endpoint
2077 .as_deref()
2078 .unwrap_or_default()
2079 .is_empty()
2080 {
2081 return Err(Error::MissingRequiredField { field: "endpoint" });
2082 }
2083 if self
2084 .state
2085 .params
2086 .completion_window
2087 .as_deref()
2088 .unwrap_or_default()
2089 .is_empty()
2090 {
2091 return Err(Error::MissingRequiredField {
2092 field: "completion_window",
2093 });
2094 }
2095 }
2096 let endpoint = endpoints::batches::BATCHES_CREATE;
2097 self.state.build_spec(endpoint.id, endpoint.template)
2098 }
2099
2100 pub async fn send(self) -> Result<Batch> {
2101 Ok(self.send_with_meta().await?.data)
2102 }
2103
2104 pub async fn send_with_meta(self) -> Result<ApiResponse<Batch>> {
2105 let (client, spec) = self.build_spec()?;
2106 client.execute_json(spec).await
2107 }
2108
2109 pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
2110 let (client, spec) = self.build_spec()?;
2111 client.execute_raw_http(spec).await
2112 }
2113}