修复: OpenAI SSE error 识别 + 条件引擎 warn + MidStream stop_flag 优先 + 双窗口 listener 时序加固
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user