services.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. from app.db.models import AgentDefinition, AgentRun, AgentVersion
  2. from app.domain.repositories import (
  3. AgentDefinitionRepository,
  4. AgentRunRepository,
  5. AgentVersionRepository,
  6. )
  7. from app.schemas.agent import (
  8. AgentCreateRequest,
  9. AgentRunCreateRequest,
  10. AgentRunStatusUpdateRequest,
  11. AgentStatusUpdateRequest,
  12. AgentVersionCreateRequest,
  13. )
  14. class AgentApplicationService:
  15. def __init__(
  16. self,
  17. *,
  18. agent_repository: AgentDefinitionRepository,
  19. agent_version_repository: AgentVersionRepository,
  20. agent_run_repository: AgentRunRepository,
  21. ) -> None:
  22. self.agent_repository = agent_repository
  23. self.agent_version_repository = agent_version_repository
  24. self.agent_run_repository = agent_run_repository
  25. def create_agent(self, payload: AgentCreateRequest) -> AgentDefinition:
  26. return self.agent_repository.create(
  27. tenant_id=payload.tenant_id,
  28. code=payload.code,
  29. name=payload.name,
  30. description=payload.description,
  31. agent_type=payload.agent_type,
  32. owner_user_id=payload.owner_user_id,
  33. metadata_json=payload.metadata_json,
  34. )
  35. def list_agents(self, *, tenant_id: str) -> list[AgentDefinition]:
  36. return self.agent_repository.list_by_tenant(tenant_id=tenant_id)
  37. def update_agent_status(
  38. self,
  39. *,
  40. agent_id: str,
  41. payload: AgentStatusUpdateRequest,
  42. ) -> AgentDefinition | None:
  43. return self.agent_repository.update_status(
  44. tenant_id=payload.tenant_id,
  45. agent_id=agent_id,
  46. status=payload.status,
  47. )
  48. def create_agent_version(self, payload: AgentVersionCreateRequest) -> AgentVersion:
  49. agent = self.agent_repository.get_by_id(
  50. tenant_id=payload.tenant_id,
  51. agent_id=payload.agent_id,
  52. )
  53. if agent is None:
  54. raise ValueError(f"agent not found: {payload.agent_id}")
  55. return self.agent_version_repository.create(
  56. tenant_id=payload.tenant_id,
  57. agent_id=payload.agent_id,
  58. status=payload.status,
  59. role=payload.role,
  60. goal=payload.goal,
  61. system_prompt=payload.system_prompt,
  62. model_config_json=payload.model_config_data.model_dump(mode="json"),
  63. memory_policy_json=payload.memory_policy.model_dump(mode="json"),
  64. tool_refs_json=[item.model_dump(mode="json") for item in payload.tool_refs],
  65. skill_refs_json=[item.model_dump(mode="json") for item in payload.skill_refs],
  66. )
  67. def list_agent_versions(self, *, tenant_id: str, agent_id: str) -> list[AgentVersion]:
  68. return self.agent_version_repository.list_by_agent(tenant_id=tenant_id, agent_id=agent_id)
  69. def create_agent_run(self, payload: AgentRunCreateRequest) -> AgentRun:
  70. agent_version = self._resolve_agent_version(
  71. tenant_id=payload.tenant_id,
  72. agent_id=payload.agent_id,
  73. agent_version_id=payload.agent_version_id,
  74. )
  75. if agent_version is None:
  76. raise ValueError("published agent version not found")
  77. return self.agent_run_repository.create(
  78. tenant_id=payload.tenant_id,
  79. agent_id=payload.agent_id,
  80. agent_version_id=agent_version.id,
  81. session_id=payload.session_id,
  82. input_text=payload.input_text,
  83. input_json=payload.input_json,
  84. )
  85. def list_agent_runs(
  86. self,
  87. *,
  88. tenant_id: str,
  89. agent_id: str | None = None,
  90. session_id: str | None = None,
  91. ) -> list[AgentRun]:
  92. return self.agent_run_repository.list_by_scope(
  93. tenant_id=tenant_id,
  94. agent_id=agent_id,
  95. session_id=session_id,
  96. )
  97. def update_agent_run_status(
  98. self,
  99. *,
  100. agent_run_id: str,
  101. payload: AgentRunStatusUpdateRequest,
  102. ) -> AgentRun | None:
  103. entity = self.agent_run_repository.get_by_id(
  104. tenant_id=payload.tenant_id,
  105. agent_run_id=agent_run_id,
  106. )
  107. if entity is None:
  108. return None
  109. return self.agent_run_repository.update_status(
  110. agent_run_id=agent_run_id,
  111. status=payload.status,
  112. worker_key=payload.worker_key,
  113. output_text=payload.output_text,
  114. output_json=payload.output_json,
  115. error_code=payload.error_code,
  116. error_message=payload.error_message,
  117. )
  118. def _resolve_agent_version(
  119. self,
  120. *,
  121. tenant_id: str,
  122. agent_id: str,
  123. agent_version_id: str | None,
  124. ) -> AgentVersion | None:
  125. if agent_version_id is not None:
  126. return self.agent_version_repository.get_by_id(
  127. tenant_id=tenant_id,
  128. agent_version_id=agent_version_id,
  129. )
  130. return self.agent_version_repository.get_latest_published(
  131. tenant_id=tenant_id,
  132. agent_id=agent_id,
  133. )