Files
AgentLab/backend/app/ledger/settings.py
T
ThearchyHelios eddeded2a4 全栈安全加固、性能提速与架构演进:连接池与沙箱止血、双路混合检索、多版本归档及前端分包治理
- 第一批(安全加固与生命周期止血):隔离测试宿主机密钥与 .env 泄漏;修复 SQLite 取消查询挂死、:memory: 连接池报错与 EngineCache 世代竞态;补齐运行与评测删除时的 Checkpointer 线程、Artifact 磁盘文件与无主附件回收;加固三套沙箱路径越界、进程组清理与 Seatbelt 数据目录隔离,封堵 SSRF IPv4-mapped IPv6 元数据绕过与响应体 OOM;修复推理模型多轮 reasoning_content、结构化输出 Token 漏计与缓存折扣计费
- 第二批(数据库/集群/问数提速与首屏分包):补齐核心表索引与 SQLite WAL 调优,列表接口按需 defer 大列,收敛启动扫描并打通跨进程 slot 槽位唤醒;优化跨源全局选表、哈希桶数字绑定、流式 CSV 导入及多方言分析算子;剥离首屏静态引入的 @xyflow/react 与全局样式(首屏主包降至 461.59 kB),补充流式 rAF 攒批、Store 精细订阅与表单无障碍绑定
- 第三批(架构演进与工程自动化闭环):记录库超挂接阈值历史版本自动增量归档至单库多表(解除 SQLite 10 库 ATTACH 硬上限);重构知识库为词面 BM25 与全集合归一化向量矩阵真·双路独立召回并支持游标分批重建;升级多方言感知 SQL 模板词法分析(E'...' / $$...$$ / q'[...]' / # / 嵌套注释)与 Decimal / bool / NaN 参数校验,消除 ledger 层对 api 路由层的反向依赖;拆分 3101 行 CaliberDrafts 页面为 7 个领域子模块,消除检查脚本本机路径硬编码并新增 GitHub Actions CI 门禁与三批回归测试套件
2026-11-13 14:51:36 +08:00

93 lines
4.1 KiB
Python

"""口径账本运行与治理设置:默认项、范围校验与持久化读取(供 ledger 领域层与设置接口共用)。"""
from __future__ import annotations
from typing import Any
from sqlalchemy.ext.asyncio import AsyncSession
from app.db.models import Setting
LEDGER_GROUP = "ledger"
LEDGER_DEFAULTS: dict[str, Any] = {
"auto_issue": True,
"issue_daily_limit": 20,
"match_timeout_s": 8,
"recall_limit": 50,
}
LEDGER_SETTING_LABEL = {
"auto_issue": "自动按口径正式出具",
"issue_daily_limit": "按口径正式出具每日上限",
"match_timeout_s": "口径比对时限(秒)",
"recall_limit": "口径升版后每次最多重算几组",
}
LEDGER_RECALL_MAX = 1000
LEDGER_TIMEOUT_RANGE = (1, 60)
LEDGER_DAILY_LIMIT_MAX = 100_000
def _daily_limit_ok(value: Any) -> bool:
return isinstance(value, int) and not isinstance(value, bool) and 0 <= value <= LEDGER_DAILY_LIMIT_MAX
def _timeout_ok(value: Any) -> bool:
return isinstance(value, (int, float)) and not isinstance(value, bool) \
and LEDGER_TIMEOUT_RANGE[0] <= value <= LEDGER_TIMEOUT_RANGE[1]
def _recall_limit_ok(value: Any) -> bool:
return isinstance(value, int) and not isinstance(value, bool) and 0 <= value <= LEDGER_RECALL_MAX
def ledger_problem(value: Any) -> str | None:
"""设置页写进来的 ledger 这一组有什么问题,没问题返回 None。"""
if not isinstance(value, dict):
return f"「口径账本」设置格式有误,需要是一个对象,当前为「{value}」"
for key, item in value.items():
if key not in LEDGER_DEFAULTS:
return (f"「口径账本」设置中不支持「{key}」,可设置的项:"
+ "、".join(f"「{LEDGER_SETTING_LABEL[k]}」" for k in LEDGER_DEFAULTS))
if key == "auto_issue" and not isinstance(item, bool):
return f"「{LEDGER_SETTING_LABEL[key]}」只能是开或关,当前为「{item}」"
if key == "issue_daily_limit" and not _daily_limit_ok(item):
return (f"「{LEDGER_SETTING_LABEL[key]}」需要是 0 到 {LEDGER_DAILY_LIMIT_MAX:,} 之间的整数(0 表示不再按口径出具),"
f"当前为「{item}」")
if key == "recall_limit" and not _recall_limit_ok(item):
return (f"「{LEDGER_SETTING_LABEL[key]}」需要是 0 到 {LEDGER_RECALL_MAX:,} 之间的整数(0 表示发布后不自动重算),"
f"当前为「{item}」")
if key == "match_timeout_s" and not _timeout_ok(item):
return (f"「{LEDGER_SETTING_LABEL[key]}」需要是 {LEDGER_TIMEOUT_RANGE[0]} 到 {LEDGER_TIMEOUT_RANGE[1]} 之间的数,"
f"当前为「{item}」")
return None
def ledger_values(stored: Any) -> dict[str, Any]:
"""库里存的(或刚写进来的)ledger 一组 → 补齐默认;存坏了的项按默认(自动出具的开关存坏了按关,宁可少出具)。"""
stored = stored if isinstance(stored, dict) else {}
auto, limit, timeout = stored.get("auto_issue"), stored.get("issue_daily_limit"), stored.get("match_timeout_s")
recall = stored.get("recall_limit")
return {
"auto_issue": auto if isinstance(auto, bool) else (LEDGER_DEFAULTS["auto_issue"] if auto is None else False),
"issue_daily_limit": limit if _daily_limit_ok(limit) else LEDGER_DEFAULTS["issue_daily_limit"],
"match_timeout_s": timeout if _timeout_ok(timeout) else LEDGER_DEFAULTS["match_timeout_s"],
"recall_limit": recall if _recall_limit_ok(recall) else LEDGER_DEFAULTS["recall_limit"],
}
async def ledger_settings(session: AsyncSession) -> dict[str, Any]:
"""设置里的 ledger 一组,没存过的补默认。按口径出具、比对从这里读。"""
row = await session.get(Setting, LEDGER_GROUP)
return ledger_values(row.value if row else None)
__all__ = [
"LEDGER_DAILY_LIMIT_MAX",
"LEDGER_DEFAULTS",
"LEDGER_GROUP",
"LEDGER_RECALL_MAX",
"LEDGER_SETTING_LABEL",
"LEDGER_TIMEOUT_RANGE",
"ledger_problem",
"ledger_settings",
"ledger_values",
]