openairs 0.1.1

A simple and efficient wrapper around the OpenAI API
Documentation


use serde::{Deserialize, Serialize};

use crate::client::{OpenAIRequest, OpenAIResponse};

#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct CreateImageRequest {
    pub prompt: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub n: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub size: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub response_format: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub user: Option<String>,
}

const CREATE_IMAGE_ENDPOINT: &str = "https://api.openai.com/v1/images/generations";

impl OpenAIRequest for CreateImageRequest {
    fn endpoint(&self) -> &str {
        CREATE_IMAGE_ENDPOINT
    }
}

impl CreateImageRequest {
    pub fn new(prompt: &str) -> Self {
        CreateImageRequest {
            prompt: prompt.to_owned(),
            ..Default::default()
        }
    }

    pub fn n(mut self, n: i32) -> Self {
        self.n = Some(n);
        self
    }

    pub fn size(mut self, size: String) -> Self {
        self.size = Some(size);
        self
    }

    pub fn response_format(mut self, response_format: String) -> Self {
        self.response_format = Some(response_format);
        self
    }

    pub fn user(mut self, user: String) -> Self {
        self.user = Some(user);
        self
    }
}

#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct ImageResponse {
    pub created: usize,
    pub data: Vec<ImageUrl>,
}

#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct ImageUrl {
    pub url: String,
}

impl OpenAIResponse for ImageResponse {}

#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct ImageEditRequest {
    pub image: String,
    pub prompt: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub mask: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub n: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub size: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub response_format: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub user: Option<String>,
}

const IMAGE_EDIT_ENDPOINT: &str = "https://api.openai.com/v1/images/edits";

impl OpenAIRequest for ImageEditRequest {
    fn endpoint(&self) -> &str {
        IMAGE_EDIT_ENDPOINT
    }
}

impl ImageEditRequest {
    pub fn new(image: &str, prompt: &str) -> Self {
        ImageEditRequest {
            image: image.to_owned(),
            prompt: prompt.to_owned(),
            ..Default::default()
        }
    }

    pub fn n(mut self, n: i32) -> Self {
        self.n = Some(n);
        self
    }

    pub fn size(mut self, size: String) -> Self {
        self.size = Some(size);
        self
    }

    pub fn mask(mut self, mask: String) -> Self {
        self.mask = Some(mask);
        self
    }

    pub fn response_format(mut self, response_format: String) -> Self {
        self.response_format = Some(response_format);
        self
    }

    pub fn user(mut self, user: String) -> Self {
        self.user = Some(user);
        self
    }
}

#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct ImageVariationRequest {
    pub image: String,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub n: Option<i32>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub size: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub response_format: Option<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    pub user: Option<String>,
}

const IMAGE_VARIATION_ENDPOINT: &str = "https://api.openai.com/v1/images/variations";

impl OpenAIRequest for ImageVariationRequest {
    fn endpoint(&self) -> &str {
        IMAGE_VARIATION_ENDPOINT
    }
}

impl ImageVariationRequest {
    pub fn new(image: &str) -> Self {
        ImageVariationRequest {
            image: image.to_owned(),
            ..Default::default()
        }
    }

    pub fn n(mut self, n: i32) -> Self {
        self.n = Some(n);
        self
    }

    pub fn size(mut self, size: String) -> Self {
        self.size = Some(size);
        self
    }

    pub fn response_format(mut self, response_format: String) -> Self {
        self.response_format = Some(response_format);
        self
    }

    pub fn user(mut self, user: String) -> Self {
        self.user = Some(user);
        self
    }
}