chat_prompts/chat/
mediatek.rs1use crate::{
2 error::{PromptError, Result},
3 BuildChatPrompt,
4};
5use endpoints::chat::{
6 ChatCompletionAssistantMessage, ChatCompletionRequestMessage, ChatCompletionSystemMessage,
7 ChatCompletionUserMessage, ChatCompletionUserMessageContent, ContentPart,
8};
9
10#[derive(Debug, Default, Clone)]
12pub struct BreezeInstructPrompt;
13impl BreezeInstructPrompt {
14 fn create_system_prompt(&self, message: &ChatCompletionSystemMessage) -> String {
16 let content = message.content();
17 match content.is_empty() {
18 true => String::from("<s>You are a helpful AI assistant built by MediaTek Research. The user you are helping speaks Traditional Chinese and comes from Taiwan."),
19 false => format!("<s>{content}"),
20 }
21 }
22
23 fn append_user_message(
25 &self,
26 chat_history: impl AsRef<str>,
27 system_prompt: impl AsRef<str>,
28 message: &ChatCompletionUserMessage,
29 ) -> String {
30 let content = match message.content() {
31 ChatCompletionUserMessageContent::Text(text) => text.to_string(),
32 ChatCompletionUserMessageContent::Parts(parts) => {
33 let mut content = String::new();
34 for part in parts {
35 if let ContentPart::Text(text_content) = part {
36 content.push_str(text_content.text());
37 content.push('\n');
38 }
39 }
40 content
41 }
42 };
43
44 match chat_history.as_ref().is_empty() {
45 true => format!(
46 "{system_prompt} [INST] {user_message} [/INST]",
47 system_prompt = system_prompt.as_ref().trim(),
48 user_message = content.trim(),
49 ),
50 false => format!(
51 "{chat_history} [INST] {user_message} [/INST]",
52 chat_history = chat_history.as_ref().trim(),
53 user_message = content.trim(),
54 ),
55 }
56 }
57
58 fn append_assistant_message(
60 &self,
61 chat_history: impl AsRef<str>,
62 message: &ChatCompletionAssistantMessage,
63 ) -> Result<String> {
64 let content = match message.content() {
65 Some(content) => content.to_string(),
66 None => match message.tool_calls().is_some() {
68 true => String::new(),
69 false => return Err(PromptError::NoAssistantMessage),
70 },
71 };
72
73 Ok(format!(
74 "{chat_history} {assistant_message}",
75 chat_history = chat_history.as_ref().trim(),
76 assistant_message = content.trim(),
77 ))
78 }
79}
80impl BuildChatPrompt for BreezeInstructPrompt {
81 fn build(&self, messages: &mut Vec<ChatCompletionRequestMessage>) -> Result<String> {
82 if messages.is_empty() {
83 return Err(crate::error::PromptError::NoMessages);
84 }
85
86 let system_prompt = match messages[0] {
88 ChatCompletionRequestMessage::System(ref message) => self.create_system_prompt(message),
89 _ => String::from("<s>You are a helpful AI assistant built by MediaTek Research. The user you are helping speaks Traditional Chinese and comes from Taiwan."),
90 };
91
92 let mut prompt = String::new();
94 for message in messages {
95 match message {
96 ChatCompletionRequestMessage::User(message) => {
97 prompt = self.append_user_message(&prompt, &system_prompt, message);
98 }
99 ChatCompletionRequestMessage::Assistant(message) => {
100 prompt = self.append_assistant_message(&prompt, message)?;
101 }
102 _ => continue,
103 }
104 }
105
106 Ok(prompt)
107 }
108}