use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiChatResponse {
pub id: String,
pub object: String,
pub created: u64,
pub model: String,
pub choices: Vec<XaiChoice>,
pub usage: Option<XaiUsage>,
pub system_fingerprint: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiChoice {
pub index: u32,
pub message: XaiMessage,
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiMessage {
pub role: String,
pub content: Option<serde_json::Value>,
pub tool_calls: Option<Vec<XaiToolCall>>,
pub reasoning_content: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiToolCall {
pub id: String,
pub r#type: String,
pub function: Option<XaiFunctionCall>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiFunctionCall {
pub name: String,
pub arguments: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiUsage {
pub prompt_tokens: Option<u32>,
pub completion_tokens: Option<u32>,
pub total_tokens: Option<u32>,
pub reasoning_tokens: Option<u32>,
pub prompt_tokens_details: Option<XaiPromptTokensDetails>,
pub completion_tokens_details: Option<XaiCompletionTokensDetails>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiPromptTokensDetails {
pub text_tokens: Option<u32>,
pub audio_tokens: Option<u32>,
pub image_tokens: Option<u32>,
pub cached_tokens: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiCompletionTokensDetails {
pub reasoning_tokens: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiStreamChunk {
pub id: String,
pub object: String,
pub created: u64,
pub model: String,
pub choices: Vec<XaiStreamChoice>,
pub usage: Option<XaiUsage>,
pub system_fingerprint: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiStreamChoice {
pub index: u32,
pub delta: XaiDelta,
pub finish_reason: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiDelta {
pub role: Option<String>,
pub content: Option<String>,
pub tool_calls: Option<Vec<XaiToolCallDelta>>,
pub reasoning_content: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiToolCallDelta {
pub index: u32,
pub id: Option<String>,
pub r#type: Option<String>,
pub function: Option<XaiFunctionCallDelta>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiFunctionCallDelta {
pub name: Option<String>,
pub arguments: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiErrorResponse {
pub error: XaiError,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiError {
pub message: String,
pub r#type: Option<String>,
pub code: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct XaiParams {
pub reasoning_effort: Option<String>,
pub deferred: Option<bool>,
pub parallel_function_calling: Option<bool>,
}
impl XaiParams {
pub const fn new() -> Self {
Self {
reasoning_effort: None,
deferred: None,
parallel_function_calling: None,
}
}
pub fn with_reasoning_effort<S: Into<String>>(mut self, effort: S) -> Self {
self.reasoning_effort = Some(effort.into());
self
}
pub const fn with_deferred(mut self, deferred: bool) -> Self {
self.deferred = Some(deferred);
self
}
pub const fn with_parallel_function_calling(mut self, parallel: bool) -> Self {
self.parallel_function_calling = Some(parallel);
self
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiModel {
pub id: String,
pub object: String,
pub created: u64,
pub owned_by: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct XaiModelsResponse {
pub object: String,
pub data: Vec<XaiModel>,
}