尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

TradingAgents-CN 使用统计与模型定价配置功能深度指南:从数据模型到前端仪表板的完整实现解析

TradingAgents-CN 使用统计与模型定价配置功能深度指南:从数据模型到前端仪表板的完整实现解析 TradingAgents-CN 使用统计与模型定价配置功能深度指南从数据模型到前端仪表板的完整实现解析【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN导读本文完整解析 TradingAgents-CN 中使用统计与定价配置功能的端到端实现涵盖后端数据模型扩展、统计服务、REST API、前端仪表板与路由导航的完整链路。读者将掌握如何为每个大模型配置输入/输出 token 单价如何通过/settings/usage页面按供应商、模型、日期多维度监控 LLM 调用成本以及如何基于 MongoDB 中的token_usage集合进行记录查询、图表分析与旧数据清理同时获得源码级的调用链原理与可复现的测试验证方法。一、功能定位与整体架构使用统计与定价配置是 TradingAgents-CN 多智能体金融分析框架的配套成本治理能力。该框架的核心业务是调用多家大模型供应商如 dashscope、openai、google 等完成投研分析每次调用都会产生 token 消耗与费用。该功能将模型定价与用量统计打通解决三个实际问题成本可观测实时掌握总请求数、输入/输出 Token、总成本定价可配置为每个模型配置input_price_per_1k/output_price_per_1k单价分析可量化按供应商饼图、按模型柱状图、按日期折线图三个维度透视成本结构。整体数据流来自 USAGE_STATISTICS_IMPLEMENTATION_SUMMARY.md为用户操作 ↓ 前端页面 (UsageStatistics.vue) ↓ API 调用 (usage.ts) ↓ 后端路由 (usage_statistics.py) ↓ 服务层 (usage_statistics_service.py) ↓ MongoDB 数据库 (token_usage 集合) ↓ 返回数据 ↓ 前端渲染图表/表格技术栈方面后端使用 FastAPI MongoDB PydanticPython 3.10前端使用 Vue 3 TypeScript Element Plus ECharts Vue Router与 TradingAgents-CN 的整体技术体系保持一致。二、后端实现数据模型扩展2.1 LLMConfig 定价字段在 app/models/config.py 中LLMConfig在原有 provider、model_name、max_tokens、temperature、timeout 等字段基础上新增了三个定价字段# 定价配置 input_price_per_1k: Optional[float] Field(None, description输入token价格(每1000个token)) output_price_per_1k: Optional[float] Field(None, description输出token价格(每1000个token)) currency: str Field(defaultCNY, description货币单位(CNY/USD/EUR))其中input_price_per_1k与output_price_per_1k均为可选的浮点数默认None表示未配置定价currency默认值为CNY。从源码结构看价格统一按每 1000 个 token计价与业界主流 API 定价口径一致。对应的请求模型LLMConfigRequestapp/models/config.py同样增加了这三个字段使前端通过 API 更新模型配置时可以直接携带定价信息。2.2 UsageRecord 使用记录模型UsageRecordapp/models/config.py描述单次 API 调用的完整账单信息class UsageRecord(BaseModel): id: Optional[str] Field(None, description记录ID) timestamp: str Field(..., description时间戳) provider: str Field(..., description供应商) model_name: str Field(..., description模型名称) input_tokens: int Field(..., description输入token数) output_tokens: int Field(..., description输出token数) cost: float Field(..., description成本) currency: str Field(defaultCNY, description货币单位) session_id: str Field(..., description会话ID) analysis_type: str Field(defaultstock_analysis, description分析类型) stock_code: Optional[str] Field(None, description股票代码)相比文档中的简化示例仓库实际实现额外提供了currency和stock_code字段前者使不同货币的成本可被区分统计后者则将每次调用与具体股票分析任务关联起来便于追溯单只股票的分析成本。2.3 UsageStatistics 使用统计模型UsageStatisticsapp/models/config.py是统计结果的聚合载体class UsageStatistics(BaseModel): total_requests: int Field(default0, description总请求数) total_input_tokens: int Field(default0, description总输入token数) total_output_tokens: int Field(default0, description总输出token数) total_cost: float Field(default0.0, description总成本已废弃使用 cost_by_currency) cost_by_currency: Dict[str, float] Field(default_factorydict, description按货币统计的成本) by_provider: Dict[str, Any] Field(default_factorydict, description按供应商统计) by_model: Dict[str, Any] Field(default_factorydict, description按模型统计) by_date: Dict[str, Any] Field(default_factorydict, description按日期统计)注意源码注释明确指出total_cost已废弃成本应以cost_by_currency按货币维度聚合的字典为准这是当前版本对多货币并存场景的兼容性设计。三、后端实现统计服务层3.1 服务核心UsageStatisticsServiceapp/services/usage_statistics_service.py 中定义了UsageStatisticsService类并在文件末尾创建了全局单例usage_statistics_service。它直接对接 MongoDB集合名使用token_usage与 tradingagents 核心库保持一致核心方法如下方法功能关键实现细节add_usage_record(record)写入一条使用记录调用record.model_dump(exclude{id})后insert_one异常时记录日志并返回Falseget_usage_records(...)按条件查询记录支持 provider、model_name、start_date、end_date、limit 组合过滤按timestamp倒序默认 limit100get_usage_statistics(days)聚合统计默认统计最近 7 天内部按 provider / model / date 三个维度做聚合get_cost_by_provider(days)供应商成本汇总内部复用get_usage_statistics后抽取cost字段get_cost_by_model(days)模型成本汇总同上模型键格式为provider/model_nameget_daily_cost(days)每日成本序列以timestamp[:10]YYYY-MM-DD为日期键delete_old_records(days)清理旧数据默认删除 90 天前记录返回deleted_count3.2 统计聚合的源码细节get_usage_statistics的实现体现了三个值得注意的设计app/services/usage_statistics_service.py查询边界用end_date datetime.now()与start_date end_date - timedelta(daysdays)构造$gte/$lte区间timestamp 以 ISO 字符串形式存储与比较多维聚合使用defaultdict分别构建by_provider、by_model、by_date每个维度下都记录requests、input_tokens、output_tokens、cost、cost_by_currency五项指标模型键拼接by_model的键为provider/model_name拼接形式如dashscope/qwen-max避免不同供应商下同名模型被合并统计序列化处理聚合完成后将嵌套的defaultdict逐一转换为普通dict保证响应可被 JSON 序列化容错降级任何异常都会记录logger.error并返回空UsageStatistics()保证统计接口在数据异常时不会崩溃。3.3 成本计算公式文档 USAGE_STATISTICS_AND_PRICING.md 明确给出成本计算公式成本 (输入 tokens / 1000) × 输入价格 (输出 tokens / 1000) × 输出价格测试数据脚本见快速测试章节也使用了完全一致的算法cost (input_tokens / 1000) * input_price (output_tokens / 1000) * output_price。系统不做自动货币转换建议全库统一货币单位以保证统计口径一致。四、后端实现API 路由层4.1 路由注册与认证路由定义在 app/routers/usage_statistics.py前缀为/api/usage并在 app/main.py 中通过app.include_router(usage_statistics.router, tags[usage-statistics])注册。所有端点均通过Depends(get_current_user)来自app.routers.auth_db强制 JWT 认证未登录请求无法访问。4.2 端点清单与参数约束方法路径说明关键 Query 参数GET/api/usage/records获取使用记录分页式 limitprovider、model_name、start_date、end_date、limit1~1000默认 100GET/api/usage/statistics获取使用统计days1~365默认 7、provider、model_nameGET/api/usage/cost/by-provider按供应商统计成本days默认 7GET/api/usage/cost/by-model按模型统计成本days默认 7GET/api/usage/cost/daily每日成本统计days默认 7DELETE/api/usage/records/old删除旧记录days30~365默认 90所有查询参数都通过 FastAPI 的Query声明了取值范围约束如days: int Query(7, ge1, le365)非法输入会被自动拒绝。响应统一包装为{success: true, message: ..., data: ...}结构异常时抛出HTTPException(status_code500)。五、前端实现仪表板、配置与路由5.1 API 封装层frontend/src/api/usage.ts 使用 TypeScript 定义了UsageRecord与UsageStatistics接口并提供六个与后端端点一一对应的封装函数getUsageRecords、getUsageStatistics、getCostByProvider、getCostByModel、getDailyCost、deleteOldRecords。其中getUsageRecords与getUsageStatistics走ApiClient.get泛型封装其余走统一的request实例默认参数分别为days7与days90。5.2 使用统计主页面 UsageStatistics.vuefrontend/src/views/Settings/UsageStatistics.vue 是功能的前端主体共 480 行页面结构自上而下为标题栏使用统计与计费标题 时间范围下拉框最近 7/30/90 天 刷新按钮统计概览卡片el-statistic四卡总请求数、总输入 Token、总输出 Token、总成本。其中总成本卡片遍历statistics.cost_by_currency按货币逐项展示并通过getCurrencySymbol(currency)渲染货币符号图表区左按供应商统计饼图 右按模型统计柱状图各 300px 高下方通栏每日成本趋势折线图均基于 ECharts 实现使用记录表格el-table展示时间、供应商、模型、输入 Token、输出 Token、成本保留 4 位小数并带货币符号、分析类型、会话 ID 等列支持分页每页 10/20/50/100 条与页码跳转数据管理按钮清理旧记录el-button typedanger点击后确认删除 90 天前的数据。无数据时统计卡片显示 0、图表区显示暂无数据表格显示空态提示交互符合 Element Plus 生态习惯。5.3 配置管理增强frontend/src/views/Settings/ConfigManagement.vue在大模型配置标签页的模型卡片中新增定价展示区 定价: 输入: 0.0200 CNY/1K / 输出: 0.0600 CNY/1K直观呈现每个模型的单价frontend/src/views/Settings/components/LLMConfigDialog.vue编辑对话框新增定价配置分区包含输入价格、输出价格两个数字输入框与货币单位下拉选择CNY/USD/EUR。5.4 路由与导航集成在 frontend/src/router/index.ts 中注册了子路由{ path: usage, name: UsageStatistics, component: () import(/views/Settings/UsageStatistics.vue), meta: { ... } }同时 frontend/src/views/Settings/index.vue 添加了使用统计菜单项带 图标与导航函数goToUsageStatistics()并导入了 Element Plus 的DataAnalysis图标。六、访问方式方式 1通过导航菜单推荐登录系统访问前端地址如http://localhost:3001或http://localhost:5173点击左侧导航栏的设置在设置页面顶部确认当前处于系统配置标签不在则切换在左侧菜单中点击使用统计 图标点击查看使用统计按钮跳转到统计界面。方式 2直接访问 URLhttp://localhost:5173/settings/usage若前端运行于其他端口替换端口号即可。仓库文档中同时出现过 3001 与 5173 两个端口以实际运行配置为准。后端 API 自检启动后端后访问 Swagger 文档http://localhost:8000/docs在使用统计标签下可直接在线调试全部六个端点。七、实操配置模型定价7.1 页面配置步骤进入设置 系统配置 配置管理选择大模型配置标签找到目标模型如 qwen-max点击编辑按钮滚动到定价配置部分填写输入价格如0.0200、输出价格如0.0600、货币单位如CNY点击保存模型卡片随即显示定价信息┌─────────────────────────────────────┐ │ ️ qwen-max ✅ 启用 │ ├─────────────────────────────────────┤ │ Token: 4000 │ │ 温度: 0.7 │ │ 超时: 60s │ ├─────────────────────────────────────┤ │ 定价: │ │ 输入: 0.0200 CNY/1K │ │ 输出: 0.0600 CNY/1K │ └─────────────────────────────────────┘7.2 通过 API 配置定价# 通过 API 更新模型配置 llm_config { provider: dashscope, model_name: qwen-max, input_price_per_1k: 0.02, # 2分/1K tokens output_price_per_1k: 0.06, # 6分/1K tokens currency: CNY } await config_service.update_llm_config(llm_config)字段说明input_price_per_1k每 1000 个输入 token 的价格浮点数建议精确到小数点后 4 位output_price_per_1k每 1000 个输出 token 的价格currency货币单位可选CNY人民币/USD美元/EUR欧元未填写时默认CNY。八、实操查询使用统计8.1 服务层调用# 获取最近 7 天的统计 stats await usage_statistics_service.get_usage_statistics(days7) print(f总请求数: {stats.total_requests}) print(f总成本: ¥{stats.total_cost:.4f}) # 按供应商统计 for provider, data in stats.by_provider.items(): print(f{provider}: ¥{data[cost]:.4f})8.2 前端调用// 获取使用统计 import { getUsageStatistics } from /api/usage const stats await getUsageStatistics({ days: 7 }) console.log(总成本:, stats.data.data.total_cost)8.3 使用场景示例查看本周成本选择最近 7 天查看总成本卡片与每日成本趋势折线图对比模型成本查看按模型统计柱状图Top 10按成本降序识别高成本模型分析供应商结构查看按供应商统计饼图了解各供应商成本占比控制单一供应商依赖审计单次调用在记录表格中按时间倒序查看每次调用的 Token 与成本明细结合会话 ID 追溯分析任务。九、快速测试与数据生成9.1 测试前置# 启动后端项目根目录 .\.venv\Scripts\Activate.ps1 .\.venv\Scripts\python -m uvicorn app.main:app --reload --host 0.0.0.0 --port 8000 # 另开终端启动前端 cd frontend npm run dev9.2 测试数据生成无真实使用数据时有两种方式生成方式 1运行股票分析——访问股票分析 单股分析输入股票代码如 600519点击开始分析完成后再回到使用统计页面查看。方式 2测试脚本批量注入——按 USAGE_STATISTICS_QUICK_TEST.md 编写scripts/add_test_usage_data.py模拟 3 家供应商dashscope / openai / google、6 个模型、最近 30 天每天 5~10 条随机记录import asyncio from datetime import datetime, timedelta import random from app.services.usage_statistics_service import usage_statistics_service from app.models.config import UsageRecord async def add_test_data(): 添加测试使用数据 providers [dashscope, openai, google] models { dashscope: [qwen-max, qwen-plus, qwen-turbo], openai: [gpt-4, gpt-3.5-turbo], google: [gemini-pro] } # 生成最近 30 天的数据 for i in range(30): date datetime.now() - timedelta(daysi) # 每天生成 5-10 条记录 for _ in range(random.randint(5, 10)): provider random.choice(providers) model random.choice(models[provider]) input_tokens random.randint(500, 3000) output_tokens random.randint(200, 1500) # 假设价格 input_price 0.02 output_price 0.06 cost (input_tokens / 1000) * input_price (output_tokens / 1000) * output_price record UsageRecord( timestampdate.isoformat(), providerprovider, model_namemodel, input_tokensinput_tokens, output_tokensoutput_tokens, costcost, session_idftest_session_{i}_{_}, analysis_typestock_analysis ) await usage_statistics_service.add_usage_record(record) print(测试数据添加完成) if __name__ __main__: asyncio.run(add_test_data())运行.\.venv\Scripts\python scripts/add_test_usage_data.py。9.3 九项功能测试用例按 USAGE_STATISTICS_QUICK_TEST.md 逐项验证测试项操作预期结果配置模型定价编辑 qwen-max填 0.0200/0.0600/CNY 并保存保存成功卡片显示定价导航访问方式 1设置 系统配置 使用统计 查看使用统计跳转/settings/usage直接访问方式 2地址栏输入/settings/usage页面正常加载统计概览查看顶部 4 卡片四项指标显示无数据为 0图表渲染查看三个图表饼图/柱状图/折线图正常无数据显示暂无数据时间范围筛选切换最近 30 天数据与图表刷新记录表格查看底部表格列完整、分页控件可用刷新数据点击刷新显示加载状态与成功提示清理旧记录点击清理旧记录并确认确认对话框、删除成功提示、数据刷新检查点还包括Swagger 中usage-statistics标签下六个端点可调用/settings/usage路由已注册MongoDB 中存在token_usage集合且数据正确落库。十、故障排查问题可能原因解决方案页面 404路由未注册检查 frontend/src/router/index.ts 中UsageStatistics路由是否存在重启前端服务图表不显示ECharts 未加载或无数据检查浏览器控制台报错确认有使用数据切换时间范围后刷新API 请求失败后端未启动或认证失效确认后端运行、已登录、JWT token 有效定价不显示配置未保存或缓存未刷新重新保存定价配置刷新页面检查 MongoDB 数据成本显示为 0模型定价未配置进入配置管理 大模型配置补齐每个模型的定价字段后刷新看不到使用统计菜单不在系统配置标签页切换到系统配置标签CtrlF5 强制刷新数据不准确定价/时间范围/存储问题核对模型定价、时间范围选择、MongoDB 记录与后端日志十一、安全、性能与边界安全机制所有/api/usage/*端点均依赖get_current_user完成 JWT 认证未登录不可访问使用记录存储在 MongoDB 的token_usage集合中与模型配置分离存储支持按用户权限控制访问启用用户隔离时用户只能查看自己的记录管理员可查看全部。性能优化查询按timestamp倒序并配合limit截断避免全量加载前端记录表格分页加载10/20/50/100 条/页图表按需渲染统计聚合在服务层单次查询内完成避免多次往返数据库。注意事项自动记录TradingAgents 核心库会自动记录每次 API 调用无需手动埋点成本公式(输入 tokens / 1000) × 输入价格 (输出 tokens / 1000) × 输出价格货币不自动转换系统不做汇率换算务必统一配置货币单位建议 CNY数据延迟统计数据可能有数秒延迟非实时精确定价及时性供应商调价后应及时更新配置否则成本估算失真数据保留建议每 90 天清理一次旧记录重要数据先导出备份。十二、已知问题与未来计划当前版本暂无已知问题。文档列出的未来演进方向包括导出统计报表Excel/PDF、成本预警通知、预算管理、更多图表类型、自定义时间范围、成本优化建议、多用户成本分摊、实时成本监控与数据缓存优化。十三、相关文档与源码索引功能文档使用统计与定价配置功能使用统计前端访问指南如何访问使用统计页面使用统计功能快速测试指南使用统计实现总结源码索引数据模型app/models/config.pyLLMConfig 定价字段、UsageRecord、UsageStatistics统计服务app/services/usage_statistics_service.pyUsageStatisticsService全局单例API 路由app/routers/usage_statistics.py/api/usage前缀JWT 保护路由注册app/main.pyinclude_router(usage_statistics.router)前端 API 封装frontend/src/api/usage.ts统计页面frontend/src/views/Settings/UsageStatistics.vue路由配置frontend/src/router/index.ts十四、更新记录2025-10-07完成后端 API 实现、前端页面开发、路由与导航集成及文档编写。【免费下载链接】TradingAgents-CN基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表