use crate::error::LlmError;
use async_trait::async_trait;
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)]
pub struct TokenUsage {
pub input: u32,
pub output: u32,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct CompletionResult {
pub text: String,
pub usage: TokenUsage,
}
#[async_trait]
pub trait LlmClient: Send + Sync + std::fmt::Debug {
async fn complete(&self, prompt: &str, max_tokens: u32) -> Result<CompletionResult, LlmError>;
fn model_id(&self) -> &str;
}
#[derive(Debug, Default, Clone, Copy)]
pub struct NoOpLlmClient;
#[async_trait]
impl LlmClient for NoOpLlmClient {
async fn complete(
&self,
_prompt: &str,
_max_tokens: u32,
) -> Result<CompletionResult, LlmError> {
Err(LlmError::NoLlmAvailable)
}
fn model_id(&self) -> &str {
"noop"
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn token_usage_default_is_zero() {
let u = TokenUsage::default();
assert_eq!(u.input, 0);
assert_eq!(u.output, 0);
}
}