1. 新增 resolve_tenant_by_chat_id() 根据飞书群 chat_id 查找绑定的租户 2. 新增 get_tenant_feishu_config() 获取租户级飞书凭证 3. FeishuService 支持传入自定义 app_id/app_secret(租户级别) 4. feishu_bot.py 收到消息时自动解析租户,使用租户凭证回复 5. feishu_longconn_service.py 同样按 chat_id 解析租户并传递 tenant_id 6. 租户管理 UI 新增飞书配置字段:App ID、App Secret、绑定群 Chat ID 7. 租户列表展示飞书绑定状态和群数量 8. 保存租户时同步更新飞书配置到 config JSON
87 lines
2.9 KiB
Python
87 lines
2.9 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
AI 指标报告脚本
|
|
|
|
聚合最近一段时间的 AI 使用与成本指标,供 ai-metrics-report Skill 调用。
|
|
当前版本主要复用 TokenMonitor 的系统统计能力。
|
|
"""
|
|
|
|
import argparse
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
|
|
def add_project_root_to_path():
|
|
# 假定脚本位于 .claude/skills/ai-metrics-report/scripts/ 下
|
|
script_path = Path(__file__).resolve()
|
|
project_root = script_path.parents[4]
|
|
if str(project_root) not in sys.path:
|
|
sys.path.insert(0, str(project_root))
|
|
|
|
|
|
def main():
|
|
parser = argparse.ArgumentParser(description="Generate AI metrics report.")
|
|
parser.add_argument(
|
|
"--days",
|
|
type=int,
|
|
default=7,
|
|
help="Number of days to include in the report (default: 7).",
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
add_project_root_to_path()
|
|
|
|
from src.analytics.token_monitor import TokenMonitor
|
|
|
|
monitor = TokenMonitor()
|
|
stats = monitor.get_system_token_stats(days=args.days) or {}
|
|
|
|
print(f"=== AI 指标报告(最近 {args.days} 天) ===\n")
|
|
|
|
total_tokens = stats.get("total_tokens", 0)
|
|
total_cost = stats.get("total_cost", 0.0)
|
|
total_requests = stats.get("total_requests", 0)
|
|
successful_requests = stats.get("successful_requests", 0)
|
|
failed_requests = stats.get("failed_requests", 0)
|
|
success_rate = stats.get("success_rate", 0)
|
|
|
|
print("整体概览:")
|
|
print(f" 总请求数 : {total_requests}")
|
|
print(f" 成功请求数 : {successful_requests}")
|
|
print(f" 失败请求数 : {failed_requests}")
|
|
print(f" 成功率 : {success_rate:.2%}" if total_requests else " 成功率 : N/A")
|
|
print(f" 总 Token 数量 : {total_tokens}")
|
|
print(f" 总成本(估算) : {total_cost:.4f} 元")
|
|
print()
|
|
|
|
# 模型使用分布
|
|
model_usage = stats.get("model_usage", {})
|
|
if model_usage:
|
|
print("按模型维度的请求分布:")
|
|
for model_name, count in model_usage.items():
|
|
pct = (count / total_requests) * 100 if total_requests else 0
|
|
print(f" - {model_name}: {count} 次 ({pct:.1f}%)")
|
|
print()
|
|
|
|
# 按日期的成本趋势(如有)
|
|
daily_usage = stats.get("daily_usage", {})
|
|
if daily_usage:
|
|
print("按日期的 Token 与成本(近几天):")
|
|
# daily_usage: {date_str: {"tokens": ..., "cost": ...}}
|
|
for date_str in sorted(daily_usage.keys()):
|
|
day_data = daily_usage[date_str]
|
|
tokens = day_data.get("tokens", 0)
|
|
cost = day_data.get("cost", 0.0)
|
|
print(f" {date_str}: tokens={tokens}, cost={cost:.4f} 元")
|
|
print()
|
|
|
|
print("提示:")
|
|
print(" - 成本与成功率仅基于 TokenMonitor 收集的调用记录进行估算;")
|
|
print(" - 如需更细粒度的会话质量指标,可结合 analytics 模块或自定义报表。")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|
|
|