Files
workphone-sdk/sdk/app/routers/experience.py

208 lines
4.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
工作手机SDK v3.0 - 经验库API
"""
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import List, Dict, Any, Optional
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from services.experience_db import experience_db
from services.adb_device import adb_manager
router = APIRouter(prefix="/api/v3/experience", tags=["经验库"])
# ========== 请求模型 ==========
class ShortcutCreate(BaseModel):
name: str
description: str
steps: List[Dict[str, Any]]
class ShortcutExecute(BaseModel):
variables: Optional[Dict[str, str]] = None
class RecordOperation(BaseModel):
device_id: str
app: str
action: str
params: Dict[str, Any]
result: Dict[str, Any]
duration_ms: int
# ========== 统计和记录 ==========
@router.get("/statistics")
async def get_statistics():
"""获取经验库统计信息"""
return {
"code": 200,
"data": experience_db.get_statistics()
}
@router.get("/operations")
async def get_operations(limit: int = 100):
"""获取最近的操作记录"""
return {
"code": 200,
"data": experience_db.get_recent_operations(limit)
}
@router.post("/operations/record")
async def record_operation(req: RecordOperation):
"""记录一次操作"""
op_id = experience_db.record_operation(
device_id=req.device_id,
app=req.app,
action=req.action,
params=req.params,
result=req.result,
duration_ms=req.duration_ms
)
return {
"code": 200,
"data": {"operation_id": op_id}
}
# ========== 快捷操作 ==========
@router.get("/shortcuts")
async def list_shortcuts():
"""列出所有快捷操作"""
return {
"code": 200,
"data": experience_db.list_shortcuts()
}
@router.get("/shortcuts/{name}")
async def get_shortcut(name: str):
"""获取快捷操作详情"""
shortcut = experience_db.get_shortcut(name)
if not shortcut:
raise HTTPException(status_code=404, detail="快捷操作不存在")
return {
"code": 200,
"data": shortcut
}
@router.post("/shortcuts")
async def create_shortcut(req: ShortcutCreate):
"""创建快捷操作"""
shortcut = experience_db.create_shortcut(
name=req.name,
description=req.description,
steps=req.steps
)
return {
"code": 200,
"data": shortcut
}
@router.post("/shortcuts/{name}/execute/{device_id}")
async def execute_shortcut(name: str, device_id: str, req: ShortcutExecute = None):
"""
执行快捷操作
示例: 执行微信发消息
POST /api/v3/experience/shortcuts/wechat_send_message/execute/emulator-5554
{
"variables": {
"contact": "张三",
"message": "你好"
}
}
"""
device = adb_manager.get_device(device_id)
if not device:
raise HTTPException(status_code=404, detail="设备不存在")
variables = req.variables if req else None
result = experience_db.execute_shortcut(name, device, variables)
return {
"code": 200 if result["success"] else 500,
"data": result
}
# ========== 智能建议 ==========
@router.get("/suggest/coordinates")
async def suggest_coordinates(app: str, text: str):
"""
获取坐标建议
根据历史操作记录建议某个APP中某个文字元素的坐标
"""
suggestion = experience_db.suggest_coordinates(app, text)
if suggestion:
return {
"code": 200,
"data": suggestion
}
return {
"code": 404,
"message": "没有找到相关记录"
}
@router.get("/success-rate")
async def get_success_rate(app: str, action: str):
"""获取某操作的成功率"""
rate = experience_db.get_success_rate(app, action)
return {
"code": 200,
"data": {
"app": app,
"action": action,
"success_rate": rate
}
}
@router.get("/average-duration")
async def get_average_duration(app: str, action: str):
"""获取某操作的平均耗时"""
duration = experience_db.get_average_duration(app, action)
return {
"code": 200,
"data": {
"app": app,
"action": action,
"average_duration_ms": duration
}
}
# ========== 学习到的APP元素 ==========
@router.get("/elements")
async def get_learned_elements():
"""获取学习到的APP元素"""
return {
"code": 200,
"data": experience_db.app_elements
}
@router.get("/elements/{app}")
async def get_app_elements(app: str):
"""获取某APP学习到的元素"""
elements = experience_db.app_elements.get(app, {})
return {
"code": 200,
"data": elements
}