Dashboard 功能
活跃 Session
活跃 Session 页面提供了实时监控功能,让管理员能够查看当前正在进行的 API 请求会话,了解系统的实时运行状态。
功能概述
Session(会话)是 Claude Code Hub 中的核心概念。当用户通过 API 发起请求时,系统会为连续的对话分配一个唯一的 Session ID,用于:
- 会话追踪:记录同一对话的多次请求
- 供应商粘性:确保同一会话的请求路由到同一供应商,提高缓存命中率
- 并发控制:限制单个会话的并发请求数
Session 生命周期
Session 默认有效期为 5 分钟。在此期间的请求会复用同一 Session,超过 5 分钟无活动后 Session 自动过期。
页面布局
活跃 Session 列表
页面顶部显示当前活跃的 Session 列表,包含以下信息:
| 列名 | 说明 |
|---|---|
| Session ID | 会话唯一标识(显示前 16 位) |
| 用户 | 发起请求的用户名称 |
| 密钥 | 使用的 API 密钥名称 |
| 供应商 | 当前绑定的供应商名称 |
| 模型 | 请求使用的模型名称 |
| 请求数 | 该 Session 累计的请求次数 |
| 输入 Token | 累计输入 Token 数量 |
| 输出 Token | 累计输出 Token 数量 |
| 费用 | 累计费用(按系统设置的货币显示) |
| 耗时 | Session 运行时长 |
| 操作 | 查看详情按钮、终止按钮 |
非活跃 Session 列表
如果存在非活跃但尚未完全过期的 Session,页面会显示第二个列表区域。非活跃 Session 列表以半透明样式显示,并标注「不计入并发数」。
活跃与非活跃的区别
- 活跃 Session:5 分钟内有请求活动,计入并发限制
- 非活跃 Session:超过 5 分钟无活动,但 Redis 数据尚未完全清理,不计入并发限制
分页功能
活跃 Session 和非活跃 Session 列表均支持独立分页,方便浏览大量会话记录。
分页说明:
| 项目 | 说明 |
|---|---|
| 每页数量 | 固定每页显示 20 条记录(不可配置) |
| 独立分页 | 活跃和非活跃列表各自维护独立的页码 |
| 分页控件 | 显示「当前页 / 总页数」格式 |
| 翻页操作 | 点击左右箭头按钮切换上一页/下一页 |
分页状态在自动刷新时会保持不变,确保浏览体验的连续性。
批量终止 Session
活跃 Session 列表支持批量终止功能,方便管理员快速清理多个会话。
进入多选模式
点击列表右上角的「多选」按钮,进入多选模式。进入后:
- 表格最左侧会出现复选框列
- 表头显示全选/取消全选复选框
- 右上角显示「已选择 N 个」计数器
- 出现「终止选中」和「取消多选」按钮
选择操作
| 操作 | 说明 |
|---|---|
| 单选 | 点击行首的复选框选中/取消单个 Session |
| 全选 | 点击表头复选框选中当前列表所有 Session |
| 取消全选 | 再次点击表头复选框取消所有选择 |
批量终止
选中目标 Session 后,点击「终止选中」按钮执行批量终止:
- 系统验证每个 Session 的权限
- 对有权限的 Session 执行终止操作
- 清除相关缓存
- 显示操作结果
权限说明
| 用户角色 | 可终止范围 |
|---|---|
| 管理员 | 所有用户的 Session |
| 普通用户 | 仅自己创建的 Session |
访问控制
仅管理员可访问
v0.3.33 版本起,Session 管理页面(/dashboard/sessions)仅对管理员开放。普通用户访问时会被自动重定向到仪表盘主页。
页面访问权限
| 用户角色 | 页面访问 | 说明 |
|---|---|---|
| 管理员 | 允许 | 可以访问完整的 Session 管理功能 |
| 普通用户 | 禁止 | 访问时重定向到 /dashboard |
管理员功能权限
管理员可以执行以下操作:
| 功能 | 范围 |
|---|---|
| 查看活跃 Session 列表 | 所有用户的 Session |
| 查看 Session 详情 | 所有 Session |
| 批量终止 Session | 所有 Session |
| 查看 Session 消息 | 所有 Session |
| 查看代理状态 | 所有 Session |
API 级别权限(纵深防御)
除页面级控制外,后端 API 也实现了数据隔离作为安全纵深防御:
| API 功能 | 管理员 | 普通用户(直接调用 API) |
|---|---|---|
| 获取 Session 列表 | 返回所有用户数据 | 仅返回自己的数据 |
| 获取 Session 详情 | 可查看所有 Session | 仅可查看自己的 Session |
| 获取 Session 消息 | 可查看所有 Session | 仅可查看自己的 Session |
| 终止 Session | 可终止所有 Session | 仅可终止自己的 Session |
双重防护
API 级别的权限过滤是安全纵深防御的一部分,防止通过直接调用 API 绕过页面权限检查。
Session 消息可能包含敏感信息。管理员查看用户 Session 消息时应遵守组织的隐私政策。
结果反馈
批量终止完成后,系统会显示详细的操作结果:
| 反馈类型 | 说明 |
|---|---|
| 成功提示 | 显示成功终止的 Session 数量 |
| 无权限警告 | 显示因权限不足而跳过的数量 |
| 不存在警告 | 显示因 Session 已过期或不存在而跳过的数量 |
| 失败警告 | 显示因 Redis 错误等原因失败的数量 |
注意事项
- 非活跃 Session 不支持多选终止(已自动过期)
- 正在终止过程中的 Session 会显示加载状态
- 终止操作不可撤销
自动刷新
页面默认每 3 秒自动刷新一次数据。刷新时,表格右上角会显示「刷新中...」提示。
Session 详情页
点击任意 Session 行的「查看」按钮,可进入该 Session 的详情页面。
三栏布局
详情页采用三栏布局设计:
| 区域 | 位置 | 功能 |
|---|---|---|
| 请求列表侧边栏 | 左侧 | 显示 Session 内所有请求,支持切换查看 |
| 消息详情区域 | 中间 | 显示选中请求的完整内容 |
| 统计信息卡片 | 右侧 | 显示 Session 概览、Token 使用等统计 |
请求列表侧边栏
左侧侧边栏显示该 Session 内的所有请求记录,支持以下功能:
请求信息展示:
| 元素 | 说明 |
|---|---|
| 状态图标 | 绿色勾表示成功(2xx),红色叹号表示错误,旋转图标表示进行中 |
| 请求序号 | 显示为 #N 格式,N 为请求在 Session 内的序号 |
| 相对时间 | 显示距今时间(如 <1m、5m、2h、1d) |
| 模型名称 | 本次请求使用的模型 |
| 状态码 | HTTP 响应状态码(200、400、500 等) |
排序功能:
请求列表支持按时间排序,点击侧边栏标题栏右侧的排序按钮(ArrowDownUp 图标)可切换排序方式:
| 排序方式 | 说明 |
|---|---|
| 正序(asc) | 按时间从早到晚排列,最早的请求显示在最上方 |
| 倒序(desc) | 按时间从晚到早排列,最新的请求显示在最上方 |
排序切换行为
切换排序方式时,分页会自动重置到第一页,确保用户始终从列表开头浏览。
交互操作:
- 点击任意请求行切换到该请求的详情
- 侧边栏支持分页,每页显示 20 条记录
- 点击左上角折叠按钮可收起侧边栏,仅显示请求数量
URL 参数驱动:
请求切换通过 URL 参数 ?seq=N 实现,其中 N 为请求序号。这意味着:
- 可以直接通过 URL 访问特定请求:
/dashboard/sessions/{sessionId}/messages?seq=3 - 浏览器前进/后退按钮可以在不同请求间导航
- 可以分享特定请求的链接给其他用户
消息详情区域
中间区域显示选中请求的完整内容:
客户端信息:
显示请求的 User-Agent 信息,帮助识别客户端类型(如 Claude Code CLI 版本、操作系统等)。
Tab 切换视图:
v0.3.37 新增
消息详情区域支持通过 Tab 切换查看不同类型的数据,包括请求头、请求体、响应头、响应体四个选项卡。
| Tab 名称 | 内容说明 |
|---|---|
| 请求头 | HTTP 请求头信息,以纯文本格式展示 |
| 请求体 | 完整的请求 messages 数据,以格式化 JSON 展示 |
| 响应头 | HTTP 响应头信息,以纯文本格式展示 |
| 响应体 | API 返回的完整响应,以格式化 JSON 展示 |
请求头追踪
v0.3.38 进一步完善了请求头追踪功能,确保请求过滤器修改的 header 能够在 Session 详情中正确显示。
请求体(Request Body):
完整的请求 messages 数据,以格式化的 JSON 展示。包含:
- 系统提示词(system message)
- 用户消息(user message)
- 助手回复(assistant message)
- 工具调用(tool calls)等
响应体(Response Body):
API 返回的完整响应体,以格式化的 JSON 展示。包含:
- 模型回复内容
- Token 使用统计
- 停止原因等元数据
右侧信息卡片
右侧显示四个统计信息卡片:
1. Session 概览
| 字段 | 说明 |
|---|---|
| 总请求数 | Session 内累计的请求次数 |
| 首次请求时间 | Session 第一次请求的时间戳 |
| 最后请求时间 | Session 最后一次请求的时间戳 |
| 总耗时 | 所有请求的累计耗时 |
2. 供应商和模型
| 字段 | 说明 |
|---|---|
| 供应商列表 | Session 中使用过的所有供应商 |
| 模型列表 | Session 中使用过的所有模型 |
3. Token 使用
| 字段 | 说明 |
|---|---|
| 总输入 Token | 所有请求的输入 Token 总和 |
| 总输出 Token | 所有请求的输出 Token 总和 |
| 缓存创建 Token | 缓存创建消耗的 Token |
| 缓存读取 Token | 从缓存读取节省的 Token |
| Token 总计 | 上述所有 Token 之和 |
4. 费用信息
显示该 Session 的累计费用,按系统配置的货币单位显示。
操作按钮
详情页顶部提供以下操作:
| 按钮 | 功能 |
|---|---|
| 返回 | 返回 Session 列表页 |
| 复制 Messages | 将当前请求消息复制到剪贴板 |
| 下载 Messages | 将当前请求消息保存为 JSON 文件 |
| 复制响应 | 将当前响应内容复制到剪贴板 |
| 终止 Session | 强制终止该 Session(会弹出确认对话框) |
需要启用消息存储
要查看请求消息和响应内容,需要在环境变量中设置 STORE_SESSION_MESSAGES=true。启用后会增加 Redis 内存使用,且可能包含敏感信息,请谨慎评估后再开启。
Session 与供应商粘性
Session 机制与供应商粘性(Session Stickiness)紧密相关:
- 首次请求:系统根据权重和优先级选择供应商,并将 Session 绑定到该供应商
- 后续请求:同一 Session 的请求优先路由到已绑定的供应商
- 故障转移:如果绑定的供应商不可用(熔断或禁用),系统会自动切换到其他供应商并更新绑定
这种机制的优势:
- 提高缓存命中率:连续对话发送到同一供应商,供应商端可利用上下文缓存
- 降低成本:缓存命中可减少输入 Token 计费
- 保证一致性:避免对话上下文在不同供应商间频繁切换
Session 状态说明
Session 有三种状态:
| 状态 | 说明 |
|---|---|
in_progress | 请求进行中 |
completed | 请求已完成 |
error | 请求出错 |
使用场景
监控系统负载
通过活跃 Session 数量和请求频率,可以了解当前系统的负载情况。
排查问题
当用户反馈请求异常时,可以通过 Session ID 快速定位到具体的请求记录,查看完整的请求和响应内容。
费用审计
查看各 Session 的 Token 使用和费用,了解资源消耗情况。
强制终止异常会话
当发现某个 Session 占用过多资源或存在异常行为时,可以通过单个终止或批量终止功能强制结束会话。
相关配置
以下环境变量与 Session 功能相关:
| 变量名 | 默认值 | 说明 |
|---|---|---|
SESSION_TTL | 300 | Session 过期时间(秒) |
STORE_SESSION_MESSAGES | false | 是否存储请求消息到 Redis |
SHORT_CONTEXT_THRESHOLD | 2 | 短上下文阈值(用于并发检测) |
ENABLE_SHORT_CONTEXT_DETECTION | true | 是否启用短上下文检测 |
