@@ -24,7 +24,8 @@ use crate::pdl::ast::{
2424 ArrayBlock , Block ,
2525 Body :: { self , * } ,
2626 CallBlock , Closure , DataBlock , EmptyBlock , EvalsTo , Expr , FunctionBlock , IfBlock , ImportBlock ,
27- IncludeBlock , ListOrString , MessageBlock , Metadata , ModelBlock , ObjectBlock , PdlBlock ,
27+ IncludeBlock , ListOrString , MessageBlock , Metadata , MetadataBuilder , ModelBlock , ObjectBlock ,
28+ PdlBlock ,
2829 PdlBlock :: Advanced ,
2930 PdlParser , PdlResult , PdlUsage , PythonCodeBlock , ReadBlock , RepeatBlock , Role , Scope ,
3031 SequencingBlock , StringOrBoolean , StringOrNull , Timing ,
@@ -75,6 +76,10 @@ impl State {
7576 }
7677 }
7778
79+ fn id ( & self ) -> String {
80+ self . id_stack . join ( "." )
81+ }
82+
7883 fn with_cwd ( & self , cwd : PathBuf ) -> Self {
7984 let mut s = self . clone ( ) ;
8085 s. cwd = cwd;
@@ -268,7 +273,7 @@ impl<'a> Interpreter<'a> {
268273 timing. end ( ) ?;
269274
270275 let mut trace_metadata = m. clone ( ) ;
271- trace_metadata. pdl_id = Some ( state. id_stack . join ( "." ) ) ;
276+ trace_metadata. pdl_id = Some ( state. id ( ) ) ;
272277 trace_metadata. pdl_timing = Some ( timing) ;
273278 trace_metadata. pdl_result = Some ( Box :: new ( result. clone ( ) ) ) ;
274279 trace. metadata = Some ( trace_metadata) ;
@@ -429,18 +434,27 @@ impl<'a> Interpreter<'a> {
429434
430435 /// Run a PdlBlock::String
431436 async fn run_string ( & self , msg : & String , state : & State ) -> Interpretation {
432- let trace = self . eval ( msg, state) ?;
437+ let result = self . eval ( msg, state) ?;
433438 if self . options . debug {
434- eprintln ! ( "String {} -> {:?}" , msg, trace ) ;
439+ eprintln ! ( "String {} -> {:?}" , msg, result ) ;
435440 }
436441
437- let result_string = match & trace {
442+ let result_string = match & result {
438443 PdlResult :: String ( s) => s. clone ( ) ,
439444 x => to_string ( & x) ?,
440445 } ;
446+
441447 let messages = vec ! [ ChatMessage :: user( result_string) ] ;
448+ let trace = Advanced ( Block {
449+ metadata : Some ( MetadataBuilder :: default ( ) . pdl_id ( state. id ( ) ) . build ( ) ?) ,
450+ body : Data ( DataBlock {
451+ data : json ! ( { "pdl__expr" : msg. clone( ) , "pdl__result" : result. clone( ) } ) ,
452+ parser : None ,
453+ raw : None ,
454+ } ) ,
455+ } ) ;
442456
443- Ok ( ( trace , messages, PdlBlock :: String ( msg . clone ( ) ) ) )
457+ Ok ( ( result , messages, trace ) )
444458 }
445459
446460 /// If `file_path` is not absolute, join it with state.cwd
@@ -904,6 +918,19 @@ impl<'a> Interpreter<'a> {
904918 }
905919
906920 let mut trace = block. clone ( ) ;
921+ trace. pdl_model_input = Some (
922+ input_messages
923+ . into_iter ( )
924+ . map ( |m| MessageBlock {
925+ role : self . from_ollama_role ( m. role ) ,
926+ content : Box :: new ( PdlBlock :: String ( m. content ) ) ,
927+ name : None ,
928+ tool_call_id : None ,
929+ defsite : None ,
930+ } )
931+ . collect ( ) ,
932+ ) ;
933+
907934 if let Some ( res) = last_res {
908935 if let Some ( usage) = res. final_data {
909936 trace. pdl_usage = Some ( PdlUsage {
@@ -1063,6 +1090,15 @@ impl<'a> Interpreter<'a> {
10631090 }
10641091 }
10651092
1093+ fn from_ollama_role ( & self , role : MessageRole ) -> Role {
1094+ match role {
1095+ MessageRole :: User => Role :: User ,
1096+ MessageRole :: Assistant => Role :: Assistant ,
1097+ MessageRole :: System => Role :: System ,
1098+ MessageRole :: Tool => Role :: Tool ,
1099+ }
1100+ }
1101+
10661102 fn parse_result ( & self , parser : & PdlParser , result : & String ) -> Result < PdlResult , PdlError > {
10671103 match parser {
10681104 PdlParser :: Json => from_str ( result) . map_err ( |e| Box :: from ( e) ) ,
@@ -1135,22 +1171,22 @@ impl<'a> Interpreter<'a> {
11351171 & mut iter_state,
11361172 true ,
11371173 ) ?;
1138- let result_messages = trace. messages_for :: < ChatMessage > ( & output_messages) ;
11391174
11401175 state. scope = iter_state. scope ;
11411176 state. escaped_variables = iter_state. escaped_variables ;
11421177
1143- Ok ( (
1144- result,
1145- match block. role ( ) {
1146- Some ( role) => result_messages
1147- . into_iter ( )
1148- . map ( |m| ChatMessage :: new ( self . to_ollama_role ( role) , m. content ) )
1149- . collect ( ) ,
1150- None => result_messages,
1151- } ,
1152- trace. to_block ( ) ,
1153- ) )
1178+ // We may be asked to overlay a role on to the messages (TODO,
1179+ // does this belong in common code, i.e. run_advanced()?)
1180+ let result_messages = trace. messages_for :: < ChatMessage > ( & output_messages) ;
1181+ let messages = match block. role ( ) {
1182+ Some ( role) => result_messages
1183+ . into_iter ( )
1184+ . map ( |m| ChatMessage :: new ( self . to_ollama_role ( role) , m. content ) )
1185+ . collect ( ) ,
1186+ None => result_messages,
1187+ } ;
1188+
1189+ Ok ( ( result, messages, trace. to_block ( ) ) )
11541190 }
11551191
11561192 /// Run a PdlBlock::Array
0 commit comments