This commit is contained in:
2026-01-20 20:36:13 +08:00
parent 4b00b9dd0a
commit 13d5af8874

View File

@@ -817,16 +817,15 @@ def s2a_batch_import_accounts(
# ==================== API 密钥用量查询 ==================== # ==================== API 密钥用量查询 ====================
def s2a_get_api_keys(page: int = 1, page_size: int = 50, timezone: str = "Asia/Shanghai") -> Optional[Dict[str, Any]]: def s2a_get_all_usage_stats(
"""获取 API 密钥列表 start_date: str,
end_date: str,
Args: timezone: str = "Asia/Shanghai"
page: 页码 ) -> Optional[Dict[str, Any]]:
page_size: 每页数量 """获取所有密钥的汇总用量统计(不传 api_key_id
timezone: 时区
Returns: Returns:
dict: API 响应数据 或 None dict: 汇总统计数据 或 None
""" """
if not S2A_API_BASE or (not S2A_ADMIN_KEY and not S2A_ADMIN_TOKEN): if not S2A_API_BASE or (not S2A_ADMIN_KEY and not S2A_ADMIN_TOKEN):
return None return None
@@ -835,9 +834,13 @@ def s2a_get_api_keys(page: int = 1, page_size: int = 50, timezone: str = "Asia/S
try: try:
response = http_session.get( response = http_session.get(
f"{S2A_API_BASE}/keys", f"{S2A_API_BASE}/admin/usage/stats",
headers=headers, headers=headers,
params={"page": page, "page_size": page_size, "timezone": timezone}, params={
"start_date": start_date,
"end_date": end_date,
"timezone": timezone
},
timeout=REQUEST_TIMEOUT timeout=REQUEST_TIMEOUT
) )
@@ -846,12 +849,10 @@ def s2a_get_api_keys(page: int = 1, page_size: int = 50, timezone: str = "Asia/S
if result.get("code") == 0: if result.get("code") == 0:
return result.get("data", {}) return result.get("data", {})
else: else:
log.warning(f"S2A 获取密钥列表失败: {result.get('message', 'Unknown error')}") log.warning(f"S2A 获取汇总用量失败: HTTP {response.status_code}")
else:
log.warning(f"S2A 获取密钥列表失败: HTTP {response.status_code}")
except Exception as e: except Exception as e:
log.warning(f"S2A 获取密钥列表异常: {e}") log.warning(f"S2A 获取汇总用量异常: {e}")
return None return None
@@ -906,6 +907,19 @@ def s2a_get_key_usage_stats(
return None return None
# 密钥列表配置 (从 /api/v1/keys 接口获取的数据)
API_KEYS_LIST = [
{"id": 11, "name": "bohe", "key": "bohebohebohebohe", "group_name": "codex"},
{"id": 10, "name": "黑与白", "key": "oyqq114514oyqq114514", "group_name": "codex"},
{"id": 9, "name": "baozi", "key": "baozibaozibaozibaozi", "group_name": "codex"},
{"id": 7, "name": "Wong-灭鼠专家", "key": "Wong1234567891011", "group_name": "codex"},
{"id": 6, "name": "小马-莹佬", "key": "mazhichentaiqiangla", "group_name": "codex"},
{"id": 5, "name": "猫猫-byteBender", "key": "ByteBender114514", "group_name": "codex"},
{"id": 4, "name": "KFC", "key": "sk-babf3f6d15582b31e959311d6ceaa9448f2cf951dc23d02386d41f68046e6018", "group_name": "codex"},
{"id": 3, "name": "zhongruan", "key": "zhongruantaiqiangla", "group_name": "codex"},
]
def s2a_get_keys_with_usage(start_date: str = None, end_date: str = None, timezone: str = "Asia/Shanghai") -> Optional[List[Dict[str, Any]]]: def s2a_get_keys_with_usage(start_date: str = None, end_date: str = None, timezone: str = "Asia/Shanghai") -> Optional[List[Dict[str, Any]]]:
"""获取密钥列表并合并用量数据 """获取密钥列表并合并用量数据
@@ -919,31 +933,26 @@ def s2a_get_keys_with_usage(start_date: str = None, end_date: str = None, timezo
""" """
from datetime import datetime from datetime import datetime
# 获取密钥列表
keys_data = s2a_get_api_keys(page=1, page_size=100, timezone=timezone)
if not keys_data:
return None
keys = keys_data.get("items", [])
if not keys:
return []
# 默认今日 # 默认今日
if not start_date: if not start_date:
start_date = datetime.now().strftime("%Y-%m-%d") start_date = datetime.now().strftime("%Y-%m-%d")
if not end_date: if not end_date:
end_date = datetime.now().strftime("%Y-%m-%d") end_date = datetime.now().strftime("%Y-%m-%d")
# 获取每个密钥的用量 keys = []
for key in keys: for key_info in API_KEYS_LIST:
key_id = key.get("id") key_id = key_info["id"]
if key_id:
usage = s2a_get_key_usage_stats(key_id, start_date, end_date, timezone) usage = s2a_get_key_usage_stats(key_id, start_date, end_date, timezone)
key["usage"] = usage if usage else {} keys.append({
else: "id": key_id,
key["usage"] = {} "name": key_info["name"],
"key": key_info["key"],
"group_name": key_info["group_name"],
"status": "active",
"usage": usage if usage else {}
})
return keys return keys if keys else None
def format_keys_usage(keys: List[Dict[str, Any]], period_text: str = "今日") -> str: def format_keys_usage(keys: List[Dict[str, Any]], period_text: str = "今日") -> str:
@@ -992,9 +1001,8 @@ def format_keys_usage(keys: List[Dict[str, Any]], period_text: str = "今日") -
for key in keys: for key in keys:
name = key.get("name", "未命名") name = key.get("name", "未命名")
key_str = key.get("key", "") key_str = key.get("key", "")
status = key.get("status", "unknown") status = key.get("status", "active")
group = key.get("group", {}) group_name = key.get("group_name", "默认")
group_name = group.get("name", "默认") if group else "默认"
usage = key.get("usage", {}) usage = key.get("usage", {})
requests = usage.get("total_requests", 0) requests = usage.get("total_requests", 0)
@@ -1019,7 +1027,6 @@ def format_keys_usage(keys: List[Dict[str, Any]], period_text: str = "今日") -
key_display = key_str[:8] + "..." if key_str else "N/A" key_display = key_str[:8] + "..." if key_str else "N/A"
lines.append(f"{status_icon} <b>{name}</b> ({group_name})") lines.append(f"{status_icon} <b>{name}</b> ({group_name})")
lines.append(f" 密钥: <code>{key_display}</code>")
lines.append(f" 请求: {requests:,} | 耗时: {fmt_duration(avg_duration)}") lines.append(f" 请求: {requests:,} | 耗时: {fmt_duration(avg_duration)}")
lines.append(f" Token: {fmt_tokens(tokens)} (入:{fmt_tokens(input_tokens)} 出:{fmt_tokens(output_tokens)})") lines.append(f" Token: {fmt_tokens(tokens)} (入:{fmt_tokens(input_tokens)} 出:{fmt_tokens(output_tokens)})")
if cache_tokens > 0: if cache_tokens > 0: