PMFlow/backend/app/models/reply_iteration.py

153 lines
7.3 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"),
)
__all__ = [
"QualityAsset",
"QualityAssetPair",
"JudgeRun",
"OptimizerCandidate",
"PromptRelease",
]