feat: cloud 门禁/超时/成本/沙箱收敛为单一判定源
- 新增标准库叶子层 timeouts/gates/quota/sandbox_policy: 审批 3600 与单轮 600 各有名常量与环境覆盖层,已建项 expires_at 永不重算;目录/控制/合并状态门禁统一判定, 目录违规无任何覆盖参数;配额取数与比较唯一来源 (USD 先于无价、命中均为 >=、无价只计 actual 行); /tmp 隔离矩阵与失联清理判定纯函数化。 - 调用点委托:server/worker/automations/auto_memory 的 配额 SQL 与比较、server/tree/marker 的目录解析、 marker 的控制门、sandbox 的任务容器名正则、两处 300 秒 陈旧阈值默认值均收敛,别名与错误文案不变。 - 统一两个 P0 口径分歧:服务端无价计数由全部 usd IS NULL 行改为 actual-only;显式不限额用户在服务端准入亦不受 无价上限约束(与 worker 运行时一致)。 - 不新增门禁种类与 record 模式(主线无此实现);不改 skill_seed/skills/SKILL.md;不改 v1.1 契约与分支保护。 - 新增 test_arch_converge.py 18 项。
This commit is contained in:
1 parent
2720acef46
commit
41e8c98512
16 files changed
+1068
-301
No files matched your search
+11
-21
@@ -59,6 +59,9 @@ import time
|
||||
|
||||
from cloud.db import connect as _db_connect
|
||||
from cloud.identity import IdentityStore
|
||||
from cloud.quota import default_quota_usd_micros as _quota_default
|
||||
from cloud.quota import monthly_usage as _quota_monthly_usage
|
||||
from cloud.quota import quota_for_owner as _quota_for_owner
|
||||
|
||||
DEFAULT_SETTINGS = {
|
||||
"generate_memories": 0,
|
||||
@@ -113,12 +116,9 @@ def redact_text(text):
|
||||
|
||||
|
||||
def _default_quota_usd_micros():
|
||||
"""与 worker/server 同款默认配额解析,避免循环 import。"""
|
||||
try:
|
||||
return max(0, int(os.environ.get(
|
||||
"CLOUD_DEFAULT_QUOTA_USD_MICROS", "10000000")))
|
||||
except (TypeError, ValueError):
|
||||
return 10000000
|
||||
"""默认配额解析:收敛到 cloud/quota.py(quota 模块是
|
||||
标准库叶子,不存在旧注释担心的循环 import)。"""
|
||||
return _quota_default()
|
||||
|
||||
|
||||
def quota_remaining_percent(db_path, owner):
|
||||
@@ -131,27 +131,17 @@ def quota_remaining_percent(db_path, owner):
|
||||
month = datetime.datetime.now(datetime.timezone.utc).strftime("%Y-%m")
|
||||
conn = _db_connect(db_path)
|
||||
try:
|
||||
conn.execute(
|
||||
"CREATE TABLE IF NOT EXISTS user_quotas("
|
||||
"user_id TEXT PRIMARY KEY, quota_usd_micros BIGINT, "
|
||||
"updated_at DOUBLE PRECISION)")
|
||||
# 配额行与当月 USD 用量取数收敛到 cloud/quota.py
|
||||
#(无价部分本函数不用,只取 USD 一项;缺 cost_records
|
||||
# 表时仍按旧行为计 0,其它查库异常仍抛给调用方)。
|
||||
quota = _quota_for_owner(conn, owner)
|
||||
conn.commit()
|
||||
row = conn.execute(
|
||||
"SELECT quota_usd_micros FROM user_quotas WHERE user_id = ?",
|
||||
(owner,)).fetchone()
|
||||
quota = _default_quota_usd_micros() if row is None else row[0]
|
||||
if quota is None:
|
||||
return None
|
||||
if quota <= 0:
|
||||
return 0.0
|
||||
try:
|
||||
used_row = conn.execute(
|
||||
"SELECT COALESCE(SUM(c.usd_micros), 0)"
|
||||
" FROM cost_records c JOIN tasks t"
|
||||
" ON c.task_id = t.id"
|
||||
" WHERE t.created_by = ? AND c.day LIKE ?",
|
||||
(owner, month + "%")).fetchone()
|
||||
used = used_row[0] if used_row else 0
|
||||
used, _unpriced = _quota_monthly_usage(conn, owner, month)
|
||||
except Exception as exc:
|
||||
if "no such table" in str(exc):
|
||||
used = 0
|
||||
|
||||
Reference in new issue
Block a user