Files
ai-team-dashboard/dashboard/Bug修复报告-v1.3.md
fang c97d301e8f chore: 清理备份文件和压缩包
- 从仓库中移除 backup-*.jsonl 备份文件
- 移除 ai-team-dashboard-v1.5.0.tar.gz 压缩包
- 移除 ai-team-dashboard-v1.5.0-README.txt
- 更新 .gitignore 排除备份和压缩包文件
- 添加推送相关文档

Made-with: Cursor
2026-03-11 11:44:14 +08:00

8.4 KiB
Raw Blame History

Bug 修复完成报告

问题 1: 每日记忆查看历史日期会跳回今天 - 已修复

问题原因

定时刷新器每 30 秒调用 fetchMemory() 时不带参数,导致总是加载今天的数据,覆盖了用户选择的历史日期。

解决方案

  1. 修改 switchTab 函数

    else if (tab==='memory') { 
      fetchMemory(selectedMemoryDate);  // 使用选中的日期
      // 定时器也使用选中的日期
      memoryTimer = setInterval(() => fetchMemory(selectedMemoryDate), 30000); 
    }
    
  2. 修改 loadMemoryByDate 函数

    function loadMemoryByDate(){
      const datePicker = document.getElementById('memoryDatePicker');
      const selectedDate = datePicker.value;
      if(selectedDate){
        selectedMemoryDate = selectedDate;
        fetchMemory(selectedDate);
        // 更新定时器,使用新选择的日期
        clearInterval(memoryTimer);
        memoryTimer = setInterval(() => fetchMemory(selectedDate), 30000);
      }
    }
    
  3. 修改 loadTodayMemory 函数

    function loadTodayMemory(){
      selectedMemoryDate = null;
      const datePicker = document.getElementById('memoryDatePicker');
      datePicker.value = '';
      fetchMemory();
      // 更新定时器,使用今天的日期
      clearInterval(memoryTimer);
      memoryTimer = setInterval(() => fetchMemory(null), 30000);
    }
    

测试方法

  1. 打开"🧠 每日记忆"标签
  2. 选择一个历史日期(如 2026-03-09
  3. 点击"查看"
  4. 等待 30 秒,页面应该仍然显示选择的日期
  5. 点击"今天"按钮,返回今日记忆

现在选择历史日期后不会自动跳回今天了!


问题 2: 全栈高手和智囊团没有 API 调用和 Token 显示 - 已修复

问题原因

之前的统计逻辑只实现了 Leader Bot大龙虾Worker Bot全栈高手、智囊团的统计逻辑缺失。

Worker Bot 运行在 Docker 容器内,会话文件在容器的文件系统中,需要使用 docker exec 命令访问。

解决方案

1. 实现 Worker Bot 统计逻辑

// Worker Bot - 从 Docker 容器内的会话文件
else {
  const bot = BOTS.find(b => b.id === botId);
  if (!bot || !bot.container) return stats;
  
  // 获取容器内所有会话文件
  const filesCmd = `docker exec ${bot.container} find /home/node/.openclaw/agents/main/sessions -name "*.jsonl" -type f`;
  const files = exec(filesCmd).split('\n').filter(Boolean);
  
  // 分析每个会话文件
  for (const file of files) {
    const catCmd = `docker exec ${bot.container} cat "${file}"`;
    const content = exec(catCmd);
    const lines = content.split('\n').filter(Boolean);
    
    // 统计 API 调用和 Token
    for (const line of lines) {
      const entry = JSON.parse(line);
      if (entry.type === 'message' && entry.message?.role === 'assistant') {
        const usage = entry.message?.usage;
        if (usage) {
          apiCalls++;
          totalInputTokens += usage.input || 0;
          totalOutputTokens += usage.output || 0;
        }
      }
    }
  }
}

2. 添加 5 分钟缓存

Worker Bot 的统计需要读取容器内的所有会话文件耗时较长2-4 秒)。添加 5 分钟缓存避免频繁计算:

function analyzeSessionStats(botId) {
  const stats = loadBotStats(botId);
  
  // 如果缓存在 5 分钟内,直接返回
  if (stats.lastUpdated && (Date.now() - new Date(stats.lastUpdated).getTime() < 300000)) {
    return stats;
  }
  
  // ... 执行统计逻辑
}

数据验证

全栈高手 (qianwen):

{
  "apiCalls": 645,
  "totalTokens": 24443881,
  "inputTokens": 24263824,
  "outputTokens": 180057
}

智囊团 (kimi):

{
  "apiCalls": 913,
  "totalTokens": 12518992,
  "inputTokens": 12436625,
  "outputTokens": 82367
}

两个 Worker Bot 都有完整的统计数据了!


📊 性能优化

缓存策略

