CI / lint / typecheck / import-linter / tests / secrets (push) Canceled after 0s
- agent: ag_conversation/ag_message 表(迁移0007),上下文组装注入最近报告画像摘要 (report.profile.latest_profile_summary 经 apps 层闭包注入,同层不互调),历史带最近 AGENT_HISTORY_TURNS=10 轮;POST/GET /agent/conversations 与消息历史接口 - agent 修复:ChatRequest.conversation_id 改 str(雪花ID超2^53,JS Number丢精度); _build_context 挪进 reserve commit 后同一 try,异常走 refund 兜底 - report: rp_feedback(维度反馈 upsert,认同率/修正率 SQL 可算,T-P3-21 最小版—— L1 记忆未建,不回写结论)+ rp_reservation(预约留资幂等,T-P3-22,预约率口径 行数/full_report.card_view 去重曝光,门槛≥8%),迁移0008 - 测试:全量 606 passed;ruff/mypy/lint-imports 全绿;E2E 真实 deepseek-v4-flash 验证 画像注入与历史携带
69 lines
3.0 KiB
Python
69 lines
3.0 KiB
Python
"""报告结论反馈 + 全面报告预约留资(T-P3-21 最小可用版 / T-P3-22)。
|
|
|
|
rp_feedback — 维度级结论反馈(准/不准 + 可选修正文本);
|
|
UniqueConstraint(report_id, dimension_key) 承载 upsert 语义:
|
|
同维度重复反馈 = 覆盖更新,不是堆行。
|
|
有意裁剪(T-P3-21 原文的「修正后置信度置 1.0 并即时写 L1 记忆」):
|
|
L1 记忆系统未建,本迭代只落表,保证认同率/修正率两项指标
|
|
可从 SQL 直接算出,不回写报告结论。
|
|
rp_reservation — 预约留资;topic 预留通用性(首期只有 full_report)。
|
|
UniqueConstraint(user_id, topic) 承载幂等:重复预约返回已有
|
|
记录(created=false),不堆行。
|
|
指标口径:预约率 = rp_reservation(topic='full_report') 行数 ÷
|
|
埋点 full_report.card_view 去重曝光数;决策门槛 ≥8%
|
|
(产品方案 §2.2.3)。
|
|
|
|
Reversible: 是。
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Sequence
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
|
|
revision: str = "0008"
|
|
down_revision: str | None = "0007"
|
|
branch_labels: str | Sequence[str] | None = None
|
|
depends_on: str | Sequence[str] | None = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
op.create_table(
|
|
"rp_feedback",
|
|
sa.Column("feedback_id", sa.BigInteger(), nullable=False),
|
|
sa.Column("report_id", sa.BigInteger(), nullable=False),
|
|
sa.Column("user_id", sa.BigInteger(), nullable=False),
|
|
sa.Column("dimension_key", sa.String(length=64), nullable=False),
|
|
sa.Column("verdict", sa.String(length=16), nullable=False),
|
|
sa.Column("correction", sa.Text(), nullable=True),
|
|
sa.Column(
|
|
"created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()
|
|
),
|
|
sa.Column(
|
|
"updated_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()
|
|
),
|
|
sa.PrimaryKeyConstraint("feedback_id"),
|
|
sa.UniqueConstraint("report_id", "dimension_key", name="uq_rp_feedback_report_dimension"),
|
|
)
|
|
op.create_index("ix_rp_feedback_user_created", "rp_feedback", ["user_id", "created_at"])
|
|
|
|
op.create_table(
|
|
"rp_reservation",
|
|
sa.Column("reservation_id", sa.BigInteger(), nullable=False),
|
|
sa.Column("user_id", sa.BigInteger(), nullable=False),
|
|
sa.Column("topic", sa.String(length=32), nullable=False),
|
|
sa.Column(
|
|
"created_at", sa.DateTime(timezone=True), nullable=False, server_default=sa.func.now()
|
|
),
|
|
sa.PrimaryKeyConstraint("reservation_id"),
|
|
sa.UniqueConstraint("user_id", "topic", name="uq_rp_reservation_user_topic"),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_table("rp_reservation")
|
|
op.drop_index("ix_rp_feedback_user_created", table_name="rp_feedback")
|
|
op.drop_table("rp_feedback")
|