analysis_service.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. from uuid import uuid4
  2. from fastapi import HTTPException, status
  3. from app.repositories.analysis_repository import AnalysisRepository
  4. from app.repositories.observation_repository import ObservationRepository
  5. from app.schemas.analysis import (
  6. AnalysisSessionCreateRequest,
  7. AnalysisSessionListResponse,
  8. AnalysisSessionResponse,
  9. AnalysisSessionSnapshot,
  10. )
  11. from app.schemas.observation import ObservationSummary
  12. from app.schemas.orchestration import OrchestratorPlan
  13. from app.services.stub_orchestrator_service import StubOrchestratorService
  14. from app.services.stub_runner_service import StubRunnerService
  15. class AnalysisService:
  16. def __init__(self) -> None:
  17. self.repository = AnalysisRepository()
  18. self.observation_repository = ObservationRepository()
  19. self.orchestrator = StubOrchestratorService()
  20. self.runner = StubRunnerService()
  21. def create_session(
  22. self,
  23. payload: AnalysisSessionCreateRequest,
  24. ) -> AnalysisSessionResponse:
  25. session_id = str(uuid4())
  26. observation = self.observation_repository.get(payload.observation_id)
  27. if observation is None:
  28. raise HTTPException(
  29. status_code=status.HTTP_404_NOT_FOUND,
  30. detail=f"Observation '{payload.observation_id}' was not found.",
  31. )
  32. plan = self.orchestrator.create_initial_plan(observation)
  33. snapshot = self._build_stub_snapshot(
  34. session_id=session_id,
  35. observation=observation,
  36. mode=payload.mode,
  37. plan=plan,
  38. )
  39. self.repository.save_snapshot(snapshot)
  40. return AnalysisSessionResponse(
  41. session_id=session_id,
  42. observation_id=payload.observation_id,
  43. status=snapshot.status,
  44. message="Analysis session created and seeded with stub experiment data.",
  45. )
  46. def get_session(self, session_id: str) -> AnalysisSessionSnapshot | None:
  47. return self.repository.get_snapshot(session_id)
  48. def list_sessions(self) -> AnalysisSessionListResponse:
  49. return self.repository.list_sessions()
  50. def _build_stub_snapshot(
  51. self,
  52. *,
  53. session_id: str,
  54. observation: ObservationSummary,
  55. mode: str,
  56. plan: OrchestratorPlan,
  57. ) -> AnalysisSessionSnapshot:
  58. run = self.runner.run_initial_plan(
  59. session_id=session_id,
  60. observation=observation,
  61. plan=plan,
  62. )
  63. return AnalysisSessionSnapshot(
  64. session_id=session_id,
  65. observation_id=observation.id,
  66. status=run.status,
  67. mode=mode,
  68. observation=observation,
  69. hypotheses=plan.hypotheses,
  70. probe_evidence=run.probe_evidence,
  71. experiments=run.experiments,
  72. conclusion=run.conclusion,
  73. )