feat: 扩展 Sub2API 成本与余额运维

This commit is contained in:
Codex
2026-07-15 03:39:57 +02:00
parent 430538eb67
commit ef09b1d0a8
20 changed files with 584 additions and 44 deletions
@@ -1068,6 +1068,19 @@ def selected_account_details(token, accounts):
return details
def mutation_plan(detail, action, include_rules):
if PAYLOAD.get("kind") == "account-name":
before_name = str(detail.get("name") or "")
desired_name = str(PAYLOAD.get("name") or "")
return {
"accountName": before_name,
"accountId": detail.get("id"),
"change": "noop" if before_name == desired_name else "update",
"before": {"name": before_name},
"desired": {"name": desired_name},
"template": None,
"_kind": "account-name",
"_desiredName": desired_name,
}
if PAYLOAD.get("kind") == "priority":
before_priority = int(detail.get("priority") or 0)
desired_priority = int(PAYLOAD.get("priority"))
@@ -1114,7 +1127,12 @@ def write_mutation_plan(token, plan):
if plan["change"] == "noop":
return {"attempted": False, "status": "noop", "error": None}
try:
payload = {"priority": plan["_desiredPriority"]} if plan["_kind"] == "priority" else {"credentials": plan["_desiredCredentials"]}
if plan["_kind"] == "priority":
payload = {"priority": plan["_desiredPriority"]}
elif plan["_kind"] == "account-name":
payload = {"name": plan["_desiredName"]}
else:
payload = {"credentials": plan["_desiredCredentials"]}
data_of(curl_api("PUT", f"/api/v1/admin/accounts/{plan['accountId']}", bearer=token, payload=payload), "update account runtime config")
return {"attempted": True, "status": "succeeded", "error": None}
except Exception as exc:
@@ -1129,6 +1147,10 @@ def reconcile_mutation_plan(token, plan, write, include_rules):
actual_priority = int(actual_detail.get("priority") or 0)
item["actual"] = {"priority": actual_priority}
item["reconciled"] = actual_priority == plan["_desiredPriority"]
elif plan["_kind"] == "account-name":
actual_name = str(actual_detail.get("name") or "")
item["actual"] = {"name": actual_name}
item["reconciled"] = actual_name == plan["_desiredName"]
else:
actual_policy = normalize_policy(actual_detail.get("credentials"))
item["actual"] = policy_summary(actual_policy, include_rules)