agent_chain_core/prompts/
message.rs1use std::collections::HashMap;
7
8use crate::error::Result;
9use crate::messages::BaseMessage;
10use crate::utils::interactive_env::is_interactive_env;
11
12pub trait BaseMessagePromptTemplate: Send + Sync {
17 fn input_variables(&self) -> Vec<String>;
21
22 fn format_messages(&self, kwargs: &HashMap<String, String>) -> Result<Vec<BaseMessage>>;
32
33 fn aformat_messages(
45 &self,
46 kwargs: &HashMap<String, String>,
47 ) -> std::pin::Pin<Box<dyn std::future::Future<Output = Result<Vec<BaseMessage>>> + Send + '_>>
48 {
49 let result = self.format_messages(kwargs);
50 Box::pin(async move { result })
51 }
52
53 fn pretty_repr(&self, html: bool) -> String;
63
64 fn pretty_print(&self) {
66 println!("{}", self.pretty_repr(is_interactive_env()));
67 }
68}
69
70pub fn get_msg_title_repr(title: &str, bold: bool) -> String {
72 let padded = format!(" {} ", title);
73 let sep_len = (80_usize).saturating_sub(padded.len()) / 2;
74 let sep: String = "=".repeat(sep_len);
75 let second_sep = if padded.len() % 2 == 0 {
76 sep.clone()
77 } else {
78 format!("{}=", sep)
79 };
80
81 if bold {
82 format!("{}\x1b[1m{}\x1b[0m{}", sep, padded, second_sep)
83 } else {
84 format!("{}{}{}", sep, padded, second_sep)
85 }
86}
87
88#[cfg(test)]
89mod tests {
90 use super::*;
91
92 #[test]
93 fn test_get_msg_title_repr() {
94 let title = get_msg_title_repr("Test", false);
95 assert!(title.contains("Test"));
96 assert!(title.contains("="));
97 }
98
99 #[test]
100 fn test_get_msg_title_repr_bold() {
101 let title = get_msg_title_repr("Test", true);
102 assert!(title.contains("Test"));
103 assert!(title.contains("\x1b[1m"));
104 assert!(title.contains("\x1b[0m"));
105 }
106}