42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
"""Runtime orchestrator joining Search Gateway, registry, audit and events."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from .search_audit_store import SearchAuditStore
|
|
from .search_event_bridge import SearchEventBridge
|
|
from .search_gateway import SearchGateway, SearchRequest
|
|
from .search_provider_registry import SearchProviderRegistry
|
|
|
|
|
|
class SearchGatewayOrchestrator:
|
|
def __init__(self):
|
|
self.registry = SearchProviderRegistry()
|
|
self.audit = SearchAuditStore()
|
|
self.events = SearchEventBridge()
|
|
self.gateway = SearchGateway(self.registry.ordered())
|
|
|
|
def execute(self, payload: dict[str, Any]) -> dict[str, Any]:
|
|
request = SearchRequest(**payload)
|
|
self.events.search_started(request.to_dict())
|
|
response = self.gateway.search(request)
|
|
result = response.to_dict()
|
|
for attempt in result.get("attempts", []):
|
|
self.events.provider_attempted(result["request_id"], attempt)
|
|
if len(result.get("attempts", [])) > 1:
|
|
self.events.fallback_triggered(result["request_id"], "multiple providers attempted")
|
|
self.audit.append(result)
|
|
self.events.search_completed(result)
|
|
return result
|
|
|
|
def status(self) -> dict[str, Any]:
|
|
return {
|
|
"registry": self.registry.status(),
|
|
"audit": "enabled",
|
|
"events": "enabled",
|
|
}
|
|
|
|
|
|
__all__ = ["SearchGatewayOrchestrator"]
|