Files
Artemis-Eapil/docs/ai-automation.md
T

33 KiB
Raw Blame History

使用 AI 完成 Android 与电脑自动化

官方 skills/artemis-use/ 随源码和 wheel 分发,包含执行、探索、诊断复盘及插件开发规范、模板和校验脚本。启动脚本、直接 artemis ui / artemis-admin 启动服务、显式 artemis mcp --install codex 共用同步逻辑;MCP 桥连接/握手不安装、不启动主程序。

默认安装到 ~/.agents/skills/artemis-use;已有 ~/.codex/skills/artemis-use 时复用该目录,显式设置 CODEX_HOME 时使用 $CODEX_HOME/skills/artemis-use。官方同名目录直接覆盖,不保留用户定制、不弹冲突提示;其他 Skill 不受影响。复制和内容校验成功后替换目录,内容未变不重写;同步失败保留旧版并告警,网页仍启动。记录版本与来源,较旧 ARTEMIS 不覆盖已安装的较新版官方 Skill;默认路径中的重复 artemis-use 合并为一份。Skill 成功安装后备份并移除 Codex 全局 AGENTS 文件内带 ARTEMIS 标记的旧规则块,保留其他内容。

目前只支持 Codex。源码环境执行 uv run artemis mcp --install codex 可手动修复集成,--generate-config codex 查看配置模板。安装器保留 MCP 启用/禁用、工具 allowlist/denylist 和审批策略;配置变化后重载 MCP,Skill 未显示时重启 Codex。-SkipMcpSync 跳过该次启动的 MCP 和 Skill 同步;直接启动可设置 ARTEMIS_SKIP_CODEX_SYNC=1。

可以向 AI 这样下达任务:

使用 artemis-use。在我指定的模拟器上验证系统设置首页能打开,不修改设置,输出 Word 和 Excel 报告。

校验这份 Excel 的测试用例,指出所有错误;先不执行。

在 emulator-5554 执行已校验用例,失败继续,完成后交付批次报告 ZIP。

搜索昨天包含“登录”的失败任务,根据截图与步骤说明失败原因,不重跑。

把当前安卓屏幕保存成 PNG 到本次任务的 trace 目录,并再保存一份到电脑桌面,返回实际文件路径。

Flash 和 Pro 都支持任务内的安卓文件工具 android_file:保存原生截图、列目录、读写 UTF-8 文本、在手机与任务目录/桌面之间传输文件。默认保存位置为 traces/<trace_id>/artifacts/android/,指定桌面时保留 trace 副本;Windows 会识别重定向的真实桌面。文本上限 64 KiB,单文件传输上限 64 MiB,每次 ADB 操作最多 60 秒,取消或超时会回收子进程。默认不覆盖已有文件,也不绕过 Android 文件访问权限。保存和传输会校验实际内容,返回文件路径、大小与 SHA-256;用例是否通过仍需结合画面和预期判断。

新保存的截图及下载文件会进入单任务“全部资料”和批次 ZIP 的 任务文件/安卓/。原有自动步骤截图仍位于 traces/images/,按步骤截图下载;二者用途不同,历史截图不能作为当前画面的新截图。

文件操作结果会进入任务执行记录,Flash 中也逐项记录操作步骤及校验结果,供终检和报告引用;不会只留下模型自行撰写的“已完成”说明。

短时安卓控件与精确拖动

