services.py 4.0 KB

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