use async_trait::async_trait;
use crate::{chat::ChatResponse, error::LLMError, ToolCall};
#[derive(Debug, Clone)]
pub struct CompletionRequest {
pub prompt: String,
pub max_tokens: Option<u32>,
pub temperature: Option<f32>,
}
#[derive(Debug, Clone)]
pub struct CompletionResponse {
pub text: String,
}
impl ChatResponse for CompletionResponse {
fn text(&self) -> Option<String> {
Some(self.text.clone())
}
fn tool_calls(&self) -> Option<Vec<ToolCall>> {
None
}
}
impl CompletionRequest {
pub fn new(prompt: impl Into<String>) -> Self {
Self {
prompt: prompt.into(),
max_tokens: None,
temperature: None,
}
}
pub fn builder(prompt: impl Into<String>) -> CompletionRequestBuilder {
CompletionRequestBuilder {
prompt: prompt.into(),
max_tokens: None,
temperature: None,
}
}
}
#[derive(Debug, Clone)]
pub struct CompletionRequestBuilder {
pub prompt: String,
pub max_tokens: Option<u32>,
pub temperature: Option<f32>,
}
impl CompletionRequestBuilder {
pub fn max_tokens(mut self, val: u32) -> Self {
self.max_tokens = Some(val);
self
}
pub fn temperature(mut self, val: f32) -> Self {
self.temperature = Some(val);
self
}
pub fn build(self) -> CompletionRequest {
CompletionRequest {
prompt: self.prompt,
max_tokens: self.max_tokens,
temperature: self.temperature,
}
}
}
#[async_trait]
pub trait CompletionProvider {
async fn complete(&self, req: &CompletionRequest) -> Result<CompletionResponse, LLMError>;
}
impl std::fmt::Display for CompletionResponse {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.text)
}
}