Flash 和普通 Pro 都支持任务内原生 action_sequence 与 drag,外层 MCP 工具不变。 这是通用的安卓短动作组合器,不限于时间轴。短时面板每次操作优先使用 [ensure_visible, click/drag]: AI 指定已观察到的面板内 target、入口 opener 资源 ID 和 target_description,工具现场判断是否已经显示; 需要时只点击入口一次,并在本机等目标出现(timeout_ms 默认 1500,上限 3000),再执行后续成员。 已显示时跳过打开,缺失、不唯一、层级不可用或超时则停止并保留回执,不重试已输入的动作。 它只准备界面,不用于业务提交;无原生 ID 时仍可组合已观察坐标的 click/wait/drag。 序列与校准拖动沿用小型动作的 16,384 字符参数流保护:异常膨胀时在执行前断流, 丢弃不完整参数,按已有的无效输出策略有限重试,不把截断内容派发到设备。 任务可以要求“先观察缩放弹层的真实滑块位置,恢复同布局后用一个连续动作打开、等待、拖动, 再检查刻度是否改变”。动作之间不再等待下一轮模型,适用于数秒后消失的控件。 序列使用 pro.execution.max_burst_actions 的数量限制(默认 4,等待也算一项), Flash/Pro 的工具声明显示实际上限。每次反向调整也保持完整的打开、等待、操作组。 序列内 click 的 target 可直接使用观察列表中的完整资源 ID;执行时重新定位,缺失或不唯一时拒绝点击, 避免模型反复将原图像素换算成归一化坐标。 click 的 times 支持 1–10 次连点,delay_ms 默认 100;连点仍占一个成员,按资源 ID 定位时每次都重新确认目标。 普通元素索引点击也核对原资源 ID 是否仍覆盖记录的点击位置,控件消失或移位时不点击旧坐标。 安卓现场检查只读取实时 UI 层级,不等待截图稳定;目标在连点途中消失时停止,并保留 completed_taps。 该计数仅表示已派发且返回无错误的点击次数,不代表业务验证通过。Flash 在连续动作末尾立即保留截图, 避免多轮稳定截图将短时面板消失后的画面覆盖为唯一证据;即时截图的稳定状态为未知,不能据此宣称画面已稳定。 普通 Pro 同样在完整连续组结束后保存截图,供立即进行的检查点验收使用;即使图片哈希与操作前相同, 也保留这次真实采集对应的动作后证据,不将图片去重当作没有采集。 元素列表中的真实 resource_id 可用于 click 的 unless_visible(面板已显示时跳过打开按钮,不能加在实际操作按钮上) 及 drag 的 require_visible(面板消失时不拖动),现场检查不增加模型轮次;层级不可用时拒绝操作。 成员回执区分完成、跳过、结果不明和未执行;部分失败后不能将已成功或结果不明的输入整组重发。 “最大/最小”优先通过原生加减按钮调整,并核对继续同向调整后滑块、刻度是否停止变化,或读取明确的原生极值。 仅接近端点、变成分钟级、关闭面板或选中录像卡片均不能证明已到最大或最小;录像卡片时间也不是固定指针对应时间。

时间轴可使用原图像素和当前两个刻度校准拖动,避免细刻度被整数归一化坐标量化。 它仍受截图分辨率、刻度线性、应用吸附及实际拖动响应影响;应先放大、短距离拖动, 再读取同名刻度或选中时间作修正。工具成功和计算误差不等于业务时间已准确选中。 若松手后时间轴继续滑动,应减慢 pan 并等待刻度停止后复核;拖动浮层的时间可能只反映松手瞬间, 与固定指针对应刻度冲突时不能用来验收。常驻时间轴的拖动不依赖缩放弹层保持打开。 量化验收可对停稳后截图的真实刻度与指针位置作线性插值,并计入读图不确定性; 目标误差加不确定性不超过用户容差时才能确认,不强制要求秒级文字读数。

MCP 能力

Android 原生控件读写、条件等待、限定容器滚动及同步多指缩放/旋转见 原生动作说明。Flash、普通 Pro 和探索共用实现;工具完成与 APP 结果、最终业务验收分别记录。

仅 PC 测试与网页“仅 PC”勾选项使用同一任务目标。先用 mobile_workspace(include_devices=false) 查看实际电脑插件,再提交 mobile_run_task(task_desc="在电脑浏览器检查指定页面", model="Flash", request_id="本次提交唯一编号", runtime_overrides={"execution_target":"computer"})。无需手机或模拟器在线;仍需可用模型和已启用并授权的电脑观察插件。model="Pro" 与 mobile_exploration 的 task_config.execution_target="computer" 同样适用。每项批量用例的 task_config 使用相同字段;插件参数见 插件任务参数。

