fix: Agent 步骤上限优化——max_steps 20→40(多步任务如打开抖音搜索),system prompt 加收敛规范(无进展 6 步主动停止总结),超限时无工具收尾请求让模型给有意义总结(不再机械提示);web 超时 600→900s
This commit is contained in:
+24
-1
@@ -32,6 +32,8 @@ SYSTEM_PROMPT = """你是手机自动化控制助手。你通过工具实时操
|
||||
5. 每次关键操作后再次 de_screenshot 验证结果,直到完成用户目标
|
||||
6. 完成或失败时用中文总结:做了什么、当前状态、需要用户注意的事项
|
||||
7. 设备不可用/操作失败时如实报告错误,不要臆测成功
|
||||
8. 效率:界面未变化时不要重复截图/点击同一位置;每步都要推进目标;
|
||||
若连续 6 步无进展(截图内容未变/操作无效),停止并总结原因,不要空转
|
||||
|
||||
可用工具清单将由系统提供。"""
|
||||
|
||||
@@ -214,7 +216,28 @@ class Agent:
|
||||
# 无工具调用:本轮即最终回答
|
||||
return full_content
|
||||
|
||||
return "(达到最大步骤数未完成,请检查操作是否卡在循环)"
|
||||
# 步骤超限:不带工具让模型做最终总结(避免机械提示,给用户有意义的结论)
|
||||
try:
|
||||
_log.warning("达到最大步骤数,请求模型收尾总结")
|
||||
saved_tools = self.tools_schema
|
||||
self.tools_schema = []
|
||||
self.messages.append({"role": "user",
|
||||
"content": "已达最大操作步骤数,请立即用中文总结:"
|
||||
"已完成的部分、当前设备状态、未能完成的原因与下一步建议。"
|
||||
"不要调用任何工具。"})
|
||||
parts = []
|
||||
async for chunk in self._chat_stream():
|
||||
delta = (chunk.get("choices") or [{}])[0].get("delta") or {}
|
||||
text = delta.get("content")
|
||||
if text:
|
||||
parts.append(text)
|
||||
if on_delta:
|
||||
on_delta(text, "content")
|
||||
self.tools_schema = saved_tools
|
||||
summary = "".join(parts)
|
||||
return summary or "(已达步骤上限,模型未能生成总结)"
|
||||
except Exception as e:
|
||||
return f"(已达最大步骤数,且收尾总结失败: {e})"
|
||||
|
||||
# ---------- 非流式(CLI) ----------
|
||||
async def run(self, prompt: str, serial: str = "") -> str:
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ class AgentSettings:
|
||||
default_serial = _env("AGENT_DEFAULT_SERIAL", "")
|
||||
|
||||
# Agent 循环上限与请求超时
|
||||
max_steps = int(_env("AGENT_MAX_STEPS", "20"))
|
||||
max_steps = int(_env("AGENT_MAX_STEPS", "40"))
|
||||
request_timeout = float(_env("AGENT_TIMEOUT", "120"))
|
||||
|
||||
# system prompt 语言
|
||||
|
||||
+1
-1
@@ -201,7 +201,7 @@ def _agent_thread(run_id, prompt, serial, cfg):
|
||||
on_delta=on_delta, on_tool=on_tool)
|
||||
|
||||
# 整体超时保护:卡死时结束,释放单实例
|
||||
answer = asyncio.run(asyncio.wait_for(_execute(), timeout=600))
|
||||
answer = asyncio.run(asyncio.wait_for(_execute(), timeout=900))
|
||||
with _lock:
|
||||
_run["state"] = "done"
|
||||
_run["answer"] = answer
|
||||
|
||||
Reference in New Issue
Block a user