API 参考
本页汇总通用 Agent API,以及各平台专属的构造函数、选项、操作和辅助方法。
本页记录 API 契约。安装、端到端工作流和故障排查请参考对应指南。平台 Agent 默认继承共享 Agent API;平台章节只记录对应环境的构造方式、选项、能力差异和工具。
本页保留少量完整示例,帮助理解相关 API 如何组合使用。更完整的接入流程和最佳实践请参考各章节末尾的指南链接。
共享 Agent API
Agent 选项与配置
Midscene 针对每个不同环境都有对应 的 Agent。每个 Agent 的构造函数都接受一组共享的配置项(设备、报告、缓存、AI 配置、钩子等),然后再叠加平台专属的配置,比如浏览器里的导航控制或 Android 的 ADB 配置。
你可以通过下面的链接查看各 Agent 的导入路径和平台专属参数:
- 在 Puppeteer 中,使用 PuppeteerAgent
- 在 Playwright 中,使用 PlaywrightAgent
- 在桥接模式(Bridge mode)中,使用 AgentOverChromeBridge
- 在 Android 中,使用 Android API 参考
- 在 iOS 中,使用 iOS API 参考
- 如果你要把 GUI Agent 集成到自己的界面,请参考 自定义界面 Agent
参数
这些 Agent 有一些相同的构造参数:
generateReport: boolean: 如果为 true,则生成报告文件。默认值为 true。persistExecutionDump: boolean: 如果为 true,Midscene 还会在报告旁边额外写出每次执行对应的 JSON dump 文件。默认值为 false。这个选项要求generateReport保持为true。reportFileName: string: 报告输出名称,默认值由 midscene 内部生成。它在不同outputFormat下含义不同:single-html(默认):按文件名处理。Midscene 会在midscene_run/report/下写入<reportFileName>.html(如果已带.html后缀则保持不变)。html-and-external-assets:按目录名处理。Midscene 会在midscene_run/report/<reportFileName>/下写入index.html与相关静态资源。
autoPrintReportMsg: boolean: 如果为 true,则打印报告消息。默认值为 true。cache?: false | { id: string; strategy?: 'read-only' | 'read-write' | 'write-only'; cacheDir?: string }:false:完全禁用缓存。id:必填的缓存 ID。strategy:可选缓存策略。默认值为'read-write'。cacheDir:可选缓存目录路径。配置后,缓存文件会写入该目录,而不是<MIDSCENE_RUN_DIR>/cache。相对路径会基于当前工作目录解析,而不是基于MIDSCENE_RUN_DIR。这样可以把缓存、日志和报告目录拆开。
cacheId: string | undefined(已废弃):仅用于向后兼容。推荐使用cache.id。aiActContext: string: 调用agent.aiAct()时,发送给 AI 模型的背景知识,比如 "有 cookie 对话框时先关闭它",默认值为空。此前名为aiActionContext,旧名称仍然兼容。modelConfig: Record<string, string | number>:当前 Agent 的模型配置。传入该参数后,当前 Agent 不再读取系统环境变量中的模型配置。详细用法见下文。replanningCycleLimit: number:aiAct的最大重规划次数。标准模型默认 20,UI-TARS 模型默认 40,AutoGLM 模型默认 100。推荐通过 Agent 入参设置;MIDSCENE_REPLANNING_CYCLE_LIMIT环境变量仅作兼容读取。waitAfterAction: number: 每次动作执行后的等待时间(毫秒)。这让 UI 有时间稳定,然后再执行下一个动作。默认值为 300 毫秒。useDeviceTime: boolean:是否使用目标设备的本地时间记录任务时间。 目标接口必须实现getDeviceLocalTimeString。如果未实现,Midscene 会输出警告并改用运行环境的系统时间。默认值为false。onTaskStartTip: (tip: string) => void | Promise<void>:可选回调,在每个子任务执行开始前收到一条可读的任务描述提示。默认值为 undefined。createOpenAIClient: (openai, options) => Promise<OpenAI | undefined>:可选的 OpenAI 客户端包装函数,可用于接入可观测性工具或自定义中间件。详细示例见下文。onLLMUsage: (usage: AIUsageInfo) => void:可选回调。每次大模型调用的用量信息就绪后,Midscene 会调用一次该函数,可用于实时统计用量和成本。outputFormat: 'single-html' | 'html-and-external-assets': 控制报告的生成格式。'single-html'(默认)将所有截图作为 base64 内嵌到单个 HTML 文件中,并把reportFileName作为 HTML 文件名。'html-and-external-assets'将截图保存为独立的 PNG 文件到子目录,并把reportFileName作为该目录名,适用于报告文件过大的场景。注意:使用'html-and-external-assets'时,报告必须通过 HTTP 服务器或 CDN 地址访问,无法直接使用file://协议打开。这是因为浏览器的 CORS(跨源资源共享)限制会阻止从 file 协议加载相对路径的本地图片。如需在本地测试,可在报告目录下启动简易的 HTTP 服务器。进入报告目录后运行以下命令之一:- 使用 Node.js:
npx serve - 使用 Python:
python -m http.server或python3 -m http.server然后通过http://localhost:3000(或终端显示的端口)访问报告。
- 使用 Node.js:
screenshotShrinkFactor: number: 控制截图的缩放比例,以减少发送给 AI 模型的图像大小,从而减少 token 消耗。默认值为 1(不缩放)。如果将其设置为 2,则截图的宽高将缩小为原来的一半,面积缩小为原来的四分之一。你可以根据实际情况调整这个值,以在图像清晰度和 token 消耗之间找到最佳平衡点。- 对于移动端设备,将
screenshotShrinkFactor设置为 2 可以在保持清晰度的同时减少 token 的消耗,但不建议设置的值超过 3,否则可能会导致图像过于模糊,影响 AI 模型的理解。 - 对于 Web 页面,如果页面内容比较复杂或包含大量细节,不建议设置过高的
screenshotShrinkFactor,以避免截图过于模糊。通常也可以通过 Puppeteer 或 Playwright 的deviceScaleFactor在更上游控制截图尺寸。
- 对于移动端设备,将
screenshotShrinkFactor 与 deviceScaleFactor 的区别:
-
screenshotShrinkFactor是 Midscene 自定义的参数,用于控制拿到浏览器、手机等设备的截图后,是否对其进行尺寸压缩。目的是减少 token 消耗、加快模型响应速度。但过度压缩会导致图片模糊,影响模型理解。 -
deviceScaleFactor是 Puppeteer 和 Playwright 自带的参数,用于配置高清屏适配(现在很多设备都是高清屏了)时将一个 CSS 逻辑像素渲染为几倍的物理像素。这也就是为什么deviceScaleFactor和实际设备的缩放比例不一致时,非 headless 模式下可能会出现页面闪烁。同时,这一缩放逻辑也决定了 Puppeteer/Playwright 的截图尺寸(基于物理像素)。相比于screenshotShrinkFactor,它是在更上游的生产端控制了截图尺寸。
二者是否可以同时使用?
- Web 场景:二者同时使用的意义不大,应该优先使用
deviceScaleFactor,直接在生产端控制截图尺寸。- 一种特殊情况:你期望配置
deviceScaleFactor来避免浏览器闪烁,但同时又不期望发送给模型的截图过大,此时可以同时使用screenshotShrinkFactor控制发送给模型时的图片压缩。
- 一种特殊情况:你期望配置
- 移动端等非 Web 场景:因为没有
deviceScaleFactor参数可用,所以只能通过screenshotShrinkFactor来控制模型消费时使用的截图尺寸。
设备 CLI 可以按单次调用传入这些 Agent 行为参数。把 API 的 camelCase 参数名转换成不带平台前缀的 kebab-case flag,例如 waitAfterAction -> --wait-after-action。各平台 CLI 入口请参考 Skills。
自定义模型
modelConfig: Record<string, string | number> 可选。它允许你通过代码配置模型,而不是通过环境变量。
如果在 Agent 初始化时提供了
modelConfig,系统环境变量中的模型配置将全部被忽略,仅使用该对象中的值。 这里可配置的 key / value 与 模型配置 文档中说明的内容完全一致。你也可以参考 模型策略 中的说明。
自定义 OpenAI 客户端
createOpenAIClient: (openai, options) => Promise<OpenAI | undefined> 可选。它允许你包装 OpenAI 客户端实例,用于集成可观测性工具(如 LangSmith、Langfuse)或应用自定义中间件。
参数说明:
openai: OpenAI- Midscene 创建的基础 OpenAI 客户端实例,已包含所有必要配置(API 密钥、基础 URL、代理等)options: Record<string, unknown>- OpenAI 初始化选项,包括:baseURL?: string- API 接入地址apiKey?: string- API 密钥dangerouslyAllowBrowser: boolean- 在 Midscene 中始终为 true- 其他 OpenAI 配置选项
返回值:
- 返回包装后的 OpenAI 客户端实例,或返回
undefined表示使用原始实例
规划与交互
这些是 Midscene 中各类 Agent 的主要 API。
agent.ai() 和 agent.aiAct() 会根据自然语言自动规划并执行多个步骤。agent.aiTap()、agent.aiInput() 等即时操作 API 直接执行指定动作,AI 模型只负责定位等底层任务。
aiAct() 或 ai()
这个方法允许你通过自然语言描述一系列 UI 操作步骤。Midscene 会自动规划这些步骤并执行。
这个接口在之前版本里也被写为 aiAction(),当前的版本兼容两种写法。为了保持代码的一致性,建议使用新的 aiAct() 方法。
- 类型
-
参数:
prompt: string | object- 用自然语言描述的操作内容,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 truedeepThink?: 'unset' | true | false- 控制 Midscene 在aiAct执行规划时的具体实现。开启后,aiAct会更注重任务拆解,并将任务 Planning 和 UI 元素定位拆解为不同的模型调用。为了兼容旧写法,'unset'仍然可以传入,并会被按false处理。详情参阅 deepThink 说明。deepLocate?: boolean- 是否开启深度定位。默认值为 false。context?: string- 本次调用的额外上下文。详见单次调用上下文。fileChooserAccept?: string | string[]- 当文件选择器弹出时,指定对应的文件路径。可以是单个文件路径或路径数组。仅在 web 页面(Playwright、Puppeteer 或 Chrome extension Bridge mode)中可用。该选项不受fileChooserAllowedDir限制。- 注意:如果文件输入框不支持多文件(没有
multiple属性),但是传入了多个文件,会抛出错误。 - 注意:如果点击触发了文件选择器但没有传入
fileChooserAccept参数,文件选择器会被忽略,页面可以继续正常操作。 - 注意:Chrome extension Bridge mode 不支持目录上传输入框(
webkitdirectory/directory)。如需上传目录,请使用 Playwright。
- 注意:如果文件输入框不支持多文件(没有
fileChooserAllowedDir?: string:显式授权当前aiAct通过提示词上传文件时可访问的目录。未配置时,模型规划的文件上传会被拒绝。配置后,提示词中的相对路径会基于此目录解析,并校验是否位于此目录下;绝对路径则直接校验是否位于此目录下。位于此目录下的 symlink 也允许上传。建议将其设置为测试用例的fixtures目录,以避免 AI 幻觉或页面提示词攻击导致aiAct上传敏感文件。loadExtraActions?: string[]:为本次调用加载预先录制的 UI Action YAML 文件。默认值为undefined,即不加载 Extra Action。每个文件代表一次设备操作,并成为一个供通用规划器使用的无参数 Action。规划器选中后,Midscene 会在执行前将其展开为录制好的单个底层 Action。该选项仅支持 Node.js,不支持自定义规划适配器。相对路径基于当前工作目录解析。文件无效、名称重复、规划适配器不受支持或底层 Action 不可用时,Midscene 会在规划开始前抛出错误。loadElementXpaths?: string[]:为本次调用加载已知 UI 元素名称到 XPath 的 YAML 映射。Midscene 会把映射提供给规划器,并在执行前为匹配的 Action 注入 XPath。XPath 匹配成功时使用确定性的 DOM 解析,不调用定位模型;元素名未匹配或 XPath 已失效时,回退到普通 AI Locate。该选项仅支持 Node.js,相对路径基于当前工作目录解析。abortSignal?: AbortSignal- 可选的 AbortSignal,用于中止aiAct的执行。当信号被触发时,Midscene 会停止当前的规划循环并抛出错误。适用于实现超时控制或用户主动取消操作的场景。
-
返回值:
- 返回执行完成后的规划输出文本;如果规划没有产生输出,则返回
undefined。执行失败时会抛出错误。
- 返回执行完成后的规划输出文本;如果规划没有产生输出,则返回
-
示例:
加载预先录制的 UI Action
一个 Extra Action 文件定义一次可复用的设备操作。
name 是展示给规划器的操作名称。actionName 指向当前界面 Action Space 中已有的 Action。actionParam 必须且只能包含一项参数:
在单次 aiAct 中传入一个或多个文件:
该选项仅支持 Node.js 和通用规划适配器。如果当前模型使用 UI-TARS、AutoGLM 等自定义规划适配器,aiAct 会在读取文件或调用模型之前抛出错误。
Extra Action 只对本次调用的规划器可见,不会修改 Agent 的 Action Space。name 不能包含尖括号、换行符或控制字符。actionName 可以填写 Action 名称或 interfaceAlias,匹配时不区分大小写。actionParam 必须只包含一项,规划开始前 Midscene 会根据目标 Action 校验该参数。若要复用多次操作,请将每次操作分别录制为一个文件,再通过 loadExtraActions 传入全部文件路径。
若底层 Action 只有一个定位字段,可以使用上面的简写。参数直接包含 prompt、xpath 或 locatedPixelBbox 即可。Midscene 只会把定位属性移入定位字段,Input 的 value、mode 等其他参数仍保留在顶层。如果定位参数包含 XPath 或 locatedPixelBbox,但没有提示词,Midscene 会使用 Extra Action 的 name 作为备用定位提示词。
加载已知元素 XPath
与 Extra Action 不同,元素 XPath 映射不记录操作类型和值,一个文件可以包含任意多个元素:
把该文件传给单次 aiAct:
规划器仍然负责选择 Action,并生成 Input 值等动态参数。当 Action 需要定位映射内的元素时,规划器使用映射键作为定位提示词,Midscene 在生成可执行任务前注入对应 XPath。可直接作用于当前焦点元素的 Action 不需要重复添加 locator。XPath 解析成功时,Locate 任务不会调用模型;规划器使用了未映射的提示词或 XPath 已失效时,Midscene 保留现有的 AI Locate 回退。该映射仅对本次调用生效,不会修改 Agent,同时会进入 Plan Cache 的键。缓存 YAML 会保留 XPath,因此缓存回放也不需要调用定位模型。
在 aiAct 提示词中上传文件
如需让 aiAct 上传提示词中提到的文件,请为该次调用显式传入 fileChooserAllowedDir。建议将其设置为测试用例的 fixtures 目录。Midscene 会在打开文件选择器的操作之前规划文件选择器配置;相对路径和绝对路径都会先解析,再校验解析结果是否仍在所选 目录内。
如果一次 aiAct 需要上传多个文件,请在提示词中把每个相对路径与对应的上传操作明确写出。后出现的路径会覆盖此前配置的文件选择器路径。不要将提示词中的文件路径与 options.fileChooserAccept 混用:模型在规划过程中生成的后续文件选择器配置可能覆盖该 option 的值。
此能力仅适用于 web 页面(Playwright、Puppeteer 和 Chrome extension Bridge mode)。当 fixture 不在当前工作目录下,或需要让同一提示词在本地和 CI 环境中复用时,请配置 fileChooserAllowedDir。
在实际运行时,Midscene 会将用户指令规划(Planning)成多个步骤,然后逐步执行。如果 Midscene 认为无法执行,将抛出一个错误。
为了获得最佳效果,请尽可能提供清晰、详细的步骤描述。
关联文档:
aiTap()
点击某个元素
- 类型

