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}