role.rs

 1use serde::{Deserialize, Serialize};
 2use std::fmt::{self, Display};
 3
 4#[derive(Clone, Copy, Serialize, Deserialize, Debug, Eq, PartialEq, Hash)]
 5#[serde(rename_all = "lowercase")]
 6pub enum Role {
 7    User,
 8    Assistant,
 9    System,
10}
11
12impl Role {
13    pub fn from_proto(role: i32) -> Role {
14        match proto::LanguageModelRole::from_i32(role) {
15            Some(proto::LanguageModelRole::LanguageModelUser) => Role::User,
16            Some(proto::LanguageModelRole::LanguageModelAssistant) => Role::Assistant,
17            Some(proto::LanguageModelRole::LanguageModelSystem) => Role::System,
18            None => Role::User,
19        }
20    }
21
22    pub fn to_proto(&self) -> proto::LanguageModelRole {
23        match self {
24            Role::User => proto::LanguageModelRole::LanguageModelUser,
25            Role::Assistant => proto::LanguageModelRole::LanguageModelAssistant,
26            Role::System => proto::LanguageModelRole::LanguageModelSystem,
27        }
28    }
29
30    pub fn cycle(self) -> Role {
31        match self {
32            Role::User => Role::Assistant,
33            Role::Assistant => Role::System,
34            Role::System => Role::User,
35        }
36    }
37}
38
39impl Display for Role {
40    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {
41        match self {
42            Role::User => write!(f, "user"),
43            Role::Assistant => write!(f, "assistant"),
44            Role::System => write!(f, "system"),
45        }
46    }
47}
48
49impl From<Role> for ollama::Role {
50    fn from(val: Role) -> Self {
51        match val {
52            Role::User => ollama::Role::User,
53            Role::Assistant => ollama::Role::Assistant,
54            Role::System => ollama::Role::System,
55        }
56    }
57}
58
59impl From<Role> for open_ai::Role {
60    fn from(val: Role) -> Self {
61        match val {
62            Role::User => open_ai::Role::User,
63            Role::Assistant => open_ai::Role::Assistant,
64            Role::System => open_ai::Role::System,
65        }
66    }
67}
68
69impl From<Role> for deepseek::Role {
70    fn from(val: Role) -> Self {
71        match val {
72            Role::User => deepseek::Role::User,
73            Role::Assistant => deepseek::Role::Assistant,
74            Role::System => deepseek::Role::System,
75        }
76    }
77}
78
79impl From<Role> for lmstudio::Role {
80    fn from(val: Role) -> Self {
81        match val {
82            Role::User => lmstudio::Role::User,
83            Role::Assistant => lmstudio::Role::Assistant,
84            Role::System => lmstudio::Role::System,
85        }
86    }
87}