1use super::{prompt_message::PromptMessage, prompt_role::PromptRole};
4use dogma::{
5 prelude::{FromStr, String, Vec, fmt},
6 traits::Collection,
7};
8use typed_builder::TypedBuilder;
9
10#[derive(Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd, TypedBuilder)]
11pub struct Prompt {
12 pub messages: Vec<PromptMessage>,
13}
14
15impl Collection for Prompt {
16 type Item = PromptMessage;
17
18 fn len(&self) -> usize {
19 self.messages.len()
20 }
21}
22
23impl From<Vec<PromptMessage>> for Prompt {
24 fn from(messages: Vec<PromptMessage>) -> Self {
25 Self { messages }
26 }
27}
28
29impl FromStr for Prompt {
30 type Err = ();
31
32 fn from_str(input: &str) -> Result<Self, Self::Err> {
33 Ok(input.into())
34 }
35}
36
37impl From<&str> for Prompt {
38 fn from(input: &str) -> Self {
39 (PromptRole::User, input).into()
40 }
41}
42
43impl From<String> for Prompt {
44 fn from(input: String) -> Self {
45 (PromptRole::User, input).into()
46 }
47}
48
49impl From<(PromptRole, &str)> for Prompt {
50 fn from((role, message): (PromptRole, &str)) -> Self {
51 (role, String::from(message)).into()
52 }
53}
54
55impl From<(PromptRole, String)> for Prompt {
56 fn from((role, message): (PromptRole, String)) -> Self {
57 Prompt {
58 messages: Vec::from([(role, message).into()]),
59 }
60 }
61}
62
63impl fmt::Display for Prompt {
64 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
65 for PromptMessage(role, message) in &self.messages {
66 writeln!(f, "{}: {}", role, message)?;
67 }
68 Ok(())
69 }
70}
71
72#[cfg(feature = "openai")]
73impl TryFrom<openai::schemas::CreateCompletionRequest_Prompt> for Prompt {
74 type Error = ();
75
76 fn try_from(
77 input: openai::schemas::CreateCompletionRequest_Prompt,
78 ) -> Result<Self, Self::Error> {
79 use openai::schemas::CreateCompletionRequest_Prompt::*;
80 match input {
81 Text(prompt) => Ok(prompt.into()),
82 TextArray(prompts) => Ok(prompts.join("").into()),
83 TokenArray(_) => Err(()),
84 TokenArrayArray(_) => Err(()),
85 }
86 }
87}