"""comparison_record: llm_cost_yuan + llm_price_snapshot(比价 LLM 调用成本 + 当时单价快照) 回填 llm_calls 时按「当时的价」逐模型算出本次比价 LLM 总成本(元),连同所用单价快照一起冻结到 记录上;admin 比价记录详情展示实际成本(旧记录 NULL → 前端回退估算)。见 services/llm_cost.py。 Revision ID: comparison_llm_cost Revises: ad_ecpm_trace_id Create Date: 2026-07-13 """ from collections.abc import Sequence import sqlalchemy as sa from sqlalchemy.dialects import postgresql from alembic import op revision: str = "comparison_llm_cost" down_revision: str | Sequence[str] | None = "ad_ecpm_trace_id" branch_labels: str | Sequence[str] | None = None depends_on: str | Sequence[str] | None = None _JSONB = sa.JSON().with_variant(postgresql.JSONB(), "postgresql") def upgrade() -> None: # 均可空、无索引;SQLite 原生支持 ADD COLUMN,无需 batch_alter_table(同 comparison_debug_fields)。 op.add_column("comparison_record", sa.Column("llm_cost_yuan", sa.Float(), nullable=True)) op.add_column("comparison_record", sa.Column("llm_price_snapshot", _JSONB, nullable=True)) def downgrade() -> None: op.drop_column("comparison_record", "llm_price_snapshot") op.drop_column("comparison_record", "llm_cost_yuan")