use crate::message::{Message, ToolCall};
use crate::tool::ToolDefinition;
use thiserror::Error;
#[derive(Debug, Clone)]
pub struct CompletionRequest {
pub messages: Vec<Message>,
pub tools: Vec<ToolDefinition>,
pub temperature: Option<f64>,
pub max_tokens: Option<u32>,
pub thinking: Option<bool>,
pub extra: Option<serde_json::Value>,
}
impl CompletionRequest {
pub fn new(messages: Vec<Message>) -> Self {
Self {
messages,
tools: Vec::new(),
temperature: None,
max_tokens: None,
thinking: None,
extra: None,
}
}
}
#[derive(Debug, Clone)]
pub enum ModelChoice {
Message(String),
ToolCall(Vec<ToolCall>),
}
#[derive(Debug, Clone, Default)]
pub struct Usage {
pub prompt_tokens: u32,
pub completion_tokens: u32,
}
#[derive(Debug, Clone)]
pub struct CompletionResponse {
pub choice: ModelChoice,
pub reasoning: Option<String>,
pub usage: Option<Usage>,
}
#[derive(Debug, Error)]
pub enum CompletionError {
#[error("HTTP error: {0}")]
Http(String),
#[error("JSON error: {0}")]
Json(#[from] serde_json::Error),
#[error("Provider error ({status}): {message}")]
Provider { status: u16, message: String },
#[error("Response error: {0}")]
Response(String),
}
pub trait CompletionModel {
type Error: std::error::Error + 'static;
fn complete(
&self,
request: CompletionRequest,
) -> impl std::future::Future<Output = Result<CompletionResponse, Self::Error>>;
}