use crate::error::ErrorCode;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum StopReason {
End,
Length,
Cancelled,
Error,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct Usage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum Response {
Status {
id: String,
status: String,
},
Token {
id: String,
content: String,
},
Done {
id: String,
content: String,
usage: Usage,
stop_reason: StopReason,
backend: String,
},
Error {
id: String,
code: ErrorCode,
message: String,
},
}
impl Response {
pub fn id(&self) -> &str {
match self {
Response::Status { id, .. }
| Response::Token { id, .. }
| Response::Done { id, .. }
| Response::Error { id, .. } => id,
}
}
pub fn is_terminal(&self) -> bool {
matches!(self, Response::Done { .. } | Response::Error { .. })
}
}