工具 功能
mobile_diagnose 环境、凭据、设备诊断和自带修复
mobile_workspace 设备列表、统一队列、插件状态及按需连接诊断;include_development 返回插件开发环境
mobile_config 读取或明确保存非敏感模型、功能、报告默认设置
mobile_run_task 单任务执行(request_id 去重);model=flash/pro 表示执行模式
mobile_manage_task 单任务状态、提交反查、暂停/继续、指导和停止;删除预览及删除、代录用户人工复验
mobile_get_device_state 设备截图、界面层级
mobile_task_file XLSX 模板与导入校验
mobile_favorites 收藏独立任务/用例/批次模板、调整默认配置、按原配置复跑;run 使用稳定 request_id
mobile_batch JSON 用例建批次、开始、暂停、继续、复制失败项、删除非活跃批次
mobile_search_history 全库搜索、日期/状态/批次筛选和分页
mobile_inspect_trace 只读步骤、截图和执行证据
mobile_export_report Word、Excel、步骤截图、录屏片段、单任务资料及批次 ZIP,返回本地绝对路径
mobile_exploration 探索对话、指导、人工示范、暂停续跑、用例版本、Flash/Pro 复跑和批次草稿

全部 MCP 工具连接用户手动启动的 ARTEMIS 网页主程序,共用配置、队列、历史、设备连接和报告。MCP 只运行轻量 stdio 连接进程,不启动后台、不独立执行任务,ARTEMIS_STANDALONE 不改变这一规则。主程序离线时 MCP 仍可握手并列出工具,调用时提示启动;启动网页后下一次调用会自动连接。调用断线不自动重放,避免重复提交。

使用前先运行 start.bat / start-cn.bat 或 uv run artemis ui。默认自动发现同一安装目录的唯一主程序(包括非默认端口);有多个数据空间时,在 MCP 环境变量中设置 ARTEMIS_DAEMON_PORT 选择。显式 ARTEMIS_APP_DIR / ARTEMIS_TRACES_DIR 必须匹配。升级后重启网页并重载旧 MCP,已运行的旧进程不会自动替换。标准 Codex 配置使用 required = false,避免 ARTEMIS 异常阻断整个 AI 会话,更新保留用户的禁用状态。

Windows 启动入口 start.bat / start-cn.bat 只检查并提示源码更新,-SkipUpdate 跳过提示。独立升级入口为 update.bat / update-cn.bat:先把升级程序复制到项目外的临时目录,检查本地修改,再终止本项目的 ARTEMIS 服务、MCP 和任务进程;之后仅做 Git 快进更新,并用新版启动程序准备环境,完成后由用户重新启动。其他项目、Codex、模拟器和共享 ADB 不受影响;运行中的任务会被中断,不会作为成功任务处理。1.1.1 及更新版本的发布 ZIP 含 Git 工作树,旧版无 .git 的 ZIP 需改用新版包或 Git 克隆。没有 Git、网络/认证失败、有本地修改或分支分叉时升级失败并保留现有源码,不重置或覆盖。

Python 按 uv.lock 同步缺失/变化的依赖;前端依据源码、资源及包锁指纹决定是否执行 npm ci 和构建,成功后才记录指纹。未运行过启动脚本的 Git 源码目录也可直接升级:先自动准备最小 Python 环境,快进源码后再安装新版依赖。国内升级入口继续使用镜像配置。升级与启动的环境准备互斥;升级失败不会自动启动服务或回滚用户配置,处理错误后可重试。双击升级失败时会保留原因并等待回车;自动化调用可设置 ARTEMIS_NO_PAUSE=1,输入重定向时也不会等待。

scrcpy 固定版本的国内下载采用多个来源,失败或 SHA256 不符时自动尝试下一来源,全部失败会显示 HTTP 状态、超时或校验原因。config/downloads.json 的 overrides.scrcpy_url 指定首选 HTTPS 地址,overrides.scrcpy_fallback_urls 指定备用地址数组;null 使用默认备用源,[] 禁用备用源。国内模式不自动回退到 GitHub 直连。

