跳到主要内容

AgentSight 配置

AgentSight 只读一个 JSON 文件:/etc/agentsight/config.json(可用 --config 覆盖)。它决定哪些进程 被追踪、哪些功能开启、流水线最多占用多少内存。源码里的参考副本是 src/agentsight/agentsight.json。

修改前必须知道的两件事​

  1. 你的文件是「替换」内置默认规则,而不是「追加」。 如果 cmdline.allow 里漏了某条规则,对应 Agent 就不再被发现。请始终从随包发布的文件出发,在它基础上增加。
  2. 改完用 reload,不用 restart。 执行 sudo systemctl reload agentsight.service,守护脚本会重启 两个工作进程以重新读取配置,几秒内恢复采集。

文件结构​

{
"schema_version": 5,
"storage": {
"base_path": "/var/log/sysak/.agentsight",
"max_total_size_mb": 2200,
"primary": { "retention_days": 30, "max_db_size_mb": 500, "check_interval_secs": 60 },
"genai": { "retention_days": 30, "max_db_size_mb": 200, "check_interval_secs": 60 },
"interruptions": { "retention_days": 30, "max_db_size_mb": 100, "check_interval_secs": 60 },
"trajectories": { "retention_days": 30, "max_db_size_mb": 500, "check_interval_secs": 300 },
"optimization": { "retention_days": 30, "max_db_size_mb": 200, "check_interval_secs": 300 },
"security_audit": { "retention_days": 30, "max_db_size_mb": 200, "check_interval_secs": 3600 },
"reuse": { "retention_days": 30, "max_db_size_mb": 200, "check_interval_secs": 300 },
"causal": { "retention_days": 30, "max_db_size_mb": 200, "check_interval_secs": 300 },
"enforcement": { "retention_days": 30, "max_db_size_mb": 100, "check_interval_secs": 60 }
},
"runtime": {
"sls_logtail_path": ""
},
"server": {
"auth": { "enabled": true }
},
"deadloop": {
"enabled": false,
"kill_after_count": 3
},
"features": {
"token_stats": true,
"tokenizer": { "enabled": false, "cache_size": 4 },
"session_mapping": { "enabled": true, "max_entries": 10000 },
"sqlite_storage": { "enabled": true, "batch": { "max_size": 100, "flush_ms": 100 } },
"resource_sampling": false,
"interruption_detection": { "enabled": true },
"audit": true,
"token_consumption": false,
"sls_logtail": false,
"trajectory_collection": { "enabled": false, "scan_interval_secs": 30 },
"reuse_llm_judge": false
},
"runtime_limits": {
"event_channel_capacity": 10000,
"event_channel_policy": "backpressure",
"event_channel_max_bytes_mb": 64,
"pending_genai_max_count": 1000,
"pending_genai_max_bytes_mb": 16,
"pid_cache_size": 1024,
"connection_capacity": 128,
"connection_max_bytes_mb": 64,
"ffi_channel_max_bytes_mb": 64,
"max_connection_body_mb": 8,
"max_sse_retained_mb": 2,
"retain_raw_sse": false,
"connection_idle_timeout_secs": 60,
"connection_hard_timeout_secs": 300,
"ring_buffer_mb": 64
},
"https": [
{ "rule": ["dashscope.aliyuncs.com"] },
{ "rule": ["api.openai.com"] }
],
"http": [],
"cmdline": {
"allow": [
{ "rule": ["*cosh-core*"], "agent_name": "CoshNG" },
{ "rule": ["*node*", "*claude*"], "agent_name": "Claude" }
],
"deny": [
{ "rule": ["*", "*", "-c", "*sftp-server*"] }
]
},
"codex_offsets": { "schema_version": 1, "entries": [] }
}

SQLite 存储策略​

