Skip to content

Commit c023835

Browse files
starpitmandel
authored andcommitted
fix: update rust interpreter to create Data blocks for expr eval, and model_input trace field
Signed-off-by: Nick Mitchell <[email protected]>
1 parent 15596f7 commit c023835

File tree

2 files changed

+58
-19
lines changed

2 files changed

+58
-19
lines changed

pdl-live-react/src-tauri/src/pdl/ast.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,10 @@ impl SequencingBlock for TextBlock {
238238
PdlResult::String(
239239
output_results
240240
.into_iter()
241-
.map(|m| m.to_string())
241+
.map(|m| match m {
242+
PdlResult::String(s) => s,
243+
x => x.to_string(),
244+
})
242245
.collect::<Vec<_>>()
243246
.join("\n"),
244247
)

pdl-live-react/src-tauri/src/pdl/interpreter.rs

Lines changed: 54 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)