MCP 同步仅检查 $CODEX_HOME/config.toml;未设置或为空时使用当前用户的 ~/.codex/config.toml。日志会显示实际路径,以及新装、更新、已是最新、未检测到或自定义跳过的结果。检测到目录但缺少 ARTEMIS 条目时安装当前源码的标准配置;已有标准配置即使指向旧解压目录,也会更新解释器、项目目录和环境路径,保留已有工具白名单。保留用户额外环境变量、禁用状态、tools 下的工具审批策略及其他服务;不会重建权限表、添加 eager 或删除旧工具策略。自定义启动包装器保持原样并提示。其他客户端的配置和规则文件不读取、不修改,其格式错误不会阻止启动。Codex 原配置无法解析,或同步程序生成的更新未通过校验时,均告警且不覆盖原文件,继续启动网页;日志会区分这两种原因,不把同步生成错误归因于用户配置。遇到后者请更新 ARTEMIS,不要删除有效的 config.toml;可使用 -SkipMcpSync 临时仅启动网页。首次修改保留备份。同步后需在 Codex 中重新加载 MCP 或重启 Codex,脚本无法替宿主重启已加载的 MCP 进程。

创建批次时必须提供唯一 request_id;请求超时后可以按编号查询或用相同内容重发,避免重复用例。创建只保存草稿,start 才执行。AI 无需先制造 Excel,也可直接提交 JSON;字段与示例见 Skill 批量任务参考。

报告按任务或批次归档到 artifacts/mcp_exports/,包含本地路径及服务下载链接;删除批次时会清理对应导出副本。运行中导出是快照;执行完成不等于验证通过,报告会保留未验证、失败、跳过与中断状态。

新安装模型默认使用 gpt-6-luna,预设 gpt-6-luna、gpt-6.1-terra、gpt-6.1-sol、gpt-6-astra、mimo-v2.6-pro;首页、兜底模型与精选任务使用统一选择控件,也支持自定义模型名称。已保存的模型配置保留。思考强度最高支持 max,默认 high,选“由模型默认”不发送该参数;接口不支持时明确报错。单次请求 300 秒,首次失败后最多再试 5 次,普通错误每次等待 10 秒,429 每次等待 60 秒,SDK 不叠加重试。首选模型连续 3 次没有有效工具调用时,当前步骤改用 gpt-6-luna(high),最多再试 3 次;下一步重新使用首选模型。兜底模型及次数可通过 .env.example 中的 OPENAI_TOOL_FALLBACK_* 和 ARTEMIS_TOOL_FALLBACK_MAX_NO_PROGRESS_ATTEMPTS 配置。请求耗尽后沿用任务暂停/恢复机制,鉴权或非法参数立即失败。视频分析与录屏是独立开关,默认均关闭。每项批量用例可覆盖模式、模型、设备、录屏和超时等配置,不影响其他任务。暂停先返回 pausing,确认状态为 task_paused 才表示设备已释放;Pro 等待模型回复或只读诊断时可及时中断,恢复后重新观察设备。AI 可用 mobile_manage_task(action="inject_instruction") 提交指导并恢复;指导由执行器在安全检查点领取,可能中断当前模型等待并重新观察设备;接收回执不保证任务结束前已消费,已经开始的设备动作会安全结束。用 guidance_history 核对指导是否被领取、在任务流程中核对实际执行情况,或用 resume 单独恢复。

429 等待、兜底模型及次数也可在网页“模型配置 → 稳定性与兜底模型”或通过已授权的 mobile_config(section="model") 配置。批次 ZIP 还收录每项任务已保存的步骤截图和录屏。

批次任务在队列中使用“用例编号 + 用例名称”显示,提示词仍是模型实际收到的内容。任务历史展示失败原因、完成时间和总耗时;导出全部资料时以用例编号命名目录。删除非活跃批次会同步清理其任务记录、步骤、截图、录屏及生成的报告,删除后不能通过旧 request_id 重复执行。

保存全局配置要求用户明确指令;只读配置不包含密钥,MCP 不接收密钥。密钥仍在网页或 .env 中填写。设置对新任务生效,模型请求重试不会触发测试用例自动重跑。历史步骤证据保留,设备动作回放已移除。

执行保护默认总时限 1800 秒,单任务、批次和 MCP 都适用,排队及用户暂停不计时。设备观测默认 60 秒、最多 3 次,ADB 命令默认 10 秒;观测失败不会继续向模型发送占位图或旧元素索引。Flash 连续 3 次动作失败先重新观察再切换兜底,兜底仍失败则结束任务并保存原因。不能以提高步数或反复重提任务代替设备诊断。

UIAutomator2 启动失败时,先释放本次连接启动的服务,再按现有策略重试;最终错误保留设备编号、尝试次数和底层原因。初始化失败且没有操作步骤时,用例目标属于未执行、未验证,应先检查设备诊断和启动日志,不能据此认定被测功能失败。

Android 应用启动通过系统包管理器查找当前用户的桌面入口,再调用 am start -W,不依赖模拟器是否内置 monkey。检查命令退出码、错误输出和实际前台状态;应用未安装、没有桌面入口或权限拒绝等明确错误直接返回原因,不重复等待启动超时。ADB 通信异常沿用最多 3 次启动尝试;启动回执超时时先确认应用是否已进入前台,避免重复启动已成功打开的应用。

Flash 和 Pro 默认复用只读 Checker,以任务提示词和用户指导中的要求核对执行结论、步骤截图及探测证据,无需另填预期结果。test_result 包含 status(passed、failed、inconclusive、blocked)、中文 reason 和 evidence;任务列表、报告与 MCP 使用同一结论。completed 仍只代表执行结束,可同时存在测试不通过。Flash 只在退出时验收,不添加计划或中途检查;沿用 Checker 的超时和开关,关闭、超时或缺少证据时显示未验证,不重跑用例。

mobile_run_task(runtime_overrides={"timeout_seconds":1800,"observation_timeout_seconds":60,"observation_max_attempts":3,"device_command_timeout_seconds":10,"action_failure_attempts":3}) 可为单任务覆盖执行保护;其中 model 是 API 模型名,外层 model 仍是 Flash/Pro 模式。相同字段也支持批次的 task_config。全局默认通过网页功能配置或明确授权的 mobile_config(section="capabilities", changes={"task_timeout_seconds":1800}, persist_defaults=true) 保存,对后续任务生效,不接受密钥。

Flash 最终 AI 判定与分析默认关闭。读取 mobile_config(section="capabilities") 的 flash_final_check_enabled;用户要求保存全局设置时,可用 changes={"flash_final_check_enabled":true} 和 persist_defaults=true 开启。它影响尚未开始的所有 Flash 任务,运行中的任务、Pro 和主动探索不变;不作为单任务或精选模板的覆盖项。关闭时 test_result.status="inconclusive"、verification_skipped=true、source="system",表示未做 AI 判定,不是测试通过;执行异常仍按原失败状态记录。人工复验可随后给出独立结论。

任务已经产生最终结果,但 SDK 线程或资源清理仍卡住时,默认最多再等待 30 秒后回收工作进程,避免继续占用队列。全局可用 ARTEMIS_WORKER_CLEANUP_TIMEOUT_SECONDS 或功能配置的 worker_cleanup_timeout_seconds 调整,任务 JSON 同名字段可覆盖。原有结果与截图保留,未完成保存的录屏尽力恢复。

MCP 工具和单任务 HTTP 提交均拒绝未知顶层字段,在执行前返回错误。mobile_run_task 使用 task_desc,HTTP /api/run 使用 goal;两者不能混用来静默替换任务。结构化 JSON 工具结果同步保留 structuredContent 和原文本内容。view_summary 的文本保持 Markdown,结构化结果提供 summary 与 steps={items,total,offset,limit,next_offset};按 next_offset 翻页,值为 null 才表示没有下一页,items 保留存储中的 step_id/step_number。

跨端阶段工具 update_task_progress 首次使用完整 stages;之后可提供 stage_updates=[{id,status,evidence?}] 和 reason。补丁只更新已存在的阶段,保留其顺序、范围、资源与未提及阶段;完整阶段和补丁只能选择一种。完成或阻塞仍需事实依据,校验或保存失败时不更新进度。来源清单与阶段完成都不能替代正式验收。

报告和证据索引的 evidence_sources 从已记录的插件来源汇总,区分安卓/电脑界面与接口、终端、文件等辅助来源,并保留实际步骤和调用编号。缺失来源显示未知,不按业务后台名称或网址推断执行平台;界面截图不能单独证明后端持久状态。该清单不改变 test_result、AI 原判或人工复验。

插件证据与留档参数

2.0.0 插件协议与可运行示例见 开发规则。单任务和批次全部资料包含各来源截图/录像、插件附件及包内证据索引。

Flash、Pro 与探索沿用现有执行上下文跟踪用户明确要求的前置条件、检查项和交付物,跨端及收尾时只补缺失证据。电脑操作或留存截图前核对窗口与页面身份;坐标以同一张最新插件截图及其编号为准,不使用手机归一化坐标或自行叠加 DPI。视觉与历史摘要保留来源、关键原文和待核实项,模糊文字或冲突读数不能直接成为已验证事实;需要时回查原图/控件树。本规则不新增规划、验收或摘要模型调用,不改变现有思考强度和输出预算。

通过 mobile_config(section="capabilities") 可读取 recording 参数;用户授权后可保存全局默认。单任务用 runtime_overrides={"recording":{"codec":"h264","computer_scope":"window","max_long_edge":1280,"fps":15}},批次在 task_config.recording 提供同样对象。JSON 配置的 agent.recording 覆盖环境默认;不要把录像参数当作模型截图参数。录屏开关继续独立且默认关闭。

运行信息的上下文参照上限固定为 300,000 tokens,前后端使用相同口径。历史压缩预算默认 80,000,JSON 的 agent.memory.transcript.context_budget_tokens 可调但不能超过 300,000;这是压缩触发预算,不是单次生成的输出 token 数,也不是整项任务累计 token 的限额。

多轮上下文与缓存诊断

Flash、Pro(启用 transcript)和探索共用分阶段上下文。一个阶段内只追加新观察、工具结果和用户指导,保留此前发送的截图、元素列表和消息原文。行动只能使用同一来源的最新观察,旧画面不能证明当前状态。检查器和摘要模型保持独立职责,不混入执行模型的对话。

默认压缩预算为 80,000 tokens:估算占用达到 28,000 后开始后台准备摘要,56,000 后等待本批摘要齐备再一次性替换历史、清理旧观察,开始下一阶段;72,000 时可紧急折叠为带步骤索引的历史。摘要失败时原文保留至硬阈值,原始证据仍可经历史工具读取。触发估算包含本轮新消息和截图,不只看上一轮用量;没有上游 usage 时使用本地保守估算。该预算不是任务累计限额,也不改变 300k 上下文参照上限。

任务 trace 的 llm_diagnostic / llm_request 在原有 usage、耗时和 prompt_cache_key 外增加 prefix_cache:

  • append_only、shared_prefix_messages:相对同任务、角色和端点上次调用,输入是否仅追加、共享多少完整消息。
  • first_changed_message:首个变化消息的位置(从 1 开始);tools_or_format_changed 表示工具或格式参数发生变化。
  • context_phase、last_compaction:上下文阶段与上次压缩前后的估算 token 数。
  • cold_start:该角色/端点在当前进程内没有比较基准;重启后首次请求会重新建立基准。

以上为适配后消息的本地指纹比较,不是网关最终序列化后的 token 前缀,也不是命中率。诊断仅持有哈希,不额外保存提示词、图片正文或凭据。实际缓存率按上游返回的 cached_tokens / input_tokens 加权统计,usage 缺失不能当作零命中。首次请求、阶段压缩、模型/工具切换可能降低缓存率;网关的路由、缓存保留时间和实现也会影响结果。该实现使用完整多轮消息,不依赖网关支持 previous_response_id,也不承诺固定命中率。

