use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatCompletions {
#[serde(default = "default_model")]
pub model: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub messages: Option<Vec<Message>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub top_p: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<Tool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools_choice: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub n: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub presence_penalty: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub frequency_penalty: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub logit_bias: Option<HashMap<String, f32>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub role: String,
pub content: MessageContent,
#[serde(skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub timestamp: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum MessageContent {
Text(String),
Structured(Vec<ContentPart>),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ContentPart {
#[serde(skip_serializing_if = "Option::is_none")]
pub text: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_url: Option<ImageUrl>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_url: Option<FileUrl>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageUrl {
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FileUrl {
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Tool {
#[serde(rename = "type")]
pub tool_type: String,
pub function: ToolFunction,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ToolFunction {
pub name: String,
pub description: String,
pub parameters: serde_json::Value,
}
fn default_model() -> String {
"gpt4free".to_string()
}
impl Default for ChatCompletions {
fn default() -> Self {
Self {
model: default_model(),
messages: None,
temperature: Some(0.9),
top_p: Some(1.0),
tools: None,
tools_choice: Some("auto".to_string()),
n: Some(1),
stream: Some(false),
stop: None,
max_tokens: Some(4096),
presence_penalty: Some(0.0),
frequency_penalty: Some(0.0),
logit_bias: None,
user: Some("Chat".to_string()),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChatResponse {
pub id: String,
pub object: String,
pub created: i64,
pub model: String,
pub choices: Vec<Choice>,
pub usage: Usage,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Choice {
pub index: i32,
pub message: Message,
pub finish_reason: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub logprobs: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Usage {
pub prompt_tokens: i32,
pub completion_tokens: i32,
pub total_tokens: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Agent {
pub id: String,
pub name: String,
#[serde(default)]
pub settings: HashMap<String, serde_json::Value>,
#[serde(default)]
pub commands: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Conversation {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub agent_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Chain {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub steps: Option<Vec<ChainStep>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ChainStep {
pub step_number: i32,
pub agent_id: String,
pub prompt_type: String,
pub prompt: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Prompt {
pub id: String,
pub name: String,
pub content: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub category: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Provider {
pub name: String,
#[serde(default)]
pub settings: HashMap<String, serde_json::Value>,
#[serde(default)]
pub supports_embeddings: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Company {
pub id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub agents: Option<Vec<Agent>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct User {
pub id: String,
pub email: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub first_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_name: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Extension {
pub name: String,
pub description: String,
#[serde(default)]
pub settings: HashMap<String, serde_json::Value>,
#[serde(default)]
pub commands: Vec<ExtensionCommand>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ExtensionCommand {
pub name: String,
pub description: String,
#[serde(default)]
pub args: HashMap<String, serde_json::Value>,
}