use serde::{Deserialize, Serialize};
use serde_json::Value;
use crate::pagination::HasId;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Assistant {
pub id: String,
#[serde(default)]
pub created_at: i64,
#[serde(default)]
pub model: String,
#[serde(default)]
pub object: String,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub instructions: Option<String>,
#[serde(default)]
pub metadata: Option<Value>,
#[serde(default)]
pub temperature: Option<f64>,
#[serde(default)]
pub top_p: Option<f64>,
#[serde(default)]
pub tools: Vec<Value>,
#[serde(default)]
pub response_format: Option<Value>,
#[serde(default)]
pub tool_resources: Option<Value>,
}
impl HasId for Assistant {
fn id(&self) -> Option<&str> {
Some(&self.id)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Thread {
pub id: String,
#[serde(default)]
pub created_at: i64,
#[serde(default)]
pub object: String,
#[serde(default)]
pub metadata: Option<Value>,
#[serde(default)]
pub tool_resources: Option<Value>,
}
impl HasId for Thread {
fn id(&self) -> Option<&str> {
Some(&self.id)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MessageText {
pub value: String,
#[serde(default)]
pub annotations: Vec<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
#[non_exhaustive]
pub enum MessageContentBlock {
Text { text: MessageText },
#[serde(other)]
Other,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ThreadMessage {
pub id: String,
#[serde(default)]
pub thread_id: String,
#[serde(default)]
pub created_at: i64,
#[serde(default)]
pub object: String,
#[serde(default)]
pub role: String,
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub content: Vec<MessageContentBlock>,
#[serde(default)]
pub assistant_id: Option<String>,
#[serde(default)]
pub run_id: Option<String>,
#[serde(default)]
pub attachments: Option<Vec<Value>>,
#[serde(default)]
pub completed_at: Option<i64>,
#[serde(default)]
pub incomplete_at: Option<i64>,
#[serde(default)]
pub incomplete_details: Option<Value>,
#[serde(default)]
pub metadata: Option<Value>,
}
impl HasId for ThreadMessage {
fn id(&self) -> Option<&str> {
Some(&self.id)
}
}
impl ThreadMessage {
pub fn text(&self) -> Option<String> {
self.content.iter().find_map(|block| match block {
MessageContentBlock::Text { text } => Some(text.value.clone()),
MessageContentBlock::Other => None,
})
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
#[non_exhaustive]
pub enum RunStatus {
Queued,
InProgress,
RequiresAction,
Cancelling,
Cancelled,
Failed,
Completed,
Incomplete,
Expired,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct RunUsage {
#[serde(default)]
pub completion_tokens: i64,
#[serde(default)]
pub prompt_tokens: i64,
#[serde(default)]
pub total_tokens: i64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct Run {
pub id: String,
#[serde(default)]
pub thread_id: String,
#[serde(default)]
pub assistant_id: String,
#[serde(default)]
pub created_at: i64,
#[serde(default)]
pub object: String,
#[serde(default = "run_status_unknown")]
pub status: RunStatus,
#[serde(default)]
pub model: String,
#[serde(default)]
pub instructions: Option<String>,
#[serde(default)]
pub parallel_tool_calls: bool,
#[serde(default)]
pub tools: Vec<Value>,
#[serde(default)]
pub started_at: Option<i64>,
#[serde(default)]
pub expires_at: Option<i64>,
#[serde(default)]
pub cancelled_at: Option<i64>,
#[serde(default)]
pub failed_at: Option<i64>,
#[serde(default)]
pub completed_at: Option<i64>,
#[serde(default)]
pub last_error: Option<Value>,
#[serde(default)]
pub incomplete_details: Option<Value>,
#[serde(default)]
pub required_action: Option<Value>,
#[serde(default)]
pub response_format: Option<Value>,
#[serde(default)]
pub tool_choice: Option<Value>,
#[serde(default)]
pub truncation_strategy: Option<Value>,
#[serde(default)]
pub usage: Option<RunUsage>,
#[serde(default)]
pub temperature: Option<f64>,
#[serde(default)]
pub top_p: Option<f64>,
#[serde(default)]
pub max_completion_tokens: Option<i64>,
#[serde(default)]
pub max_prompt_tokens: Option<i64>,
#[serde(default)]
pub metadata: Option<Value>,
}
fn run_status_unknown() -> RunStatus {
RunStatus::Unknown
}
impl HasId for Run {
fn id(&self) -> Option<&str> {
Some(&self.id)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct RunStep {
pub id: String,
#[serde(default)]
pub run_id: String,
#[serde(default)]
pub thread_id: String,
#[serde(default)]
pub assistant_id: String,
#[serde(default)]
pub created_at: i64,
#[serde(default)]
pub object: String,
#[serde(rename = "type", default)]
pub step_type: String,
#[serde(default)]
pub status: String,
#[serde(default)]
pub step_details: Value,
#[serde(default)]
pub last_error: Option<Value>,
#[serde(default)]
pub usage: Option<RunUsage>,
#[serde(default)]
pub metadata: Option<Value>,
#[serde(default)]
pub expired_at: Option<i64>,
#[serde(default)]
pub cancelled_at: Option<i64>,
#[serde(default)]
pub failed_at: Option<i64>,
#[serde(default)]
pub completed_at: Option<i64>,
}
impl HasId for RunStep {
fn id(&self) -> Option<&str> {
Some(&self.id)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct AssistantDeleted {
pub id: String,
pub deleted: bool,
#[serde(default)]
pub object: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct ThreadDeleted {
pub id: String,
pub deleted: bool,
#[serde(default)]
pub object: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[non_exhaustive]
pub struct MessageDeleted {
pub id: String,
pub deleted: bool,
#[serde(default)]
pub object: String,
}