chat_prompts/chat/
openchat.rs

1use crate::{
2    error::{PromptError, Result},
3    BuildChatPrompt,
4};
5use endpoints::chat::{
6    ChatCompletionAssistantMessage, ChatCompletionRequestMessage, ChatCompletionUserMessage,
7    ChatCompletionUserMessageContent, ContentPart,
8};
9
10/// Generate prompts for the amazon `MistralLite-7B` model.
11#[derive(Debug, Default, Clone)]
12pub struct OpenChatPrompt;
13impl OpenChatPrompt {
14    /// Create a user prompt from a chat completion request message.
15    fn append_user_message(
16        &self,
17        chat_history: impl AsRef<str>,
18        message: &ChatCompletionUserMessage,
19    ) -> String {
20        let content = match message.content() {
21            ChatCompletionUserMessageContent::Text(text) => text.to_string(),
22            ChatCompletionUserMessageContent::Parts(parts) => {
23                let mut content = String::new();
24                for part in parts {
25                    if let ContentPart::Text(text_content) = part {
26                        content.push_str(text_content.text());
27                        content.push('\n');
28                    }
29                }
30                content
31            }
32        };
33
34        match chat_history.as_ref().is_empty() {
35            true => format!(
36                "GPT4 User: {user_message}<|end_of_turn|>",
37                user_message = content.trim(),
38            ),
39            false => format!(
40                "{chat_history}GPT4 User: {user_message}<|end_of_turn|>",
41                chat_history = chat_history.as_ref().trim(),
42                user_message = content.trim(),
43            ),
44        }
45    }
46
47    /// create an assistant prompt from a chat completion request message.
48    fn append_assistant_message(
49        &self,
50        chat_history: impl AsRef<str>,
51        message: &ChatCompletionAssistantMessage,
52    ) -> Result<String> {
53        let content = match message.content() {
54            Some(content) => content.to_string(),
55            // Note that the content is optional if `tool_calls` is specified.
56            None => match message.tool_calls().is_some() {
57                true => String::new(),
58                false => return Err(PromptError::NoAssistantMessage),
59            },
60        };
61
62        Ok(format!(
63            "{chat_history}GPT4 Assistant: {assistant_message}<|end_of_turn|>",
64            chat_history = chat_history.as_ref().trim(),
65            assistant_message = content.trim(),
66        ))
67    }
68}
69impl BuildChatPrompt for OpenChatPrompt {
70    fn build(&self, messages: &mut Vec<ChatCompletionRequestMessage>) -> Result<String> {
71        // append user/assistant messages
72        if messages.is_empty() {
73            return Err(crate::error::PromptError::NoMessages);
74        }
75
76        // append user/assistant messages
77        let mut prompt = String::new();
78        for message in messages {
79            match message {
80                ChatCompletionRequestMessage::User(message) => {
81                    prompt = self.append_user_message(&prompt, message);
82                }
83                ChatCompletionRequestMessage::Assistant(message) => {
84                    prompt = self.append_assistant_message(&prompt, message)?;
85                }
86                _ => continue,
87            }
88        }
89
90        prompt.push_str("GPT4 Assistant:");
91
92        Ok(prompt)
93    }
94}