use std::collections::BTreeMap;
use dynamo_parsers::reasoning::{ReasoningParser, ReasoningParserType};
use serde::{Deserialize, Serialize};
#[derive(Deserialize)]
struct Input {
family: String,
mode: String,
cases: BTreeMap<String, CaseIn>,
}
#[derive(Deserialize)]
struct CaseIn {
#[serde(default)]
model_text: String,
#[serde(default)]
chunks: Vec<String>,
}
#[derive(Serialize)]
struct CaseOut {
reasoning_text: String,
normal_text: String,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let path = std::env::args()
.nth(1)
.ok_or("usage: record_dynamo_reasoning <input.json>")?;
let input: Input = serde_json::from_str(&std::fs::read_to_string(path)?)?;
let mut out: BTreeMap<String, CaseOut> = BTreeMap::new();
for (case_id, case) in input.cases {
let mut parser = ReasoningParserType::get_reasoning_parser_from_name(&input.family);
let result = if input.mode == "stream" {
let mut reasoning = String::new();
let mut normal = String::new();
for chunk in &case.chunks {
let r = parser.parse_reasoning_streaming_incremental(chunk, &[]);
reasoning.push_str(&r.reasoning_text);
normal.push_str(&r.normal_text);
}
CaseOut {
reasoning_text: reasoning,
normal_text: normal,
}
} else {
let r = parser.detect_and_parse_reasoning(&case.model_text, &[]);
CaseOut {
reasoning_text: r.reasoning_text,
normal_text: r.normal_text,
}
};
out.insert(case_id, result);
}
println!("{}", serde_json::to_string(&out)?);
Ok(())
}