fix
This commit is contained in:
@@ -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
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -845,13 +848,11 @@ def s2a_get_api_keys(page: int = 1, page_size: int = 50, timezone: str = "Asia/S
|
|||||||
result = response.json()
|
result = response.json()
|
||||||
if result.get("code") == 0:
|
if result.get("code") == 0:
|
||||||
return result.get("data", {})
|
return result.get("data", {})
|
||||||
else:
|
|
||||||
log.warning(f"S2A 获取密钥列表失败: {result.get('message', 'Unknown error')}")
|
|
||||||
else:
|
else:
|
||||||
log.warning(f"S2A 获取密钥列表失败: HTTP {response.status_code}")
|
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)
|
keys.append({
|
||||||
key["usage"] = usage if usage else {}
|
"id": key_id,
|
||||||
else:
|
"name": key_info["name"],
|
||||||
key["usage"] = {}
|
"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:
|
||||||
|
|||||||
Reference in New Issue
Block a user