All checks were successful
CI / test (pull_request) Successful in 4m3s
- token 用量接入:ModelGateway 经 adapter.parse_usage 累计评测侧 LLM 调用的 token 消耗,引擎写入 run.summary.eval_token_usage,报告透出 - 放弃率落地:CaseOutcome 新增 abandoned 标记(对话中途发送/接收失败), build_run_summary 统计 abandoned_cases / abandonment_rate - Go/No-Go 可配置:Scenario 新增 acceptance_criteria 字段(DB 列 + 幂等迁移), 报告按场景标准出 verdict,缺省回退全局默认;标准变更不触发考纲升版
43 lines
1.3 KiB
Python
43 lines
1.3 KiB
Python
"""add acceptance_criteria column to scenarios
|
|
|
|
Revision ID: 3f8a2c91d4e7
|
|
Revises: d5f6193ba7c8
|
|
Create Date: 2026-08-25 10:00:00.000000
|
|
|
|
"""
|
|
from typing import Sequence, Union
|
|
|
|
import sqlalchemy as sa
|
|
from alembic import op
|
|
from sqlalchemy import inspect
|
|
|
|
# revision identifiers, used by Alembic.
|
|
revision: str = '3f8a2c91d4e7'
|
|
down_revision: Union[str, Sequence[str], None] = 'd5f6193ba7c8'
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
|
depends_on: Union[str, Sequence[str], None] = None
|
|
|
|
|
|
def _column_exists(inspector, table_name: str, column_name: str) -> bool:
|
|
columns = inspector.get_columns(table_name)
|
|
return any(col['name'] == column_name for col in columns)
|
|
|
|
|
|
def upgrade() -> None:
|
|
"""Add scenarios.acceptance_criteria for per-scenario go/no-go thresholds."""
|
|
conn = op.get_bind()
|
|
inspector = inspect(conn)
|
|
|
|
if not _column_exists(inspector, 'scenarios', 'acceptance_criteria'):
|
|
with op.batch_alter_table('scenarios', schema=None) as batch_op:
|
|
batch_op.add_column(sa.Column('acceptance_criteria', sa.Text(), nullable=True))
|
|
|
|
|
|
def downgrade() -> None:
|
|
conn = op.get_bind()
|
|
inspector = inspect(conn)
|
|
|
|
if _column_exists(inspector, 'scenarios', 'acceptance_criteria'):
|
|
with op.batch_alter_table('scenarios', schema=None) as batch_op:
|
|
batch_op.drop_column('acceptance_criteria')
|