storage.base_path 是 AgentSight 自有数据库共用的目录。storage.max_total_size_mb 限制这些数据库的 总物理占用,默认值为 2200 MiB。设为 0 可关闭总量限制;启用时必须至少为 9 MiB。每轮维护前都会 重读有效配置;如果配置文件缺失、未写完或无效,则继续使用最近一次有效值。

在 schema v5 中,每项存储策略统一使用 retention_days、max_db_size_mb 和 check_interval_secs。值为 0 时,分别关闭按时间保留、按容量清理或定时维护;如果 check_interval_secs 为 0,即使另外两项 非零也不会自动执行维护。

存储保留时间容量上限检查间隔
storage.primary(agentsight.db)30 天500 MiB60 秒
storage.genai(genai_events.db,含评估结果)30 天200 MiB60 秒
storage.interruptions30 天100 MiB60 秒
storage.trajectories30 天500 MiB300 秒
storage.optimization30 天200 MiB300 秒
storage.security_audit30 天200 MiB3,600 秒
storage.reuse30 天200 MiB300 秒
storage.causal30 天200 MiB300 秒
storage.enforcement30 天100 MiB60 秒

维护先删除允许淘汰且已经过期的行。如果数据库因此发生变化,必须成功完成 WAL checkpoint 后才进入容量 阶段。物理占用超过 max_db_size_mb 时触发淘汰,并以逻辑占用降到上限的 90% 为目标。维护不会执行 VACUUM,释放页会留在 SQLite freelist 中供后续写入复用。

check_interval_inserts 已不再支持。schema_version 变化时配置格式整体替换:版本缺失或低于 v5 的文件 会先备份,再替换为 schema v5,不会合并旧设置。自定义配置请从随包发布的 agentsight.json 开始修改, 不要把旧字段复制到新文件。

功能开关​

features 下的每一项都可以独立关闭。关闭后对应模块根本不会被实例化,因此既不占内存也不产生 I/O。

功能JSON 路径默认值作用
Token 计账features.token_statstrue核心能力:按 Agent、模型统计 Token
本地 tokenizerfeatures.tokenizer.enabledfalse供应商未返回 usage 时用 Hugging Face 分词器兜底
Session 映射features.session_mapping.enabledtrue把供应商返回的 response ID 映射到 Agent 的 session ID
SQLite 存储features.sqlite_storage.enabledtrue本地持久化;关闭后使用空实现,Dashboard 将没有数据
资源采样features.resource_samplingfalse每秒采集 Agent CPU/RSS;依赖 SQLite 存储
中断检测features.interruption_detection.enabledtrue检测失败、停滞与死循环
审计features.audittrue持久化 LLM 调用与进程动作
Token 消费记录features.token_consumptionfalse额外的聚合消费记录
外部日志导出features.sls_logtailfalse把结构化事件写入文件,供外部采集器读取
轨迹采集features.trajectory_collection.enabledfalse周期扫描本地 Agent JSONL 会话和 Hermes state.db 写入 trajectories.db(仅 trace 模式)
轨迹 LLM 判定features.reuse_llm_judgefalse允许 POST /api/reuse/judge 调用已配置的 LLM 判定规则无法归类的轨迹;每次调用都会产生费用

reuse_llm_judge 只影响 POST /api/reuse/judge。除非已经配置优化 LLM 且明确需要付费的二级判定,否则请保持关闭。修改后 reload 服务,让 server 读取新配置。

随功能附带的调节项:

配置项默认值含义
features.tokenizer.cache_size4常驻内存的分词器模型个数
features.session_mapping.max_entries10000response ID → session ID 映射上限
features.sqlite_storage.batch.max_size100每批写入行数
features.sqlite_storage.batch.flush_ms100批量写入的最大延迟(毫秒)
features.trajectory_collection.scan_interval_secs30JSONL 与 Hermes SQLite 轨迹发现间隔;存储清理由 storage.trajectories.check_interval_secs 控制
features.trajectory_collection.scan_dirs未设置覆盖默认位置及环境变量路径;每项可指向会话根目录、Hermes home/数据库或四级内含 .claude/projects 的工作区上层目录

运行时上限​

这些限额约束流水线中保留的 payload。设置进程内存上限时,还应计入进程基线、eBPF ring buffer、 解码器工作内存和 allocator 开销。安装包 systemd unit 仍使用 MemoryMax=350M。

配置项默认值含义
cpu_budget_percent25trace 进程的协作式 CPU 目标;0 关闭调度,100 表示一个逻辑核
event_channel_capacity10000探针到流水线的有界通道容量
event_channel_policybackpressure通过字节限额后等待队列槽位;drop_newest 拒绝已满队列。sample、sample:N、sample=N 每 N 条保留一条(默认 N=10)
event_channel_max_bytes_mb64排队 probe payload 的字节上限;0 关闭限额。超过字节限额时丢弃事件并增加通道丢弃计数,与槽位策略分别执行
pending_genai_max_count1000原始完成记录、等待 session ID 的事件与本地 SQLite 重试共享条数上限
pending_genai_max_bytes_mb16同一队列的字节上限
pid_cache_size1024PID → Agent 名称的 LRU 条目数
connection_capacity128HTTP 连接缓存条目数,必须大于零;至少应达到预计同时存在的连接数
connection_max_bytes_mb64HTTP/1 与 HTTP/2 共用的保留字节预算,包含 buffer capacity 和解码器状态;0 关闭预算
ffi_channel_max_bytes_mb64FFI 事件 payload 的字节预算,计入执行中的 callback;0 关闭预算。同时受已有的 10000 条队列容量限制
max_connection_body_mb8单连接 body 上限,接收分片时立即检查
max_sse_retained_mb2单流保留的 SSE payload 上限,包含未完整事件;最小有效上限为 1 KiB
retain_raw_ssefalse保留原始 SSE 事件序列,关闭 provider delta 归约;仍受字节限额约束
connection_idle_timeout_secs60空闲软超时:只写一次 SQLite pending 行,并保留流以便恢复
connection_hard_timeout_secs300空闲硬超时:输出不完整记录并释放 HTTP/1 连接及 HTTP/2 流;0 关闭该超时
ring_buffer_mb64eBPF ring buffer 大小,必须是 2 的幂

默认 connection_capacity=128 可容纳 128 个并发 HTTP/1 连接。应按所有 Agent 实际打开的连接数 选择容量,一个 Agent 可能打开多个连接。HTTP/2 的流条目容量为该值的四倍,并共用同一字节预算。 最近 5 秒有流量的 HTTP/1 连接与 HTTP/2 流会跳过容量驱逐。所有条目均受保护时,拒绝新调用并标记 abandon_reason=capacity_rejected,已有调用继续采集。保护覆盖请求组装、等待响应及流式接收阶段; 在途调用空闲满 5 秒后可被淘汰。 HTTP/1 调用完成后将名额继续保留 5 秒,供 keep-alive 复用,仅保存连接标识和完成时间。 保留名额计入 connection_capacity,无后续流量时过期;期间新连接可能被拒绝。 HTTP/2 流 ID 不会复用,因此已完成的流不保留名额。 硬字节上限仍可回收受保护条目。已有配置中显式设置的容量保持不变。修改运行时限额后需要重启采集。

CPU 调度默认开启,cpu_budget_percent=25;设为 0 可关闭。 完成记录在分析和写入之前按进程 CPU 预算调度,并与 primary/GenAI 维护共用工作准入。原始记录转移到有界队列,最多使用 pending 字节预算的一半;队列满时施加背压。 清理在小步骤之间让出执行权,后续调度继续处理。较低目标可能增加投递和清理延迟。 该参数是协作式目标,单次操作和其他进程线程仍可能导致超出目标;调整时需一起检查采集完整性、 探针丢事件、队列增长及尾部排空时间。 agentsight_completion_queue_count、agentsight_completion_queue_bytes 和 agentsight_completion_wait_seconds 反映延迟投递,agentsight_cpu_budget_deferred_total 记录预算等待次数。

