- 多项目选择列表改为面向任意数量项目:统一项目标签为“主项目、项目 2、项目 3 ...”,去除原先对前两个项目的特化命名,避免三项目及以上场景下展示不一致。
- 项目列表接口补充
isPrimary元信息,并同步升级前端项目选项缓存结构,确保各页面可基于统一项目元数据渲染选择器。 - 仪表盘、调用记录、探索页、渠道页的项目选择框改为自适应宽度,提升三项目及以上时的可用性与布局稳定性。
- 项目列表接口改为合并“当前环境变量中的项目”和“数据库中仍存在历史数据的项目”,即使旧项目已从环境变量移除,前端仍可继续切换查看其历史统计。
- 渠道统计页临时增加“删除当前范围数据”能力:
- app/channels/page.tsx 在渠道组(provider)和子渠道(email)两级新增删除按钮,复用确认弹窗展示当前项目、当前时间范围与预计删除条数,降低误删风险。
- app/api/channels/route.ts 扩展临时删除预估与执行动作,按当前页面筛选的
project + 日期范围 + provider/email条件删除usage_records,并在删除后清理渠道缓存。 - 渠道页成功提示与失败提示同步补齐,删除完成后会自动刷新当前统计结果。
-
合并当前 cherry-pick 冲突并保留两侧能力:
explore接口与页面同时保留project项目筛选和filterInvalid无效点过滤,避免缓存键与请求参数丢失。overview查询与接口同时保留project过滤和lastSyncAt返回值,维持多项目统计与最近同步时间展示。records查询与页面合并多字段排序sortKeys和project筛选,修复游标查询变量冲突。/api/sync合并为按project维度去重的分块写入逻辑,兼容大批量同步与多项目唯一索引。scripts/migrate.mjs合并本地.env*自动加载与 Neon/pg 双驱动迁移能力,保持本地与部署环境兼容性。
-
合并
sync路由与渠道统计分支冲突:/api/sync保留provider/email维度映射增强,同时继续使用分块写入,降低大批量同步时的单次 SQL 压力。- 去重键统一切换为
occurredAt + project + route + model + email,与当前usage_records唯一索引保持一致。 - 鉴权 cookie 改为直接使用
cookies(),移除旧的弱类型导入方式。
-
修复
records查询构建失败:- 删除 lib/queries/records.ts 中重复声明的
baseWhere,恢复next build编译通过。
- 删除 lib/queries/records.ts 中重复声明的
-
修复
sync-model-prices构建失败:- 删除 app/api/sync-model-prices/route.ts 中残留的重复
inArray/desc解构,并统一使用cookies(),消除重复定义导致的构建错误。
- 删除 app/api/sync-model-prices/route.ts 中残留的重复
-
修复
/api/syncTypeScript 构建失败:- 为
findMissingAuthIndexes()与applyAuthMappingsToRows()的查询结果补充显式类型,消除row隐式any导致的构建阻断。
- 为
-
修复
records查询 TypeScript 构建失败:- 为 lib/queries/records.ts 中
modelPrices查询结果补充显式类型,消除priceRows.map()中参数隐式any的构建错误。
- 为 lib/queries/records.ts 中
-
Explore 页模型图例排序方式现可在浏览器端记忆:
- 图例排序(首字母 / Token用量 / 请求次数)改为持久化到
localStorage的exploreLegendSort。 - 刷新页面或重新打开浏览器标签页后,会自动恢复上次选中的排序方式,避免每次都重新切换。
- 图例排序(首字母 / Token用量 / 请求次数)改为持久化到
-
修复 Explore 页时间范围与主图末尾日期不一致的问题:
- 后端探索明细查询移除默认
limit(50000)截断,避免在高频数据下只返回时间范围前段记录、导致主图停在较早日期。 - 保留
maxPoints参数能力,仅在显式传入时才限制返回条数。 - 前端在 Explore 明细点数超过
20,000时默认关闭散点图开关,优先保证全量时间范围可见,同时降低大数据量下的 SVG 渲染压力。
- 后端探索明细查询移除默认
-
修复每小时负载分布堆叠图中"输入"与"缓存"重复计数的问题:
- 原始数据中
inputTokens包含缓存命中部分,与cachedTokens存在子集重叠,导致堆叠图双重计数。 - 在
hourlySeriesuseMemo 输出前对每个数据点执行inputTokens = Math.max(0, inputTokens - cachedTokens),使两者在图中不重叠。 - 调整普通图和全屏图的堆叠顺序为:输入 → 缓存 → 输出 → 思考,保持"输入"与"缓存"在视觉上相邻,语义更清晰。
- 同步更新两个图的 tooltip 排序、图例排序,以及顶层圆角(
radius移至新顶层的思考柱)。
- 原始数据中
-
Tokens 卡片"缓存"改为缓存命中率显示,"输入"增加 hover 展示未命中输入:
- "缓存"行:默认标签"缓存命中率"及百分比,hover 切换为"缓存"及实际 token 数。
- "输入"行:默认标签"输入"及总输入 token 数,hover 切换为"未命中输入"及
totalInputTokens - totalCachedTokens。 - 两行均使用相同的 opacity 过渡动画(duration-200),
absolute覆盖层不影响布局。
-
修复首页"无法加载实时用量:"后内容为空的问题:
- HTTP/2 协议不携带 status text,
res.statusText在现代部署中始终为空字符串。 - 改为优先读取响应体 JSON 中的
error字段,回退到res.statusText,最终回退到HTTP ${res.status}。 catch分支的error.message同样增加|| "未知错误"兜底。
- HTTP/2 协议不携带 status text,
-
Explore 页模型图例排序切换:
- 点击"模型图例"右侧的排序标签可循环切换:首字母 → Token用量 → 次数 → 首字母。
- 排序计算在
ModelLegend组件内部维护(legendSortstate +sortedModelsuseMemo),不影响外部状态。 - 新增
modelStatsprop(由ExplorePage从points汇总 tokens / requests),在切换时无需重复遍历。
-
Explore 页模型图例颜色优化(方案B 系统整改):
- 原
MODEL_COLORS中5处色相/色调高度相似的颜色(浅蓝≈天青、浅红≈玫红、重复黄≈橙黄、浅绿≈绿、浅紫≈品红紫)影响图例区分度。 - 替换方案:
- 位置6
#99e6ff(浅蓝 200°)→#c0ff30(柠绿 82°) - 位置8
#ffb3b3(浅红 0°)→#40fff0(青绿 177°) - 位置11
#ffe66d(重复黄55°)→#ff50a0(玫粉 340°) - 位置16
#b3f5b3(浅绿 120°)→#40ffa0(春绿 152°) - 位置17
#d9b3ff(浅紫 280°)→#f050e8(品红洋红 305°)
- 位置6
- 新颜色相邻最小色相差从 <5° 提升至 ≥15°,视觉区分度显著改善。
- 原
-
Records 页表头多列排序:
- 点击未激活列 → 插入头部成为主排序键(desc);点击已激活列第二次 → 切换为 asc;第三次 → 从排序列表移除(
occurredAt列不允许移除,第三次循环回 desc)。 - 存在多个排序键时,表头箭头旁显示小数字标注优先级(₁₂₃...);悬停显示操作提示。
- URL 参数改为
sort=field:order,field:order格式,兼容旧sortField+sortOrder参数。 - 游标分页采用方案 A:以首个排序键(主键)+ id 作为游标,次级排序在每页内精确有序。
- 改动文件:
lib/queries/records.ts(添加SortKey类型和getSortExpr辅助函数,getUsageRecords接受sortKeys[])、app/api/records/route.ts(解析sort参数)、app/records/page.tsx(多键排序状态与交互)。
- 点击未激活列 → 插入头部成为主排序键(desc);点击已激活列第二次 → 切换为 asc;第三次 → 从排序列表移除(
-
首页饼图颜色分配方式优化:
- 原逻辑按模型在原始数组中的位置分配颜色,导致颜色与排名无关联。
- 改为按 tokens 降序排名为每个模型分配固定颜色索引(
pieColorIndexMapuseMemo),tokens最多的模型始终得到颜色表第一个颜色,依此类推;对饼图Cell和自定义图例均生效,普通视图和全屏视图保持一致。
-
首页新增自动刷新功能:
- 在"刷新数据"按钮左侧新增"自动刷新"复选框及刷新频率下拉框(预设 30秒/1分钟/5分钟/10分钟/30分钟 + 自定义秒数输入)。
- 使用
public/auto-refresh-worker.jsWeb Worker 计时,后台标签页也不会被浏览器降频/休眠,计时精度不受影响。 - 刷新频率和自定义值持久化至
localStorage(autoRefreshSettings),页面刷新后自动恢复;自动刷新开关默认关闭,不自动恢复以避免意外刷新。
-
同步超时时限从 60s 调整为 120s,支持 env 调节:
- 前后端统一使用
NEXT_PUBLIC_SYNC_TIMEOUT_MS环境变量覆盖(毫秒,正整数),默认 120s。 - 后端(
app/api/sync/route.ts)USAGE_TIMEOUT_MS读取该变量;前端(app/page.tsx)doSync默认参数读取该变量(构建时注入)。
- 前后端统一使用
-
formatCompactNumber补充 B(十亿)级别支持:- 值 ≥ 1,000,000,000 时显示为
x.xxB(保留两位小数),避免 Tokens 等超大数值停留在1500M等不直观格式。
- 值 ≥ 1,000,000,000 时显示为
-
首页请求数卡片成功/失败数精简显示:
- 当成功数或失败数 ≥ 10000(超过 4 位)时,自动转为紧凑格式(如 12.3k),减少卡片文字溢出。
- 鼠标悬停时通过
title属性展示完整整数,方便查看精确值。
-
自动刷新 UI 精细优化:
- 改为扁平一体化按钮样式:开启时整体 emerald 配色,关闭时 slate 配色;频率选项区通过
max-width过渡动画展开/收起,无条件渲染避免动画失效。 - 选择"自定义..."时频率下拉框收缩为仅显示箭头(选项文字颜色改透明),节省横向空间。
- 下拉选项深色模式下使用近白绿配色(
#d1fae5文字 /#022c22背景),防止深色环境下文字不可见。 - 悬停自动刷新按钮时展示倒计时提示(如"30s 后刷新"),使用
tickBaseTimeRef+tickIntervalMsRef精确计算剩余秒数;每次 tick 及开启时同步更新基准时间,确保倒计时始终准确。 - 修复倒计时 tooltip 被
overflow-hidden容器裁切无法显示的问题:将 tooltip 移至外层relativewrapper 内但置于overflow-hiddendiv 之外。 - 频率展开区及自定义输入区动画改为纯 opacity 淡入淡出(
transition-opacity duration-200),去除宽度滑动动画;隐藏时max-w-0即时折叠空间,opacity 为 0 时折叠不可见,视觉效果等同纯渐变。
- 改为扁平一体化按钮样式:开启时整体 emerald 配色,关闭时 slate 配色;频率选项区通过
-
Explore API 移除抽样采样逻辑:
- 去掉
row_number() % step分步跳过机制,改为直接按时间排序查询,最多返回maxPoints(默认提升至 50,000)条记录,所有返回点均为连续真实数据,不再跳过任何有效点。 - 零 tokens 过滤从前端 JS 下推至 SQL 层:始终并行统计无效点数量(
zeroTokensCount)随接口返回;当filterInvalid=true时 points 查询加入total_tokens != 0条件。 - 前端移除独立工具栏开关,改为在"渲染点数"统计行内联可点击文字:有无效点时默认显示"(过滤无效点?)",点击后过滤并改为"(已过滤 N 无效点)",再次点击取消过滤;开关状态存储在
localStorage中(默认不过滤)。 step字段保留但固定为 1,不影响现有接口契约。
- 去掉
-
Explore 页数据过滤优化:
- 当接口返回总点数(
total)超过 3000 时,自动过滤掉tokens为 0 的数据点,减少无效噪点渲染,降低大数据量下散点图的视觉干扰和渲染压力;"渲染点数"旁同步显示已过滤的零 tokens 点数量。
- 当接口返回总点数(
-
Explore 页散点图渲染性能优化:
- 将每个数据点的双层 SVG circle(透明命中区 + 可见圆)合并为单个 circle,DOM 节点数量减少约 50%,万级点数下渲染压力显著降低。
- 为工具栏新增"散点图"显示开关(默认开启),关闭后
<Scatter data={[]}>跳过全部散点渲染,可在只需查看堆叠面积分布时大幅降低 SVG 节点数。 - 引入
deferredFilteredPoints = useDeferredValue(filteredPoints),Y 轴直方图、X 轴时间分布、堆叠面积图三个重计算 memo 使用延迟版本,新数据加载完毕时不阻塞主线程渲染。 - 为两处
tickFormatter的v参数补充: number类型注解,消除 TypeScript implicit any 报错。 - 模型图例支持 Ctrl/⌘+点击独显:按住 Ctrl(Mac 为 ⌘)单击某图例,隐藏所有其他模型,仅保留该模型可见;若目标模型已处于独显状态则恢复全部;图例悬停提示更新为"点击隐藏,Ctrl/⌘+点击独显"。
-
首页统计卡片数值优化:
- 平均 TPM、平均 RPM 均移除尾随零小数(
10.00→10,1.50→1.5)。 - 平均 RPM 同步引入万级以上压缩显示(
>= 1000时显示1k、10k等)。
- 平均 TPM、平均 RPM 均移除尾随零小数(
-
完善数据库连接池配置说明:
- 在
README.md中新增“数据库连接池配置 (本地开发)”表格,详细列出DATABASE_POOL_MAX、DATABASE_POOL_IDLE_TIMEOUT_MS等环境变量的作用与默认值,便于开发者优化连接数占用。
- 在
-
重构数据库连接层,支持通用 PostgreSQL 与 Neon 无服务器 WebSocket 双驱动:
lib/db/client.ts:新增条件化驱动工厂,通过 URL 模式(含.neon.tech)或环境变量DATABASE_DRIVER=neon|pg自动选择@neondatabase/serverless(WebSocket)或pg.Pool(标准 TCP);Aiven、Supabase、RDS 等默认使用pg。- 新增
DATABASE_CA环境变量支持:pg驱动下可传入 CA 证书 PEM 内容(原始或 Base64 编码),用于 Aiven、自建 PostgreSQL 等需要sslmode=verify-full的场景。 scripts/migrate.mjs:同步更新为动态驱动加载,支持DATABASE_CA,迁移脚本与运行时保持策略一致。- 新增依赖:
@neondatabase/serverless、ws、@types/ws、pg、@types/pg,移除对@vercel/postgres的直接依赖。 - 修复根本原因:
@vercel/postgrescreatePool强制要求池化连接串,不兼容直连 URL;构建时模块顶层初始化导致invalid_connection_string错误;pg不支持 Neon serverless WebSocket 端点(wss://host:443)。
-
修复
pg驱动在小规格数据库下易触发53300(连接槽耗尽)的问题:- 为运行时
pg.Pool增加可配置连接池参数:DATABASE_POOL_MAX、DATABASE_POOL_IDLE_TIMEOUT_MS、DATABASE_POOL_CONNECTION_TIMEOUT_MS、DATABASE_POOL_MAX_USES。 - 默认将池大小收敛为
5,降低 Vercel 多实例并发下打满数据库连接槽的风险。
- 为运行时
- 渠道统计支持主渠道重命名:新增
PATCH /api/channels的rename-provider动作,可将指定旧渠道名批量更新为新渠道名(写回usage_records.provider)。 - 渠道页新增“渠道名称编辑”交互:支持在分组头部直接修改并保存渠道名称;同时为子渠道重命名请求显式携带
rename-email动作标识。 - 渠道页分组口径收敛:
channels页面改为严格按usage_records.provider分组、按usage_records.email作为子渠道,不再通过provider/email字符串切分推断,避免qwen等前缀误归类。 - 修复子渠道“保存无感”问题:
channels页请求改为skipCache=1 + no-store,并在更新条数为 0 时返回明确提示,避免误判已保存。 - 调整子渠道重命名范围:
PATCH /api/channels取消project过滤,改为按provider + oldEmail全量覆盖usage_records.email(覆盖该子渠道全部数据)。 - 渠道统计新增“子渠道临时重命名”能力:在 app/channels/page.tsx 支持直接编辑子渠道名称,并通过
/api/channels的PATCH接口写回数据库,覆盖usage_records.email。 - 新增
/api/channels更新接口:按provider + oldEmail (+可选 project)批量更新为newEmail,更新后自动清理渠道缓存并返回变更条数。 - 修复
db:backfill:usage-provider-email执行失败:移除脚本对 TypeScriptschema的 ESM 直接导入,改为纯 SQL 回填;并增加冲突前去重逻辑,避免触发唯一索引usage_records_occurred_project_route_model_email_idx报错。 - 新增数据修复脚本 scripts/backfill-usage-provider-email.mjs:
- 当
usage_records.auth_index有值时,按现有匹配规则(auth_index优先,其次email(api-key))回填provider/email。 - 当
usage_records.auth_index为空时,将provider/email统一清空。 - 新增命令
pnpm db:backfill:usage-provider-email用于执行该修复。
- 当
- 修复同步回填空值问题:
/api/sync在 AI Provider 匹配场景下,回填逻辑改为同时支持auth_index与email(api-key)匹配auth_file_mappings.auth_id,并避免将usage_records.provider/email覆盖为空字符串。 - 同步入库补充映射回填:当
usage_records.auth_index成功匹配auth_file_mappings.auth_id后,写入usage_records.provider = auth_file_mappings.provider。 - 同步入库补充邮箱回填:当匹配成功后,写入
usage_records.email = auth_file_mappings.email;若auth_file_mappings.email为空,则回退写入auth_file_mappings.name到usage_records.email。 - 查询展示口径调整:
records/overview/explore的“提供商/凭证”改为直接读取usage_records.provider与usage_records.email,不再在查询阶段回查auth_file_mappings。 - 新增“渠道统计”页面:添加 app/channels/page.tsx 并接入侧边栏导航,支持按项目/时间范围查看渠道用量、费用、成功率与分组展开。
- 渠道接口口径调整:
/api/channels改为以usage_records.provider作为渠道、usage_records.email作为子账号聚合,返回provider/email组合的channel字段供前端分组展示。
- 调整
records调用记录表格列宽策略:将“模型 / 密钥 / 凭证”从固定宽度改为与其他列一致的 auto 自适应分配,改善不同分辨率下的列宽一致性。 - 数据库字段重命名:
usage_records.source更名为usage_records.email,并将usage_records.channel更名为usage_records.provider;同步更新唯一索引与查询索引命名。 - 同步与查询链路适配新字段:
/api/sync去重键改用email,records/overview/explore/channels改为读取email/provider列;对外筛选参数仍兼容source命名。 - 调整
/api/sync流程:刷新时默认不再预先同步auth_file_mappings,仅在检测到本次auth_index存在未命中时触发一次补救同步,减少无效映射刷新请求。 - 增强映射补救来源:补充拉取
openai-compatibility、gemini-api-key、codex-api-key、claude-api-key四类管理配置,并按规则写入auth_file_mappings,用于后续匹配兜底。 - 新增同步可观测字段:
/api/sync返回authFilesSyncTriggered、unmatchedAuthIndexesBefore、unmatchedAuthIndexesAfter,便于判断未命中补救是否触发及效果。 - 统一凭证回退匹配口径:
records/overview/explore在auth_index未命中时增加usage.source(api-key)对auth_file_mappings.auth_id的二次匹配,并将最终未命中统一显示为“未知渠道”。
- 修复构建前迁移脚本的连接串读取时机:改为在运行阶段加载
.env*后再初始化数据库连接,避免因顶层createPool()提前执行导致missing_connection_string报错。 - 当未配置
DATABASE_URL/POSTGRES_URL时,迁移脚本改为输出提示并跳过迁移(不阻塞构建),提升本地与 CI 场景下的构建容错性。 - 修复多处
usageRecords.project字段误用(channels、overview、sync-model-prices):统一改为按usageRecords.route过滤项目,消除 TypeScript 构建报错并恢复项目筛选能力。 - 修复
lib/queries/records.ts缺失导入:补充estimateCost、priceMap引用,恢复记录页费用计算的编译通过状态。 - 修复
channels聚合字段误用:将不存在的usageRecords.channel更正为usageRecords.source,恢复渠道统计接口编译与按渠道分组能力。 - 修复
/api/projects对失效配置项config.cliproxyProjects的依赖:改为从usage_records.route动态聚合项目列表,保证项目下拉与后端筛选口径一致并消除构建错误。 - 修复
explore页残留的项目筛选状态引用:移除未定义的setProject/setProjectOptions相关逻辑,恢复 TypeScript 构建通过。 - 修复首页仪表盘缺失的项目筛选状态定义:补回
project与projectOptions状态,消除project/setProjectOptions未定义编译错误并恢复价格同步请求参数。 - 修复
records页残留的项目筛选状态引用:移除未定义的setProject/setProjectOptions副作用与无用导入,恢复页面编译通过。 - 修复
overview查询参数类型与接口透传:补回project类型定义并在/api/overview中接收/透传该参数,同时将其纳入缓存键,避免类型报错与跨项目缓存串用。
- 调整
records页提供商染色策略:覆盖GeminiCLI、Vertex、AIStudio、Antigravity、Claude、Codex、Qwen、Kimi、iFlow(大小写不敏感),提升来源识别度与颜色区分度。
- 新增凭证映射与
source相关能力,统一凭证展示/筛选口径,减少跨页面筛选不一致。 records页面升级列管理(显隐、排序、宽度、自适应、持久化)与交互样式,提升可读性和可操作性。- 新增/完善提供商字段展示与相关查询,便于按来源识别调用记录。
explore增加按 Key/凭证过滤与下拉候选,提升探索效率。/api/sync为/auth-files(15s)和/usage(60s)增加超时控制,并区分超时/普通错误,避免上游阻塞拖垮同步请求。records同步失败/超时改为悬浮窗报错(含错误样式),让超时信息更直观可见。records同步反馈新增 warning 态:当前端收到/api/sync的authFilesWarning时以黄色提示展示“部分成功”,并在有入库时附带同步条数,减少用户误判。
- 修复时区配置与 SQL 分组问题,避免统计在不同时区下出现偏差。
- 仪表盘图表改进(组合图/错误指标/线条样式)并补充记录页路由显示控制,增强可视化表达。
- 升级开发依赖(
@types/node、drizzle-kit),保持工具链稳定。
- 升级
recharts,改进图表兼容性与表现。
- 概览 API 增加
skipCache控制,便于在需要时获取最新统计。
- 升级开发依赖(
eslint-config-next、@types/node),提升开发体验。
- 升级
lucide-react,更新图标依赖。
- 升级 React 及类型依赖,保持框架版本一致。
- 升级
next与zod,提升框架与校验库兼容性。
- 模型价格同步链路集中优化(搜索、按钮交互、并发锁、304 处理、鉴权、免费模型/批量更新),提升同步稳定性与可用性。
- 调整状态提示与日期选择器样式,降低界面干扰并提升可读性。
- 新增模型价格同步功能,为费用估算提供自动化数据来源。
- 修复成本计算表达式引用,确保费用统计正确。
- 完善同步与成本计费逻辑(含思考 token 计费),提高记录与费用准确性。
- 仪表盘增加成功/失败原始计数展示,并调整迁移与请求统计字段逻辑,提升数据可解释性。
- 上线调用记录页面与后端查询/API,并完善表格与日历样式,形成完整的记录管理能力。
- 升级
next与相关开发依赖,保持版本一致性。
- 升级
@types/node,保持类型定义更新。
- 优化筛选组件交互(动画、清除、状态切换)与小时维度图表能力(72h、柱状/面积切换)。
- 加入同步超时与状态修复,降低首屏阻塞风险。
- 增加自定义时间范围、Modal 与探索页交互优化,并推进 Next.js 版本迁移,提升整体交互流畅度。
- 调整请求数与 token 展示细节,提升数值展示直观性。
- 引入并优化 Toast 状态提示机制,增强同步过程反馈。
- 完善迁移脚本与构建流程,支持首次部署可用。
- 引入
vercel/analytics并优化散点图 Y 轴动画。
- 优化趋势图与探索图性能(仅渲染可视范围),并修复日志页与 tooltip 相关体验问题。
- 优化探索图与仪表盘布局,补充 Modal 能力并调整 README/构建配置,提升整体可维护性。
- 上线数据探索页与相关 API,补充缓存、同步、登录与错误处理等基础能力。
- 增加 CI/依赖管理与项目基础文件(如许可证、Dependabot),完善工程化。
- 初始化鉴权中间件、同步接口结构与基础文档,形成项目最初可用版本。