执行模型、视觉摘要和历史摘要的 Responses 请求均按“探索会话(普通任务用任务 ID)+角色+模型”生成稳定的匿名 prompt_cache_key,并在 Thread-Id、Session-Id 请求头中发送相同值。标识符合 ^[-0-9A-Za-z._:]{1,128}$;暂停继续时保持稳定,不同任务或角色隔离。网关可从头部或 JSON 字段提取路由键,不依赖特定 User-Agent,也不会伪装为 Codex。标识在每次调用时设置,不写入共享 HTTP 客户端,避免并发任务互相覆盖。显式传入的缓存键及会话请求头优先。仅指定会话请求头时,正文中缺省的缓存键依次沿用有效的 thread-id、thread_id、session-id 或 session_id(头名称不区分大小写);补齐缺少的另一种会话头,但不添加同义别名。调用方同时显式指定不同的键时保留原值,应自行保证一致。

网关亲和规则

网关透传 Thread-Id / Thread_id、Session-Id / Session_id,并从这些请求头或 JSON 的 prompt_cache_key 提取亲和键,即可覆盖 ARTEMIS 默认请求。默认这三个值相同,无需重复添加下划线头或 X-Codex-Window-Id。pass_headers 只负责透传,选中渠道和模型前缀缓存是否命中仍取决于服务端实现;不能仅凭头部存在宣称命中。

X-Client-Request-Id 是每次尝试独立的诊断编号,可继续透传,但不要加入缓存亲和键来源。User-Agent、Originator 和 Codex 专用头也不应替代 ARTEMIS 的会话键。保留其他客户端需要的透传项即可;本版不修改生产网关规则。

执行模式弹窗显示本任务所有已记录模型调用的缓存 Token 和加权命中率:累计 cached_tokens ÷ 累计 prompt_tokens。缓存输入已包含在输入总量中,不能再相加;不平均每次调用的百分比,也不把命中请求数当成 token 命中率。打开弹窗后运行中每 3 秒更新,历史任务读取已保存统计;没有有效输入用量时显示 —,请求失败有明确提示。统计以服务端上报为准,未上报的缓存量按 0 汇总,旧任务漏记的数据不会回填。

模型缓存还要求可复用的上下文前缀,路由稳定不能保证命中或节费。参考 OpenAI 官方缓存说明。

有请求诊断的调用同时发送 X-Client-Request-Id,默认与 trace 内的 request_id 一致,便于对照 API 日志。request_sent_at 表示实际发送时间;routing_header_fingerprints 只记录发送的会话头的哈希,client_request_id_matches 表示关联 ID 是否一致。不记录认证头或其他请求头正文。稳定标识提供路由亲和条件,实际命中仍取决于前缀和上游缓存。

辅助摘要继续独立处理各自片段,避免为了提高命中比例累积不相关的历史。视觉摘要中完全重复的插件执行结果与控件树只发送一份;独立错误、状态、不同观察及原始 trace 均保留。

Responses WebSocket 增量传输

网页“模型配置 → 传输协议”选择 WebSocket(增量传输),或在 .env 设置 OPENAI_TRANSPORT=websocket。网页保存对新任务生效;直接编辑 .env 后重启相应服务。默认 http,旧配置不变。JSON 模型/节点配置可用 transport 单独覆盖;MCP 使用 mobile_config(section="model", changes={"transport":"websocket"}, persist_defaults=true) 保存,仍须用户明确要求修改默认值。

异步任务请求在现有 SDK 序列化与完整性保护之下接入 /v1/responses WebSocket。首轮发送完整上下文;同一任务(或探索)、角色、模型、路由头及凭据范围内复用连接。只在当前输入严格包含上一轮输入和完整输出、生成选项一致时,发送 previous_response_id 与新增输入。仅忽略消息 ID、状态、输出概率等不影响历史语义的响应字段,不按文本相似度截取。工具结果保留 call_id,文本、图片、结构化输出与 usage 继续走原有解析和安全检查。同步底层模型调用仍使用 HTTP;Flash、Pro、探索和辅助模型运行路径均为异步。

