models.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. from __future__ import annotations
  2. from typing import Any, Literal, Optional
  3. from pydantic import BaseModel, ConfigDict
  4. class ViewModel(BaseModel):
  5. model_config = ConfigDict(extra="forbid")
  6. class RunSummary(ViewModel):
  7. script_build_id: int
  8. title: str
  9. status: str
  10. checkpoint: str
  11. root_trace_id: str
  12. revision: int
  13. task_count: int
  14. attempt_count: int
  15. planner_turn_count: int
  16. current_focus_task_id: Optional[str]
  17. current_gap: str
  18. created_at: str
  19. updated_at: str
  20. class TaskNode(ViewModel):
  21. task_id: str
  22. display_path: str
  23. parent_task_id: Optional[str]
  24. child_task_ids: list[str]
  25. task_kind: str
  26. phase: str
  27. objective: str
  28. status: str
  29. blocked_reason: Optional[str]
  30. attempt_count: int
  31. validation_count: int
  32. decision_count: int
  33. current_spec_version: int
  34. acceptance_criteria: list[dict[str, Any]]
  35. context_refs: list[str]
  36. created_at: str
  37. updated_at: str
  38. class PlannerTurn(ViewModel):
  39. turn_id: str
  40. order: int
  41. message_sequence: int
  42. phase: str
  43. action: str
  44. action_label: str
  45. summary: str
  46. observable_reasoning: str
  47. result_summary: str
  48. status: Literal["succeeded", "failed", "unknown"]
  49. focus_task_id: Optional[str]
  50. affected_task_ids: list[str]
  51. visible_task_ids: list[str]
  52. tool_name: str
  53. tool_arguments: dict[str, Any]
  54. tokens: int
  55. cost: float
  56. created_at: str
  57. class LifecycleEvent(ViewModel):
  58. event_id: str
  59. kind: Literal["task", "attempt", "validation", "decision"]
  60. title: str
  61. status: str
  62. summary: str
  63. created_at: str
  64. attempt_id: Optional[str] = None
  65. class AgentStep(ViewModel):
  66. sequence: int
  67. role: str
  68. step_kind: Literal["instruction", "explanation", "tool_call", "tool_result"]
  69. title: str
  70. text: str
  71. tool_name: Optional[str]
  72. tool_arguments: Optional[dict[str, Any]]
  73. tokens: int
  74. cost: float
  75. duration_ms: Optional[float]
  76. created_at: str
  77. class DataUsage(ViewModel):
  78. inherited_inputs: list[dict[str, Any]]
  79. confirmed_reads: list[dict[str, Any]]
  80. produced_outputs: list[dict[str, Any]]
  81. adoption: list[dict[str, Any]]
  82. class AttemptDetail(ViewModel):
  83. attempt_id: str
  84. task_id: str
  85. status: str
  86. worker_preset: Optional[str]
  87. worker_trace_id: Optional[str]
  88. execution_mode: Optional[str]
  89. started_at: Optional[str]
  90. completed_at: Optional[str]
  91. total_tokens: int
  92. total_cost: float
  93. error: Optional[Any]
  94. submission: Optional[dict[str, Any]]
  95. validation: Optional[dict[str, Any]]
  96. decision: Optional[dict[str, Any]]
  97. prompt: str
  98. steps: list[AgentStep]
  99. class TaskDetail(ViewModel):
  100. task: TaskNode
  101. contract: Optional[dict[str, Any]]
  102. lifecycle: list[LifecycleEvent]
  103. attempts: list[AttemptDetail]
  104. data_usage: DataUsage
  105. class ExecutionView(ViewModel):
  106. schema_version: Literal["script-build-execution-view/v1"]
  107. data_mode: Literal["persisted-real-run"]
  108. generated_at: str
  109. run: RunSummary
  110. planner_turns: list[PlannerTurn]
  111. tasks: list[TaskNode]
  112. snapshot_basis: str
  113. warnings: list[str]