kernelx_core/capabilities/
chat.rs

1use super::HasCapability;
2use crate::{models::ModelConfig, Result};
3use async_trait::async_trait;
4
5#[derive(Debug, Clone)]
6pub struct ChatMessage {
7    role: Role,
8    content: String,
9}
10
11#[derive(Debug, Clone, PartialEq, Eq)]
12pub enum Role {
13    System,
14    User,
15    Assistant,
16}
17
18impl ChatMessage {
19    pub fn new(role: Role, content: &str) -> Self {
20        Self {
21            role,
22            content: content.into(),
23        }
24    }
25
26    pub fn system(content: &str) -> Self {
27        Self::new(Role::System, content)
28    }
29
30    pub fn user(content: &str) -> Self {
31        Self::new(Role::User, content)
32    }
33
34    pub fn assistant(content: &str) -> Self {
35        Self::new(Role::Assistant, content)
36    }
37
38    pub fn role(&self) -> &Role {
39        &self.role
40    }
41
42    pub fn content(&self) -> &str {
43        &self.content
44    }
45}
46
47#[async_trait]
48pub trait Chat: HasCapability {
49    async fn chat(&self, messages: Vec<ChatMessage>) -> Result<String> {
50        self.chat_impl(self.model_id(), messages, self.config())
51            .await
52    }
53
54    #[doc(hidden)]
55    async fn chat_impl(
56        &self,
57        model: &str,
58        messages: Vec<ChatMessage>,
59        config: &ModelConfig,
60    ) -> Result<String>;
61}