"""带机器码的 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" #: 设置(api/settings.py):对外访问地址由环境变量 AGENTLAB_PUBLIC_URL 指定时,设置里那一项不能改成别的值(409) PUBLIC_URL_ENV_LOCKED = "public_url_env_locked" 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)