pub mod openrouter;
use crate::{RagConfig, Result};
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Message {
pub role: String,
pub content: String,
}
impl Message {
pub fn system(content: impl Into<String>) -> Self {
Message {
role: "system".into(),
content: content.into(),
}
}
pub fn user(content: impl Into<String>) -> Self {
Message {
role: "user".into(),
content: content.into(),
}
}
}
#[async_trait]
pub trait ChatModel: Send + Sync {
async fn complete(&self, messages: &[Message]) -> Result<String>;
async fn ask(&self, system: &str, user: &str) -> Result<String> {
self.complete(&[Message::system(system), Message::user(user)])
.await
}
}
pub fn from_config(cfg: &RagConfig) -> Result<Arc<dyn ChatModel>> {
Ok(Arc::new(openrouter::OpenRouterClient::from_config(cfg)?))
}