services.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from core_domain import InitialNodeContract, RunCreateContract
  2. from app.db.models import Message, RunRequest, Session as SessionModel
  3. from app.domain.repositories import MessageRepository, RunRequestRepository, SessionRepository
  4. from app.infrastructure.runtime_client import RuntimeServiceClient
  5. from app.schemas.message import MessageCreateRequest
  6. from app.schemas.run_request import DispatchRunRequest, DispatchRunResponse, RunRequestCreateRequest
  7. from app.schemas.session import SessionCreateRequest
  8. class SessionApplicationService:
  9. def __init__(
  10. self,
  11. session_repository: SessionRepository,
  12. message_repository: MessageRepository,
  13. run_request_repository: RunRequestRepository,
  14. runtime_client: RuntimeServiceClient | None = None,
  15. ) -> None:
  16. self.session_repository = session_repository
  17. self.message_repository = message_repository
  18. self.run_request_repository = run_request_repository
  19. self.runtime_client = runtime_client
  20. def create_session(self, payload: SessionCreateRequest) -> SessionModel:
  21. return self.session_repository.create(
  22. tenant_id=payload.tenant_id,
  23. app_id=payload.app_id,
  24. user_id=payload.user_id,
  25. channel_type=payload.channel_type,
  26. title=payload.title,
  27. )
  28. def list_sessions(self, tenant_id: str, app_id: str | None = None) -> list[SessionModel]:
  29. return self.session_repository.list_by_scope(tenant_id=tenant_id, app_id=app_id)
  30. def create_message(self, payload: MessageCreateRequest) -> Message:
  31. return self.message_repository.create(
  32. tenant_id=payload.tenant_id,
  33. session_id=payload.session_id,
  34. turn_id=payload.turn_id,
  35. role=payload.role,
  36. content_type=payload.content_type,
  37. content_text=payload.content_text,
  38. content_json=payload.content_json,
  39. )
  40. def list_messages(self, tenant_id: str, session_id: str) -> list[Message]:
  41. return self.message_repository.list_by_session(tenant_id=tenant_id, session_id=session_id)
  42. def create_run_request(self, payload: RunRequestCreateRequest) -> RunRequest:
  43. return self.run_request_repository.create(
  44. tenant_id=payload.tenant_id,
  45. session_id=payload.session_id,
  46. app_version_id=payload.app_version_id,
  47. workflow_version_id=payload.workflow_version_id,
  48. trigger_type=payload.trigger_type,
  49. request_payload_json=payload.request_payload_json,
  50. request_status=payload.request_status,
  51. )
  52. def list_run_requests(self, tenant_id: str, session_id: str) -> list[RunRequest]:
  53. return self.run_request_repository.list_by_session(tenant_id=tenant_id, session_id=session_id)
  54. def dispatch_run_request(self, payload: DispatchRunRequest) -> DispatchRunResponse:
  55. run_request = self.create_run_request(
  56. RunRequestCreateRequest(
  57. tenant_id=payload.tenant_id,
  58. session_id=payload.session_id,
  59. app_version_id=payload.app_version_id,
  60. workflow_version_id=payload.workflow_version_id,
  61. trigger_type=payload.trigger_type,
  62. request_payload_json=payload.request_payload_json,
  63. request_status="accepted",
  64. )
  65. )
  66. if self.runtime_client is None:
  67. raise RuntimeError("runtime client is not configured")
  68. runtime_response = self.runtime_client.create_run(
  69. RunCreateContract(
  70. tenant_id=payload.tenant_id,
  71. app_id=payload.app_id,
  72. app_version_id=payload.app_version_id,
  73. workflow_id=payload.workflow_id,
  74. workflow_version_id=payload.workflow_version_id,
  75. session_id=payload.session_id,
  76. trigger_type=payload.trigger_type,
  77. priority=payload.priority,
  78. initial_node=(
  79. InitialNodeContract(
  80. node_id=payload.initial_node.node_id,
  81. node_type=payload.initial_node.node_type,
  82. status=payload.initial_node.status,
  83. )
  84. if payload.initial_node is not None
  85. else None
  86. ),
  87. )
  88. )
  89. return DispatchRunResponse.from_parts(run_request=run_request, runtime_response=runtime_response)