1use crate::{
7 aim::{ContextLike, WorkflowLike},
8 inference::{Capability, Modifier, OutputFormat},
9};
10use std::sync::Arc;
11
12#[derive(Debug, PartialEq, Clone)]
14pub struct Prompt {
15 system: Arc<str>,
16 user: Arc<str>,
17}
18
19impl Prompt {
20 pub fn new(system: Arc<str>, user: Arc<str>) -> Self {
22 Self { system, user }
23 }
24
25 pub fn generate (
31 workflow: Arc<dyn WorkflowLike>,
32 context: &mut dyn ContextLike,
33 capability: &Capability,
34 ) -> Self {
35 let mut format = OutputFormat::new(capability);
36 let modifier = Modifier::new(workflow, context);
37
38 modifier.role(&mut format);
40 modifier.others(&mut format);
41 modifier.instructions(&mut format);
42 modifier.output_format(&mut format);
43 modifier.examples(&mut format);
44 modifier.user_text(&mut format);
45
46 let system = modifier.system_prompt();
47 let user = Arc::from(format.finish());
48 Self::new(system, user)
49 }
50
51 pub fn system(&self) -> Arc<str> {
53 self.system.clone()
54 }
55
56 pub fn user(&self) -> Arc<str> {
58 self.user.clone()
59 }
60}