PMFlow/backend/app/models/reply_iteration.py

259 lines
13 KiB
Python

"""回复质量迭代相关模型。"""
from __future__ import annotations
from typing import Any, Optional
from sqlalchemy import BigInteger, ForeignKey, Integer, Text, UniqueConstraint, VARCHAR
from sqlalchemy.orm import Mapped, mapped_column
from .base import Base
from .types import JSONB
class QualityAsset(Base):
__tablename__ = "quality_assets"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
project_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
asset_type: Mapped[str] = mapped_column(VARCHAR(16), nullable=False, index=True)
status: Mapped[str] = mapped_column(VARCHAR(16), nullable=False, default="approved", index=True)
source_feedback_record_id: Mapped[Optional[int]] = mapped_column(
Integer,
ForeignKey("feedback_center_records.id", ondelete="SET NULL"),
nullable=True,
index=True,
)
qa_record_id: Mapped[Optional[int]] = mapped_column(
Integer,
ForeignKey("qa_records.id", ondelete="SET NULL"),
nullable=True,
index=True,
)
ai_call_log_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, index=True)
prompt_key: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True, index=True)
workflow_type: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True)
asked_via: Mapped[Optional[str]] = mapped_column(VARCHAR(32), nullable=True, index=True)
planned_tier: Mapped[Optional[str]] = mapped_column(VARCHAR(16), nullable=True, index=True)
executed_tier: Mapped[Optional[str]] = mapped_column(VARCHAR(16), nullable=True, index=True)
route_source: Mapped[Optional[str]] = mapped_column(VARCHAR(32), nullable=True)
route_rule_name: Mapped[Optional[str]] = mapped_column(VARCHAR(255), nullable=True)
question_text: Mapped[str] = mapped_column(Text, nullable=False)
answer_text: Mapped[str] = mapped_column(Text, nullable=False)
corrected_answer: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
source_snapshot: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
tags: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
approved_by: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
approved_at: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True)
class QualityAssetPair(Base):
__tablename__ = "quality_asset_pairs"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
project_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
pair_type: Mapped[str] = mapped_column(VARCHAR(24), nullable=False, default="preference", index=True)
status: Mapped[str] = mapped_column(VARCHAR(16), nullable=False, default="approved", index=True)
chosen_asset_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("quality_assets.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
rejected_asset_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("quality_assets.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
reason_text: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
approved_by: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
approved_at: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True)
class JudgeRun(Base):
__tablename__ = "judge_runs"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
project_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
asset_id: Mapped[Optional[int]] = mapped_column(
Integer,
ForeignKey("quality_assets.id", ondelete="CASCADE"),
nullable=True,
index=True,
)
pair_id: Mapped[Optional[int]] = mapped_column(
Integer,
ForeignKey("quality_asset_pairs.id", ondelete="CASCADE"),
nullable=True,
index=True,
)
prompt_key: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True, index=True)
workflow_type: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True, index=True)
asked_via: Mapped[Optional[str]] = mapped_column(VARCHAR(32), nullable=True, index=True)
planned_tier: Mapped[Optional[str]] = mapped_column(VARCHAR(16), nullable=True, index=True)
executed_tier: Mapped[Optional[str]] = mapped_column(VARCHAR(16), nullable=True, index=True)
route_rule_name: Mapped[Optional[str]] = mapped_column(VARCHAR(255), nullable=True)
judge_status: Mapped[str] = mapped_column(VARCHAR(16), nullable=False, default="completed", index=True)
bucket_key: Mapped[str] = mapped_column(VARCHAR(255), nullable=False, index=True)
rule_score: Mapped[Optional[float]] = mapped_column(nullable=True)
llm_score: Mapped[Optional[float]] = mapped_column(nullable=True)
overall_score: Mapped[Optional[float]] = mapped_column(nullable=True)
findings: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
llm_evidence: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
metadata_json: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
class OptimizerCandidate(Base):
__tablename__ = "optimizer_candidates"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
project_id: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
judge_run_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("judge_runs.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
candidate_type: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, index=True)
target_type: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, index=True)
target_ref: Mapped[str] = mapped_column(VARCHAR(255), nullable=False, index=True)
status: Mapped[str] = mapped_column(VARCHAR(24), nullable=False, default="draft", index=True)
suggestion: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
evidence: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
class PromptRelease(Base):
__tablename__ = "prompt_releases"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
prompt_key: Mapped[str] = mapped_column(VARCHAR(128), nullable=False, index=True)
version: Mapped[int] = mapped_column(Integer, nullable=False, default=1)
body_snapshot: Mapped[str] = mapped_column(Text, nullable=False)
status: Mapped[str] = mapped_column(VARCHAR(16), nullable=False, default="draft", index=True)
notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
created_by: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
activated_by: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
activated_at: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True)
__table_args__ = (
UniqueConstraint("tenant_id", "prompt_key", "version", name="uq_prompt_releases_tenant_key_version"),
)
class PromptReleaseCheck(Base):
__tablename__ = "prompt_release_checks"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
prompt_key: Mapped[str] = mapped_column(VARCHAR(128), nullable=False, index=True)
release_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("prompt_releases.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
check_type: Mapped[str] = mapped_column(VARCHAR(48), nullable=False, index=True)
status: Mapped[str] = mapped_column(VARCHAR(24), nullable=False, index=True)
severity: Mapped[str] = mapped_column(VARCHAR(16), nullable=False, default="info", index=True)
summary: Mapped[str] = mapped_column(Text, nullable=False)
details_json: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
created_by: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
completed_at: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True)
class PromptGoldenCase(Base):
__tablename__ = "prompt_golden_cases"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
prompt_key: Mapped[str] = mapped_column(VARCHAR(128), nullable=False, index=True)
case_name: Mapped[str] = mapped_column(VARCHAR(255), nullable=False)
status: Mapped[str] = mapped_column(VARCHAR(24), nullable=False, default="active", index=True)
input_payload: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
expected_contract: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
expected_contains: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
source: Mapped[str] = mapped_column(VARCHAR(48), nullable=False, default="manual", index=True)
source_ai_call_log_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, index=True)
case_type: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="regression", index=True)
priority: Mapped[str] = mapped_column(VARCHAR(24), nullable=False, default="blocking", index=True)
scenario_key: Mapped[Optional[str]] = mapped_column(VARCHAR(128), nullable=True, index=True)
tags: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
last_run_status: Mapped[Optional[str]] = mapped_column(VARCHAR(24), nullable=True, index=True)
last_failed_at: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True)
created_by: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
class PromptReplayRun(Base):
__tablename__ = "prompt_replay_runs"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
prompt_key: Mapped[str] = mapped_column(VARCHAR(128), nullable=False, index=True)
release_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("prompt_releases.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
baseline_release_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, index=True)
run_status: Mapped[str] = mapped_column(VARCHAR(24), nullable=False, default="pending", index=True)
run_mode: Mapped[str] = mapped_column(VARCHAR(32), nullable=False, default="contract_smoke", index=True)
case_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
passed_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
failed_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
warning_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
score_delta: Mapped[Optional[float]] = mapped_column(nullable=True)
summary: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
risk_flags_json: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
created_by: Mapped[Optional[int]] = mapped_column(BigInteger, nullable=True, index=True)
started_at: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True)
completed_at: Mapped[Optional[str]] = mapped_column(VARCHAR(64), nullable=True)
class PromptReplayCaseResult(Base):
__tablename__ = "prompt_replay_case_results"
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
run_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("prompt_replay_runs.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
golden_case_id: Mapped[int] = mapped_column(
Integer,
ForeignKey("prompt_golden_cases.id", ondelete="CASCADE"),
nullable=False,
index=True,
)
prompt_key: Mapped[str] = mapped_column(VARCHAR(128), nullable=False, index=True)
release_id: Mapped[int] = mapped_column(Integer, nullable=False, index=True)
baseline_output: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
candidate_output: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
status: Mapped[str] = mapped_column(VARCHAR(24), nullable=False, index=True)
contract_result_json: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
diff_summary: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
risk_flags_json: Mapped[Optional[Any]] = mapped_column(JSONB, nullable=True)
baseline_ai_call_log_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, index=True)
candidate_ai_call_log_id: Mapped[Optional[int]] = mapped_column(Integer, nullable=True, index=True)
judge_score: Mapped[Optional[float]] = mapped_column(nullable=True)
judge_label: Mapped[Optional[str]] = mapped_column(VARCHAR(32), nullable=True, index=True)
judge_reason: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
latency_ms: Mapped[Optional[int]] = mapped_column(Integer, nullable=True)
estimated_cost: Mapped[Optional[float]] = mapped_column(nullable=True)
error_summary: Mapped[Optional[str]] = mapped_column(Text, nullable=True)
__all__ = [
"QualityAsset",
"QualityAssetPair",
"JudgeRun",
"OptimizerCandidate",
"PromptRelease",
"PromptReleaseCheck",
"PromptGoldenCase",
"PromptReplayRun",
"PromptReplayCaseResult",
]