add new tool: to_captcha
This commit is contained in:
parent
50589232d6
commit
f1f32d8366
14 changed files with 1008 additions and 130 deletions
|
|
@ -20,13 +20,17 @@ class TaskRecord:
|
|||
result: str | None = None
|
||||
error: str | None = None
|
||||
raw_response: dict[str, Any] | None = None
|
||||
human_intervention: dict[str, Any] | None = None
|
||||
session_id: str | None = None
|
||||
resume_token: str | None = None
|
||||
awaiting_deadline: float | 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)
|
||||
return max(0.0, end - self.started_at)
|
||||
|
||||
|
||||
class TaskStore:
|
||||
|
|
@ -51,16 +55,42 @@ class TaskStore:
|
|||
if rec is None:
|
||||
return None
|
||||
rec.status = TaskStatus.running
|
||||
rec.started_at = time.time()
|
||||
rec.finished_at = None
|
||||
rec.error = None
|
||||
rec.human_intervention = None
|
||||
rec.awaiting_deadline = None
|
||||
if rec.started_at is None:
|
||||
rec.started_at = time.time()
|
||||
return rec
|
||||
|
||||
async def set_awaiting_captcha(
|
||||
self,
|
||||
task_id: str,
|
||||
raw_response: dict[str, Any],
|
||||
max_wait_seconds: int,
|
||||
) -> TaskRecord | None:
|
||||
async with self._lock:
|
||||
rec = self._tasks.get(task_id)
|
||||
if rec is None:
|
||||
return None
|
||||
payload = raw_response.get("human_intervention") or {}
|
||||
rec.status = TaskStatus.awaiting_user_captcha
|
||||
rec.raw_response = raw_response
|
||||
rec.human_intervention = payload
|
||||
rec.session_id = payload.get("session_id") or rec.session_id
|
||||
rec.resume_token = payload.get("resume_token") or rec.resume_token
|
||||
rec.awaiting_deadline = time.time() + max(1, int(max_wait_seconds))
|
||||
rec.error = None
|
||||
rec.finished_at = None
|
||||
return rec
|
||||
|
||||
async def set_done(
|
||||
self,
|
||||
task_id: str,
|
||||
success: bool,
|
||||
raw_response: dict[str, Any] | None,
|
||||
error: str | None,
|
||||
result: str | None = None,
|
||||
self,
|
||||
task_id: str,
|
||||
success: bool,
|
||||
raw_response: dict[str, Any] | None,
|
||||
error: str | None,
|
||||
result: str | None = None,
|
||||
) -> TaskRecord | None:
|
||||
async with self._lock:
|
||||
rec = self._tasks.get(task_id)
|
||||
|
|
@ -69,8 +99,35 @@ class TaskStore:
|
|||
rec.finished_at = time.time()
|
||||
rec.raw_response = raw_response
|
||||
rec.error = error if error is not None else (
|
||||
raw_response.get("error") if isinstance(raw_response, dict) else None)
|
||||
raw_response.get("error") if isinstance(raw_response, dict) else None
|
||||
)
|
||||
rec.result = result if result is not None else (
|
||||
raw_response.get("result") if isinstance(raw_response, dict) else None)
|
||||
raw_response.get("result") if isinstance(raw_response, dict) else None
|
||||
)
|
||||
rec.human_intervention = None
|
||||
rec.awaiting_deadline = None
|
||||
rec.status = TaskStatus.succeeded if success else TaskStatus.failed
|
||||
return rec
|
||||
|
||||
async def expire_if_needed(self, task_id: str) -> TaskRecord | None:
|
||||
async with self._lock:
|
||||
rec = self._tasks.get(task_id)
|
||||
if rec is None:
|
||||
return None
|
||||
if rec.status != TaskStatus.awaiting_user_captcha:
|
||||
return rec
|
||||
if rec.awaiting_deadline is None or rec.awaiting_deadline > time.time():
|
||||
return rec
|
||||
|
||||
rec.status = TaskStatus.failed
|
||||
rec.finished_at = time.time()
|
||||
rec.error = "CAPTCHA wait expired before the user completed verification."
|
||||
rec.raw_response = {
|
||||
"success": False,
|
||||
"status": TaskStatus.failed.value,
|
||||
"error": rec.error,
|
||||
"error_code": "captcha_wait_expired",
|
||||
}
|
||||
rec.human_intervention = None
|
||||
rec.awaiting_deadline = None
|
||||
return rec
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue