跳到主要内容

AgentSight 数据与存储

AgentSight 采集到的一切都以 SQLite 数据库形式留在本机。Dashboard、CLI 和 HTTP API 只是同一批文件的三种 视图。

数据放在哪里​

所有数据库位于 /var/log/sysak/.agentsight/,以私有 umask 创建,仅 root 可读。

文件内容
genai_events.db主库:保存 LLM 调用及其 Agent 进程的定时 CPU/RSS 采样,含耗时、会话与对话 ID
agentsight.db审计记录(LLM 调用与进程动作)以及 Token 消费聚合
interruption_events.db检测到的中断,含类型、严重级别与证据
optimization.dbDashboard 优化分析的结果
trajectories.dbATIF v1.7 轨迹,仅在开启 features.trajectory_collection 时存在
.agentsight-private/security.db安全事件、案例、证据与处置状态
.agentsight-private/enforcement.db拦截策略、违规记录与状态流转
.agentsight-private/reuse.db轨迹复用标签、人工决定、LLM verdict 与标签审计事件
.agentsight-private/causal.db持久化的因果归因 case
.dashboard_tokenDashboard 访问令牌(64 位十六进制,仅 root 可读)
optimization_config.json在 Dashboard 设置页填写的 LLM 配置(API Key 存于此)
*.db-wal、*.db-shmSQLite 预写日志与共享内存;属正常文件,干净退出时会做 checkpoint

serve、dashboard、skill-metrics、audit、metrics、summary、interruption 支持用 --db 指向别的数据库文件,这也是浏览副本或归档的方式。tracer 自身始终写入默认目录。

serve --db <path> 会让所有兄弟库都从 --db 所在目录解析——GenAI 事件、中断库、轨迹库以及 health checker 都跟着它走。私有的安全、拦截、复用与因果库从其 .agentsight-private/ 子目录解析。 因此归档副本是隔离展示的,不会混入当前主机的数据。请把兄弟 .db 文件以及存在时的 .agentsight-private/ 目录放在你传入的那个文件的同一目录下。裸相对路径 --db name.db 使用当前目录。

这些文件包含完整的提示词与模型回答,请按敏感数据对待:保持安装时的目录权限,往外拷贝时务必谨慎。

SQLite 为唯一活跃输出时会立即保存已经完成的调用。默认 Logtail 即使已注册,只要部署文件不存在 或 telemetry 已关闭,就不会增加 session 等待。如果之后才识别出 Agent 的会话,会同时更新已存储 的 session ID 与完整事件 JSON。FFI callback 和活跃的外部 exporter 仍在投递前等待 session 解析。 每次调用都会检查输出门控,因此启用或恢复 Logtail 后,后续调用会恢复该等待。

保留与容量上限​

trajectories.db 通过 source_session_states 保存 Hermes 扫描指纹,按采集会话 ID、来源和 规范化数据库路径区分。该元数据在正文容量淘汰和采集器重启后仍保留,未变化的会话保持被淘汰状态, 直到源发生变化。可写打开旧库时自动建表,并从已有 Hermes 轨迹元数据补齐状态,不读取 ATIF 正文。 维护时清理源消息时间已过保留期或源文件已消失的状态;关闭按时间保留限制时,源库存在则保留状态。 不需要改变 JSON 配置版本,也不会修改源 Hermes 数据库。

SSE 调用超过采集字节上限或因连接容量被驱逐时,AgentSight 仅输出有界元数据,标记 incomplete=true、metadata_only=true 和 abandon_reason,不保留正文、消息或 token 用量; 字节超限还设置 truncated=true。容量驱逐跳过最近 5 秒活跃的在途调用,包括请求组装和等待响应阶段; 所有条目均受保护时, 拒绝新调用并标记 abandon_reason=capacity_rejected。HTTP/1 调用完成后保留不含 payload 的名额 5 秒, 供下一次 keep-alive 请求复用。活跃连接与保留名额合计不超过 connection_capacity;名额过期前可能拒绝新连接。 硬字节上限仍可回收活跃条目。有界标记会跳过该调用的 后续尾流,避免反复输出 incomplete 记录和驱逐其他连接。新请求或 HTTP 响应清除标记, 但容量拒绝的调用必须等到新请求到达才清除标记。标记可能因 容量限制被提前移除;定期维护按配置的连接软超时、硬超时和 60 秒三者中的最大值使标记过期。 硬超时移除仍允许迟到响应恢复为 response-only 证据。

schema v4 为每个 AgentSight 自有数据库统一配置 retention_days、max_db_size_mb 和 check_interval_secs:

存储默认策略清理覆盖范围配置项
agentsight.db30 天、500 MiB、每 60 秒完整:审计、Token、HTTP 与消费历史storage.primary
genai_events.db30 天、200 MiB、每 60 秒完整:GenAI 事件、资源采样与 evaluation run 共用这个物理库storage.genai
interruption_events.db30 天、100 MiB、每 60 秒完整的中断历史storage.interruptions
trajectories.db30 天、500 MiB、每 300 秒部分:清理轨迹正文,但保护近期文件和 Hermes 会话的指纹storage.trajectories
optimization.db30 天、200 MiB、每 300 秒完整的优化结果历史storage.optimization
.agentsight-private/security.db30 天、200 MiB、每 3,600 秒部分:清理终态案例图和无引用事件,保护活动案例图storage.security_audit
.agentsight-private/reuse.db30 天、200 MiB、每 300 秒部分:仅旧标签事件与未确认的纯自动标签storage.reuse
.agentsight-private/causal.db30 天、200 MiB、每 300 秒部分:淘汰最旧缓存,但至少保留最新一条storage.causal
.agentsight-private/enforcement.db30 天、100 MiB、每 60 秒部分:仅 violation 与终态 transitionstorage.enforcement

Tokenless 的 stats.db 会在状态 API 中列为外部存储。AgentSight 只读打开它,不执行生命周期治理;该文件 仍由 Tokenless 管理。

storage.max_total_size_mb 为 9 个 AgentSight 自有数据库设置总物理占用上限,默认值为 2200 MiB。设为 0 可关闭总量限制;启用时必须至少为 9 MiB,确保每个数据库至少保留可执行治理的 1 MiB 配额。

每项值为 0 时分别关闭按时间清理、按容量清理或定时检查。因而检查间隔为零时,即使保留天数和容量上限 非零,也不会自动治理该存储。旧 check_interval_inserts 字段已不支持;v4 之前的配置会按既有 schema 升级机制先备份再替换。

每个现有的长期运行 trace、serve、本地 trace 或本地 serve 进程最多启动一个轻量 sqlite-maintenance 线程,不会另起维护进程。该线程顺序执行本进程负责的所有数据库任务。trace 与 serve 同时覆盖同一物理文件时,通过 <db>.maintenance.lock 协调;拿到锁的进程会重新测量保留与容量 状态后再执行操作。

GenAI 维护使用独立于采集投递与查询的连接。删除分成小批次,并在批次之间释放写锁;数据库忙时,维护 延后到下一轮。WAL checkpoint 先通过 passive 模式复制页面,再尝试立即截断,避免长期读事务使维护 等待时阻塞采集写入。 采集写入或排队重试需要写锁时,维护不会再启动下一批删除,而是延后到后续调度轮次。

开启定时维护时,trace 进程将 primary 和 GenAI 的 WAL checkpoint 交给该维护线程,避免在采集提交时触发。 保留与容量检查之间约每秒执行一次 passive checkpoint;清理周期仍由 check_interval_secs 控制。 SQLite 的同步持久性设置保持原值。关闭定时维护时,采集连接保留自动 WAL checkpoint。

开启 runtime_limits.cpu_budget_percent 后,primary 与 GenAI 清理会在有界操作之间让出执行权, 并在后续调度继续。维护与采集投递共用 CPU 准入,既有保留和容量目标继续生效,但清理一轮可能耗时更长。

