models.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from __future__ import annotations
  2. from typing import Any, Literal, Optional
  3. from pydantic import BaseModel, ConfigDict, Field
  4. class ViewModel(BaseModel):
  5. model_config = ConfigDict(extra="forbid")
  6. class RunSummary(ViewModel):
  7. script_build_id: int
  8. status: str
  9. summary: str
  10. started_at: Optional[str] = None
  11. completed_at: Optional[str] = None
  12. class InputSummary(ViewModel):
  13. topic: str
  14. account_name: Optional[str] = None
  15. persona_point_count: int = 0
  16. strategy_names: list[str] = Field(default_factory=list)
  17. snapshot_id: str
  18. digest: str
  19. class DataRef(ViewModel):
  20. label: str
  21. kind: str
  22. ref: Optional[str] = None
  23. detail: Optional[str] = None
  24. class ContractNarration(ViewModel):
  25. action: str
  26. reasoning: str
  27. goals: list[str]
  28. inputs: list[str]
  29. output: str
  30. criteria: list[str]
  31. class ProcessView(ViewModel):
  32. label: str
  33. actor: str
  34. tool_name: Optional[str] = None
  35. trace_id: Optional[str] = None
  36. details: dict[str, Any] = Field(default_factory=dict)
  37. class StepEvidence(ViewModel):
  38. contract: Optional[dict[str, Any]] = None
  39. tool_calls: list[dict[str, Any]] = Field(default_factory=list)
  40. artifact_refs: list[dict[str, Any]] = Field(default_factory=list)
  41. validation: Optional[dict[str, Any]] = None
  42. decision: Optional[dict[str, Any]] = None
  43. class JourneyStep(ViewModel):
  44. step_id: str
  45. sequence: int = 0
  46. step_type: Literal["plan", "execute", "validate", "decide"]
  47. title: str
  48. status: str
  49. task_id: str
  50. attempt_id: Optional[str] = None
  51. validation_id: Optional[str] = None
  52. decision_id: Optional[str] = None
  53. reasoning: str
  54. reasoning_source: Literal["observable", "contract", "validation", "decision", "system"]
  55. process: ProcessView
  56. input_data: list[DataRef] = Field(default_factory=list)
  57. output_data: list[DataRef] = Field(default_factory=list)
  58. contract: Optional[ContractNarration] = None
  59. parallel_group_id: Optional[str] = None
  60. parallel_position: Optional[int] = None
  61. parallel_total: Optional[int] = None
  62. model: Optional[str] = None
  63. tokens: Optional[int] = None
  64. cost: Optional[float] = None
  65. duration_ms: Optional[int] = None
  66. created_at: str
  67. evidence: StepEvidence
  68. class JourneyEdge(ViewModel):
  69. edge_id: str
  70. source: str
  71. target: str
  72. relation: Literal["sequence", "creates", "validates", "decides", "loop"]
  73. label: str
  74. class JourneyView(ViewModel):
  75. schema_version: Literal["script-build-journey/v1"]
  76. generated_at: str
  77. script_build_id: int
  78. root_trace_id: str
  79. status: str
  80. objective: str
  81. input_summary: InputSummary
  82. steps: list[JourneyStep]
  83. edges: list[JourneyEdge]
  84. warnings: list[str]