astera-customerAI / runtime /integration.py
G-ACE's picture
Deploy current Customer AI runtime 96b5a02fe7bbc525787d1a4359b7358d63d4d89a
d04144c verified
Raw
History Blame Contribute Delete
1.72 kB
from __future__ import annotations
from dataclasses import dataclass
from .schemas import RoleName, RoleResult, TaskResolution
@dataclass(frozen=True)
class IntegratedRoleResult:
resolutions: tuple[TaskResolution, ...]
missing_task_ids: tuple[str, ...]
contradiction_task_ids: tuple[str, ...]
risks: tuple[str, ...]
uncertainties: tuple[str, ...]
evidence_ids: tuple[str, ...]
def as_dict(self) -> dict[str, object]:
return {"resolutions":[r.model_dump(mode="json") for r in self.resolutions],"missing_task_ids":list(self.missing_task_ids),"contradiction_task_ids":list(self.contradiction_task_ids),"risks":list(self.risks),"uncertainties":list(self.uncertainties),"evidence_ids":list(self.evidence_ids)}
class DialogueIntegrator:
def integrate(self, results: list[RoleResult]) -> IntegratedRoleResult:
by_role = {result.role: result for result in results}
if set(by_role) != set(RoleName):
raise ValueError("three_role_result_required")
constructive = by_role[RoleName.CONSTRUCTIVE]
missing = set().union(*(r.missing_needs for r in results))
contradictions = set().union(*(r.contradictions for r in results))
return IntegratedRoleResult(
resolutions=tuple(constructive.task_resolutions),
missing_task_ids=tuple(sorted(missing)),
contradiction_task_ids=tuple(sorted(contradictions)),
risks=tuple(dict.fromkeys(item for r in results for item in r.risks)),
uncertainties=tuple(dict.fromkeys(item for r in results for item in r.uncertainties)),
evidence_ids=tuple(dict.fromkeys(item for r in results for item in r.evidence_ids)),
)