feat: improve batch task controls and release 1.2.0
This commit is contained in:
1 parent
0e13bb5c29
commit
84e183d28d
38 files changed
+632
-147
No files matched your search
@@ -45,7 +45,7 @@ import re
|
||||
import uuid
|
||||
|
||||
from artemis.config.settings import settings
|
||||
from artemis.runtime.task_control import TaskControl
|
||||
from artemis.runtime.task_control import TaskControl, has_pending_instruction
|
||||
|
||||
from jinja2 import Template
|
||||
from langchain_core.messages import (
|
||||
@@ -937,6 +937,9 @@ class FlashRunner:
|
||||
action_names = self.executor.action_tool_names
|
||||
index_elements = self._turn_index_snapshot(state)
|
||||
for tc in tool_calls:
|
||||
control = getattr(self.ctx, "task_control", None)
|
||||
if isinstance(control, TaskControl) and has_pending_instruction(control.directory):
|
||||
return None, pre_screenshot_bytes, xml_list, action_sequence
|
||||
name = tc["name"].split(":")[-1] if ":" in tc["name"] else tc["name"]
|
||||
args = tc.get("args") or {}
|
||||
tc_id = tc.get("id") or str(uuid.uuid4())
|
||||
@@ -1118,7 +1121,36 @@ class FlashRunner:
|
||||
turn_base = len(messages) - 1
|
||||
current_tools = report_only_tools if is_final else tools_declaration
|
||||
|
||||
response = await self._invoke_model(llm, current_tools, messages)
|
||||
if isinstance(control, TaskControl):
|
||||
interrupted, response = await control.run_interruptibly(
|
||||
self._invoke_model(llm, current_tools, messages),
|
||||
on_pause=getattr(self.ctx, "on_task_pause", None),
|
||||
on_resume=getattr(self.ctx, "on_task_resume", None),
|
||||
)
|
||||
else:
|
||||
interrupted, response = (
|
||||
False,
|
||||
await self._invoke_model(llm, current_tools, messages),
|
||||
)
|
||||
|
||||
if interrupted or (
|
||||
isinstance(control, TaskControl) and has_pending_instruction(control.directory)
|
||||
):
|
||||
# Do not dispatch a stale action or final answer from a prompt
|
||||
# assembled before the instruction arrived.
|
||||
(
|
||||
shot_path,
|
||||
current_pre_screenshot_bytes,
|
||||
current_xml_list,
|
||||
) = await capture_screenshot_and_parse_ui(
|
||||
self.ctx, state, self.controller, skip_settling=False
|
||||
)
|
||||
state.latest_screenshot = shot_path
|
||||
pending_notices.append(
|
||||
"新指导已打断旧模型步骤。请重新观察画面并按最新指导决定下一步。"
|
||||
)
|
||||
turns -= 1
|
||||
continue
|
||||
|
||||
if response is None:
|
||||
break
|
||||
@@ -1145,6 +1177,18 @@ class FlashRunner:
|
||||
self._record_llm_trace(step_token_usage, raw_text)
|
||||
|
||||
tool_calls = self._resolve_tool_calls(response, raw_text)
|
||||
if isinstance(control, TaskControl) and has_pending_instruction(control.directory):
|
||||
(
|
||||
shot_path,
|
||||
current_pre_screenshot_bytes,
|
||||
current_xml_list,
|
||||
) = await capture_screenshot_and_parse_ui(
|
||||
self.ctx, state, self.controller, skip_settling=False
|
||||
)
|
||||
state.latest_screenshot = shot_path
|
||||
pending_notices.append("新指导已收到;忽略旧模型动作,重新观察画面。")
|
||||
turns -= 1
|
||||
continue
|
||||
|
||||
if not tool_calls:
|
||||
logger.info(
|
||||
|
||||
Reference in new issue
Block a user