本文提供 Mobile Use SDK 的功能介绍、快速入门以及功能说明,便于您在指定项目中快速集成 Mobile Use SDK,无需关注 Agent 实现细节即可对 Mobile Use Agent 通过自然语言指令下发任务并获取任务执行结果。
说明
Mobile Use 是基于火山引擎云手机与豆包视觉识别大模型能力,通过自然语言指令完成面向移动端场景自动化任务的从AI Infra 到 AI Agent 的解决方案,产品介绍详见 Mobile Use 解决方案介绍。
开始使用 Mobile Use SDK 之前,您必须准备好以下资源。
注意
请求云手机服务和对象存储服务的火山引擎 AK/SK 必须使用同一个,否则会造成 Agent 无响应。
注意
注意
由于模型迭代频繁,请在对接前咨询技术支持获取当前最推荐使用的模型名称。
下载以下示例项目。
下载完成后,在本地解压压缩包,并使用开发工具(例如 TRAE 等)打开项目。
项目结构说明:
mobile-use-examples/ - examples/ # 示例项目集 - basic_usage.py # SDK 基本使用和设置 - app_automation.py # 应用启动和导航 - .env.example # 环境配置模板 - mcp.json # MCP 服务器配置 - pyproject.toml # 项目依赖项 - README.md # 项目自述文档,您可以从中获取到项目介绍以及运行指南
打开终端(Terminal),在项目根目录依次运行以下命令,使用 uv 安装依赖。
uv venv source .venv/bin/activate uv sync
运行以下命令,新建 .env 文件。
cp .env.example .env
在项目根目录打开 .env 文件,根据提示依次配置各个参数,并保存。
参数说明:
说明
配置前请确保已参考上文准备工作章节完成了所有的资源创建与配置。
cn-beijing(可选)在项目根目录打开 mcp.json 文件,根据实际需要配置其他 MCP 服务。
说明
Mobile Use SDK 已内置 Mobile Use MCP,如果没有其他 MCP 服务可配置,则无需操作本步骤。
返回终端内,在项目根目录运行 basic_usage.py 示例代码。
uv run examples/basic_usage.py
效果说明:
当前屏幕有哪些内容。在项目根目录运行 app_automation.py 示例代码。
uv run examples/app_automation.py
测试效果说明:
本章节介绍如何将 Mobile Use SDK 集成在项目中。
通过 PyPI 将 SDK 集成至项目。
pip install ve-mobile-use
在项目根目录的 .env 文件内,配置 SDK 所必须的环境变量。
说明
推荐使用 dotenv 管理配置值。
# Mobile Use SDK Examples Environment Configuration # Volcengine Cloud Phone (ACEP) Configuration ACEP_AK=your_volcengine_access_key ACEP_SK=your_volcengine_secret_key ACEP_ACCOUNT_ID=your_volcengine_account_id # TOS (Object Storage) Configuration TOS_AK=your_tos_access_key TOS_SK=your_tos_secret_key TOS_BUCKET=your_tos_bucket TOS_REGION=your_tos_region TOS_ENDPOINT=your_tos_endpoint # AI Model Configuration (Doubao/ARK) ARK_API_KEY=your_ark_api_key ARK_MODEL_ID=your_model_id ARK_BASE_URL=your_ark_base_url # Cloud Phone Instance Configuration TEST_PRODUCT_ID=your_product_id TEST_POD_ID=your_pod_id
如果您是通过函数服务 veFaaS 一键部署的 Mobile Use Agent 应用,以上变量值可通过以下方式快速获取:
说明
如果您想要实时查看云手机效果,可通过以下任一方式实现:
from mobile_use_sdk.mobile import CloudPhone from mobile_use_sdk.config import TosInfo from dotenv import load_dotenv import os # 使用环境变量演示 load_dotenv() async def main(): # 云手机管理 Client phone_manager = PhoneManager( ak=os.getenv("ACEP_AK"), sk=os.getenv("ACEP_SK"), account_id=os.getenv("ACEP_ACCOUNT_ID"), tos_info=TosInfo( ak=os.getenv("TOS_AK"), sk=os.getenv("TOS_SK"), bucket=os.getenv("TOS_BUCKET"), region=os.getenv("TOS_REGION"), endpoint=os.getenv("TOS_ENDPOINT"), ), ) # 连接某个云手机,可以使用这个方法连续创建 cloud_phone = await phone_manager.create_cloud_phone( pod_id=os.getenv("TEST_POD_ID"), product_id=os.getenv("TEST_PRODUCT_ID"), ) # 测试 tos 和 云手机操作 screen_result = await cloud_phone.screenshot() # 获取手机截图 print(screen_result) # { screenshot: "tos_url", screenshot_dimensions: (720,1440) } # 关闭云手机连接 await cloud_phone.aclose()
标准使用方式
from mobile_use_sdk.mobile import CloudPhone from mobile_use_sdk.config import TosInfo from mobile_use_sdk.agent import MobileUseAgent from dotenv import load_dotenv load_dotenv() async def main(): # 云手机管理 Client phone_manager = PhoneManager( ak=os.getenv("ACEP_AK"), sk=os.getenv("ACEP_SK"), account_id=os.getenv("ACEP_ACCOUNT_ID"), tos_info=TosInfo( ak=os.getenv("TOS_AK"), sk=os.getenv("TOS_SK"), bucket=os.getenv("TOS_BUCKET"), region=os.getenv("TOS_REGION"), endpoint=os.getenv("TOS_ENDPOINT"), ), ) # 连接某个云手机,可以使用这个方法连续创建 cloud_phone = await phone_manager.create_cloud_phone( pod_id=os.getenv("TEST_POD_ID"), product_id=os.getenv("TEST_PRODUCT_ID"), ) # 初始化 Agent agent = await MobileUseAgent.init_with_mobile( mobile=cloud_phone, ) # 测试一个 case await cloud_phone.press_home() # 执行简单任务 result = await agent.run("执行xxx任务") # 任务结果 print(result) await cloud_phone.aclose() if __name__ == '__main__': asyncio.run(main())
结构化输出示例
Mobile Use 支持对内容进行结构化提取,示例如下,您可以参考并接入到项目当中。
from pydantic import BaseModel from mobile_use_sdk.agent import MobileUseAgent class AppInfo(BaseModel): app_name: str version: str size: str rating: float result = await agent.run("执行xxx任务", response_format=AppInfo) app_info = AppInfo(**result) print(result.app_name, result.version)
SDK 有 4 块导出模块,其中:agent、mobile 为核心;cli、config 为辅助模块。
from mobile_use_sdk.mobile import PhoneManager from mobile_use_sdk.agent import MobileUseAgent from mobile_use_sdk.config import LLMConfig, AgentConfig, TosInfo
创建一个维持签名和鉴权信息的实例
from mobile_use_sdk.mobile import PhoneManager phone_manager = PhoneManager( ak=os.getenv("ACEP_AK"), sk=os.getenv("ACEP_SK"), account_id=os.getenv("ACEP_ACCOUNT_ID"), tos_info=TosInfo( ak=os.getenv("TOS_AK"), sk=os.getenv("TOS_SK"), bucket=os.getenv("TOS_BUCKET"), region=os.getenv("TOS_REGION"), endpoint=os.getenv("TOS_ENDPOINT"), ), )
使用 Manager 实例,可以创建多个云手机的实例
cloud_phone = await phone_manager.create_cloud_phone( pod_id=os.getenv("TEST_POD_ID"), product_id=os.getenv("TEST_PRODUCT_ID"), ) await phone.aclose()
支持多种手机操作,包括:
tap
## 函数声明 async def tap(self, point: tuple[int, int]) -> str: ## 使用方式 await phone.tap((x ,y))
swipe
## 函数声明 async def swipe(self, start_point: tuple[int, int], end_point: tuple[int, int],) -> str ## 使用方式 await phone.swipe((x,y), (x,y))
long_press
async def long_press(self, point: tuple[int, int], duration: int = 1) -> str await phone.long_press((x,y), 1)
press_home
async def press_home(self) -> str await phone.press_home()
press_back
async def press_back(self, count: int = 1) -> str await phone.press_back(1)
screenshot
async def screenshot(self) -> dict: response = await phone.screenshot() print(response) # => # { # "screenshot": screenshot_url, # "screenshot_dimensions": (width, height), # }
launch_app
async def launch_app(self, package_name: str) -> str: await phone.launch_app("com.ss.android.ugc.aweme") # 抖音包
close_app
async def close_app(self, package_name: str) -> str: await phone.close_app("com.ss.android.ugc.aweme") # 抖音包
list_apps
async def list_apps(self) -> dict: await phone.list_apps() # [{app_name: "抖音", package_name: "com.ss.android.ugc.aweme"}]
close_apps
async def close_app(self) -> str: await phone.close_apps()
Mobile Use 默认使用豆包视觉理解系列的模型,模型列表参考上文准备工作章节。
from mobile_use_sdk.agent import MobileUseAgent from mobile_use_sdk.config import LLMConfig # 使用默认配置 llm_config=LLMConfig( model=os.getenv("ARK_MODEL_ID"), # 'doubao-1.5-thinking-vision-pro' , '或您的推理点id' api_key=os.getenv("ARK_API_KEY"), # 'ak-xxx' base_url=os.getenv("ARK_BASE_URL"), # https://ark.cn-beijing.volces.com/api/v3 ) agent = await MobileUseAgent.init_with_mobile( llm_config=llm_config, mobile=cloud_phone, )
为了效果的稳定,系统提示词会追加到到当前系统提示词之后,请确保新增系统提示词不要过多对 Agent 的输出产生影响。如果需要新增工具,请使用第三方 MCP 功能集成。
from mobile_use_sdk.agent import MobileUseAgent from mobile_use_sdk.config import AgentConfig agent_config = AgentConfig( addiontional_system_prompt="请使用英语回答问题", step_interval=0.5, max_steps=25 ) agent = await MobileUseAgent.init_with_mobile( llm_config=llm_config, agent_config=agent_config, mobile=cloud_phone, )
如果想要集成第三方 API、MCP,可以如下集成,背后 Mobile Use 会帮忙做 McpHub 的链接池管理,封装的 Langgraph 的 McpAdaptor,可以支持现阶段所有的 mcp json 协议。
from mobile_use_sdk.agent import MobileUseAgent, mcp_manager # 自定义MCP配置 mcp_config = { "mcpServers": { "a_map": { "url": "https://xxx", "transport": "sse" } } } agent = await MobileUseAgent.init_with_mobile( mobile=cloud_phone, mcp_json=mcp_json, ) # 注意在程序结束,需要对 mcp_manager 进行清除, 背后 agent 使用 mcp 链接池管理 await mcp_manager.cleanup_all_connections()
run用于执行单个移动设备操作任务并返回完整的执行结果。
async def run( self, user_prompt: str, thread_id: Optional[str] = uuid.uuid4(), output_format: Optional[Type[BaseModel]] = None, ) -> AgentResponse:
参数 | 类型 | 是否必须 | 说明 |
|---|---|---|---|
|
| 是 | 用户输入的任务描述或指令。 |
|
| 否 | 会话线程 ID,用于标识和追踪会话状态。
|
|
| 否 | 指定结构化输出的数据格式,继承自 pydantic 库的
|
返回类型为 AgentResponse。
主要属性:
属性 | 类型 | 说明 |
|---|---|---|
info | AgentInfo | Agent 基本信息,包含执行参数和用户输入。 |
result | AgentResult | 最终执行结果,包含摘要和结构化输出。 |
history | list[AgentHistory] | 完整的执行历史记录列表。 |
final_state | Dict[str, Any] | 图执行后的最终状态。 |
实例方法:
方法 | 说明 |
|---|---|
| 获取所有执行步骤的总耗时。
|
| 检查 Agent 是否已完成执行。
|
| 获取执行过程中的错误信息。
|
| 获取所有工具调用记录。
|
| 获取执行历史中的截图数据。
|
| 获取所有消息记录。
|
import asyncio from mobile_use_sdk.cli.stream_output import StreamOutput from mobile_use_sdk.agent import MobileUseAgent from dotenv import load_dotenv import os from mobile_use_sdk.mobile.cloud_phone import CloudPhone load_dotenv() async def run_task_with_user_interaction(agent, user_prompt, stream_output): print(f"\n🎯 开始执行任务: {user_prompt}") print("=" * 50) user_input_for_resume = None def handle_user_input(user_input: str): nonlocal user_input_for_resume user_input_for_resume = user_input stream_output.set_user_input_callback(handle_user_input) try: async for chunk in agent.astream(user_prompt, is_stream=True): stream_output.register_task(chunk) while user_input_for_resume is not None: current_input = user_input_for_resume user_input_for_resume = None print(f"用户反馈,{current_input}, 请等待...") async for chunk in agent.astream(current_input, is_stream=True): stream_output.register_task(chunk) print(f"\n✅ 任务完成: {user_prompt}") except Exception as e: print(f"\n❌ 任务执行出错: {e}") async def agent_run(): stream_output = StreamOutput() async with CloudPhone() as cloud_phone: await cloud_phone.initialize( pod_id=os.getenv("TEST_POD_ID"), product_id=os.getenv("TEST_PRODUCT_ID"), ) try: await cloud_phone.clear_apps() agent = MobileUseAgent() await agent.initialize( mobile=cloud_phone, ) tasks = [ "执行xxx1任务", "执行xxx2任务", "执行xxx3任务", ] for task in tasks: await run_task_with_user_interaction(agent, task, stream_output) await asyncio.sleep(1) except Exception as e: print(f"❌ 执行出错: {e}") if __name__ == "__main__": asyncio.run(agent_run())