add new tool: to_captcha

This commit is contained in:
VladislavIlin7 2026-04-21 23:32:09 +03:00
parent 50589232d6
commit f1f32d8366
14 changed files with 1008 additions and 130 deletions

View file

@ -2,6 +2,8 @@ from fastapi import APIRouter, Depends, HTTPException, Request
from fastapi.responses import JSONResponse
from api.contracts.task_schemas import (
BrowserCaptchaAbortRequest,
BrowserCaptchaReadyRequest,
BrowserTaskAcceptedResponse,
BrowserTaskRequest,
BrowserTaskResultResponse,
@ -20,8 +22,8 @@ def get_task_service(request: Request) -> TaskService:
@router.post("/tasks", response_model=BrowserTaskAcceptedResponse, status_code=202)
async def create_task(
payload: BrowserTaskRequest,
service: TaskService = Depends(get_task_service),
payload: BrowserTaskRequest,
service: TaskService = Depends(get_task_service),
) -> BrowserTaskAcceptedResponse:
rec = await service.submit_task(task=payload.task.strip(), timeout=payload.timeout, metadata=payload.metadata)
return BrowserTaskAcceptedResponse(task_id=rec.task_id, status=rec.status)
@ -37,8 +39,8 @@ async def get_task_status(task_id: str, service: TaskService = Depends(get_task_
@router.get("/tasks/{task_id}/result", response_model=BrowserTaskResultResponse)
async def get_task_result(
task_id: str,
service: TaskService = Depends(get_task_service),
task_id: str,
service: TaskService = Depends(get_task_service),
) -> JSONResponse | BrowserTaskResultResponse:
rec = await service.get_task(task_id)
if rec is None:
@ -55,18 +57,35 @@ async def get_task_result(
"result": None,
"error": None,
"raw_response": None,
"human_intervention": None,
},
)
return BrowserTaskResultResponse(
task_id=rec.task_id,
status=rec.status,
success=(rec.status == TaskStatus.succeeded),
execution_time=rec.execution_time,
result=rec.result,
error=rec.error,
raw_response=rec.raw_response,
)
return _to_result_response(rec)
@router.post("/tasks/{task_id}/captcha/ready", response_model=BrowserTaskResultResponse)
async def captcha_ready(
task_id: str,
payload: BrowserCaptchaReadyRequest,
service: TaskService = Depends(get_task_service),
) -> BrowserTaskResultResponse:
rec = await service.resume_captcha(task_id, user_response=payload.user_response)
if rec is None:
raise HTTPException(status_code=404, detail="Task not found")
return _to_result_response(rec)
@router.post("/tasks/{task_id}/captcha/abort", response_model=BrowserTaskResultResponse)
async def captcha_abort(
task_id: str,
payload: BrowserCaptchaAbortRequest,
service: TaskService = Depends(get_task_service),
) -> BrowserTaskResultResponse:
rec = await service.abort_captcha(task_id, reason=payload.reason)
if rec is None:
raise HTTPException(status_code=404, detail="Task not found")
return _to_result_response(rec)
def _to_status_response(rec: TaskRecord) -> BrowserTaskStatusResponse:
@ -77,4 +96,18 @@ def _to_status_response(rec: TaskRecord) -> BrowserTaskStatusResponse:
started_at=rec.started_at,
finished_at=rec.finished_at,
error=rec.error,
human_intervention=rec.human_intervention,
)
def _to_result_response(rec: TaskRecord) -> BrowserTaskResultResponse:
return BrowserTaskResultResponse(
task_id=rec.task_id,
status=rec.status,
success=(rec.status == TaskStatus.succeeded),
execution_time=rec.execution_time,
result=rec.result,
error=rec.error,
raw_response=rec.raw_response,
human_intervention=rec.human_intervention,
)