use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Serialize)]
pub(crate) struct ChatCompletionRequest {
pub model: String,
pub messages: Vec<WireMessage>,
#[serde(skip_serializing_if = "Option::is_none")]
pub max_tokens: Option<u32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub temperature: Option<f32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub stop: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tools: Option<Vec<WireTool>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_choice: Option<Value>,
#[serde(skip_serializing_if = "std::ops::Not::not")]
pub stream: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub stream_options: Option<StreamOptions>,
}
#[derive(Debug, Serialize)]
pub(crate) struct StreamOptions {
pub include_usage: bool,
}
#[derive(Debug, Serialize)]
pub(crate) struct WireMessage {
pub role: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_calls: Option<Vec<WireToolCall>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tool_call_id: Option<String>,
}
#[derive(Debug, Serialize)]
pub(crate) struct WireTool {
#[serde(rename = "type")]
pub kind: &'static str,
pub function: WireFunction,
}
#[derive(Debug, Serialize)]
pub(crate) struct WireFunction {
pub name: String,
pub description: String,
pub parameters: Value,
}
#[derive(Debug, Serialize)]
pub(crate) struct WireToolCall {
pub id: String,
#[serde(rename = "type")]
pub kind: &'static str,
pub function: WireToolCallFunction,
}
#[derive(Debug, Serialize)]
pub(crate) struct WireToolCallFunction {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ChatCompletionResponse {
pub id: String,
#[serde(default)]
pub model: String,
pub choices: Vec<Choice>,
#[serde(default)]
pub usage: Option<Usage>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct Choice {
pub message: RespMessage,
#[serde(default)]
pub finish_reason: Option<String>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct RespMessage {
#[serde(default)]
pub content: Option<String>,
#[serde(default)]
pub tool_calls: Option<Vec<RespToolCall>>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct RespToolCall {
pub id: String,
pub function: RespToolCallFunction,
}
#[derive(Debug, Deserialize)]
pub(crate) struct RespToolCallFunction {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Copy, Deserialize)]
pub(crate) struct Usage {
#[serde(default)]
pub prompt_tokens: u32,
#[serde(default)]
pub completion_tokens: u32,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ChatCompletionChunk {
#[serde(default)]
pub choices: Vec<ChunkChoice>,
#[serde(default)]
pub usage: Option<Usage>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ChunkChoice {
pub delta: ChunkDelta,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ChunkDelta {
#[serde(default)]
pub content: Option<String>,
#[serde(default)]
pub tool_calls: Option<Vec<ChunkToolCall>>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ChunkToolCall {
#[serde(default)]
pub id: Option<String>,
#[serde(default)]
pub function: Option<ChunkToolCallFunction>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ChunkToolCallFunction {
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub arguments: Option<String>,
}
#[derive(Debug, Serialize)]
pub(crate) struct EmbeddingsRequest {
pub model: String,
pub input: Vec<String>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct EmbeddingsResponse {
#[serde(default)]
pub model: String,
pub data: Vec<EmbeddingData>,
#[serde(default)]
pub usage: Option<EmbeddingUsage>,
}
#[derive(Debug, Deserialize)]
pub(crate) struct EmbeddingData {
pub embedding: Vec<f32>,
}
#[derive(Debug, Clone, Copy, Deserialize)]
pub(crate) struct EmbeddingUsage {
#[serde(default)]
pub prompt_tokens: u32,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ApiError {
pub error: ApiErrorBody,
}
#[derive(Debug, Deserialize)]
pub(crate) struct ApiErrorBody {
#[serde(default)]
pub message: String,
}