本地历史、截图替换或压缩后重新发送当前完整上下文;不会为了续传保留已经移除的旧界面索引。连接重建或服务端明确返回 previous_response_not_found 时,从本地完整历史恢复,后者最多补发一次且必须尚未出现输出。连接在输出中途断开时,不在传输层盲目重发,交给现有模型重试预算;取消关闭未完成连接,不采纳半截工具参数或结论。不同会话并行、同一连接串行;连接池最多保留 32 个会话,空闲 60 秒释放,连接满 55 分钟主动重建。store=false 保持不变。

网关必须支持 WebSocket Upgrade、双向长连接、response.create 与响应 ID 续接;只透传会话头不能证明支持。握手传递现有授权和路由头,保持 TLS/自定义 CA 验证与 OPENAI_USE_SYSTEM_PROXY 策略,拒绝携带凭据跨地址重定向。不支持升级时明确报错,可在网页改回 HTTP,不会静默改成 HTTP 全量请求。

请求诊断的 transport 记录 full_request_bytes、sent_payload_bytes、received_payload_bytes、payload_bytes_saved、incremental、reused_input_items、connection_reused、create_events 和重建原因。字节数衡量 JSON 应用载荷,不包含 TLS/WebSocket 帧和压缩开销;SDK 内部兼容 SSE 的字节不冒充网络流量或 HTTP 200。握手上的请求标识属于建连尝试,后续轮次以本地请求诊断及响应 ID 关联。减少上传不等于减少模型上下文 token,也不等于缓存命中,usage 仍以服务端实报为准。协议见 OpenAI 官方说明。

指定任务诊断、复盘与管理

流式请求中的 click、long_press、swipe、press_key、manage_app、wait_for_delay 每次调用参数超过 16,384 字符时,会立即关闭该请求并丢弃未完成输出,避免持续生成异常参数直到超时。该保护只针对小型设备动作,不限制输入文本、笔记、报告或插件参数,也不改变模型思考强度与输出 token 配置。异常最多额外尝试一次(配置为不重试时不重试);仍异常时进入现有备用模型或暂停恢复流程。诊断记录保留 invalid_output 分类及 stream_guard 中的工具名、实际字符数和保护上限,不保存参数正文;无法据此断定异常来自模型生成还是 API 中转。

mobile_inspect_trace 增加 view_report、view_usage、view_requests、view_logs、view_evidence。这些动作复用 HTTP /api/sessions/{id}/inspection,不生成下载文件、不执行设备动作;offset/limit 控制分页。日志只读取有限尾部并脱敏,正文超限明确 text_truncated。用量展示缓存输入/总输入、角色及已记录的模型分组;未记录模型显示 unknown。

mobile_run_task(request_id=...) 在既有自动化存储中登记提交回执。同一个 ID/相同内容只派发一次;内容不同拒绝。连接断开先用 mobile_manage_task(action="lookup", request_id=...) 找 trace_id,查实际状态,未知结果不自动重跑。普通状态与报告统一读取人工复验结果,保留 AI 原判。

mobile_manage_task(deletion_preview/delete) 可预览和删除非活动任务;探索也有对应动作,并保留独立复跑。delete 需要 user_confirmed=true,表明用户明确要求删除,不强制重复确认。review 只代录用户明确给出的 review_status=passed/failed 和 review_reason,需 user_confirmed=true;Agent 自己的推断不能标成人工结论。

插件开发

使用官方 Skill 的 插件开发参考,从自带模板开始。通过 mobile_workspace(include_devices=false, include_development=true) 找到当前服务的 Python;在任意目录均可调用 Skill 自带校验脚本。静态检查、MCP 握手与真实操作验收分别报告。市场发布需用户明确要求,验证未覆盖场景必须注明。