1pub mod openrouter;
5
6use crate::{RagConfig, Result};
7use async_trait::async_trait;
8use serde::{Deserialize, Serialize};
9use std::sync::Arc;
10
11#[derive(Debug, Clone, Serialize, Deserialize)]
13pub struct Message {
14 pub role: String,
16 pub content: String,
18}
19
20impl Message {
21 pub fn system(content: impl Into<String>) -> Self {
23 Message {
24 role: "system".into(),
25 content: content.into(),
26 }
27 }
28 pub fn user(content: impl Into<String>) -> Self {
30 Message {
31 role: "user".into(),
32 content: content.into(),
33 }
34 }
35}
36
37#[async_trait]
39pub trait ChatModel: Send + Sync {
40 async fn complete(&self, messages: &[Message]) -> Result<String>;
42
43 async fn ask(&self, system: &str, user: &str) -> Result<String> {
45 self.complete(&[Message::system(system), Message::user(user)])
46 .await
47 }
48}
49
50pub fn from_config(cfg: &RagConfig) -> Result<Arc<dyn ChatModel>> {
53 Ok(Arc::new(openrouter::OpenRouterClient::from_config(cfg)?))
54}