Bot 缓存时间 理由
Leader 5 分钟 主机文件读取快
Worker 5 分钟 Docker 读取慢,需要缓存

性能对比

全栈高手 & 智囊团统计:

首次请求(冷启动): ~4 秒  (需要读取 Docker 内所有会话文件)
5 分钟内再次请求:   <100ms (从缓存文件读取)

整体 /api/stats 接口:

首次请求: ~10 秒  (所有 Bot 都需要统计)
缓存命中: <1 秒   (所有数据从缓存读取)

🎯 技术细节

Worker Bot 会话文件位置

# 全栈高手
/home/node/.openclaw/agents/main/sessions/*.jsonl
容器: ai-team-qianwen

# 智囊团
/home/node/.openclaw/agents/main/sessions/*.jsonl
容器: ai-team-kimi

会话文件格式

Worker Bot 和 Leader Bot 使用相同的会话文件格式:

{
  "type": "message",
  "message": {
    "role": "assistant",
    "usage": {
      "input": 26912,
      "output": 174,
      "cacheRead": 0,
      "cacheWrite": 0,
      "totalTokens": 27086,
      "cost": {
        "input": 0.107648,
        "output": 0.002784,
        "total": 0.110432
      }
    }
  }
}

Docker 命令优化

使用 find + cat 而不是多次独立调用:

# 方法 1: 逐个读取(慢)
docker exec container cat file1.jsonl
docker exec container cat file2.jsonl
...

# 方法 2: 一次性获取列表,然后批量读取(快)
docker exec container find /path -name "*.jsonl"
# 然后逐个 cat

虽然还是需要多次 docker exec,但加上缓存后体验很好。


🎨 用户体验

修复前

  • 选择历史日期后 30 秒自动跳回今天
  • 全栈高手和智囊团没有统计数据
  • 数据统计页面看起来不完整

修复后

  • 选择历史日期后保持不变
  • 所有 Bot 都有完整的统计数据
  • 可以对比各个 Bot 的使用情况
  • 首次加载后5 分钟内访问都是秒开

📈 统计数据对比

三个 Bot 的使用情况

Bot API 调用 总 Token Input Output 平均/次
大龙虾 3,272 378M 378M 287K 115K
全栈高手 645 24.4M 24.2M 180K 37.9K
智囊团 913 12.5M 12.4M 82K 13.7K
总计 4,830 415M 415M 549K 86K

观察:

  • 大龙虾处理最多请求,平均 Token 最高(包含大量上下文)
  • 全栈高手次之,专注于实现任务
  • 智囊团调用次数多但平均 Token 较低(快速分析)

测试验证

测试 1: 历史日期保持

  1. 打开 http://localhost:3800
  2. 切换到"🧠 每日记忆"
  3. 选择日期2026-03-09
  4. 点击"查看"
  5. 等待 30 秒
  6. 页面仍显示 2026-03-09 的记忆

测试 2: Worker Bot 统计

  1. 打开"📈 数据统计"标签
  2. 查看三个 Bot 的卡片
  3. 大龙虾3,272 次调用378M tokens
  4. 全栈高手645 次调用24.4M tokens
  5. 智囊团913 次调用12.5M tokens

测试 3: 缓存性能

# 第一次请求(冷启动)
time curl http://localhost:3800/api/stats
# 预期: ~10 秒

# 第二次请求(缓存)
time curl http://localhost:3800/api/stats
# 预期: <1 秒

🔧 后续优化建议

1. 后台定时刷新

可以添加后台任务,每 5 分钟自动更新所有 Bot 的统计:

// 每 5 分钟后台刷新统计
setInterval(() => {
  BOTS.forEach(bot => analyzeSessionStats(bot.id));
}, 300000);

2. 增量统计

只统计新增的会话文件,而不是每次都统计所有文件:

// 记录上次统计的文件列表
// 下次只统计新文件

3. 优化 Docker 读取

可以考虑将 Worker Bot 的会话文件挂载到主机,避免使用 docker exec

# docker-compose.yml
volumes:
  - ./worker-sessions:/home/node/.openclaw/agents/main/sessions:ro

🎉 总结

修复内容

  1. 每日记忆历史日期选择后不会跳回今天
  2. 全栈高手和智囊团的 API 统计正常显示
  3. 添加 5 分钟缓存优化性能

技术改进

  • 定时器传递正确的参数
  • 实现 Docker 容器内会话文件读取
  • 添加智能缓存机制
  • 统一 Worker 和 Leader 的统计逻辑

性能提升

  • Worker Bot 统计首次: ~4 秒
  • Worker Bot 统计缓存: <100ms
  • 整体提升: 95%+

服务已重启: http://localhost:3800

清除浏览器缓存并刷新页面即可看到修复效果! 🎉