Remove interact verify endpoint
All checks were successful
python-syntax / syntax-check (push) Successful in 31s
All checks were successful
python-syntax / syntax-check (push) Successful in 31s
This commit is contained in:
@@ -8,14 +8,13 @@ from fastapi.exceptions import RequestValidationError
|
||||
from fastapi.responses import JSONResponse
|
||||
|
||||
from .config import SETTINGS
|
||||
from .models import ExecRequest, InteractRequest, InteractVerifyRequest, LaunchRequest, SeeRequest, SeeZoomRequest, WindowActionRequest, WindowQuery
|
||||
from .models import ExecRequest, InteractRequest, LaunchRequest, SeeRequest, SeeZoomRequest, WindowActionRequest, WindowQuery
|
||||
from .services import (
|
||||
apply_window_action,
|
||||
capture_region_image,
|
||||
capture_screen,
|
||||
draw_grid,
|
||||
encode_image,
|
||||
execute_and_verify,
|
||||
extract_ocr_items,
|
||||
exec_action,
|
||||
exec_command as run_exec_command,
|
||||
@@ -159,11 +158,6 @@ def interact(req: InteractRequest, _: None = Depends(_auth)):
|
||||
return _ok(exec_action(req.action, req.screen))
|
||||
|
||||
|
||||
@app.post("/interact/verify")
|
||||
def interact_verify(req: InteractVerifyRequest, _: None = Depends(_auth)):
|
||||
return _ok(execute_and_verify(req))
|
||||
|
||||
|
||||
@app.get("/health")
|
||||
def health(_: None = Depends(_auth)):
|
||||
return _ok(
|
||||
|
||||
@@ -164,25 +164,4 @@ class ClickTextAction(BaseModel):
|
||||
return self
|
||||
|
||||
|
||||
class VerifyOCRTextNearPoint(BaseModel):
|
||||
type: Literal["ocr_text_near_point"]
|
||||
text: str = Field(min_length=1, max_length=1000)
|
||||
x: int = Field(ge=0)
|
||||
y: int = Field(ge=0)
|
||||
radius: int = Field(default=80, ge=1, le=1000)
|
||||
screen: int = 0
|
||||
match: Literal["contains", "exact", "regex"] = "contains"
|
||||
case_sensitive: bool = False
|
||||
min_confidence: float = Field(default=0.0, ge=0.0, le=100.0)
|
||||
ocr_lang: str = Field(default="eng", min_length=1, max_length=64)
|
||||
ocr_psm: int | None = Field(default=None, ge=0, le=13)
|
||||
|
||||
|
||||
class InteractVerifyRequest(BaseModel):
|
||||
action: InteractRequest
|
||||
verify: VerifyOCRTextNearPoint
|
||||
check_interval_ms: int = Field(default=250, ge=50, le=5000)
|
||||
timeout_ms: int = Field(default=3000, ge=100, le=60000)
|
||||
|
||||
|
||||
ActionRequest.model_rebuild()
|
||||
|
||||
@@ -15,11 +15,9 @@ from .models import (
|
||||
ActionRequest,
|
||||
ClickTextAction,
|
||||
GridTarget,
|
||||
InteractVerifyRequest,
|
||||
LaunchRequest,
|
||||
PixelTarget,
|
||||
Target,
|
||||
VerifyOCRTextNearPoint,
|
||||
WindowActionRequest,
|
||||
WindowQuery,
|
||||
)
|
||||
@@ -357,52 +355,6 @@ def exec_action(req: ActionRequest, screen: int = 0) -> dict:
|
||||
}
|
||||
|
||||
|
||||
def _verify_ocr_text_near_point(spec: VerifyOCRTextNearPoint) -> dict:
|
||||
radius = spec.radius
|
||||
display, _, _ = select_display(spec.screen)
|
||||
region_x = max(display["x"], spec.x - radius)
|
||||
region_y = max(display["y"], spec.y - radius)
|
||||
max_right = display["x"] + display["width"]
|
||||
max_bottom = display["y"] + display["height"]
|
||||
region_right = min(max_right, spec.x + radius)
|
||||
region_bottom = min(max_bottom, spec.y + radius)
|
||||
region_w = max(1, region_right - region_x)
|
||||
region_h = max(1, region_bottom - region_y)
|
||||
img, region, _, _, screen_selection = capture_region_image(spec.screen, region_x, region_y, region_w, region_h)
|
||||
items = extract_ocr_items(img, region["x"], region["y"], spec.min_confidence, spec.ocr_lang, spec.ocr_psm)
|
||||
matches = [item for item in items if _text_matches(item["text"], spec.text, spec.match, spec.case_sensitive)]
|
||||
return {"ok": len(matches) > 0, "matches": matches[:8], "items_count": len(items), "screen": screen_selection, "region": region}
|
||||
|
||||
|
||||
def execute_and_verify(req: InteractVerifyRequest) -> dict:
|
||||
started = time.time()
|
||||
action_result = exec_action(req.action.action, req.action.screen)
|
||||
attempts = 0
|
||||
last_check = None
|
||||
deadline = started + (req.timeout_ms / 1000.0)
|
||||
while True:
|
||||
attempts += 1
|
||||
check = _verify_ocr_text_near_point(req.verify)
|
||||
last_check = check
|
||||
if check["ok"]:
|
||||
return {
|
||||
"action_result": action_result,
|
||||
"verified": True,
|
||||
"attempts": attempts,
|
||||
"last_check": last_check,
|
||||
"duration_ms": int((time.time() - started) * 1000),
|
||||
}
|
||||
if time.time() >= deadline:
|
||||
return {
|
||||
"action_result": action_result,
|
||||
"verified": False,
|
||||
"attempts": attempts,
|
||||
"last_check": last_check,
|
||||
"duration_ms": int((time.time() - started) * 1000),
|
||||
}
|
||||
time.sleep(req.check_interval_ms / 1000.0)
|
||||
|
||||
|
||||
def windows_only(feature: str):
|
||||
if sys.platform != "win32":
|
||||
raise HTTPException(status_code=501, detail=f"{feature} is currently supported on Windows hosts only")
|
||||
|
||||
Reference in New Issue
Block a user