31 lines
948 B
Python
31 lines
948 B
Python
"""Execution budgets shared by supervised web and MCP tasks."""
|
|
|
|
from dataclasses import dataclass, field
|
|
import time
|
|
|
|
from artemis.config.settings import settings
|
|
|
|
|
|
def task_timeout(item: dict, job: dict | None = None, batch: dict | None = None) -> int:
|
|
options = item.get("runtime_overrides") or (job or {}).get("case", {}).get("task_config") or {}
|
|
return int(
|
|
options.get("timeout_seconds")
|
|
or (batch or {}).get("timeout_seconds")
|
|
or settings.ARTEMIS_TASK_TIMEOUT_SECONDS
|
|
)
|
|
|
|
|
|
@dataclass
|
|
class ExecutionBudget:
|
|
limit: float
|
|
elapsed: float = 0
|
|
_last: float = field(default_factory=time.monotonic)
|
|
_excluded: bool = False
|
|
|
|
def update(self, *, excluded: bool = False) -> float:
|
|
now = time.monotonic()
|
|
if not self._excluded:
|
|
self.elapsed += max(0, now - self._last)
|
|
self._last, self._excluded = now, excluded
|
|
return max(0, self.limit - self.elapsed)
|