use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenAiMessage {
pub role: String,
pub content: Option<serde_json::Value>,
pub tool_calls: Option<Vec<OpenAiToolCall>>,
pub tool_call_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenAiToolCall {
pub id: String,
pub r#type: String,
pub function: Option<OpenAiFunction>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OpenAiFunction {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiChatResponse {
pub id: String,
pub object: String,
pub created: u64,
pub model: String,
pub choices: Vec<OpenAiChoice>,
pub usage: Option<OpenAiUsage>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiChoice {
pub index: u32,
pub message: OpenAiMessage,
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiUsage {
pub prompt_tokens: Option<u32>,
pub completion_tokens: Option<u32>,
pub total_tokens: Option<u32>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiModel {
pub id: String,
pub object: String,
pub created: Option<u64>,
pub owned_by: String,
pub permission: Option<Vec<serde_json::Value>>,
pub root: Option<String>,
pub parent: Option<String>,
}
#[derive(Debug, Clone, Deserialize)]
pub struct OpenAiModelsResponse {
pub object: String,
pub data: Vec<OpenAiModel>,
}
#[derive(Debug, Clone, Default)]
pub struct OpenAiSpecificParams {
pub organization: Option<String>,
pub project: Option<String>,
pub response_format: Option<serde_json::Value>,
pub logit_bias: Option<serde_json::Value>,
pub logprobs: Option<bool>,
pub top_logprobs: Option<u32>,
pub presence_penalty: Option<f32>,
pub frequency_penalty: Option<f32>,
pub user: Option<String>,
}
#[derive(Debug, Clone, Default)]
pub struct OpenAiEmbeddingOptions {
pub dimensions: Option<u32>,
pub encoding_format: Option<crate::types::EmbeddingFormat>,
pub user: Option<String>,
}
impl OpenAiEmbeddingOptions {
pub fn new() -> Self {
Self::default()
}
pub fn with_dimensions(mut self, dimensions: u32) -> Self {
self.dimensions = Some(dimensions);
self
}
pub fn with_encoding_format(mut self, format: crate::types::EmbeddingFormat) -> Self {
self.encoding_format = Some(format);
self
}
pub fn with_user(mut self, user: impl Into<String>) -> Self {
self.user = Some(user.into());
self
}
pub fn apply_to_request(
self,
mut request: crate::types::EmbeddingRequest,
) -> crate::types::EmbeddingRequest {
if let Some(dims) = self.dimensions {
request.dimensions = Some(dims);
}
if let Some(format) = self.encoding_format {
request.encoding_format = Some(format);
}
if let Some(user) = self.user {
request.user = Some(user);
}
request
}
}
pub trait OpenAiEmbeddingRequestExt {
fn with_openai_config(self, config: OpenAiEmbeddingOptions) -> Self;
fn with_openai_dimensions(self, dimensions: u32) -> Self;
fn with_openai_encoding_format(self, format: crate::types::EmbeddingFormat) -> Self;
fn with_openai_user(self, user: impl Into<String>) -> Self;
}
impl OpenAiEmbeddingRequestExt for crate::types::EmbeddingRequest {
fn with_openai_config(self, config: OpenAiEmbeddingOptions) -> Self {
config.apply_to_request(self)
}
fn with_openai_dimensions(self, dimensions: u32) -> Self {
let mut request = self;
request.dimensions = Some(dimensions);
request
}
fn with_openai_encoding_format(self, format: crate::types::EmbeddingFormat) -> Self {
let mut request = self;
request.encoding_format = Some(format);
request
}
fn with_openai_user(self, user: impl Into<String>) -> Self {
let mut request = self;
request.user = Some(user.into());
request
}
}