容量淘汰、容量拒绝、同 key 替换、字节超限、空闲硬超时、进程退出或采集关闭时,AgentSight 输出 finish_reason="incomplete"、abandon_reason 和 incomplete=true。 容量淘汰、容量拒绝与字节超限仅保留有界的路由和关联元数据,设置 metadata_only=true, 不保留正文、消息与 token 用量,也不执行完整 payload 分析。每个字段上限 2 KiB,最多保留八个路由或关联 header;字节超限还包含 truncated=true。其他生命周期移除继续保留已捕获的部分证据。 即使关闭 SQLite,这些记录也会走正常 FFI 投递路径;v2 callback 暴露 metadata,typed callback 暴露 incomplete finish reason。 新流量会刷新空闲计时。软超时 snapshot 依赖 SQLite 并保留在途状态;FFI 模式无采集事件时仍执行硬超时维护。

仅投递语义事件时,SSE delta 会增量归约,原始 TLS buffer 在流结束前即可释放。需要原始事件序列的 exporter 应启用 retain_raw_sse;FFI raw HTTPS 回退开启时也会保留原始序列。两种模式均受资源限额约束。

通过 AGENTSIGHT_METRICS_FILE 导出的运行时指标包括 agentsight_http_conn_removed_total{reason,state}、agentsight_http_abandoned_emitted_total{reason}、 agentsight_http_conn_active、agentsight_http_conn_retained_bytes、agentsight_ffi_inflight_bytes 和 agentsight_ffi_dropped_total{reason}。FFI 队列过载时丢弃最新事件,并按 count 或 bytes 原因计数, 可据此区分捕获不完整与消费端积压。

Agent 发现规则​

cmdline.allow 决定哪些进程算作 Agent、叫什么名字。每条规则是一组命令行 token,支持 * 通配, 所有 token 需按顺序匹配。

{ "rule": ["*node*", "*claude*"], "agent_name": "Claude" }

表示第一个参数含 node、下一个参数含 claude 的进程。

随包发布的规则覆盖 Hermes、Codex、Runloop、cosh(Cosh)、cosh-ng(CoshNG)、OpenClaw、 Claude Code、Qwen Code 和 AgentScope,共 31 条。

添加自己的 Agent,追加规则后 reload:

{ "rule": ["*python*", "*my_agent*"], "agent_name": "MyAgent" }
sudo systemctl reload agentsight.service

然后确认规则已生效:

sudo agentsight discover --list-known | grep -i MyAgent # 规则已列出
sudo agentsight discover # 跑一次自己的 Agent,然后看它被匹配

discover 读取的是 tracer 所用的同一份 config.json,因此 --list-known 会反映你的新增规则 (用 --config <path> 可指向其他文件)。也可以以采集到的数据为准——Agent 跑起来后 sudo agentsight summary --last 1 的会话数应当非零;若一直没有数据,用 journalctl -u agentsight.service 查看日志。

cmdline.deny 用于剔除本会被匹配到的进程——默认那条规则把 sftp-server 子进程排除在数据之外。

两个实战要点:

  • Rust、Go 编译出来的 Agent 二进制不会被 node* 这类规则匹配,需要为二进制名单独加规则。
  • 包装进程同样重要。cosh-ng 会派生 cosh-shell 和 cosh-core,因此两者都有规则。

端点规则​

配置节用途
https需要通过 uprobe 解密 TLS 流量的域名。自己的供应商域名不在里面时请补上。
http通过 TCP 探针采集的明文 HTTP 目标。
"https": [
{ "rule": ["dashscope.aliyuncs.com"] },
{ "rule": ["api.openai.com"] },
{ "rule": ["my-gateway.internal"] }
]

