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。fileChooserAccept?: string | string[]- 当文件选择器弹出时,指定对应的文件路径。可以是单个文件路径或路径数组。仅在 web 页面(Playwright、Puppeteer 或 Chrome extension Bridge mode)中可用。- 注意:如果文件输入框不支持多文件(没有
multiple属性),但是传入了多个文件,会抛出错误。 - 注意:如果点击触发了文件选择器但没有传入
fileChooserAccept参数,文件选择器会被忽略,页面可以继续正常操作。 - 注意:Chrome extension Bridge mode 不支持目录上传输入框(
webkitdirectory/directory)。如需上传目录,请使用 Playwright。
- 注意:如果文件输入框不支持多文件(没有
abortSignal?: AbortSignal- 可选的 AbortSignal,用于中止aiAct的执行。当信号被触发时,Midscene 会停止当前的规划循环并抛出错误。适用于实现超时控制或用户主动取消操作的场景。
-
返回值:
- 返回执行完成后的规划输出文本;如果规划没有产生输出,则返回
undefined。执行失败时会抛出错误。
- 返回执行完成后的规划输出文本;如果规划没有产生输出,则返回
-
示例:
在实际运行时,Midscene 会将用户指令规划(Planning)成多个步骤,然后逐步执行。如果 Midscene 认为无法执行,将抛出一个错误。
为了获得最佳效果,请尽可能提供清晰、详细的步骤描述。
关联文档:
aiTap()
点击某个元素
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:deepLocate?: boolean- 是否开启深度定位。该参数原来叫deepThink,现已更名为deepLocate。默认值为 false。xpath?: string- 目标元素的 xpath 路径,用于执行当前操作。如果提供了这个 xpath,Midscene 会优先使用该 xpath 来找到元素,然后依次使用缓存和 AI 模型。默认值为空cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 truefileChooserAccept?: string | string[]- 当文件选择器弹出时,指定对应的文件路径。可以是单个文件路径或路径数组。仅在 web 页面(Playwright、Puppeteer 或 Chrome extension Bridge mode)中可用。- 注意:如果文件输入框不支持多文件(没有
multiple属性),但是传入了多个文件,会抛出错误。 - 注意:如果点击触发了文件选择器但没有传入
fileChooserAccept参数,文件选择器会被忽略,页面可以继续正常操作。 - 注意:Chrome extension Bridge mode 不支持目录上传输入框(
webkitdirectory/directory)。如需上传目录,请使用 Playwright。
- 注意:如果文件输入框不支持多文件(没有
-
返回值:
Promise<void>
-
示例:
aiHover()
在 Web 页面和桌面端(
@midscene/computer)中可用,在移动端(Android、iOS 或 HarmonyOS)下不可用。
鼠标悬停某个元素上。
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:
-
返回值:
Promise<void>
-
示例:
aiInput()
在某个元素中输入文本。
- 类型
-
参数:
推荐用法:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。opt: object- 配置对象,包含:value: string | number- 必填,要输入的文本内容。- 当
mode为'replace'时:文本将替换输入框中的所有现有内容。 - 当
mode为'typeOnly'时:直接输入文本,不会先清空输入框。 - 当
mode为'clear'时:会忽略文本内容,仅清空输入框。
- 当
deepLocate?: boolean- 是否开启深度定位。该参数原来叫deepThink,现已更名为deepLocate。默认值为 false。xpath?: string- 目标元素的 xpath 路径,用于执行当前操作。如果提供了这个 xpath,Midscene 会优先使用该 xpath 来找到元素,然后依次使用缓存和 AI 模型。默认值为空cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 trueautoDismissKeyboard?: boolean- 如果为 true,则键盘会在输入文本后自动关闭,仅在 Android/iOS/HarmonyOS 中有效。默认值为 true。keyboardTypeDelay?: number- 输入文本时每个按键之间的延迟(毫秒)。设置后,文本将逐字符输入,每个字符之间等待指定的延迟。适用于输入框在快速输入下丢字的场景。mode?: 'replace' | 'clear' | 'typeOnly'- 输入模式。(默认值: 'replace')'replace': 先清空输入框,然后输入文本。'typeOnly': 直接输入文本,不会先清空输入框。'clear': 清空输入框,不会输入新的文本。
兼容用法(已过时,但仍然支持):
value: string | number- 要输入的文本内容。locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选的配置对象,类型与推荐用法中的opt类型相同。
-
返回值:
Promise<void>
-
示例:
我们最近更新了 aiInput 的 API 签名,将定位提示作为第一个参数,使得参数顺序更直观。旧的签名 aiInput(value, locate, options) 仍然完全兼容,但建议新代码使用推荐的签名。
aiClearInput()
清空输入框内容。适合作为一个独立步骤使用:在输入前先清空,或只需删除现有文本而暂时不输入新内容。
- 类型
-
参数:
-
返回值:
- 返回
Promise<void>
- 返回
-
示例:
aiClearInput 与 aiInput 的取舍
aiInput(locate, { value: '...' }) 默认会先清空输入框(mode: 'replace')。只有在需要把清空当成独立一步时(例如测试空值校验,或想把清空和输入拆成两步分别控制)才使用 aiClearInput。
aiKeyboardPress()
按下键盘上的某个键。
- 类型
-
参数:
推荐用法:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。opt: object- 配置对象,包含:keyName: string- 必填,要按下的键,如Enter、Tab、Escape等。不支持组合键。可在我们的源码中查看完整的按键名称列表。deepLocate?: boolean- 是否开启深度定位。该参数原来叫deepThink,现已更名为deepLocate。默认值为 false。xpath?: string- 目标元素的 xpath 路径,用于执行当前操作。如果提供了这个 xpath,Midscene 会优先使用该 xpath 来找到元素,然后依次使用缓存和 AI 模型。默认值为空cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 true
兼容用法(已过时,但仍然支持):
key: string- 要按下的键,如Enter、Tab、Escape等。不支持组合键。locate?: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选的配置对象,类型与推荐用法中的opt类型相同。
-
返回值:
Promise<void>
-
示例:
我们最近更新了 aiKeyboardPress 的 API 签名,将定位提示作为第一个参数,使得参数顺序更直观。旧的签名 aiKeyboardPress(key, locate, options) 仍然完全兼容,但建议新代码使用推荐的签名。
aiScroll()
滚动页面或某个元素。
- 类型
-
参数:
推荐用法:
locate: string | object | undefined- 用自然语言描述的元素定位,或使用图片作为提示词。如果未传入或为 undefined,Midscene 会在当前鼠标位置滚动。opt: object- 配置对象,包含:scrollType?: 'singleAction' | 'scrollToBottom' | 'scrollToTop' | 'scrollToRight' | 'scrollToLeft'- 滚动类型,默认值为singleAction。direction?: 'down' | 'up' | 'left' | 'right'- 滚动方向,默认值为down。仅在scrollType为singleAction时生效。不论是 Android 还是 Web,这里的滚动方向都是指页面哪个方向的内容会进入屏幕。比如当滚动方向是down时,页面下方被隐藏的内容会从屏幕底部开始逐渐向上露出。distance?: number | null- 滚动距离,单位为像素。设置为null表示由 Midscene 自动决定。deepLocate?: boolean- 是否开启深度定位。该参数原来叫deepThink,现已更名为deepLocate。默认值为 false。xpath?: string- 目标元素的 xpath 路径,用于执行当前操作。如果提供了这个 xpath,Midscene 会优先使用该 xpath 来找到元素,然后依次使用缓存和 AI 模型。默认值为空cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 true
兼容用法(已过时,但仍然支持):
scrollParam: PlanningActionParamScroll- 滚动参数(包含 scrollType、direction、distance)。locate?: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选的配置对象,类型与推荐用法中的opt类型相同。
-
返回值:
Promise<void>
-
示例:
我们最近更新了 aiScroll 的 API 签名,将定位提示作为第一个参数,使得参数顺序更直观。旧的签名 aiScroll(scrollParam, locate, options) 仍然完全兼容,但建议新代码使用推荐的签名。
aiPinch()
执行双指缩放手势,用于放大或缩小。支持 Android、iOS 和 Web(基于 Chromium 的浏览器)。
- 类型
-
参数:
locate: string | object | undefined- 用自然语言描述的缩放目标元素,或使用图片作为提示词。如果未传入,缩放将在屏幕中心执行。opt: object- 配置对象,包含:
-
返回值:
Promise<void>
-
示例:
- Android:通过 yadb 的
-pinch命令实现。 - iOS:通过 W3C Actions API 双触摸指针实现。
- Web:通过 CDP 触摸事件实现。Puppeteer/Playwright 需设置
enableTouchEventsInActionSpace: true。Playwright 仅支持 Chromium 内核浏览器。 - HarmonyOS:不支持。
uitest框架未提供多触点 API。
aiLongPress()
长按(按住不放)某个元素,常用于唤起右键/上下文菜单、触发选中模式或其他长按手势。
- 类型
-
参数:
-
返回值:
- 返回
Promise<void>
- 返回
-
示例:
- Android、iOS、HarmonyOS、Web(基于 Chromium 的浏览器,通过触摸事件实现)。HarmonyOS 会忽略
duration选项,因为底层uitestAPI 不支持自定义按住时长。
aiDoubleClick()
双击某个元素。
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:
-
返回值:
Promise<void>
-
示例:
aiRightClick()
可用于 web 页面和 PC 桌面端(
@midscene/computer),不可用于移动设备(Android、iOS 或 HarmonyOS)。
右键点击某个元素。请注意,Midscene 在右键点击后无法与浏览器原生上下文菜单交互。这个接口通常用于已经监听了右键点击事件的元素。
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:
-
返回值:
Promise<void>
-
示例:
提取、定位与断言
aiAsk()
使用此方法,你可以针对当前页面,直接向 AI 模型发起提问,并获得字符串形式的回答。
aiAsk() 与 aiString() 完全等价。
- 类型
-
参数:
prompt: string | object- 用自然语言描述的询问内容,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一 般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。
-
返回值:
- 返回一个 Promise。返回 AI 模型的回答。
-
示例:
除了 aiAsk 方法,你还可以使用 aiQuery 方法,直接从 UI 提取结构化的数据。
aiQuery()
使用此方法,你可以直接从 UI 提取结构化的数据。只需在 dataDemand 中描述期望的数据格式(如字符串、数字、JSON、数组等),Midscene 即返回相应结果。
- 类型
-
参数:
dataDemand: string | object:描述预期的返回值和格式。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。
-
返回值:
- 返回值可以是任何合法的基本类型,比如字符串、数字、JSON、数组等。
- 你只需在
dataDemand中描述它,Midscene 就会给你满足格式的返回。
-
示例:
此外,我们还提供了 aiBoolean(), aiNumber(), aiString() 三个便捷方法,用于直接提取布尔值、数字和字符串。
aiBoolean()
从 UI 中提取一个布尔值。
- 类型
-
参数:
prompt: string- 用自然语言描述的期望值,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。
-
返回值:
- 返回一个 Promise。当 AI 返回结果时解析为布尔值。
-
示例:
aiNumber()
从 UI 中提取一个数字。
- 类型
-
参数:
prompt: string | object- 用自然语言描述的期望值,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。
-
返回值:
- 返回一个 Promise。当 AI 返回结果时解析为数字。
-
示例:
aiString()
从 UI 中提取一个字符串。
aiString() 与 aiAsk() 完全等价。
- 类型
-
参数:
prompt: string | object- 用自然语言描述的期望值,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。
-
返回值:
- 返回一个 Promise。当 AI 返回结果时解析为字符串。
-
示例:
aiLocate()
通过自然语言描述一个元素的定位。
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:
-
返回值:
- 返回一个 Promise。当元素定位成功时解析为元素定位信息。
rect在大多数定位链路里表示命中的目标元素边界。- 有些模型只支持按点定位,不支持按元素边界定位。在这种情况下,例如 AutoGLM,这里的
rect会退化成一个包含元素中心的8x8小方块,而不是真实的元素边界。 - 由于
rect的表现会明显受底层模型能力影响,不建议对这个字段建立过强的边界语义依赖。 - 如果你想获得更稳定的点击位置,推荐优先使用
center字段。 dpr是仅供 Web 使用的兼容字段,表示截图物理像素与 CSS 逻辑像素的比例。其他 Agent 类型不保证提供该字段。
-
示例:
aiAssert()
通过自然语言描述一个断言条件,让 AI 判断该条件是否为真。当条件不满足时,SDK 会抛出错误,并在错误信息中追加 AI 返回的详细原因。
- 类型
-
参数:
assertion: string | object- 用自然语言描述的断言条件,或使用图片作为提示词。errorMsg?: string- 当断言失败时附加的可选错误提示信息。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则 只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。
-
返回值:
- 返回一个 Promise。当断言成功时解析为 void;若断言失败,则抛出一个错误,错误信息包含
errorMsg以及 AI 生成的原因。
- 返回一个 Promise。当断言成功时解析为 void;若断言失败,则抛出一个错误,错误信息包含
-
示例:
断言在测试脚本中非常重要。为了降低因 AI 幻觉导致错误断言的风险(例如遗漏错误),你也可以使用 .aiQuery 加上常规的 JavaScript 断言来替代 .aiAssert。
例如,你可以这样替代上面的断言代码:
观察与等待
startObserving()
在一段时间内持续采样屏幕,后续断言会基于这段有序记录判断状态或变化。它适合捕捉单张截图容易错过的短暂 UI,比如 toast、横幅或页面切换。
返回的 UIObserver 提供:
observer.stop(): Promise<void>- 停止采样,并截取最后一张用于断言的截图。断言前必须先调用。observer.aiAssert(assertion: string, msg?: string, opt?: object): Promise<void>- 基于已观察到的时间段执行断言。模型会收到所有缓冲帧和最后一张截图;断言文本决定它应该判断“是否曾经出现”、最终状态,还是按顺序发生的变化。observer.aiBoolean(prompt: string, opt?: object): Promise<boolean>- 基于已观察到的时间段做布尔查询。observer.frameCount: number- 当前已缓冲的帧数。
工作方式与成本:
- Midscene 会优先从设备的连续帧源采集画面:Android 使用 scrcpy(
scrcpyConfig.enabled)、iOS 使用 WDA MJPEG(wdaMjpegFrameSource.enabled)、Web 使用 CDP screencast(始终可用)。没有帧源时,会退回到定时截图;移动端实际帧率会明显降低。 - 采样阶段只保存帧句柄。断言时再解码需要发送给模型的帧,避免在后台采样时持续解码。
- 模型会收到缓冲区内的所有帧(最多
maxFrames帧)和最后一张截图,避免漏掉长时间观察中的短暂 UI。如需控制 token 成本,可增大intervalMs(降低采样密度)或减小maxFrames(缩小缓冲区)。观察帧会显示在报告时间线中,并带有Observed标签。 - iOS 的观察帧来自 MJPEG 流,分辨率和质量较低;最后一张截图仍是全质量截图。
aiWaitFor()
等待某个条件达成。为控制 AI 服务成本,相邻两次检查的开始时间至少间隔 checkIntervalMs 毫秒。
- 类型
-
参数:
assertion: string- 用自然语言描述的断言条件options?: object- 可选的配置对象timeoutMs?: number- 超时 时间(毫秒,默认为 15000)。每轮检查开始时都会记录时间,只要该时间点仍在超时窗口内,就会进入下一轮检查;否则视为超时checkIntervalMs?: number- 相邻两次检查开始时间的最小间隔(毫秒),默认值为 3000
-
返回值:
- 返回一个 Promise。当断言成功时解析为 void;若超时,则抛出错误。
-
示例:
考虑到 AI 服务的时间消耗,.aiWaitFor 并不是一个特别高效的方法。使用一个普通的 sleep 可能是替代 waitFor 的另一种方式。
工作流执行与上下文
runYaml()
执行一个 YAML 格式的自动化脚本。脚本中的 tasks 部分会被解析和执行,并返回所有 .aiQuery 调用的结果。
- 类型
-
参数:
yamlScriptContent: string- YAML 格式的脚本内容
-
返回值:
- 返回一个包含
result属性的对象,其中包含所有aiQuery调用的结果
- 返回一个包含
-
示例:
更多关于 YAML 脚本的信息,请参考 Automate with Scripts in YAML。
runGherkinScenario()
运行一个 Gherkin Scenario,并把其中的步骤映射为 Midscene Agent 调用。
此 API 从 Midscene 1.10 开始支持,目前仍处于 Beta 阶段。未来 API 可能发生变化。
- 类型
-
参数:
scenarioText: string- 一个 Gherkin scenario,或者一组不带Scenario:头部的 Gherkin 步骤options?: object- 可选的运行选项context?: string- 本次运行使用的临时上下文abortSignal?: AbortSignal- 用于中止本次运行的可选信号deepThink?: 'unset' | true | false- 传给Given和When步骤对应的aiActdeepLocate?: boolean- 传给Given和When步骤对应的aiAct
-
返回值:
Promise<void>- 所有步骤执行完成后 resolve。如果某个步骤失败,错误文案会包含 Gherkin 行号、原始步骤,以及当时正在执行的 Midscene 语义动作。
-
示例:
关于支持规则、限制、缓存行为和 YAML 用法,请参考 BDD 风格脚本(Gherkin)。
setAIActContext()
设置在调用 agent.aiAct() 或 agent.ai() 时,发送给 AI 模型的背景知识。这个设置会覆盖之前的设置。
对于即时操作类型的 API,比如 aiTap(),这个设置不会生效。
- 类型
-
参数:
aiActContext: string- 要发送给 AI 模型的背景知识。aiActionContext旧参数名依然可用。
-
示例:
agent.setAIActionContext() 已被弃用,请改用 agent.setAIActContext()。弃用的方法仍作为兼容别名保留。
evaluateJavaScript()
仅 Web Agent 可用。
这个方法允许你在 web 页面上下文中执行一段 JavaScript 代码,并返回执行结果。
- 类型
-
参数:
script: string- 要执行的 JavaScript 代码。
-
返回值:
- 返回执行结果。
-
示例:
freezePageContext()
冻结当前页面上下文,使后续所有的操作都复用同一个页面快照,避免多次重复获取页面状态。在执行大量并发操作时,它可以显著提升性能。
一些注意点:
- 通常情况下,你不需要使用这个方法,除非你确定“页面状态获取”是脚本性能瓶颈。
- 需要及时调用
agent.unfreezePageContext()来恢复实时页面状态。 - 不要在交互类操作中使用这个方法,它会让 AI 模型无法感知到页面的最新状态,产生令人 困惑的错误。
- 类型
-
返回值:
Promise<void>
-
示例:
在报告中,使用冻结上下文的操作会在 Insight tab 中显示 🧊 图标。
unfreezePageContext()
解冻页面上下文,恢复使用实时的页面状态。
- 类型
-
返回值:
Promise<void>
报告、指标与生命周期
recordToReport()
默认在报告文件中记录当前截图并添加描述,也可以记录调用方传入的截图。
- 类型
-
参数:
title?: string- 可选,截图的标题,如果未提供,则标题为 'untitled'。options?: RecordToReportOptions- 可选,一个配置对象,包含:content?: string- 截图的描述。screenshots?: Array<{ base64: string; description?: string }>- 在同一个报告条目下记录一张或多张传入的截图。设置该选项后,Midscene 不会再自动截图。base64推荐使用 PNG/JPEG data URI,例如data:image/png;base64,...;也可以传裸 base64 body,此时会按 PNG 处理。
-
兼容性:
screenshotBase64?: string仍然作为向后兼容的单截图覆盖参数被接受。新代码建议使用screenshots: [{ base64 }]。screenshots和screenshotBase64二者只能传入一个。 -
返回值:
Promise<void>
-
示例:
_unstableLogContent()
从报告文件中获取日志内容。日志内容的结构可能会在未来发生变化。
- 类型
-
返回值:
- 返回一个对象,包含日志内容。
-
示例:
大模型用量指标
Midscene 会记录每一次大模型调用的 token 用量。你可以在运行时从 agent 读取聚合后的总量,这对于配合 Langfuse 等工具做成本可观测性非常有用。
metrics
一个 getter,返回自 agent 创建以来累计的大模型用量快照。
- 类型
- 示例
onLLMUsage 选项
如需实时追踪,可在构造 agent 时传入 onLLMUsage 回调。每次大模型调用的用量一旦就绪即触发一次,回调参数为原始用量信息(token 数、模型名、意图、请求 id 等)。
属性
.reportFile
报告文件的路径。
共享类型
定位选项:深度定位(deepLocate)
deepLocate 是一个可选参数,适用于所有需要元素定位的 API(aiAct、aiTap、aiHover、aiInput、aiKeyboardPress、aiScroll、aiDoubleClick、aiRightClick、aiLocate 等)。
开启后,Midscene 会调用 AI 模型两次以精确定位元素,从而提升准确性。这在目标元素面积较小、难以和周围元素区分时非常有用。对于新一代模型(如 Qwen3.x / Doubao 2.0 / Gemini 3.5),大多数场景下带来的收益不明显,建议按需开启。
- 默认值:
false
历史上,deepThink 这个名字在不同 API 中承担过两种含义:
- 在
aiAct()中,deepThink从一开始就 表示规划模式,用于引导任务拆解和专注规划的思考过程。详情请参考 aiAct deepThink 说明。 - 在
aiTap、aiHover等单步操作方法中,旧的deepThink表示定位增强,等同于现在的deepLocate。
为了区分这两种语义,自 v1.5.1 起,deepThink 只用于表示规划模式,定位增强统一命名为 deepLocate。
- 对于
aiAct(),可以同时使用deepThink和deepLocate:deepThink控制规划模式,deepLocate控制本节描述的深度定位。 - 对于
aiTap、aiHover等单步操作方法,如果需要提升定位精确度,推荐使用语义更清晰的deepLocate参数;旧的deepThink参数仍然兼容,语义等同于deepLocate。 :::
使用图片的提示词输入
你可以在提示词中使用图片作为补充,来描述无法通过自然语言表达的内容。
使用图片作为提示词时,提示词的参数格式如下:
- 示例一:使用图片描述点击位置
- 示例二:使用图片进行页面断言
- 示例三:使用图片引导操作(
aiAct)
图片尺寸的注意事项
请遵守模型提供商对图片体积和尺寸的限制。过大或过小的图片都可能被拒绝,准确限制请以模型提供商的文档为准。
报告工具
ReportMergingTool
在运行多个自动化工作流时,每个 agent 都会生成独立的报告文件。ReportMergingTool 提供了将多个自动化报告合并为单个报告的能力,便于统一查看和管理自动化结果。
new ReportMergingTool()
创建一个报告合并工具实例。
- 示例:
.append()
将自动化报告添加到待合并列表中。通常在每个自动化工作流结束后调用此方法。
- 类型
-
参数:
reportInfo: ReportFileWithAttributes- 报告信息对象,包含:reportFilePath: string- 报告文件的路径,通常是agent.reportFilereportAttributes: object- 报告属性testId: string- 自动化工作流的唯一标识符testTitle: string- 自动化工作流标题testDescription: string- 自动化工作流描述testDuration: number- 自动化工作流执行时长(毫秒)testStatus: 'passed' | 'failed' | 'timedOut' | 'skipped' | 'interrupted'- 自动化状态
-
返回值:
void
-
示例:
.mergeReports()
执行报告合并操作,将所有添加的报告合并为一个 HTML 文件。
- 类型
-
参数:
reportFileName?: 'AUTO' | string- 合并后的报告文件名- 默认为
'AUTO',自动生成文件名 - 可以指定自定义文件名(不需要
.html后缀)
- 默认为
opts?: object- 可选配置对象rmOriginalReports?: boolean- 是否删除原始报告文件,默认为falseoverwrite?: boolean- 如果目标文件已存在是否覆盖,默认为false
-
返回值:
- 成功时返回合并后的报告文件路径
- 如果没有添加任何报告,返回
null
-
示例:
.clear()
清空待合并的报告列表。如果需要在同一个实例中进行多次合并操作,可以使用此方法清空之前的报告列表。
- 类型
-
返回值:
void
-
示例:
Web 浏览器(@midscene/web)
当你需要自定义 Midscene 的浏览器自动化 Agent,或查阅 Web 专属构造参数时,请参考本篇。关于通用参数(报告、Hook、缓存等),请阅读API 参考(通用)。
Web Action Space(动作空间)
PuppeteerAgent、PlaywrightAgent 和 Chrome Bridge 共用一套 Action Space,Midscene Agent 在规划任务时可以使用这些操作:
Tap—— 左键点击元素。RightClick—— 右键点击元素。DoubleClick—— 双击元素。Hover—— 悬停目标元素。Input—— 输入文本,支持replace/typeOnly/clear模式(append是typeOnly的已废弃别名)。KeyboardPress—— 按下指定键(可在按键前先聚焦目标)。Scroll—— 以元素为起点或从屏幕中央滚动,支持滚动到顶/底/左/右。DragAndDrop—— 从一个元素拖拽到另一个元素。LongPress—— 长按目标元素,可选自定义时长。Swipe—— 触摸式滑动(开启enableTouchEventsInActionSpace时可用)。Pinch—— 双指缩放手势,用于放大/缩小(开启enableTouchEventsInActionSpace时可用;Playwright 仅支持 Chromium 内核浏览器)。ClearInput—— 清空输入框内容。Navigate—— 在当前标签页打开指定 URL。Reload—— 刷新当前页面。GoBack—— 浏览器后退。
PuppeteerPageAgent / PuppeteerAgent
当你需要在 Puppeteer 控制的浏览器里复用 Midscene 的 AI 操作能力时使用。
PuppeteerPageAgent 绑定单个 Puppeteer Page。PuppeteerAgent 仍作为兼容别名保留。
导入
构造器
浏览器特有选项
除了通用 Agent 参 数,Puppeteer 还提供:
forceSameTabNavigation: boolean—— 限制始终在当前标签页内导航,默认true。waitForNavigationTimeout: number—— 当操作触发页面跳转时的最长等待时间,默认5000(设为0表示不等待)。waitForNetworkIdleTimeout: number—— 每次操作后等待网络空闲的时间,默认2000(设为0关闭)。enableTouchEventsInActionSpace: boolean—— 在动作空间里增加触摸手势(如滑动),用于需要触摸事件的页面,默认false。keyboardTypeDelay: number—— 透传给 Puppeteerpage.keyboard.type的每字符延迟(毫秒)。默认值为undefined,表示 Midscene 不传该选项,使用 Puppeteer 自身默认值。通常无需配置;只有当受控输入框在快速输入下出现丢字等特殊情况时,再调大该值(例如80)。forceChromeSelectRendering: boolean—— 强制select元素使用 Chrome 的 base-select 样式,避免系统原生样式导致截图/元素提取不可见;需要 Puppeteer >24.6.0。默认值为true;如需关闭(例如旧版 Chrome/Puppeteer)可设为false。customActions: DeviceAction[]—— 借助defineAction注册自定义动作,让规划器可以调用领域特定步骤。
使用说明
:::info
- 每个页面一个 Agent:默认情况下(
forceSameTabNavigation: true)Midscene 会拦截新标签并在当前页打开,便于调试;若想保留浏览器原生的新标签行为可设为false,并自行给每个页面创建新的PuppeteerAgent。如果需要同一个 Agent 管理浏览器级别的页面切换,请使用PuppeteerBrowserAgent。 PuppeteerAgent/PuppeteerPageAgent为了兼容性仍保持 page-scoped 语义,不会暴露浏览器级别的页面切换能力;需要时请显式选择PuppeteerBrowserAgent。- 更多交互方法请参考 API 参考(通用)。
PuppeteerBrowserAgent
当一个 Midscene Agent 需要管理 Puppeteer 浏览器内的页面切换时,使用 PuppeteerBrowserAgent。它绑定 browser 实例,维护一个 active page,并且可以选择自动跟随新打开的页面。
- 构造函数:
new PuppeteerBrowserAgent(browser, page, options?)—— 你要显式指定初始 active page 时使用。 - 工厂方法:
PuppeteerBrowserAgent.create(browser, options?)—— 你希望 Midscene 自动选择或创建初始 active page 时使用。它会优先使用initialPage,否则复用浏览器里的第一个页面,或者创建一个新页面。 initialPage: Page—— 工厂方法使用的初始 Puppeteer 页面。autoFollowNewPage: boolean—— 浏览器打开新页面时是否自动切换 active page,默认false。newPageTimeout: number——waitForNewPage的超时时间,默认5000。activePage: Page—— Browser Agent 当前控制的页面。pages()—— 列出绑定 browser 中的页面。newPage()—— 创建新页面并将其设为 active page。setActivePage(page: Page)—— 显式指定 Browser Agent 接下来控制哪个 Puppeteer 页面。waitForNewPage(action?, options?)—— 等待新打开的页面,但不会隐式切换 active page。
另请参阅
- 集成到 Puppeteer 获取安装、Fixture 与远程 CDP 配置。
PlaywrightPageAgent / PlaywrightAgent
在 Playwright 浏览器中使用 Midscene 以支持带 AI 的测试或自动化流程。
PlaywrightPageAgent 绑定单个 Playwright Page。PlaywrightAgent 仍作为兼容别名保留。
导入
构造器
浏览器特有选项
forceSameTabNavigation: boolean—— 强制在当前标签页内执行,默认true。waitForNavigationTimeout: number—— 等待导航完成的时间,默认5000(设为0关闭)。waitForNetworkIdleTimeout: number—— 每次操作后等待网络空闲的时间,默认2000(设为0关闭)。enableTouchEventsInActionSpace: boolean—— 在动作空间里增加触摸手势(如滑动),用于需要触摸事件的页面,默认false。keyboardTypeDelay: number—— 透传给 Playwrightpage.keyboard.type的每字符延迟(毫秒)。默认值为undefined,表示 Midscene 不传该选项,使用 Playwright 自身默认值。通常无需配置;只有当受控输入框在快速输入下出现丢字等特殊情况时,再调大该值(例如80)。forceChromeSelectRendering: boolean—— 强制select元素使用 Chrome 的 base-select 样式,避免系统原生样式导致截图/元素提取不可见;需要 Playwright ≥1.52.0。默认值为true;如需关闭(例如旧版 Chrome/Playwright)可设为false。customActions: DeviceAction[]—— 追加项目特有的动作,供规划器调用。
使用说明
- 每个页面一个 Agent:默认
forceSameTabNavigation为true,Midscene 会拦截新标签确保稳定性;如需浏览器原生新标签行为请设为false,并自行给每个页面创建新的PlaywrightAgent。如果需要同一个 Agent 管理 browser context 级别的页 面切换,请使用PlaywrightBrowserAgent。 PlaywrightAgent/PlaywrightPageAgent为了兼容性仍保持 page-scoped 语义,不会暴露浏览器级别的页面切换能力;需要时请显式选择PlaywrightBrowserAgent。- 更多交互方法请参考 API 参考(通用)。
PlaywrightBrowserAgent
当一个 Midscene Agent 需要管理 Playwright browser context 内的页面切换时,使用 PlaywrightBrowserAgent。它绑定 browser context,维护一个 active page,并且可以选择自动跟随新打开的页面。
- 构造函数:
new PlaywrightBrowserAgent(context, page, options?)—— 你要显式指定初始 active page 时使用。 - 工厂方法:
PlaywrightBrowserAgent.create(context, options?)—— 你希望 Midscene 自动选择或创建初始 active page 时使用。它会优先使用initialPage,否则复用 context 里的第一个页面,或者创建一个新页面。 initialPage: Page—— 工厂方法使用的初始 Playwright 页面。autoFollowNewPage: boolean—— context 打开新页面时是否自动切换 active page,默认false。newPageTimeout: number——waitForNewPage的超时时间,默认5000。activePage: Page—— Browser Agent 当前控制的页面。pages()—— 列出绑定 browser context 中的页面。newPage()—— 创建新页面并将其设为 active page。setActivePage(page: Page)—— 显式指定 Browser Agent 接下来控制哪个 Playwright 页面。waitForNewPage(action?, options?)—— 等待新打开的页面,但不会隐式切换 active page。
另请参阅
- 集成到 Playwright 获取安装、Fixture 用法和更多配置。
Chrome Bridge Agent
Bridge mode 允许 Midscene 通过扩展控制当前桌面 Chrome 标签页,而无需再启动独立的自动化浏览器。
导入
构造器
桥接配置
closeNewTabsAfterDisconnect?: boolean—— 是否在销毁时自动关闭桥接创建的新标签页,默认false。allowRemoteAccess?: boolean—— 是否允许远程机器连接,默认false(监听127.0.0.1)。host?: string—— 自定义 Bridge Server 的监听地址,优先级高于allowRemoteAccess。port?: number—— Bridge Server 端口,默认3766。enableWaterFlowAnimation?: boolean—— Midscene 控制页面时是否显示蓝色动态边框和鼠标指示,默认true;如需截取不含视觉覆盖层的截图,可设为false。
完整安装与能力说明,见 Chrome 插件桥接模式。
使用说明
请先调用 connectCurrentTab 或 connectNewTabWithUrl 再执行其他操作。每个 AgentOverChromeBridge 只能连接一个标签页;destroy 之后需要重新创建实例。
方法
connectCurrentTab()
options.forceSameTabNavigation(默认true)会拦截新标签并在当前页打开,方便调试;若想保留新标签行为可设为false,但需要为每个新标签创建新的 Agent。- 连接当前激活标签页,成功后返回
Promise<void>,如果扩展未允许连接会报错。
connectNewTabWithUrl()
url—— 新标签页要打开的地址。options—— 与connectCurrentTab相同。- 打开新标签并连接成功后返回
Promise<void>。
destroy()
closeNewTabsAfterDisconnect—— 运行时覆盖构造器配置,为true时销毁时关闭桥接创建的新标签页。- 清理桥接连接和本地服务完成后返回
Promise<void>。
另请参阅
- API 参考(通用) 查看共享的 Agent 方法。
- 桥接模式 了解扩展安装、执行顺序与 YAML 用法。
Android(@midscene/android)
当你需要自定义设备行为、把 Midscene 接入框架,或排查 adb 问题时,请查阅本节。关于通用构造函数(报告、Hook、缓存等)的参数说明,请参考平台无关的 API 参考。
Android Action Space(动作空间)
AndroidDevice 使用以下动作空间,Midscene Agent 在规划任务时可以使用这些操作:
Tap—— 点击元素。DoubleClick—— 双击元素。Input—— 输入文本,支持replace/typeOnly/clear模式(append是typeOnly的已废弃别名)。支持可选参数autoDismissKeyboard和keyboardTypeDelay。Scroll—— 以元素为起点或从屏幕中央向上/下/左/右滚动,支持滚动到顶/底/左/右。DragAndDrop—— 从一个元素拖拽到另一个元素。KeyboardPress—— 按下指定键位。LongPress—— 长按目标元素,可选自定义时长。PullGesture—— 上拉或下拉(如下拉刷新),可选距离与持续时间。Pinch—— 双指缩放手势。scale > 1放大,scale < 1缩小。ClearInput—— 清空输入框内容。Launch—— 打开网页或package/.Activity。Terminate—— 按包名强制停止应用。RunAdbShell—— 执行原始adb shell命令。AndroidBackButton—— 触发系统返回。AndroidHomeButton—— 回到桌面。AndroidRecentAppsButton—— 打开多任务/最近应用。
AndroidDevice
创建一个可供 AndroidAgent 驱动的 adb 设备实例。
导入
构造函数
设备选项
deviceId: string—— 来自adb devices或getConnectedDevices()的值。autoDismissKeyboard?: boolean—— 输入完成后自动隐藏键盘,默认true。keyboardDismissStrategy?: 'esc-first' | 'back-first'—— 关闭键盘的顺序,默认'esc-first'。keyboardTypeDelay?: number—— 输入文本时每个按键之间的延迟(毫秒)。设置后,文本将逐字符输入,每个字符之间等待指定的延迟,而不是一次性发送整串文本。适用于输入过快导致丢字的设备或输入框。仅对input text路径生效;使用 yadb 时忽略此选项。androidAdbPath?: string—— adb 可执行文件的自定义路径。remoteAdbHost?: string/remoteAdbPort?: number—— 指向远程 adb server。imeStrategy?: 'always-yadb' | 'yadb-for-non-ascii'—— 控制何时调用 yadb 进行文本输入,默认'yadb-for-non-ascii'。'yadb-for-non-ascii'(默认)—— 对 Unicode 字符(包括 Latin Unicode 如 ö、é、ñ)、中文、日文以及格式化符号(如 %s、%d)使用 yadb。纯 ASCII 文本使用更快的原生adb input text。'always-yadb'—— 对所有文本输入始终使用 yadb,提供最大兼容性,但对纯 ASCII 文本稍慢。
displayId?: number—— 在设备镜像多个屏幕时,选择特定虚拟屏幕。screenshotResizeScale?: number—— 已废弃。 此选项已移除,不再生效。如需控制发送给 AI 模型的截图尺寸,请使用AgentOpt中的screenshotShrinkFactor。minScreenshotBufferSize?: number—— 截图 buffer 大小校验阈值,单位为字节;低于该值的 buffer 会被视为截图采集失败或已损坏。默认1024(1KB)。设置为0仅跳过此大小校验;Midscene 仍会拒绝空 buffer 和无效图片格式。alwaysRefreshScreenInfo?: boolean—— 每一步都重新查询旋转角度与屏幕尺寸,默认false。
scrcpy 配置和状态方法
-
scrcpyConfig?: object—— scrcpy 截图配置,默认关闭。enabled?: boolean—— 是否启用 scrcpy 截图,默认false。maxSize?: number—— 视频流最大宽度或高度,默认0,表示不缩放。videoBitRate?: number—— H.264 编码码率,单位为 bps,默认2000000。idleTimeoutMs?: number—— 空闲连接的断开时间,单位为毫秒,默认30000;设为0时禁用。
-
device.getScrcpyStatus()—— 返回enabled、connected、lastError和retryAfter。 -
device.retryScrcpy(): Promise<void>—— 跳过冷却时间,立即重试 scrcpy 连接。
使用说明
- 可以使用
getConnectedDevices()发现设备,udid与adb devices输出一致。 - 可以使用
remoteAdbHost/remoteAdbPort连接远程 adb;如果 adb 不在 PATH 中,可设置androidAdbPath。
AndroidAgent
将 Midscene 的 AI 规划能力绑定到 AndroidDevice,实现 UI 自动化。
导入
构造函数
Android 特有选项
customActions?: DeviceAction[]—— 通过defineAction扩展规划器的可用动作。appNameMapping?: Record<string, string>—— 将友好的应用名称映射到包名。当你在launch(target)里传入应用名称时,Agent 会在此映射中查找对应的包名;若未找到映射,则按原样尝试启动target。- 其余字段与通用构造参数一致,包括
generateReport、reportFileName、aiActContext、modelConfig、cache、createOpenAIClient和onTaskStartTip等。
使用说明
- 一个设备连接对应一个 Agent。
launch、terminate、runAdbShell等 Android 专属辅助函数也可在 YAML 脚本中使用,语法见 Android 平台特定动作。- 通用交互方法请查阅 API 参考(通用)。
Android 特有方法
agent.launch()
启动网页或原生 Android activity/package。
target: string—— 可以是网页 URL,也可以是package/.Activity形式的字符串,例如com.android.settings/.Settings,也可以是应用包名、URL 或应用名称。若传入应用名称且在appNameMapping中存在映射,将自动解析为对应包名;若未找到映射,则直接按target启动。
agent.runAdbShell()
通过连接的设备运行原始的 adb shell 命令。传入的内容只需要包含 shell 命令本身,不要包含 adb shell 前缀。
command: string—— 原样传递给adb shell的命令。例如要传input tap 100 200,不要传adb shell input tap 100 200。opt.timeout?: number—— 可选的命令执行超时时间,单位为毫秒。
agent.terminate()
终止(强制停止)正在运行的 Android 应用。

