use crate::completion::{
Completion, CompletionError, CompletionModel, CompletionRequestBuilder, CompletionResponse,
Message, ModelChoice, Prompt, PromptError,
};
pub struct Model<M: CompletionModel> {
model: M,
temperature: Option<f64>,
}
impl<M: CompletionModel> Completion<M> for Model<M> {
async fn completion(
&self,
prompt: &str,
chat_history: Vec<Message>,
) -> Result<CompletionRequestBuilder<M>, CompletionError> {
Ok(self
.model
.completion_request(prompt)
.messages(chat_history)
.temperature_opt(self.temperature))
}
}
impl<M: CompletionModel> Prompt for Model<M> {
async fn chat(&self, prompt: &str, chat_history: Vec<Message>) -> Result<String, PromptError> {
match self.completion(prompt, chat_history).await?.send().await? {
CompletionResponse {
choice: ModelChoice::Message(message),
..
} => Ok(message),
CompletionResponse {
choice: ModelChoice::ToolCall(toolname, _),
..
} => Err(PromptError::ToolError(
crate::tool::ToolSetError::ToolNotFoundError(toolname),
)),
}
}
}
pub struct ModelBuilder<M: CompletionModel> {
model: M,
pub temperature: Option<f64>,
}
impl<M: CompletionModel> ModelBuilder<M> {
pub fn new(model: M) -> Self {
Self {
model,
temperature: None,
}
}
pub fn temperature(mut self, temperature: f64) -> Self {
self.temperature = Some(temperature);
self
}
pub fn build(self) -> Model<M> {
Model {
model: self.model,
temperature: self.temperature,
}
}
}