外层任务循环挂一串停止评估器,任一命中即停(OR 语义)
内层 ReAct 用迭代上限(见「主循环形态」),外层 Task Loop 由 LoopCoordinator 决定还要不要下一轮:先看是否被请求中止,再依次询问评估器链,第一个返回 should_stop 的评估器名字记为 stop_reason。同目录 schema/stop_condition.py 里内置了轮数上限、token 预算、墙钟超时、完成承诺(CompletionPromiseEvaluator,由 TaskCompletionRail 检测到约定标记后通知,可要求连续确认 N 次、中途缺席即清零)与自定义谓词五种。值得注意的是:评估器自己抛异常时只记一条 warning 并跳过——坏掉的停止条件不会让循环停下来。
- 适合
- 长任务要同时受轮数、token、时间约束,并且想把「完成」定义成可检测的约定。
- 代价
- 评估器抛异常时会被跳过,停止条件写错了不会让循环停下,要靠日志发现。
def should_continue(self) -> bool:
"""Return True if the loop may proceed.
Evaluates all evaluators with OR semantics — the first
evaluator that returns True from ``should_stop()``
terminates the loop and records the stop reason.
"""
if self._aborted:
self._stop_reason = "Aborted"
return False
ctx = self._build_eval_context()
for ev in self._evaluators:
try:
if ev.should_stop(ctx):
self._stop_reason = ev.name
logger.info(
"Stop condition met: %s",
ev.name,
)
return False
except Exception:
logger.warning(
"Evaluator %s raised an error",
ev.name,
exc_info=True,
)
return True