use std::time::Duration;
use bytes::Bytes;
use http::Method;
use tokio_util::sync::CancellationToken;
use super::*;
use crate::files::UploadSource;
use crate::generated::endpoints;
use crate::json_payload::JsonPayload;
use crate::response_meta::ApiResponse;
use crate::stream::{RawSseStream, SseStream};
use crate::transport::RequestSpec;
macro_rules! json_payload_wrapper {
($(#[$meta:meta])* $name:ident) => {
$(#[$meta])*
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(transparent)]
pub struct $name(Value);
impl Default for $name {
fn default() -> Self {
Self(Value::Null)
}
}
impl From<Value> for $name {
fn from(value: Value) -> Self {
Self(value)
}
}
impl From<$name> for Value {
fn from(value: $name) -> Self {
value.0
}
}
impl $name {
pub fn as_raw(&self) -> &Value {
&self.0
}
pub fn into_raw(self) -> Value {
self.0
}
pub fn kind(&self) -> Option<&str> {
self.0.get("type").and_then(Value::as_str)
}
}
};
}
json_payload_wrapper!(
ConversationContentPart
);
json_payload_wrapper!(
ConversationInputItem
);
json_payload_wrapper!(
EvalDataSourceConfig
);
json_payload_wrapper!(
EvalTestingCriterion
);
json_payload_wrapper!(
EvalRunInput
);
json_payload_wrapper!(
EvalOutput
);
json_payload_wrapper!(
SkillVersionContent
);
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum AudioTranscriptionSegmentId {
Number(u64),
String(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AudioTranscriptionSegment {
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<AudioTranscriptionSegmentId>,
#[serde(skip_serializing_if = "Option::is_none")]
pub avg_logprob: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub compression_ratio: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub no_speech_prob: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub seek: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub speaker: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(default)]
pub tokens: Vec<u64>,
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub segment_type: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AudioTranscriptionWord {
#[serde(skip_serializing_if = "Option::is_none")]
pub word: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub probability: Option<f64>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(untagged)]
pub enum FineTuningHyperparameterValue {
Text(String),
Integer(u64),
Float(f64),
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningJobHyperparameters {
#[serde(skip_serializing_if = "Option::is_none")]
pub batch_size: Option<FineTuningHyperparameterValue>,
#[serde(skip_serializing_if = "Option::is_none")]
pub learning_rate_multiplier: Option<FineTuningHyperparameterValue>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n_epochs: Option<FineTuningHyperparameterValue>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningJobError {
#[serde(skip_serializing_if = "Option::is_none")]
pub code: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub param: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningMetrics {
#[serde(skip_serializing_if = "Option::is_none")]
pub full_valid_loss: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub full_valid_mean_token_accuracy: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub step: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub train_loss: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub train_mean_token_accuracy: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub valid_loss: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub valid_mean_token_accuracy: Option<f64>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningWandbIntegration {
#[serde(skip_serializing_if = "Option::is_none")]
pub project: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entity: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningJobIntegration {
#[serde(rename = "type")]
#[serde(skip_serializing_if = "Option::is_none")]
pub integration_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub wandb: Option<FineTuningWandbIntegration>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ContainerExpiresAfter {
#[serde(skip_serializing_if = "Option::is_none")]
pub anchor: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub minutes: Option<u64>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ImageData {
pub url: Option<String>,
pub b64_json: Option<String>,
pub revised_prompt: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ImageGenerationResponse {
pub created: Option<u64>,
#[serde(default)]
pub data: Vec<ImageData>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ImageGenerateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quality: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub response_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub background: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub moderation: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub partial_images: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AudioSpeechCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub voice: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub speed: Option<f32>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AudioTranscription {
#[serde(default)]
pub text: String,
pub language: Option<String>,
pub duration: Option<f64>,
#[serde(default)]
pub segments: Vec<AudioTranscriptionSegment>,
#[serde(default)]
pub words: Vec<AudioTranscriptionWord>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AudioTranslation {
#[serde(default)]
pub text: String,
pub language: Option<String>,
pub duration: Option<f64>,
#[serde(default)]
pub segments: Vec<AudioTranscriptionSegment>,
#[serde(default)]
pub words: Vec<AudioTranscriptionWord>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningJob {
pub id: String,
#[serde(default)]
pub object: String,
pub model: Option<String>,
pub fine_tuned_model: Option<String>,
pub status: Option<String>,
pub training_file: Option<String>,
pub validation_file: Option<String>,
pub created_at: Option<u64>,
pub finished_at: Option<u64>,
pub trained_tokens: Option<u64>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
pub hyperparameters: Option<FineTuningJobHyperparameters>,
#[serde(default)]
pub result_files: Vec<String>,
pub error: Option<FineTuningJobError>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningJobEvent {
pub id: Option<String>,
#[serde(default)]
pub object: String,
#[serde(rename = "type")]
pub event_type: Option<String>,
pub level: Option<String>,
pub message: Option<String>,
pub created_at: Option<u64>,
pub data: Option<FineTuningMetrics>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningCheckpoint {
pub id: String,
#[serde(default)]
pub object: String,
pub fine_tuning_job_id: Option<String>,
pub fine_tuned_model_checkpoint: Option<String>,
pub step_number: Option<u64>,
pub created_at: Option<u64>,
pub metrics: Option<FineTuningMetrics>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningCheckpointPermission {
pub id: String,
#[serde(default)]
pub object: String,
pub project_id: Option<String>,
pub fine_tuning_checkpoint_id: Option<String>,
pub created_at: Option<u64>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FineTuningJobCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub training_file: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub validation_file: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub suffix: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub seed: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub hyperparameters: Option<FineTuningJobHyperparameters>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub integrations: Vec<FineTuningJobIntegration>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Batch {
pub id: String,
#[serde(default)]
pub object: String,
pub endpoint: Option<String>,
pub status: Option<String>,
pub input_file_id: Option<String>,
pub output_file_id: Option<String>,
pub error_file_id: Option<String>,
pub completion_window: Option<String>,
pub created_at: Option<u64>,
pub cancelled_at: Option<u64>,
pub cancelling_at: Option<u64>,
pub completed_at: Option<u64>,
pub expired_at: Option<u64>,
pub expires_at: Option<u64>,
pub failed_at: Option<u64>,
pub finalizing_at: Option<u64>,
pub in_progress_at: Option<u64>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
pub model: Option<String>,
pub request_counts: Option<BatchRequestCounts>,
pub errors: Option<BatchErrors>,
pub usage: Option<BatchUsage>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct BatchError {
pub code: Option<String>,
pub line: Option<u64>,
pub message: Option<String>,
pub param: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct BatchErrors {
#[serde(default)]
pub data: Vec<BatchError>,
pub object: Option<String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct BatchRequestCounts {
#[serde(default)]
pub completed: u64,
#[serde(default)]
pub failed: u64,
#[serde(default)]
pub total: u64,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct BatchUsageInputTokensDetails {
pub cached_tokens: Option<u64>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct BatchUsageOutputTokensDetails {
pub reasoning_tokens: Option<u64>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default, PartialEq, Eq)]
pub struct BatchUsage {
#[serde(default)]
pub input_tokens: u64,
pub input_tokens_details: Option<BatchUsageInputTokensDetails>,
#[serde(default)]
pub output_tokens: u64,
pub output_tokens_details: Option<BatchUsageOutputTokensDetails>,
#[serde(default)]
pub total_tokens: u64,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct BatchCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub input_file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub endpoint: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub completion_window: Option<String>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Conversation {
pub id: String,
#[serde(default)]
pub object: String,
pub name: Option<String>,
pub created_at: Option<u64>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ConversationItem {
pub id: String,
#[serde(default)]
pub object: String,
#[serde(rename = "type")]
pub item_type: Option<String>,
pub status: Option<String>,
pub role: Option<String>,
#[serde(default)]
pub content: Vec<ConversationContentPart>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ConversationCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub items: Vec<ConversationInputItem>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ConversationUpdateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ConversationItemCreateParams {
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub item_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub role: Option<String>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub content: Vec<ConversationContentPart>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Eval {
pub id: String,
#[serde(default)]
pub object: String,
pub name: Option<String>,
pub status: Option<String>,
pub created_at: Option<u64>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EvalRun {
pub id: String,
#[serde(default)]
pub object: String,
pub eval_id: Option<String>,
pub status: Option<String>,
pub created_at: Option<u64>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EvalOutputItem {
pub id: String,
#[serde(default)]
pub object: String,
pub status: Option<String>,
pub output: Option<EvalOutput>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EvalCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_source: Option<EvalDataSourceConfig>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub testing_criteria: Vec<EvalTestingCriterion>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EvalUpdateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_source: Option<EvalDataSourceConfig>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub testing_criteria: Vec<EvalTestingCriterion>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct EvalRunCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<EvalRunInput>,
#[serde(skip_serializing_if = "Option::is_none")]
pub data_source: Option<EvalDataSourceConfig>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Container {
pub id: String,
#[serde(default)]
pub object: String,
pub name: Option<String>,
pub status: Option<String>,
pub created_at: Option<u64>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ContainerFile {
pub id: String,
#[serde(default)]
pub object: String,
pub container_id: Option<String>,
pub file_id: Option<String>,
pub filename: Option<String>,
pub status: Option<String>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ContainerCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub expires_after: Option<ContainerExpiresAfter>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ContainerFileCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub path: Option<String>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Skill {
pub id: String,
#[serde(default)]
pub object: String,
pub name: Option<String>,
pub description: Option<String>,
pub model: Option<String>,
pub status: Option<String>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SkillVersion {
pub id: String,
#[serde(default)]
pub object: String,
pub skill_id: Option<String>,
pub status: Option<String>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SkillCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SkillUpdateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub instructions: Option<String>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct SkillVersionCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<SkillVersionContent>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct Video {
pub id: String,
#[serde(default)]
pub object: String,
pub model: Option<String>,
pub prompt: Option<String>,
pub status: Option<String>,
pub created_at: Option<u64>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct VideoCharacter {
pub id: String,
#[serde(default)]
pub object: String,
pub name: Option<String>,
pub status: Option<String>,
#[serde(default)]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct VideoCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub model: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub prompt: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub size: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub duration: Option<String>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct VideoCharacterCreateParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image: Option<String>,
#[serde(default, skip_serializing_if = "metadata_is_empty")]
pub metadata: BTreeMap<String, String>,
#[serde(flatten)]
pub extra: BTreeMap<String, Value>,
}
#[derive(Debug, Clone)]
pub struct ImageGenerateRequestBuilder {
state: TypedJsonRequestState<ImageGenerateParams>,
}
impl ImageGenerateRequestBuilder {
pub(crate) fn new(client: Client) -> Self {
Self {
state: TypedJsonRequestState::new(client, ImageGenerateParams::default()),
}
}
pub fn model(mut self, model: impl Into<String>) -> Self {
self.state.params.model = Some(model.into());
self
}
pub fn prompt(mut self, prompt: impl Into<String>) -> Self {
self.state.params.prompt = Some(prompt.into());
self
}
pub fn n(mut self, n: u32) -> Self {
self.state.params.n = Some(n);
self
}
pub fn size(mut self, size: impl Into<String>) -> Self {
self.state.params.size = Some(size.into());
self
}
pub fn quality(mut self, quality: impl Into<String>) -> Self {
self.state.params.quality = Some(quality.into());
self
}
pub fn response_format(mut self, response_format: impl Into<String>) -> Self {
self.state.params.response_format = Some(response_format.into());
self
}
pub fn background(mut self, background: impl Into<String>) -> Self {
self.state.params.background = Some(background.into());
self
}
pub fn output_format(mut self, output_format: impl Into<String>) -> Self {
self.state.params.output_format = Some(output_format.into());
self
}
pub fn moderation(mut self, moderation: impl Into<String>) -> Self {
self.state.params.moderation = Some(moderation.into());
self
}
pub fn partial_images(mut self, partial_images: u32) -> Self {
self.state.params.partial_images = Some(partial_images);
self
}
pub fn stream(mut self, stream: bool) -> Self {
self.state.params.stream = Some(stream);
self
}
pub fn user(mut self, user: impl Into<String>) -> Self {
self.state.params.user = Some(user.into());
self
}
pub fn metadata(mut self, metadata: BTreeMap<String, String>) -> Self {
self.state.params.metadata = metadata;
self
}
pub fn params(mut self, params: ImageGenerateParams) -> Self {
self.state.params = params;
self
}
pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
self.state = self.state.body_value(body);
self
}
pub fn json_body<U>(mut self, body: &U) -> Result<Self>
where
U: Serialize,
{
self.state = self.state.body_value(value_from(body)?);
Ok(self)
}
pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.state = self.state.extra_header(key, value);
self
}
pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.state = self.state.extra_query(key, value);
self
}
pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
self.state = self.state.extra_body(key, value);
self
}
pub fn provider_option(
mut self,
key: impl Into<String>,
value: impl Into<JsonPayload>,
) -> Self {
self.state = self.state.provider_option(key, value);
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.state = self.state.timeout(timeout);
self
}
pub fn max_retries(mut self, max_retries: u32) -> Self {
self.state = self.state.max_retries(max_retries);
self
}
pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
self.state = self.state.cancellation_token(token);
self
}
fn build_spec(self) -> Result<(Client, RequestSpec)> {
if self.state.body_override.is_none() {
if self
.state
.params
.model
.as_deref()
.unwrap_or_default()
.is_empty()
{
return Err(Error::MissingRequiredField { field: "model" });
}
if self
.state
.params
.prompt
.as_deref()
.unwrap_or_default()
.is_empty()
{
return Err(Error::MissingRequiredField { field: "prompt" });
}
}
self.state
.build_spec("images.generate", "/images/generations")
}
pub async fn send(self) -> Result<ImageGenerationResponse> {
Ok(self.send_with_meta().await?.data)
}
pub async fn send_with_meta(self) -> Result<ApiResponse<ImageGenerationResponse>> {
let (client, spec) = self.build_spec()?;
client.execute_json(spec).await
}
pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
let (client, spec) = self.build_spec()?;
client.execute_raw_http(spec).await
}
pub async fn send_sse(mut self) -> Result<SseStream<Value>> {
self.state.params.stream = Some(true);
let (client, mut spec) = self.build_spec()?;
spec.options.insert_header("accept", "text/event-stream");
client.execute_sse(spec).await
}
pub async fn send_raw_sse(mut self) -> Result<RawSseStream> {
self.state.params.stream = Some(true);
let (client, mut spec) = self.build_spec()?;
spec.options.insert_header("accept", "text/event-stream");
client.execute_raw_sse(spec).await
}
}
#[derive(Debug, Clone)]
pub struct AudioSpeechRequestBuilder {
inner: BytesRequestBuilder,
}
impl AudioSpeechRequestBuilder {
pub(crate) fn new(client: Client) -> Self {
Self {
inner: BytesRequestBuilder::new(
client,
"audio.speech.create",
Method::POST,
"/audio/speech",
),
}
}
pub(crate) fn stream(client: Client) -> Self {
Self::new(client).extra_body("stream_format", Value::String("sse".into()))
}
pub fn model(mut self, model: impl Into<String>) -> Self {
self.inner = self.inner.extra_body("model", Value::String(model.into()));
self
}
pub fn voice(mut self, voice: impl Into<String>) -> Self {
self.inner = self.inner.extra_body("voice", Value::String(voice.into()));
self
}
pub fn input(mut self, input: impl Into<String>) -> Self {
self.inner = self.inner.extra_body("input", Value::String(input.into()));
self
}
pub fn instructions(mut self, instructions: impl Into<String>) -> Self {
self.inner = self
.inner
.extra_body("instructions", Value::String(instructions.into()));
self
}
pub fn audio_format(mut self, format: impl Into<String>) -> Self {
self.inner = self
.inner
.extra_body("format", Value::String(format.into()));
self
}
pub fn speed(mut self, speed: f32) -> Self {
self.inner = self.inner.extra_body("speed", Value::from(speed));
self
}
pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
self.inner = self.inner.body_value(body);
self
}
pub fn json_body<U>(mut self, body: &U) -> Result<Self>
where
U: Serialize,
{
self.inner = self.inner.json_body(body)?;
Ok(self)
}
pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.inner = self.inner.extra_header(key, value);
self
}
pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.inner = self.inner.extra_query(key, value);
self
}
pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
self.inner = self.inner.extra_body(key, value);
self
}
pub fn provider_option(
mut self,
key: impl Into<String>,
value: impl Into<JsonPayload>,
) -> Self {
self.inner = self.inner.provider_option(key, value);
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.inner = self.inner.timeout(timeout);
self
}
pub fn max_retries(mut self, max_retries: u32) -> Self {
self.inner = self.inner.max_retries(max_retries);
self
}
pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
self.inner = self.inner.cancellation_token(token);
self
}
pub async fn send(self) -> Result<Bytes> {
self.inner.send().await
}
pub async fn send_with_meta(self) -> Result<ApiResponse<Bytes>> {
self.inner.send_with_meta().await
}
pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
self.inner.send_raw().await
}
pub async fn send_raw_sse(self) -> Result<RawSseStream> {
self.inner.send_raw_sse().await
}
pub async fn send_sse(self) -> Result<SseStream<Value>> {
self.inner.send_sse().await
}
}
#[derive(Debug, Clone)]
pub struct AudioTranscriptionRequestBuilder {
inner: JsonRequestBuilder<AudioTranscription>,
}
impl AudioTranscriptionRequestBuilder {
pub(crate) fn new(client: Client, stream: bool) -> Self {
let inner = JsonRequestBuilder::new(
client,
"audio.transcriptions.create",
Method::POST,
"/audio/transcriptions",
);
Self {
inner: if stream {
inner.extra_body("stream", Value::Bool(true))
} else {
inner
},
}
}
pub fn model(mut self, model: impl Into<String>) -> Self {
self.inner = self.inner.multipart_text("model", model);
self
}
pub fn file(mut self, file: UploadSource) -> Self {
self.inner = self.inner.multipart_file("file", file);
self
}
pub fn language(mut self, language: impl Into<String>) -> Self {
self.inner = self.inner.multipart_text("language", language);
self
}
pub fn prompt(mut self, prompt: impl Into<String>) -> Self {
self.inner = self.inner.multipart_text("prompt", prompt);
self
}
pub fn response_format(mut self, response_format: impl Into<String>) -> Self {
self.inner = self
.inner
.multipart_text("response_format", response_format);
self
}
pub fn temperature(mut self, temperature: f32) -> Self {
self.inner = self
.inner
.multipart_text("temperature", temperature.to_string());
self
}
pub fn timestamp_granularity(mut self, granularity: impl Into<String>) -> Self {
self.inner = self
.inner
.multipart_text("timestamp_granularities[]", granularity);
self
}
pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
self.inner = self.inner.body_value(body);
self
}
pub fn json_body<U>(mut self, body: &U) -> Result<Self>
where
U: Serialize,
{
self.inner = self.inner.json_body(body)?;
Ok(self)
}
pub fn multipart_text(mut self, name: impl Into<String>, value: impl Into<String>) -> Self {
self.inner = self.inner.multipart_text(name, value);
self
}
pub fn multipart_file(mut self, name: impl Into<String>, file: UploadSource) -> Self {
self.inner = self.inner.multipart_file(name, file);
self
}
pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.inner = self.inner.extra_header(key, value);
self
}
pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.inner = self.inner.extra_query(key, value);
self
}
pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
self.inner = self.inner.extra_body(key, value);
self
}
pub fn provider_option(
mut self,
key: impl Into<String>,
value: impl Into<JsonPayload>,
) -> Self {
self.inner = self.inner.provider_option(key, value);
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.inner = self.inner.timeout(timeout);
self
}
pub fn max_retries(mut self, max_retries: u32) -> Self {
self.inner = self.inner.max_retries(max_retries);
self
}
pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
self.inner = self.inner.cancellation_token(token);
self
}
pub async fn send(self) -> Result<AudioTranscription> {
self.inner.send().await
}
pub async fn send_with_meta(self) -> Result<ApiResponse<AudioTranscription>> {
self.inner.send_with_meta().await
}
pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
self.inner.send_raw().await
}
pub async fn send_raw_sse(self) -> Result<RawSseStream> {
let client = self.inner.client.clone();
let mut spec = self.inner.into_spec();
spec.options.insert_header("accept", "text/event-stream");
client.execute_raw_sse(spec).await
}
pub async fn send_sse(self) -> Result<SseStream<Value>> {
let client = self.inner.client.clone();
let mut spec = self.inner.into_spec();
spec.options.insert_header("accept", "text/event-stream");
client.execute_sse(spec).await
}
}
#[derive(Debug, Clone)]
pub struct AudioTranslationRequestBuilder {
inner: JsonRequestBuilder<AudioTranslation>,
}
impl AudioTranslationRequestBuilder {
pub(crate) fn new(client: Client) -> Self {
Self {
inner: JsonRequestBuilder::new(
client,
"audio.translations.create",
Method::POST,
"/audio/translations",
),
}
}
pub fn model(mut self, model: impl Into<String>) -> Self {
self.inner = self.inner.multipart_text("model", model);
self
}
pub fn file(mut self, file: UploadSource) -> Self {
self.inner = self.inner.multipart_file("file", file);
self
}
pub fn prompt(mut self, prompt: impl Into<String>) -> Self {
self.inner = self.inner.multipart_text("prompt", prompt);
self
}
pub fn response_format(mut self, response_format: impl Into<String>) -> Self {
self.inner = self
.inner
.multipart_text("response_format", response_format);
self
}
pub fn temperature(mut self, temperature: f32) -> Self {
self.inner = self
.inner
.multipart_text("temperature", temperature.to_string());
self
}
pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
self.inner = self.inner.body_value(body);
self
}
pub fn json_body<U>(mut self, body: &U) -> Result<Self>
where
U: Serialize,
{
self.inner = self.inner.json_body(body)?;
Ok(self)
}
pub fn multipart_text(mut self, name: impl Into<String>, value: impl Into<String>) -> Self {
self.inner = self.inner.multipart_text(name, value);
self
}
pub fn multipart_file(mut self, name: impl Into<String>, file: UploadSource) -> Self {
self.inner = self.inner.multipart_file(name, file);
self
}
pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.inner = self.inner.extra_header(key, value);
self
}
pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.inner = self.inner.extra_query(key, value);
self
}
pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
self.inner = self.inner.extra_body(key, value);
self
}
pub fn provider_option(
mut self,
key: impl Into<String>,
value: impl Into<JsonPayload>,
) -> Self {
self.inner = self.inner.provider_option(key, value);
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.inner = self.inner.timeout(timeout);
self
}
pub fn max_retries(mut self, max_retries: u32) -> Self {
self.inner = self.inner.max_retries(max_retries);
self
}
pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
self.inner = self.inner.cancellation_token(token);
self
}
pub async fn send(self) -> Result<AudioTranslation> {
self.inner.send().await
}
pub async fn send_with_meta(self) -> Result<ApiResponse<AudioTranslation>> {
self.inner.send_with_meta().await
}
pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
self.inner.send_raw().await
}
}
#[derive(Debug, Clone)]
pub struct FineTuningJobCreateRequestBuilder {
state: TypedJsonRequestState<FineTuningJobCreateParams>,
}
impl FineTuningJobCreateRequestBuilder {
pub(crate) fn new(client: Client) -> Self {
Self {
state: TypedJsonRequestState::new(client, FineTuningJobCreateParams::default()),
}
}
pub fn model(mut self, model: impl Into<String>) -> Self {
self.state.params.model = Some(model.into());
self
}
pub fn training_file(mut self, training_file: impl Into<String>) -> Self {
self.state.params.training_file = Some(training_file.into());
self
}
pub fn validation_file(mut self, validation_file: impl Into<String>) -> Self {
self.state.params.validation_file = Some(validation_file.into());
self
}
pub fn suffix(mut self, suffix: impl Into<String>) -> Self {
self.state.params.suffix = Some(suffix.into());
self
}
pub fn seed(mut self, seed: u64) -> Self {
self.state.params.seed = Some(seed);
self
}
pub fn hyperparameters(
mut self,
hyperparameters: impl Into<FineTuningJobHyperparameters>,
) -> Self {
self.state.params.hyperparameters = Some(hyperparameters.into());
self
}
pub fn integration(mut self, integration: impl Into<FineTuningJobIntegration>) -> Self {
self.state.params.integrations.push(integration.into());
self
}
pub fn metadata(mut self, metadata: BTreeMap<String, String>) -> Self {
self.state.params.metadata = metadata;
self
}
pub fn params(mut self, params: FineTuningJobCreateParams) -> Self {
self.state.params = params;
self
}
pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
self.state = self.state.body_value(body);
self
}
pub fn json_body<U>(mut self, body: &U) -> Result<Self>
where
U: Serialize,
{
self.state = self.state.body_value(value_from(body)?);
Ok(self)
}
pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.state = self.state.extra_header(key, value);
self
}
pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.state = self.state.extra_query(key, value);
self
}
pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
self.state = self.state.extra_body(key, value);
self
}
pub fn provider_option(
mut self,
key: impl Into<String>,
value: impl Into<JsonPayload>,
) -> Self {
self.state = self.state.provider_option(key, value);
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.state = self.state.timeout(timeout);
self
}
pub fn max_retries(mut self, max_retries: u32) -> Self {
self.state = self.state.max_retries(max_retries);
self
}
pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
self.state = self.state.cancellation_token(token);
self
}
fn build_spec(self) -> Result<(Client, RequestSpec)> {
if self.state.body_override.is_none() {
if self
.state
.params
.model
.as_deref()
.unwrap_or_default()
.is_empty()
{
return Err(Error::MissingRequiredField { field: "model" });
}
if self
.state
.params
.training_file
.as_deref()
.unwrap_or_default()
.is_empty()
{
return Err(Error::MissingRequiredField {
field: "training_file",
});
}
}
self.state
.build_spec("fine_tuning.jobs.create", "/fine_tuning/jobs")
}
pub async fn send(self) -> Result<FineTuningJob> {
Ok(self.send_with_meta().await?.data)
}
pub async fn send_with_meta(self) -> Result<ApiResponse<FineTuningJob>> {
let (client, spec) = self.build_spec()?;
client.execute_json(spec).await
}
pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
let (client, spec) = self.build_spec()?;
client.execute_raw_http(spec).await
}
}
#[derive(Debug, Clone)]
pub struct BatchCreateRequestBuilder {
state: TypedJsonRequestState<BatchCreateParams>,
}
impl BatchCreateRequestBuilder {
pub(crate) fn new(client: Client) -> Self {
Self {
state: TypedJsonRequestState::new(client, BatchCreateParams::default()),
}
}
pub fn input_file_id(mut self, input_file_id: impl Into<String>) -> Self {
self.state.params.input_file_id = Some(input_file_id.into());
self
}
pub fn endpoint(mut self, endpoint: impl Into<String>) -> Self {
self.state.params.endpoint = Some(endpoint.into());
self
}
pub fn completion_window(mut self, completion_window: impl Into<String>) -> Self {
self.state.params.completion_window = Some(completion_window.into());
self
}
pub fn metadata(mut self, metadata: BTreeMap<String, String>) -> Self {
self.state.params.metadata = metadata;
self
}
pub fn params(mut self, params: BatchCreateParams) -> Self {
self.state.params = params;
self
}
pub fn body_value(mut self, body: impl Into<JsonPayload>) -> Self {
self.state = self.state.body_value(body);
self
}
pub fn json_body<U>(mut self, body: &U) -> Result<Self>
where
U: Serialize,
{
self.state = self.state.body_value(value_from(body)?);
Ok(self)
}
pub fn extra_header(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.state = self.state.extra_header(key, value);
self
}
pub fn extra_query(mut self, key: impl Into<String>, value: impl Into<String>) -> Self {
self.state = self.state.extra_query(key, value);
self
}
pub fn extra_body(mut self, key: impl Into<String>, value: impl Into<JsonPayload>) -> Self {
self.state = self.state.extra_body(key, value);
self
}
pub fn provider_option(
mut self,
key: impl Into<String>,
value: impl Into<JsonPayload>,
) -> Self {
self.state = self.state.provider_option(key, value);
self
}
pub fn timeout(mut self, timeout: Duration) -> Self {
self.state = self.state.timeout(timeout);
self
}
pub fn max_retries(mut self, max_retries: u32) -> Self {
self.state = self.state.max_retries(max_retries);
self
}
pub fn cancellation_token(mut self, token: CancellationToken) -> Self {
self.state = self.state.cancellation_token(token);
self
}
fn build_spec(self) -> Result<(Client, RequestSpec)> {
if self.state.body_override.is_none() {
if self
.state
.params
.input_file_id
.as_deref()
.unwrap_or_default()
.is_empty()
{
return Err(Error::MissingRequiredField {
field: "input_file_id",
});
}
if self
.state
.params
.endpoint
.as_deref()
.unwrap_or_default()
.is_empty()
{
return Err(Error::MissingRequiredField { field: "endpoint" });
}
if self
.state
.params
.completion_window
.as_deref()
.unwrap_or_default()
.is_empty()
{
return Err(Error::MissingRequiredField {
field: "completion_window",
});
}
}
let endpoint = endpoints::batches::BATCHES_CREATE;
self.state.build_spec(endpoint.id, endpoint.template)
}
pub async fn send(self) -> Result<Batch> {
Ok(self.send_with_meta().await?.data)
}
pub async fn send_with_meta(self) -> Result<ApiResponse<Batch>> {
let (client, spec) = self.build_spec()?;
client.execute_json(spec).await
}
pub async fn send_raw(self) -> Result<http::Response<Bytes>> {
let (client, spec) = self.build_spec()?;
client.execute_raw_http(spec).await
}
}