feat: add tool-call fallback and resilient batch exports
This commit is contained in:
1 parent
ab066733b8
commit
d31eb2a19d
32 files changed
+538
-72
No files matched your search
@@ -508,6 +508,9 @@ class OperatorNode:
|
||||
plan_gate_bounced = False
|
||||
no_progress_attempts = 0
|
||||
no_progress_limit = settings.ARTEMIS_OPERATOR_MAX_NO_PROGRESS_ATTEMPTS
|
||||
fallback_limit = settings.ARTEMIS_TOOL_FALLBACK_MAX_NO_PROGRESS_ATTEMPTS
|
||||
active_llm = base_llm
|
||||
using_tool_fallback = False
|
||||
|
||||
for iteration in range(max_iterations):
|
||||
control = getattr(self.ctx, "task_control", None)
|
||||
@@ -532,7 +535,7 @@ class OperatorNode:
|
||||
)
|
||||
)
|
||||
|
||||
bound_llm = base_llm.bind_tools(tools=traced_tools)
|
||||
bound_llm = active_llm.bind_tools(tools=traced_tools)
|
||||
interrupted, response = await self._await_or_pause(
|
||||
invoke_llm_with_timeout_message(acomplete(bound_llm, current_messages))
|
||||
)
|
||||
@@ -607,11 +610,25 @@ class OperatorNode:
|
||||
|
||||
if not response.tool_calls:
|
||||
no_progress_attempts += 1
|
||||
if no_progress_attempts >= no_progress_limit:
|
||||
raise OperatorNoProgressError(
|
||||
f"模型连续 {no_progress_attempts} 次未提供可执行的工具调用,"
|
||||
"已停止任务以避免空转;未执行新的设备动作。"
|
||||
if no_progress_attempts >= (
|
||||
fallback_limit if using_tool_fallback else no_progress_limit
|
||||
):
|
||||
if using_tool_fallback:
|
||||
raise OperatorNoProgressError(
|
||||
f"首选模型连续 {no_progress_limit} 次、兜底模型连续 "
|
||||
f"{no_progress_attempts} 次未提供可执行的工具调用;"
|
||||
"已停止任务以避免空转。"
|
||||
)
|
||||
active_llm = get_llm(ctx=self.ctx, name="operator", use_fallback=True)
|
||||
using_tool_fallback = True
|
||||
no_progress_attempts = 0
|
||||
logger.warning("Operator 首选模型未调用工具,当前步骤切换到兜底模型")
|
||||
current_messages.append(
|
||||
SystemMessage(
|
||||
content="本步骤已切换兜底模型。请使用工具完成操作或明确报告阻碍。"
|
||||
)
|
||||
)
|
||||
continue
|
||||
logger.warning("LLM returned no tool call; requesting a concrete tool call.")
|
||||
current_messages.append(response)
|
||||
current_messages.append(
|
||||
@@ -931,11 +948,25 @@ class OperatorNode:
|
||||
|
||||
if validation_errors:
|
||||
no_progress_attempts += 1
|
||||
if no_progress_attempts >= no_progress_limit:
|
||||
raise OperatorNoProgressError(
|
||||
f"模型连续 {no_progress_attempts} 次未提供可执行的工具调用,"
|
||||
"工具参数校验仍失败;已停止任务,未执行被拒绝的设备动作。"
|
||||
if no_progress_attempts >= (
|
||||
fallback_limit if using_tool_fallback else no_progress_limit
|
||||
):
|
||||
if using_tool_fallback:
|
||||
raise OperatorNoProgressError(
|
||||
f"首选模型连续 {no_progress_limit} 次、兜底模型连续 "
|
||||
f"{no_progress_attempts} 次未提供可执行的工具调用,"
|
||||
"工具参数校验仍失败;已停止任务。"
|
||||
)
|
||||
active_llm = get_llm(ctx=self.ctx, name="operator", use_fallback=True)
|
||||
using_tool_fallback = True
|
||||
no_progress_attempts = 0
|
||||
logger.warning("Operator 首选模型工具调用校验失败,当前步骤切换到兜底模型")
|
||||
current_messages.append(
|
||||
SystemMessage(
|
||||
content="本步骤已切换兜底模型。请修正上面的工具参数后再调用。"
|
||||
)
|
||||
)
|
||||
continue
|
||||
logger.warning("Some action calls failed validation. Feeding back to LLM.")
|
||||
continue
|
||||
no_progress_attempts = 0
|
||||
|
||||
Reference in new issue
Block a user