49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
"""Repeatable local baseline for the in-process governance path."""
|
|
import asyncio
|
|
import statistics
|
|
import time
|
|
from dataclasses import dataclass, asdict
|
|
|
|
from app.core.contracts import AgentDefinition, AgentRequest, CoreResult, RequestContext
|
|
from app.service.agent.base import BaseAgent
|
|
|
|
|
|
class BenchmarkAgent(BaseAgent):
|
|
async def handle(self, request: AgentRequest, context: RequestContext) -> CoreResult:
|
|
del context
|
|
return CoreResult(text=request.message)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Baseline:
|
|
iterations: int
|
|
p50_ms: float
|
|
p95_ms: float
|
|
max_ms: float
|
|
|
|
|
|
async def run(iterations: int = 200) -> Baseline:
|
|
agent = BenchmarkAgent(AgentDefinition(agent_type="benchmark", version="1"))
|
|
request = AgentRequest(
|
|
agent_type="benchmark", message="ping", session_id="benchmark",
|
|
idempotency_key="benchmark-key-0001",
|
|
)
|
|
context = RequestContext(user_id="1", trace_id="benchmark")
|
|
samples: list[float] = []
|
|
for index in range(iterations):
|
|
started = time.perf_counter()
|
|
async for _ in agent.execute(request, context, f"run-{index}"):
|
|
pass
|
|
samples.append((time.perf_counter() - started) * 1000)
|
|
ordered = sorted(samples)
|
|
return Baseline(
|
|
iterations=iterations,
|
|
p50_ms=statistics.median(ordered),
|
|
p95_ms=ordered[min(len(ordered) - 1, int(len(ordered) * 0.95))],
|
|
max_ms=max(ordered),
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
print(asdict(asyncio.run(run())))
|