myagent-ai 1.15.16 → 1.15.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/web/api_server.py +37 -49
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "myagent-ai",
3
- "version": "1.15.16",
3
+ "version": "1.15.18",
4
4
  "description": "本地桌面端执行型AI助手 - Open Interpreter 风格 | Local Desktop Execution-Oriented AI Assistant",
5
5
  "main": "main.py",
6
6
  "bin": {
package/web/api_server.py CHANGED
@@ -1228,57 +1228,35 @@ class ApiServer:
1228
1228
  return web.json_response({"error": str(e)}, status=500)
1229
1229
 
1230
1230
  def _build_task_plan_context(self, agent_path: str, chat_mode: str, original_message: str, session_id: str = "") -> str:
1231
- """构建任务规划上下文(仅 exec 模式,注入到 system_prompt 中)"""
1231
+ """构建任务规划上下文(仅 exec 模式,注入到 system_prompt 中)
1232
+
1233
+ [v1.15.17] 统一为 V2 <output> XML 格式,移除旧的 ```tasklist``` / ```action``` 格式指令,
1234
+ 避免与 SYSTEM_PROMPT 的 XML 输出要求冲突导致模型输出非 XML 内容。
1235
+ 任务进度统一通过 <task_plan> 标签管理,工具调用统一通过 <toolstocal> 标签执行。
1236
+ """
1232
1237
  if chat_mode != "exec":
1233
1238
  return ""
1234
1239
 
1235
- base_instruction = (
1240
+ return (
1236
1241
  "你当前处于【执行模式】(Execution Mode)。\n\n"
1237
- "## 核心规则\n"
1238
- "1. **任务列表(按复杂度决定)**:\n"
1239
- " - 如果用户的需求是简单任务(预计操作步骤不超过3步,如:单次查询、简单计算、问答题、格式转换、文件读取等),【不要】使用 ```tasklist```,直接用纯文本回复并执行即可。\n"
1240
- " - 只有当任务较复杂(预计需要超过3步操作,如:多文件修改、需要调研+实现+测试、涉及多个模块联动等),才使用 ```tasklist``` 代码块来跟踪进度。\n"
1241
- " - 格式:```tasklist\\n[{\"text\": \"步骤描述\", \"status\": \"pending\"}]\\n```\n"
1242
- " - status 可选值:pending(待执行)、running(进行中)、done(已完成)、blocked(受阻)\n"
1243
- " - 首次收到复杂任务时,拆分为多个步骤,全部标记为 pending\n"
1244
- " - 每次执行完一个步骤后,更新对应步骤状态为 done,下一个为 running\n"
1245
- "2. **单步执行(强制)**:每次回复【只能执行一个操作】(一个工具调用、一个代码块或一个技能调用)。\n"
1246
- " - 执行完一个操作后停下来,等待结果反馈后再决定下一步\n"
1247
- " - 不要一次性执行多个操作\n"
1248
- "3. **回复格式**:先写纯文本分析/总结 → 如有任务列表则用 ```tasklist``` 更新进度 → 最后用 ```action``` 执行操作(如有)\n"
1249
- "4. **任务完成**:当使用任务列表且所有步骤都标记为 done 时,用 ```action``` 输出 {\"type\": \"final_answer\", \"content\": \"...\"} 结束任务。简单任务直接回复即可。\n"
1242
+ "## 执行模式核心规则(必须在 <output> XML 中遵循)\n"
1243
+ "1. **单步执行(强制)**:每次回复的 <toolstocal> 中只能包含一个 <tool> 调用。\n"
1244
+ " - 执行完一个操作后停下来,等待工具返回结果后再决定下一步\n"
1245
+ " - 不要一次性调用多个工具,每个 <toolstocal> 只放一个 <tool>\n"
1246
+ "2. **任务进度跟踪**:通过 <output> 中的 <task_plan> 标签管理任务进度。\n"
1247
+ " - 简单任务(不超过3步):<task_plan> 输出为空,直接执行即可\n"
1248
+ " - 复杂任务(超过3步):在 <task_plan> 中创建 Markdown 任务列表,"
1249
+ "- [ ] 待办 / - [x] 已完成 跟踪进度\n"
1250
+ " - 每次工具执行完后,必须更新 <task_plan> 中对应步骤的完成状态\n"
1251
+ "3. **继续执行**:任务未完成时,设置 <finish>false</finish>,"
1252
+ "<next_step> 描述下一步具体操作。\n"
1253
+ "4. **任务完成**:所有步骤完成后,设置 <finish>true</finish>,"
1254
+ "<finish_reason> 填写完成总结。\n"
1255
+ "\n注意:所有输出必须严格遵循 <output> XML 格式,"
1256
+ "不要使用 ```tasklist``` 或 ```action``` 等非 XML 格式。\n"
1257
+ "任务进度统一通过 <task_plan> 标签管理,工具调用统一通过 <toolstocal> 标签执行。"
1250
1258
  )
1251
1259
 
1252
- # 从内存读取当前任务列表(按 session 隔离)
1253
- store_key = session_id or agent_path
1254
- tasks = self._task_list_store.get(store_key, [])
1255
- if not tasks:
1256
- return base_instruction + "\n## 当前状态\n暂无任务计划。如果是简单任务(不超过3步),直接执行即可,无需创建任务列表。如果是复杂任务(超过3步),请先分析用户需求,拆分为具体步骤,然后用 ```tasklist``` 输出计划。"
1257
-
1258
- pending = [f" - ⏳ {t['text']}" for t in tasks if t.get("status") in ("pending", "running", "blocked")]
1259
- done = [f" - ✅ {t['text']}" for t in tasks if t.get("status") == "done"]
1260
- running = [f" - 🔄 {t['text']}" for t in tasks if t.get("status") == "running"]
1261
-
1262
- # 如果所有任务都已完成,不再注入任务上下文,让 LLM 自然回复
1263
- if not pending and not running:
1264
- return ""
1265
-
1266
- context = base_instruction + "\n## 当前任务进度\n"
1267
- if done:
1268
- context += "已完成:\n" + "\n".join(done) + "\n"
1269
- if running:
1270
- context += "进行中:\n" + "\n".join(running) + "\n"
1271
- if pending:
1272
- context += "待执行:\n" + "\n".join(pending) + "\n"
1273
- context += (
1274
- "\n## 下一步\n"
1275
- "1. 用纯文本简要分析当前进展\n"
1276
- "2. 用 ```tasklist``` 更新任务进度(标记已完成的步骤为 done,标记当前步骤为 running)\n"
1277
- "3. 用 ```action``` 执行下一个待执行步骤(每次只执行一个操作)\n"
1278
- "4. 如果所有步骤已完成,用 {\"type\": \"final_answer\", \"content\": \"总结\"} 结束\n"
1279
- )
1280
- return context
1281
-
1282
1260
  async def handle_chat_page(self, request):
1283
1261
  """GET /chat - 重定向到聊天页面"""
1284
1262
  raise web.HTTPFound("/ui/chat/chat_container.html")
@@ -2108,6 +2086,8 @@ class ApiServer:
2108
2086
  "execution_mode", "enabled", "sandbox_image", "sandbox_network", "sandbox_memory",
2109
2087
  "platform", "platform_token", "platform_app_id", "platform_app_secret",
2110
2088
  "model_id", "backup_model_ids", "work_dir", "department")
2089
+ # [v1.15.17] 在修改 cfg 之前保存旧部门,修复部门同步 bug
2090
+ old_dept = cfg.get("department", "")
2111
2091
  # 更新允许的字段
2112
2092
  updated = False
2113
2093
  for k in allowed_fields:
@@ -2123,8 +2103,7 @@ class ApiServer:
2123
2103
  # 自动更新 updated_at
2124
2104
  cfg["updated_at"] = datetime.datetime.now().isoformat()
2125
2105
  (ad / "config.json").write_text(json.dumps(cfg, indent=2, ensure_ascii=False), encoding="utf-8")
2126
- # 部门变更时同步部门成员列表
2127
- old_dept = cfg.get("department", "")
2106
+ # 部门变更时同步部门成员列表(old_dept 已在 cfg 修改前保存)
2128
2107
  new_dept = data.get("department", old_dept)
2129
2108
  if old_dept != new_dept and (old_dept or new_dept):
2130
2109
  try:
@@ -2195,6 +2174,15 @@ class ApiServer:
2195
2174
  logger.info(f" 已清理 Agent '{path}' 的 {len(rows)} 个会话记忆")
2196
2175
  except Exception as e:
2197
2176
  logger.warning(f"清理会话记忆失败: {e}")
2177
+ # [v1.15.17] 从部门成员列表中移除已删除的 Agent
2178
+ dept = cfg.get("department", "") if cfg else ""
2179
+ if dept:
2180
+ try:
2181
+ dm = self._get_dept_manager()
2182
+ dm.assign_agent(dept, agents=[path], action="remove")
2183
+ logger.info(f"已从部门 '{dept}' 移除已删除的 Agent '{path}'")
2184
+ except Exception as e:
2185
+ logger.warning(f"从部门移除 Agent '{path}' 失败: {e}")
2198
2186
  shutil.rmtree(ad)
2199
2187
  logger.info(f"删除 Agent: {path}")
2200
2188
  return web.json_response({"ok": True})
@@ -4178,8 +4166,8 @@ class ApiServer:
4178
4166
  role="user",
4179
4167
  content=(
4180
4168
  f"[系统提示] 任务尚未完成,仍有 {pending_count} 个未执行步骤。"
4181
- "你必须继续执行操作:用 ```action``` 代码块输出操作指令。"
4182
- "不要只输出文字总结或反馈,必须输出具体的操作命令。"
4169
+ "你必须继续执行操作:通过 <output> XML 中的 <toolstocal> 输出工具调用指令。"
4170
+ "不要只输出文字总结或反馈,必须输出具体的工具调用命令。"
4183
4171
  ),
4184
4172
  )
4185
4173
  )