From 4819b2126920ba868edadd08986ae3bf12dbf0e2 Mon Sep 17 00:00:00 2001 From: ThearchyHelios Date: Fri, 16 Oct 2026 09:43:08 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8B=E4=B8=80=E8=BD=AE=E7=AC=AC=201=20?= =?UTF-8?q?=E6=B3=A2=E7=9A=84=E5=A5=91=E7=BA=A6=E9=AA=A8=E6=9E=B6=EF=BC=9A?= =?UTF-8?q?=E8=BF=90=E8=A1=8C=E5=8A=A0=20end=5Freason=EF=BC=88=E4=BA=BA?= =?UTF-8?q?=E5=B7=A5=E9=A9=B3=E5=9B=9E=20/=20=E6=89=8B=E5=8A=A8=E5=81=9C?= =?UTF-8?q?=E6=AD=A2=EF=BC=89=EF=BC=8C=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=8A=A0=E7=9B=AE=E6=A0=87=E7=A7=8D=E7=B1=BB=E5=92=8C=20id?= =?UTF-8?q?=E3=80=81=E8=A7=A6=E5=8F=91=E8=AE=B0=E5=BD=95=E5=8A=A0=E8=AF=84?= =?UTF-8?q?=E6=B5=8B=20id=EF=BC=88=E5=AE=9A=E6=97=B6=E5=8F=AA=E6=9C=89?= =?UTF-8?q?=E4=B8=80=E5=A5=97=EF=BC=89=EF=BC=8C=E8=BF=90=E8=A1=8C=E6=9D=A5?= =?UTF-8?q?=E6=BA=90=E7=99=BB=E8=AE=B0=20eval=E3=80=81ledger=5Fissue?= =?UTF-8?q?=E3=80=81reconcile=E3=80=81recall=EF=BC=88=E9=83=BD=E5=8F=AA?= =?UTF-8?q?=E8=83=BD=E7=94=B1=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=86=99=EF=BC=89?= =?UTF-8?q?=EF=BC=9B=E8=BF=81=E7=A7=BB=E5=8F=AA=E5=8A=A0=E4=B8=8D=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/db/base.py | 6 ++++++ backend/app/db/models.py | 11 +++++++++++ backend/app/engine/origin.py | 5 +++++ frontend/src/lib/terms.ts | 4 ++++ frontend/src/typesApp.ts | 1 + 5 files changed, 27 insertions(+) diff --git a/backend/app/db/base.py b/backend/app/db/base.py index 98e28bc1..40204684 100644 --- a/backend/app/db/base.py +++ b/backend/app/db/base.py @@ -239,6 +239,12 @@ _COLUMN_MIGRATIONS: list[tuple[str, str, str]] = [ ("apps", "scope", "VARCHAR(20) DEFAULT 'shared'"), ("apps", "owner", "VARCHAR(100)"), ("apps", "blueprint_id", "VARCHAR(32)"), + # 下一轮(docs/design/next-round/00-总方案.md X4、X9):运行为什么结束在 cancelled;定时的目标种类和 id; + # 定时触发建的那次评测。存量行:end_reason 为空,target_kind 是 workflow(target_id 由 scheduler 按 workflow_id 读) + ("runs", "end_reason", "VARCHAR(20)"), + ("schedules", "target_kind", "VARCHAR(20) DEFAULT 'workflow'"), + ("schedules", "target_id", "VARCHAR(32)"), + ("schedule_fires", "eval_run_id", "VARCHAR(32)"), ] #: 迁移补上的列要建的索引:(索引名, 表, 列或多列)。create_all 不碰已有的表,表上新列的索引也就不会建。 diff --git a/backend/app/db/models.py b/backend/app/db/models.py index 7e3ad023..6c11c6bf 100644 --- a/backend/app/db/models.py +++ b/backend/app/db/models.py @@ -654,6 +654,9 @@ class Run(Base, TimestampMixin): input: Mapped[dict[str, Any]] = mapped_column(default=dict) output: Mapped[dict[str, Any]] = mapped_column(default=dict) error: Mapped[str | None] = mapped_column(Text, default=None) + # 运行为什么结束在 cancelled(docs/design/next-round/00-总方案.md X9):rejected 人工驳回、stopped 手动停止。 + # 其余终态、加这一列之前的运行为空 + end_reason: Mapped[str | None] = mapped_column(String(20), default=None) usage: Mapped[dict[str, Any]] = mapped_column(default=dict) # tokens / cost / 各节点耗时 started_at: Mapped[datetime | None] = mapped_column(default=None) finished_at: Mapped[datetime | None] = mapped_column(default=None) @@ -975,6 +978,12 @@ class Schedule(Base, TimestampMixin): id: Mapped[str] = mapped_column(String(32), primary_key=True, default=new_id) name: Mapped[str] = mapped_column(String(200), default="") + # 定时的目标(next-round X4,定时只有一套):workflow 发起工作流运行;eval_suite 跑一次评测题集; + # source_maintenance 维护一个数据源(探查、剖析、取值观察)。加这一列之前的任务都是 workflow + target_kind: Mapped[str] = mapped_column(String(20), default="workflow") + # 目标的 id:workflow 时同 workflow_id;其余两种是题集 id、数据源 id + target_id: Mapped[str | None] = mapped_column(String(32), default=None, index=True) + # 非空(老表的约束,只加不改的迁移放宽不了):目标不是工作流时存空串,读写都经 scheduler/service 里的一处封装 workflow_id: Mapped[str] = mapped_column(String(32), index=True) # 保存时的工作流名。工作流还在时接口给它现在的名字,删掉之后才用这一份 workflow_name: Mapped[str] = mapped_column(String(200), default="") @@ -1020,6 +1029,8 @@ class ScheduleFire(Base): # started | skipped_overlap | skipped_misfire | failed_to_start status: Mapped[str] = mapped_column(String(30), default="started") run_id: Mapped[str | None] = mapped_column(String(32), default=None, index=True) + # 目标是评测题集时,这一次触发建的那次评测(target_kind=eval_suite,next-round X4) + eval_run_id: Mapped[str | None] = mapped_column(String(32), default=None) reason: Mapped[str | None] = mapped_column(Text, default=None) # 渲染后的输入,就是交给运行的那一份 inputs: Mapped[dict[str, Any]] = mapped_column(default=dict) diff --git a/backend/app/engine/origin.py b/backend/app/engine/origin.py index dd50ce0a..6e418db8 100644 --- a/backend/app/engine/origin.py +++ b/backend/app/engine/origin.py @@ -24,6 +24,11 @@ ORIGIN_KINDS = ( "api", # 直接调接口,没说是哪 "trial", # 蓝图的试运行(探索运行,docs/design/normal-user-apps.md N4) "personal_app", # 个人应用的刷新(探索运行,N7) + # 下一轮(docs/design/next-round/00-总方案.md X1):都只能由服务端写 + "eval", # 评测:作答和算期望的运行(探索运行) + "ledger_issue", # 问数据的答案按已治理口径正式出具(正式运行) + "reconcile", # 口径对账:这次的取数和口径在同一份数据上各算一次(探索运行) + "recall", # 口径召回:新旧两版口径在同一份数据上各算一次(探索运行) ) #: 客户端在 POST /api/runs 里能声明的来源 diff --git a/frontend/src/lib/terms.ts b/frontend/src/lib/terms.ts index 6e4a5e4d..51fb6dba 100644 --- a/frontend/src/lib/terms.ts +++ b/frontend/src/lib/terms.ts @@ -5114,6 +5114,10 @@ export const ORIGIN_LABEL: Record = { api: '接口', trial: '蓝图试运行', personal_app: '个人应用刷新', + eval: '评测', + ledger_issue: '按口径正式出具', + reconcile: '口径对账', + recall: '口径召回', } export const ORIGIN_TEXT = { diff --git a/frontend/src/typesApp.ts b/frontend/src/typesApp.ts index 744c8beb..df2b6c2a 100644 --- a/frontend/src/typesApp.ts +++ b/frontend/src/typesApp.ts @@ -703,6 +703,7 @@ export interface NotifyChannelRow { export type OriginKind = | 'chat' | 'canvas' | 'launcher' | 'schedule' | 'app_entry' | 'app_view' | 'app_backfill' | 'hook' | 'api' | 'trial' | 'personal_app' + | 'eval' | 'ledger_issue' | 'reconcile' | 'recall' /** 查看的对象。caliber 是已发布口径卡上的指标(蓝图助手复用口径时看,服务端 look/calibers.py) */ export interface LookObject {