Dashboard 认证​

"server": { "auth": { "enabled": true } }

令牌认证默认开启。本机回环访问免认证,远程访问需要令牌。只有在可信内网才建议把 enabled 设为 false,详见 Dashboard 指南。

死循环自动终止​

"deadloop": { "enabled": false, "kill_after_count": 3 }

默认关闭。开启后,当同一个工具调用循环重复 kill_after_count 次时,AgentSight 会终止该 Agent 进程。 死循环的检测和上报与这个开关无关,它只控制 AgentSight 是否动手,详见 中断检测。

外部日志导出​

"runtime": { "sls_logtail_path": "" },
"features": { "sls_logtail": false }

runtime.sls_logtail_path 非空即开启基于文件的结构化事件导出,供外部日志采集器读取,且该路径支持 运行期热更新。想让数据完全留在本机就保持为空,详见 数据与存储。

Codex offset​

codex_offsets 保存 Codex CLI 各版本的符号偏移量——Codex 静态链接 TLS 库且不导出符号。AgentSight 会依次尝试符号表、字节模式匹配,最后才查这张表。如果新版 Codex 采集不到数据,用 src/agentsight/scripts/extract-codex-offsets.py 重新生成条目。

schema_version 与升级​

schema_version(当前为 5)标记配置格式版本。启动时 AgentSight 会与内置版本比对:

  • 相同或更新 → 保留文件不动;
  • 缺失或更旧 → 先复制为 config.json.bak.<unix秒>,再替换为当前默认配置。

schema v5 引入上述 HTTP 与 FFI 保留预算默认值,并下调 Probe 及延迟 GenAI 队列的字节预算。 旧版本配置会先备份后整体替换,需要从备份重新应用自定义发现规则和设置。

schema v4 把所有存储策略的按写入次数检查统一改为 check_interval_secs,并新增 reuse、causal 和 enforcement。旧 schema 中的自定义项不会自动合并。请在新文件上重新应用需要的规则,然后 reload 服务。

环境变量​

变量用途
AGENTSIGHT_TOKENIZER_PATH本地分词器模型所在目录
AGENTSIGHT_ENFORCER_SOCKETenforcer socket 路径(默认 /run/agentsight/enforcer.sock)
AGENTSIGHT_CHROME_TRACE输出 Chrome trace 文件用于流水线性能分析
AGENTSIGHT_METRICS_FILE将 Prometheus 运行时指标原子写入指定文件;未设置或设为空时关闭导出
AGENTSIGHT_METRICS_INTERVAL_SECS运行时指标快照的最短间隔,单位为正整数秒(默认 1);仅在设置 AGENTSIGHT_METRICS_FILE 时使用
RUST_LOG日志级别,例如 RUST_LOG=debug

运行时指标的更新频率不会高于设置的间隔。退出时即使间隔尚未到期,也会写入最终快照。 启用指标导出时,0 等无效间隔会导致启动失败。

改完怎么验证​

sudo systemctl reload agentsight.service
systemctl is-active agentsight.service
sudo agentsight summary --last 1

如果服务起不来,多半是 JSON 写坏了:

python3 -m json.tool /etc/agentsight/config.json > /dev/null && echo "JSON ok"
journalctl -u agentsight.service -n 30 --no-pager

Tokenless 统计 API​

连接远程 Tokenless 时,在传给 agentsight serve --config /etc/agentsight/config.json 的配置中加入以下可选的顶层设置:

{"tokenless_api":{"url":"http://127.0.0.1:7397","credential_file":"/etc/agentsight/tokenless-api-token"}}

凭据文件保存与 tokenless stats serve 相同的 Bearer token。使用私有网络或 HTTPS 代理。服务在启动时读取文件;修改后需重启 AgentSight。凭据仅保存在后端,非法配置 会阻止启动。不配置此项时,保留现有的本地数据库集成方式。