asimov_prompt/
prompt.rs

1// This is free and unencumbered software released into the public domain.
2
3use 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}