修复: OpenAI SSE error 识别 + 条件引擎 warn + MidStream stop_flag 优先 + 双窗口 listener 时序加固

This commit is contained in:
lxy
2026-08-01 14:53:03 +08:00
parent ba578dfe6c
commit db99e7107c
6 changed files with 161 additions and 8 deletions
+37 -4
View File
@@ -38,20 +38,53 @@ impl ConditionEngine {
pub fn evaluate(expr: &str, context: &Value) -> anyhow::Result<bool> {
let trimmed = expr.trim();
if trimmed.is_empty() {
// 空表达式:保守 false。配置漏写条件时留可观测线索(非用户笔误,但利于排查
// 「为什么这条边条件总不满足」——可能是上游未填 condition 字段)。
tracing::warn!(
target: "df_workflow::conditions",
"条件表达式为空,求值保守 false(检查 edge.condition 是否漏填)"
);
return Ok(false);
}
let toks = match tokenize(trimmed) {
Ok(t) => t,
// tokenizer 阶段即非法(如未闭合引号):保守 false,不静默放行
Err(_) => return Ok(false),
// tokenizer 阶段即非法(如未闭合引号、单 = 、未识别关键字):保守 false,不静默放行
// 留 warn 记录表达式片段,排查笔误(如 status 拼错、引号未闭合)有据可循。
// 表达式可能较长,仅取前 200 字符防日志膨胀。
Err(_) => {
let preview = if trimmed.len() > 200 {
format!("{}...(截断)", &trimmed[..trimmed.floor_char_boundary(200)])
} else {
trimmed.to_string()
};
tracing::warn!(
target: "df_workflow::conditions",
expr = %preview,
"条件表达式 tokenize 失败(疑似未闭合引号/非法符号/未识别关键字),求值保守 false"
);
return Ok(false);
}
};
let mut parser = Parser { toks, pos: 0, ctx: context };
match parser.parse_or() {
Ok(v) => Ok(v),
// 解析错误保守 false:与历史行为「未识别表达式默认 false」一致,不破坏调用方
Err(_) => Ok(false),
// 解析错误保守 false:与历史行为「未识别表达式默认 false」一致,不破坏调用方
// 留 warn 记录表达式片段,排查结构错误(如括号不闭合、操作数缺失)有据可循。
Err(_) => {
let preview = if trimmed.len() > 200 {
format!("{}...(截断)", &trimmed[..trimmed.floor_char_boundary(200)])
} else {
trimmed.to_string()
};
tracing::warn!(
target: "df_workflow::conditions",
expr = %preview,
"条件表达式解析失败(疑似括号不闭合/操作数缺失/结构错误),求值保守 false"
);
Ok(false)
}
}
}
}