ai_agents / src /qa_platform /models.py
tomas.helmfridsson
token counter
c1dbaf4
Raw History Blame Contribute Delete
3.65 kB
from __future__ import annotations
from dataclasses import asdict, dataclass, field
from typing import Any
@dataclass
class AgentRuntimeConfig:
agent_key: str
agent_name: str
execution_mode: str
timeout_seconds: int = 60
provider_strategy: str = ""
model_family: str = ""
model_override: str = ""
model_id: str = ""
directives: str = ""
@dataclass
class RunControlConfig:
max_rounds: int
max_feedback_messages: int
max_feedback_per_agent_pair: int
@dataclass
class WorkingMemory:
shared: dict[str, Any] = field(default_factory=dict)
agent_private: dict[str, dict[str, Any]] = field(default_factory=dict)
timeline: list[str] = field(default_factory=list)
def read_shared(self, key: str, default: Any = None) -> Any:
return self.shared.get(key, default)
def write_shared(self, key: str, value: Any, *, author: str | None = None) -> None:
self.shared[key] = value
if author:
self.timeline.append(f"{author} wrote shared memory key '{key}'.")
def read_agent(self, agent_key: str, key: str, default: Any = None) -> Any:
return self.agent_private.get(agent_key, {}).get(key, default)
def write_agent(self, agent_key: str, key: str, value: Any) -> None:
self.agent_private.setdefault(agent_key, {})[key] = value
self.timeline.append(f"{agent_key} updated private memory key '{key}'.")
def add_note(self, note: str) -> None:
if note.strip():
self.timeline.append(note.strip())
@dataclass
class RunSession:
title: str
source_requirements: str
working_memory: WorkingMemory = field(default_factory=WorkingMemory)
@dataclass
class RequirementItem:
requirement_id: str
original_text: str
normalized_text: str
priority: str
acceptance_criteria: list[str]
assumptions: list[str] = field(default_factory=list)
@dataclass
class TestCaseDesign:
test_case_id: str
requirement_id: str
title: str
test_type: str
preconditions: list[str]
steps: list[str]
expected_results: list[str]
oracle: str
risks: list[str] = field(default_factory=list)
@dataclass
class GeneratedArtifact:
artifact_id: str
requirement_id: str
design_id: str
target: str
test_name: str
test_data: dict[str, Any]
selectors: list[str]
pseudocode: list[str]
@dataclass
class ReviewReport:
approved: bool
coverage_ratio: float
findings: list[str]
improvement_actions: list[str]
@dataclass
class StageTrace:
iteration: int
stage_index: int
agent_name: str
input_summary: list[str]
output_summary: list[str]
status: str
reasoning_trace: list[str] = field(default_factory=list)
reasoning_source: str = "structured_trace"
agent_explanation: str = ""
decision_explanation: str = ""
duration_ms: int = 0
prompt_tokens: int | None = None
completion_tokens: int | None = None
total_tokens: int | None = None
@dataclass
class PipelineResult:
title: str
source_requirements: str
requirements: list[RequirementItem]
test_designs: list[TestCaseDesign]
generated_artifacts: list[GeneratedArtifact]
review: ReviewReport
iterations: int
run_controls: RunControlConfig
total_feedback_messages: int = 0
pair_feedback_counts: dict[str, int] = field(default_factory=dict)
agent_configs: list[AgentRuntimeConfig] = field(default_factory=list)
stage_traces: list[StageTrace] = field(default_factory=list)
run_session: RunSession | None = None
def to_dict(self) -> dict[str, Any]:
return asdict(self)