services.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. from app.db.models import TeamDefinition, TeamRun, TeamVersion
  2. from app.domain.repositories import (
  3. TeamDefinitionRepository,
  4. TeamRunRepository,
  5. TeamVersionRepository,
  6. )
  7. from app.schemas.team import (
  8. TeamCreateRequest,
  9. TeamRunCreateRequest,
  10. TeamRunStatusUpdateRequest,
  11. TeamStatusUpdateRequest,
  12. TeamVersionCreateRequest,
  13. )
  14. class TeamApplicationService:
  15. def __init__(
  16. self,
  17. *,
  18. team_repository: TeamDefinitionRepository,
  19. team_version_repository: TeamVersionRepository,
  20. team_run_repository: TeamRunRepository,
  21. ) -> None:
  22. self.team_repository = team_repository
  23. self.team_version_repository = team_version_repository
  24. self.team_run_repository = team_run_repository
  25. def create_team(self, payload: TeamCreateRequest) -> TeamDefinition:
  26. return self.team_repository.create(
  27. tenant_id=payload.tenant_id,
  28. code=payload.code,
  29. name=payload.name,
  30. description=payload.description,
  31. team_type=payload.team_type,
  32. owner_user_id=payload.owner_user_id,
  33. metadata_json=payload.metadata_json,
  34. )
  35. def list_teams(self, *, tenant_id: str) -> list[TeamDefinition]:
  36. return self.team_repository.list_by_tenant(tenant_id=tenant_id)
  37. def update_team_status(
  38. self,
  39. *,
  40. team_id: str,
  41. payload: TeamStatusUpdateRequest,
  42. ) -> TeamDefinition | None:
  43. return self.team_repository.update_status(
  44. tenant_id=payload.tenant_id,
  45. team_id=team_id,
  46. status=payload.status,
  47. )
  48. def create_team_version(self, payload: TeamVersionCreateRequest) -> TeamVersion:
  49. team = self.team_repository.get_by_id(tenant_id=payload.tenant_id, team_id=payload.team_id)
  50. if team is None:
  51. raise ValueError(f"team not found: {payload.team_id}")
  52. if not payload.member_refs:
  53. raise ValueError("team version requires at least one member")
  54. return self.team_version_repository.create(
  55. tenant_id=payload.tenant_id,
  56. team_id=payload.team_id,
  57. status=payload.status,
  58. coordination_mode=payload.coordination_mode,
  59. objective=payload.objective,
  60. member_refs_json=[item.model_dump(mode="json") for item in payload.member_refs],
  61. policy_json=payload.policy_json,
  62. )
  63. def list_team_versions(self, *, tenant_id: str, team_id: str) -> list[TeamVersion]:
  64. return self.team_version_repository.list_by_team(tenant_id=tenant_id, team_id=team_id)
  65. def create_team_run(self, payload: TeamRunCreateRequest) -> TeamRun:
  66. team_version = self._resolve_team_version(
  67. tenant_id=payload.tenant_id,
  68. team_id=payload.team_id,
  69. team_version_id=payload.team_version_id,
  70. )
  71. if team_version is None:
  72. raise ValueError("published team version not found")
  73. return self.team_run_repository.create(
  74. tenant_id=payload.tenant_id,
  75. team_id=payload.team_id,
  76. team_version_id=team_version.id,
  77. session_id=payload.session_id,
  78. input_text=payload.input_text,
  79. input_json=payload.input_json,
  80. )
  81. def list_team_runs(
  82. self,
  83. *,
  84. tenant_id: str,
  85. team_id: str | None = None,
  86. session_id: str | None = None,
  87. ) -> list[TeamRun]:
  88. return self.team_run_repository.list_by_scope(
  89. tenant_id=tenant_id,
  90. team_id=team_id,
  91. session_id=session_id,
  92. )
  93. def update_team_run_status(
  94. self,
  95. *,
  96. team_run_id: str,
  97. payload: TeamRunStatusUpdateRequest,
  98. ) -> TeamRun | None:
  99. entity = self.team_run_repository.get_by_id(
  100. tenant_id=payload.tenant_id,
  101. team_run_id=team_run_id,
  102. )
  103. if entity is None:
  104. return None
  105. return self.team_run_repository.update_status(
  106. team_run_id=team_run_id,
  107. status=payload.status,
  108. worker_key=payload.worker_key,
  109. output_text=payload.output_text,
  110. output_json=payload.output_json,
  111. error_code=payload.error_code,
  112. error_message=payload.error_message,
  113. )
  114. def _resolve_team_version(
  115. self,
  116. *,
  117. tenant_id: str,
  118. team_id: str,
  119. team_version_id: str | None,
  120. ) -> TeamVersion | None:
  121. if team_version_id is not None:
  122. return self.team_version_repository.get_by_id(
  123. tenant_id=tenant_id,
  124. team_version_id=team_version_id,
  125. )
  126. return self.team_version_repository.get_latest_published(
  127. tenant_id=tenant_id,
  128. team_id=team_id,
  129. )