Files
assist/.kiro/skills/ai-metrics-report/scripts/ai_metrics_report.py
Jeason 7950cd8237 feat: 飞书机器人按租户路由 群组绑定租户 + 独立凭证 + 知识库隔离
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
2026-04-02 09:58:04 +08:00

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()