chat_prompts/chat/
openchat.rs1use crate::{
2 error::{PromptError, Result},
3 BuildChatPrompt,
4};
5use endpoints::chat::{
6 ChatCompletionAssistantMessage, ChatCompletionRequestMessage, ChatCompletionUserMessage,
7 ChatCompletionUserMessageContent, ContentPart,
8};
9
10#[derive(Debug, Default, Clone)]
12pub struct OpenChatPrompt;
13impl OpenChatPrompt {
14 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 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 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 if messages.is_empty() {
73 return Err(crate::error::PromptError::NoMessages);
74 }
75
76 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}