kernelx_core/capabilities/
chat.rs1use 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}