完成的采集记录遇到临时 SQLite 写锁冲突时,会留在现有 pending 队列中重试,与等待 session ID 的事件 共享 pending_genai_max_count 和 pending_genai_max_bytes_mb。重试不会向外部出口重复发送记录。 超出预算或永久写入失败会记录日志;agentsight_genai_sqlite_retry_total 按 queued、busy、stored、 over_budget、failed 区分排队、锁冲突、写入成功、预算拒绝和失败次数。

每次维护遵循同一顺序:

  1. 按各业务 Store 的 schema 安全规则,删除早于保留截止时间且允许淘汰的记录。
  2. 如果按时间删除改变了数据库,必须成功完成 WAL checkpoint 后才能继续。
  3. 仅在物理占用(database、WAL 与 SHM)超过上限时触发容量淘汰。
  4. 按最旧且允许淘汰的记录清理,每轮 checkpoint,直到逻辑占用降至上限的 90%。

总量分配排序同样计入 WAL 与 SHM,因此 WAL 较大的数据库可能在一轮中优先治理。该数据库会在淘汰前执行 checkpoint,后续轮次再按新的物理占用重新分配。

自动维护永远不执行 VACUUM。释放页保留在 freelist 中供后续写入复用,因此物理文件较大但逻辑占用在 目标内时仍属正常。如需向文件系统归还空间,请先停止服务,再在维护窗口手动执行 sudo sqlite3 /var/log/sysak/.agentsight/<db> 'VACUUM;'。

两个部分覆盖的存储会刻意保护持久决定与控制状态。复用库不会删除人工持有、已确认或已覆盖的标签;拦截库 会保护 binding、pending 或 indeterminate transition,以及 credential intent/snapshot 状态。因果条目是缓存, 被淘汰后再次请求可能重新触发付费归因计算。

容器部署请注意:这些保留语义只在数据目录持久化时才有意义。不挂卷时容器每次重启都会清空全部数据, 详见 容器与 Sidecar 的持久化一节。

Settings 页面通过 POST /api/storage/config 修改总量上限。使用配置文件启动的长期运行 trace、 serve、本地 trace 和本地 serve 进程都会在维护前重读有效配置,无需重启;本地进程未指定 --config 时不能持久化修改。配置文件缺失、未写完或无效时继续使用最近一次有效上限。页面还会展示物理/逻辑占用、 清理覆盖范围与维护 worker 状态。

通过 API 查看当前占用:

TOKEN=$(sudo cat /var/log/sysak/.agentsight/.dashboard_token)
curl -s -H "Authorization: Bearer $TOKEN" http://127.0.0.1:7396/api/storage/status \
| python3 -m json.tool

响应使用 schema version 3。每个存储都返回 availability、size、policy、coverage、size_state,以及包含 scheduled、worker_running、worker_heartbeat_unix_ms、last_attempt_unix_ms、 last_success_unix_ms、last_result、consecutive_failures、next_run_unix_ms 的 maintenance 对象。 轨迹、安全审计、复用、因果与拦截库会因受保护数据而报告 partial。运行态字段只描述提供当前响应的进程, trace 负责的库显示未调度,并不能证明另一个 trace 进程没有运行。接口不返回数据库路径。 within_policy 只表示容量状态;worker 是否健康必须结合调度、heartbeat、尝试、结果与失败字段判断。

也可以直接检查目录:

sudo du -sh /var/log/sysak/.agentsight
sudo ls -la /var/log/sysak/.agentsight

清空数据​

sudo systemctl stop agentsight.service
sudo rm -rf /var/log/sysak/.agentsight
sudo systemctl start agentsight.service

删掉目录也会删掉 Dashboard 令牌,下次启动会重新生成。如果想保留历史,先把目录拷到别处,之后用 agentsight serve --db /path/to/genai_events.db 浏览。

HTTP API​

服务自己会给出路由清单,不用猜:

curl -s http://127.0.0.1:7396/api/docs | python3 -m json.tool

非本机请求需要令牌:

TOKEN=$(sudo cat /var/log/sysak/.agentsight/.dashboard_token)
curl -s -H "Authorization: Bearer $TOKEN" http://<host>:7396/api/sessions

0.11 的端点分组:

分组示例用途
服务GET /health、GET /metrics、GET /api/docs存活探测、Prometheus 指标、路由清单(/health 与 /metrics 仅本机可访问)
认证GET /api/auth/status、GET /api/auth/verify、POST /api/auth/login认证状态、能力列表、令牌换 cookie
会话与调用GET /api/sessions、GET /api/sessions/{id}/traces、GET /api/sessions/{id}/resources、GET /api/traces/{id}、GET /api/conversations/{id}、POST /api/sessions/search会话列表、会话内对话摘要(以 conversation_id 为键)与进程资源、按 response_id 的单次调用详情、语义搜索
指标GET /api/timeseries、GET /api/metrics/latency、GET /api/agent-namesToken 时序、延迟分位、Agent 过滤项
中断GET /api/interruptions、/count、/stats、/session-counts、/conversation-counts、POST /api/interruptions/{id}/resolve排查与关闭
Agent 健康GET /api/agent-health、DELETE /api/agent-health/{pid}、POST /api/agent-health/{pid}/restart实时状态与恢复动作
Tokenless 记录POST /api/tokenless/refresh、GET /api/tokenless/records、GET /api/tokenless/records/{cache_id}刷新已保存统计、列出元数据和读取详情;内容需显式指定 include_content=true。三条路由即使来自 loopback 也需要 Dashboard 凭据
Token 节省GET /api/token-savings、GET /api/token-savings/session/{id}Tokenless 节省量
ATIF 导出GET /api/export/atif/session/{id}(还有 trace、conversation)轨迹导出
轨迹GET /api/trajectories、/filters、/steps、/{session_id}已采集轨迹。列表支持可选的 label、exclude_label、human_backed 过滤;label 是逗号分隔的有效标签,例如 good,bad
复用标签POST /api/reuse/triage、GET /api/reuse/sessions、POST /api/reuse/sessions/{session_id}/label、POST /api/reuse/sessions/labels:batch-confirm、GET /api/reuse/label-stats、POST /api/reuse/judge规则分诊与人工标签决定。judge 需要 features.reuse_llm_judge=true 与已配置的 LLM 凭据,并会产生付费模型调用
偏好GET /api/preferences、/export、/turns用户偏好分析、Markdown 导出,以及供 Agent 侧推理使用的用户原始轮次
存储GET /api/storage/status、POST /api/storage/configschema v3 的总量上限、容量、覆盖范围与维护 worker 状态;存在配置文件时可通过 POST 持久化总量上限
Skill 指标GET /api/skill-metrics、/downloads、/loads、/usage-ratio、/distribution、/hotnessSkill 采纳情况
优化分析POST /api/optimize/sessions/{id}/{dimension}、GET /api/optimize/results、GET 与 POST /api/optimize/configLLM 辅助分析
质量与归因POST /api/grader/evaluate、GET /api/grader/latest、POST /api/causal-attribution会话质量评分、根因归因
安全与审计GET /api/security/*、GET /api/audit/*、POST /api/audit/cases/{id}/review装了 agent-sec-core 时可用
拦截GET /api/enforcement/health、POST /api/enforcement/bindings、GET /api/enforcement/violations装了 enforcer 时可用;写操作始终要求令牌

时间范围参数是纳秒时间戳(start_ns、end_ns),与 CLI 的 --last 窗口对应。

# 最近一小时的会话
NOW=$(date +%s%N); AGO=$((NOW - 3600000000000))
curl -s "http://127.0.0.1:7396/api/sessions?start_ns=$AGO&end_ns=$NOW" | python3 -m json.tool | head

获取某个 Session 的原始 CPU/RSS 采样点和活动区间:

curl -s "http://127.0.0.1:7396/api/sessions/<SESSION_ID>/resources?max_points=2000" | python3 -m json.tool

每个采样点都是进程级数据,包含 Epoch 纳秒时间戳、PID、CPU 百分比和以字节计的 RSS 内存。对于多进程 Agent,Dashboard 会汇总该 Session 关联的所有 PID。这些数据表示 Session 运行时的进程环境,并非严格的 Session 资源归因:同一个共享 Agent 进程可能同时服务多个 Session。LLM 区间使用采集到的请求和响应时间; Tool Call 区间从产生工具请求的 LLM 响应结束开始,到携带对应工具结果的下一次 LLM 请求开始为止。未被 LLM 调用或已匹配 Tool Call 覆盖的间隙会返回为 idle;无法匹配结果的 Tool Call 不会虚构结束时间。

Chrome Trace 中的进程输出​

对于聚合的进程生命周期,Chrome Trace 只保留 stdout 和 stderr 的开头内容,每条流最多 64 KiB。 任一流达到上限后,其后续输出不再保留;另一条流仍可继续保留到自己的上限。若上限截断 UTF-8 字符, 则舍弃不完整的尾部。其他无效字节沿用有损文本解码。

Prometheus 指标​

curl -s http://127.0.0.1:7396/metrics | head
# HELP agentsight_token_input_total Total input tokens consumed by agent (all-time)
# TYPE agentsight_token_input_total counter
agentsight_token_input_total{agent="CoshNG"} 100000
agentsight_token_input_total{agent="Cosh"} 50000

计数器按 Agent 维度、取累计值:agentsight_token_input_total、agentsight_token_output_total、 agentsight_token_total_total、agentsight_llm_requests_total。/metrics 只允许本机访问,因此请用 节点本地的 Prometheus agent 抓取,或者通过本机反向代理暴露。agentsight metrics 在命令行输出同样内容。

agentsight_http_sse_discarded_bytes_total{reason} 统计保留废弃 SSE 标记期间跳过的尾流字节。 结合 agentsight_http_conn_removed_total{reason,state} 可区分资源压力与正常完成。 Aggregator 阶段耗时包含 compact SSE 读取。 agentsight_http2_closed_stream_discarded_bytes_total 统计 HTTP/2 正常完成或因资源、协议问题终止后 跳过的 DATA payload 字节;trailer 仍更新 header 解码器。

轨迹导出(ATIF v1.7)​

任意会话、对话或单次调用都能导出为自包含的 JSON 轨迹——Agent 元信息、步骤、消息、工具调用与 Token 汇总:

curl -s http://127.0.0.1:7396/api/export/atif/session/<SESSION_ID> > session.atif.json

Dashboard 的轨迹查看页通过下载 JSON 提供同一份文件,也能导入在别的机器上采集的轨迹。适合离线分析、 共享复现场景,或喂给评测流水线。

外部日志导出​

AgentSight 可以把结构化事件写入文件,供外部日志采集器读取:

{
"runtime": { "sls_logtail_path": "/var/log/anolisa/agentsight/events.jsonl" },
"features": { "sls_logtail": true }
}

该路径支持运行期修改——设为 "" 即暂停导出。如果希望数据完全留在本机,保持默认即可。采集器侧的配置 (端点、凭证)不属于 AgentSight 的范围。

备份​

sudo systemctl stop agentsight.service
sudo tar czf agentsight-data-$(date +%F).tar.gz -C /var/log/sysak .agentsight
sudo systemctl start agentsight.service

先停服务可以确保 WAL 已 checkpoint,归档内容才是一致的。

相关页面​

查询到的 Tokenless 统计数据保存在现有 GenAI store 的 genai_events.db 中。同一端点、 源 ID 和原始时间戳的重复查询更新元数据,保留显式获取的完整内容与原始源会话 ID。 这些副本遵循 storage.genai 的保留期限和容量清理策略,不修改 Tokenless 数据库。