add api for post browser-use tasks
This commit is contained in:
parent
890d492de0
commit
d277955a9a
11 changed files with 320 additions and 8 deletions
69
api/task_store.py
Normal file
69
api/task_store.py
Normal file
|
|
@ -0,0 +1,69 @@
|
|||
import time
|
||||
import uuid
|
||||
from asyncio import Lock
|
||||
from dataclasses import dataclass, field
|
||||
from enum import Enum
|
||||
from typing import Any
|
||||
|
||||
from api.schemas import TaskStatus
|
||||
|
||||
|
||||
@dataclass
|
||||
class TaskRecord:
|
||||
task_id: str
|
||||
task: str
|
||||
timeout: int
|
||||
metadata: dict[str, Any] | None
|
||||
status: TaskStatus = TaskStatus.queued
|
||||
create_at: float = field(default_factory=time.time)
|
||||
started_at: float | None = None
|
||||
finished_at: float | None = None
|
||||
result: str | None = None
|
||||
error: str | None = None
|
||||
raw_response: dict[str, Any] | None = None
|
||||
|
||||
@property
|
||||
def execution_time(self) -> float:
|
||||
if self.started_at is None:
|
||||
return 0
|
||||
end = self.finished_at if self.finished_at is not None else time.time()
|
||||
return max(0, end - self.started_at)
|
||||
|
||||
|
||||
class TaskStore:
|
||||
def __init__(self) -> None:
|
||||
self._lock = Lock()
|
||||
self._tasks: dict[str, TaskRecord] = {}
|
||||
|
||||
async def create(self, task: str, timeout: int, metadata: dict[str, Any] | None) -> TaskRecord:
|
||||
task_id = uuid.uuid4().hex
|
||||
rec = TaskRecord(task_id=task_id, task=task, timeout=timeout, metadata=metadata)
|
||||
async with self._lock:
|
||||
self._tasks[task_id] = rec
|
||||
return rec
|
||||
|
||||
async def get(self, task_id: str) -> TaskRecord | None:
|
||||
async with self._lock:
|
||||
return self._tasks.get(task_id)
|
||||
|
||||
async def set_running(self, task_id: str) -> TaskRecord | None:
|
||||
async with self._lock:
|
||||
rec = self._tasks.get(task_id)
|
||||
if rec is None:
|
||||
return None
|
||||
rec.status = TaskStatus.running
|
||||
rec.started_at = time.time()
|
||||
return rec
|
||||
|
||||
async def set_done(self, task_id: str, success: bool, raw_response: dict[str, Any] | None,
|
||||
error: str | None) -> TaskRecord | None:
|
||||
async with self._lock:
|
||||
rec = self._tasks.get(task_id)
|
||||
if rec is None:
|
||||
return None
|
||||
rec.finished_at = time.time()
|
||||
rec.raw_response = raw_response
|
||||
rec.error = error or (raw_response.get("error") if isinstance(raw_response, dict) else None)
|
||||
rec.status = TaskStatus.succeeded if success else TaskStatus.failed
|
||||
|
||||
return rec
|
||||
Loading…
Add table
Add a link
Reference in a new issue