mirror of
https://github.com/ThearchyHelios/AgentLab.git
synced 2026-11-15 22:42:01 +00:00
6b3c737fb8
以前剖析是一次同步长请求,预算按整次算(max_queries 60、max_total_s 120),选 50 张表只做得完前两三张,其余整张记「查询次数用完」;不能停,关掉页面报告就没了,对业务库查了什么无从查。
- data/catalog_profile.py:检查逻辑和 _apply 并入规则原样保留,只换编排。公开的逐表入口 profile_table:先列全检查项(plan_checks,纯函数,范围的 profile_checks、建任务时列的检查项、执行用同一份;遮罩、多列、不在表结构里、指向视图的关系在这里就列成按规则跳过),第一条查询估行数(确知空表整张表跳过),逐项执行、进度回调,整张表结束写目录并和回调在同一次库操作里;停止时做完的项照常写、没做的记 cancelled 保留旧结论。_Runner 拆成整个任务一个的 SourceRunner(只读守卫、单条时限、任务级止损:连续 3 条失败、最近 10 条 7 条超时;最近 6 条 4 条超时提醒;每条查询留痕,SQL 经 normalize_sql 去掉字面量)和每张表一个的 TableBudget(用完只停这张表)。删掉同步的 profile_catalog、挑表前批量估行数(_skip_empty、PROFILE_DEFAULT_TABLES、PROFILE_PROBE_TABLES)和进程内 _RUNNING。设置换成 table_max_queries(1–200,缺省 40)、table_max_s(10–600,缺省 60),旧键 max_queries、max_total_s 启动时从库里删掉(migrate_settings,不折算:旧值按整次算,含义不同),保存时只摘掉不报错(without_legacy)。表助手的 run_query 和起草时核对有效记录条件改走单条查询入口 run_single_query,行为不变。
- data/catalog_profile_jobs.py:剖析任务的建(selected / needed / all 三种范围,排序同前:有待核实关系的在前、使用次数、表结构顺序;挑出 0 张 ProfileNothing)、排队(和同源起草按建立先后串行,waiting_for)、执行(每张表开始前重读数据源:停用或关掉剖析就停下;遮罩按最新设置)、停止、重试、启动标中断不续跑、保留最近 50 个结束的任务(某张表最近一次剖析所在的不删)、last_profile / profile_due 的查询、任务和逐表的接口形状。
- api/catalog.py:加 /profile-jobs(建、active、latest、{job_id}、tasks/{seq}、cancel、retry),登记在 /{table} 前面;删掉 POST /catalog/profile;清单每行加 last_profile、profile_due、profile_due_reason、profile_checks,顶层加 active_profile_job;单表加 last_profile;导入目录、同步起草遇到剖析任务 409 profile_busy。api/coded.py 加 profile_nothing、catalog_profile_finished;api/datasources.py 保存时摘掉旧键;main.py 启动时标中断加设置迁移,关停时停掉进行中的剖析。
- 测试:test_catalog_profile.py、test_catalog_profile_units.py、test_catalog_semantics.py 里打同步接口和旧设置键的改走任务和新键,检查逻辑的断言保留;同步接口的整次总量上限一条改成逐表次数、逐表时长两条。
48 lines
2.4 KiB
Python
48 lines
2.4 KiB
Python
"""带机器码的 HTTP 错误。
|
||
|
||
detail 仍是给人看的那一句,老前端照旧直接显示;code 是给程序认的稳定标识。
|
||
以前前端只能按 detail 的开头几个字认出某一类错误,文案一改就悄悄失灵。
|
||
"""
|
||
from __future__ import annotations
|
||
|
||
from fastapi import HTTPException, Request
|
||
from fastapi.responses import JSONResponse
|
||
|
||
#: 限定的数据源一个都不在了(删了或停用了),见 copilot._sources
|
||
DATASOURCE_SCOPE_EMPTY = "datasource_scope_empty"
|
||
|
||
#: 保存数据源时剖析设置不合规(422):field 是出错的那一项(table_max_queries……),说不清是哪一项时没有 field
|
||
PROFILE_SETTINGS_INVALID = "profile_settings_invalid"
|
||
#: 剖析任务开始不了(409,api/catalog.create_profile_job):未开启、数据源停用、没有表结构、快照被改动、这个源已有排队或
|
||
#: 进行中的剖析任务(导入目录、同步起草遇到剖析任务也是它)、按范围挑出 0 张表
|
||
PROFILE_DISABLED = "profile_disabled"
|
||
DATASOURCE_INACTIVE = "datasource_inactive"
|
||
SCHEMA_MISSING = "schema_missing"
|
||
PROFILE_BUSY = "profile_busy"
|
||
SNAPSHOT_TAMPERED = "snapshot_tampered"
|
||
PROFILE_NOTHING = "profile_nothing"
|
||
#: 要停止的剖析任务已经结束了(409)
|
||
CATALOG_PROFILE_FINISHED = "catalog_profile_finished"
|
||
#: 数据目录的后台起草任务(api/catalog.py 的 /catalog/draft-jobs):同一个源已有排队或进行中的任务(409,界面改去
|
||
#: GET /draft-jobs/active 显示那一个)、起草模型用不了(409,不建任务)、要停止的任务已经结束了(409)
|
||
CATALOG_DRAFT_BUSY = "catalog_draft_busy"
|
||
CATALOG_DRAFT_MODEL_UNAVAILABLE = "catalog_draft_model_unavailable"
|
||
CATALOG_DRAFT_FINISHED = "catalog_draft_finished"
|
||
|
||
|
||
class CodedHTTPException(HTTPException):
|
||
"""field:出错的是哪一项(表单据此把报错落到那一格)。可选,没有就不出现在返回里。"""
|
||
|
||
def __init__(self, status_code: int, detail: str, code: str, *, field: str | None = None) -> None:
|
||
super().__init__(status_code, detail)
|
||
self.code = code
|
||
self.field = field
|
||
|
||
|
||
async def coded_handler(_: Request, exc: Exception) -> JSONResponse:
|
||
assert isinstance(exc, CodedHTTPException)
|
||
content: dict[str, str] = {"detail": exc.detail, "code": exc.code}
|
||
if exc.field:
|
||
content["field"] = exc.field
|
||
return JSONResponse(status_code=exc.status_code, content=content, headers=exc.headers)
|