diff --git a/Dockerfile b/Dockerfile index 68c77b7..19578e0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -48,7 +48,7 @@ ENV HOME=/home/user # 安装插件 RUN openclaw plugins install @openclaw-china/channels@latest -RUN openclaw plugins install @openclaw/acpx +RUN #openclaw plugins install @openclaw/acpx RUN #npx -y @tencent-weixin/openclaw-weixin-cli@latest install # 把插件数据备份到不会被挂载覆盖的目录 diff --git a/app/api/routes_chat.py b/app/api/routes_chat.py index bd75ade..2978edb 100644 --- a/app/api/routes_chat.py +++ b/app/api/routes_chat.py @@ -827,41 +827,41 @@ async def _run_openclaw_cmd(): prefix_parts: list[str] = [] - prefix_parts.append( - "### ACPX MANDATORY(编程任务必须执行;否则视为回答失败)\n\n" - "判定为“编程任务”的条件(命中任一即是):\n" - "- 需要:修改/新增/删除代码或文件、生成补丁(diff)、修复报错、运行测试/命令、排查日志、提交 commit/PR、对某个仓库/目录进行操作\n" - "- 或用户消息中出现:fix/bug/implement/add/refactor/test/build/run/compile/commit/PR/diff/文件/路径/报错/日志 等关键词\n\n" - "总规则:\n" - "1) 只要是编程任务,你【必须】通过 ACPX 调用 Claude Code 完成工作;你自己【禁止】直接给出最终代码实现/补丁/测试结论(除非这些内容来自 Claude Code 的输出并被你转述)。\n" - "2) 开始前你【必须】先读取并遵循工作区内文档:AGENTS.md(ACP/ACPX 说明)与 CLAUDE.md(开发习惯/约束)。\n" - "3) 你必须优先使用“持久会话”,会话名固定为:\n" - " acpx-claude-{openclaw_session_id}\n" - "4) 超时(必须遵守):\n" - " - 默认超时:600 秒(10 分钟)\n" - " - 复杂任务:1200 秒(20 分钟)或更长\n" - " - 调用 acpx 时必须显式设置超时参数(按 AGENTS.md / ACPX CLI 支持的方式传入),禁止省略\n" - "5) 工作目录(--cwd)规则:\n" - " - 若用户在自然语言里明确给出目录路径:必须将该路径原样用于 --cwd(禁止自作主张改路径)\n" - " - 否则:使用“当前工作目录”(本 prefix 会提供 workspace_path)作为 --cwd\n\n" - "固定执行流程(必须按顺序):\n" - "A. 会话探测:\n" - " acpx claude sessions show acpx-claude-{openclaw_session_id}\n" - "B. 若不存在/失败,则创建会话(只需一次):\n" - " acpx claude sessions new --name acpx-claude-{openclaw_session_id}\n" - "C. 使用持久会话执行任务(必须带上 --cwd):\n" - " acpx claude -s acpx-claude-{openclaw_session_id} --cwd \"<完整任务描述(包含约束/验收标准/相关文件信息)>\"\n\n" - "输出与可验证锚点(Claude Code 必须在最终输出中包含):\n" - "- 修改了哪些文件(路径列表)\n" - "- 每个文件的变更摘要(或 diff/补丁片段)\n" - "- 运行了哪些命令/测试,以及结果(失败则给出关键错误信息)\n\n" - "失败即停(强制):\n" - "- 若任何 acpx 命令返回非 0 或超时:你只能输出\n" - " (1) “❌ ACPX 调用失败” + 关键 stderr/exit_code(去除无关噪声)\n" - " (2) 下一步建议(例如检查 acpx 是否可用、会话名、--cwd 路径是否存在)\n" - " 然后停止;禁止继续“假装完成”或直接生成实现代码。\n\n" - "非编程问题(概念解释/问答)才允许你直接回答;一旦问题转为编程任务,立刻切换到以上 ACPX 流程。" - ) + # prefix_parts.append( + # "### ACPX MANDATORY(编程任务必须执行;否则视为回答失败)\n\n" + # "判定为“编程任务”的条件(命中任一即是):\n" + # "- 需要:修改/新增/删除代码或文件、生成补丁(diff)、修复报错、运行测试/命令、排查日志、提交 commit/PR、对某个仓库/目录进行操作\n" + # "- 或用户消息中出现:fix/bug/implement/add/refactor/test/build/run/compile/commit/PR/diff/文件/路径/报错/日志 等关键词\n\n" + # "总规则:\n" + # "1) 只要是编程任务,你【必须】通过 ACPX 调用 Claude Code 完成工作;你自己【禁止】直接给出最终代码实现/补丁/测试结论(除非这些内容来自 Claude Code 的输出并被你转述)。\n" + # "2) 开始前你【必须】先读取并遵循工作区内文档:AGENTS.md(ACP/ACPX 说明)与 CLAUDE.md(开发习惯/约束)。\n" + # "3) 你必须优先使用“持久会话”,会话名固定为:\n" + # " acpx-claude-{openclaw_session_id}\n" + # "4) 超时(必须遵守):\n" + # " - 默认超时:600 秒(10 分钟)\n" + # " - 复杂任务:1200 秒(20 分钟)或更长\n" + # " - 调用 acpx 时必须显式设置超时参数(按 AGENTS.md / ACPX CLI 支持的方式传入),禁止省略\n" + # "5) 工作目录(--cwd)规则:\n" + # " - 若用户在自然语言里明确给出目录路径:必须将该路径原样用于 --cwd(禁止自作主张改路径)\n" + # " - 否则:使用“当前工作目录”(本 prefix 会提供 workspace_path)作为 --cwd\n\n" + # "固定执行流程(必须按顺序):\n" + # "A. 会话探测:\n" + # " acpx claude sessions show acpx-claude-{openclaw_session_id}\n" + # "B. 若不存在/失败,则创建会话(只需一次):\n" + # " acpx claude sessions new --name acpx-claude-{openclaw_session_id}\n" + # "C. 使用持久会话执行任务(必须带上 --cwd):\n" + # " acpx claude -s acpx-claude-{openclaw_session_id} --cwd \"<完整任务描述(包含约束/验收标准/相关文件信息)>\"\n\n" + # "输出与可验证锚点(Claude Code 必须在最终输出中包含):\n" + # "- 修改了哪些文件(路径列表)\n" + # "- 每个文件的变更摘要(或 diff/补丁片段)\n" + # "- 运行了哪些命令/测试,以及结果(失败则给出关键错误信息)\n\n" + # "失败即停(强制):\n" + # "- 若任何 acpx 命令返回非 0 或超时:你只能输出\n" + # " (1) “❌ ACPX 调用失败” + 关键 stderr/exit_code(去除无关噪声)\n" + # " (2) 下一步建议(例如检查 acpx 是否可用、会话名、--cwd 路径是否存在)\n" + # " 然后停止;禁止继续“假装完成”或直接生成实现代码。\n\n" + # "非编程问题(概念解释/问答)才允许你直接回答;一旦问题转为编程任务,立刻切换到以上 ACPX 流程。" + # ) if force_skill_lines: prefix_parts.append( @@ -879,12 +879,12 @@ async def _run_openclaw_cmd(): prefix_parts.append(f"附件目录:{workspace_path}/.302ai/attachments") prefix_parts.append( f"如果是编程相关任务,请先阅读 {workspace_path}/CLAUDE.md(里面有我使用claude code开发习惯") - prefix_parts.append( - f"实现代码需要通过ACPX调用claude code, 具体见工作区里的AGENTS.md里ACP相关的信息") - prefix_parts.append( - f"如果是编程相关任务,阅读 acpx skill 参考文档,了解所有命令、标志和工作流模式:/home/user/.claude/skills/acpx/SKILL.md") - prefix_parts.append( - f"如果是编程相关任务,需要完整的 CLI 参考及所有选项和示例:/home/user/acpx/docs/CLI.md") + # prefix_parts.append( + # f"实现代码需要通过ACPX调用claude code, 具体见工作区里的AGENTS.md里ACP相关的信息") + # prefix_parts.append( + # f"如果是编程相关任务,阅读 acpx skill 参考文档,了解所有命令、标志和工作流模式:/home/user/.claude/skills/acpx/SKILL.md") + # prefix_parts.append( + # f"如果是编程相关任务,需要完整的 CLI 参考及所有选项和示例:/home/user/acpx/docs/CLI.md") prefix = "\n\n".join(prefix_parts) + "\n\n" diff --git a/app/core/ai302/deploy_ops.py b/app/core/ai302/deploy_ops.py index 3aaf958..f5340a9 100644 --- a/app/core/ai302/deploy_ops.py +++ b/app/core/ai302/deploy_ops.py @@ -3,6 +3,7 @@ import aiohttp +from app.core.config import settings from app.core.http_client import fetch_json_with_retry @@ -37,7 +38,7 @@ async def create_302ai_deploy_task( response = await fetch_json_with_retry( 'POST', - "https://api.302.ai/302/webserve/project", + f"{settings.ANTHROPIC_BASE_URL}/302/webserve/project", session=session, data=form_data, headers=headers @@ -48,5 +49,5 @@ async def create_302ai_deploy_task( async def get_302ai_deploy_task_info(deploy_project_id, headers: dict | None = None): return await fetch_json_with_retry("GET", - f"https://api.302.ai/302/webserve/project?project_id={deploy_project_id}", + f"{settings.ANTHROPIC_BASE_URL}/302/webserve/project?project_id={deploy_project_id}", headers=headers) \ No newline at end of file diff --git a/app/core/oc_ops.py b/app/core/oc_ops.py index a1510cc..44e1685 100644 --- a/app/core/oc_ops.py +++ b/app/core/oc_ops.py @@ -920,83 +920,6 @@ async def add_my_oc_system_prompt_to_agent_md( --- -### ACPX + Claude Code 工作流 - -**触发条件**: OpenClaw 收到编程相关任务时 - -**执行方式**: 通过 `acpx` CLI 调用 Claude Code,而非原生 subagent 或 PTY - -#### 会话命名规则 -``` -acpx-claude-{openclaw_session_id} -``` - -#### 超时设置 -- 默认超时: 600秒 (10分钟) -- 复杂任务: 1200秒 (20分钟) 或更长 - -#### 输出过滤(只显示给用户的内容) -需要过滤的元信息前缀: - -| 前缀 | 含义 | 处理方式 | -|------|------|----------| -| `[client] initialize` | 客户端初始化 | 隐藏 | -| `[tool] ...` | 工具调用日志 | 隐藏 | -| `[thinking] ...` | 思考过程 | 隐藏 | -| `[done] end_turn` | 回复完成 | 隐藏 | - -#### 错误处理模板 -```bash -${ACPX_CMD} claude exec "任务描述" || echo "❌ 任务执行失败" -``` - -#### 会话管理(推荐:优先使用持久会话) - -**首次创建会话**(每个项目/任务只做一次): -```bash -acpx claude sessions new --name acpx-claude-{session_id} -``` - -**后续使用持久会话**(保留上下文): -```bash -acpx claude -s acpx-claude-{session_id} "任务描述" -``` - -**查看会话状态**: -```bash -acpx claude sessions show acpx-claude-{session_id} -``` - -**关闭会话**: -```bash -acpx claude sessions close acpx-claude-{session_id} -``` - -#### 一次性执行(仅用于简单、无需上下文的任务) -```bash -acpx claude exec "任务描述" -``` - -#### 工作目录处理(--cwd) - -acpx 支持 `--cwd` 参数指定工作目录。 - -**⚠️ 重要规则**:如果用户在自然语言任务描述中**明确提及了工作区路径**,必须: -1. 将该路径通过 `--cwd` 参数原样传入 -2. **严格使用用户提及的原路径**,禁止传入自以为"正确"的路径 -3. 路径优先级:用户明确指定的路径 > 当前 OpenClaw 工作区 - -**示例**: -```bash -# 用户说:"在 /home/user/projects/myapp 目录下修复 bug" -# ✅ 正确做法: -acpx claude -s acpx-claude-{session_id} --cwd /home/user/projects/myapp "修复 bug" - -# ❌ 错误做法(禁止这样做): -# acpx claude -s acpx-claude-{session_id} --cwd /home/user/.openclaw/workspace "修复 bug" -``` -``` - --- ## 💓 Heartbeats - Be Proactive!