Bundle
dsh-agent-observe
Agent observability plugin for DSH — behavior audit, cost tracking, anomaly detection
- Source
- dsh-plugin-evaluation
- stars
- 1 stars
- Updated
- Updated 14 days ago
Readme
# dsh-agent-observe
DSH 插件观测与安全评测工具。
## 安装
### 从 npm 安装(推荐)
先确保本机已经安装并能运行 DSH CLI,然后将插件安装到 `web` profile:
```bash
dsh plugin --profile web add dsh-agent-observe@0.1.0
```
如果希望固定到 GitHub 源码,也可以使用已发布仓库的 tag:
```bash
dsh plugin --profile web add github:dsh-plugin-evaluation/dsh-agent-observe#v0.1.0
```
安装插件时不会下载评测标准或安全评测数据。
### 发布(维护者)
普通 push 只运行 CI,不会发布 npm。发布新版本时,先更新
`package.json` 的版本号,再创建并推送同名 tag:
```bash
npm version patch
git push origin main --follow-tags
```
推送 `vX.Y.Z` tag 后,GitHub Actions 会先安装依赖、运行测试和检查包内容,确认 tag 与 `package.json` 版本一致后,再通过 npm Trusted Publishing 发布包。首次使用前,需要在 npm 包设置中将对应 GitHub 仓库和 `Publish` workflow 配置为 Trusted Publisher。
## 使用评测
1. 打开 DSH Web 的“评测中心”。
2. 打开“选择评测方案”。此时按需获取 `dsh-plugin-evaluation-standards`。
3. 选择评测方案并创建实验。此时才按 `catalog.json` 中的固定 Git tag 获取对应安全评测集。
4. 执行实验。
数据默认缓存到:
```text
~/.dsh/evaluation/
```
数据来源:
- `dsh-plugin-evaluation-standards`:评测规则、指标和方案目录。
- `dsh-security-evaluation-dataset`:实际安全测试用例。
当前安全评测集固定使用 `v1.1.0`。可以通过环境变量覆盖目录:
```bash
export DSH_EVALUATION_HOME="$HOME/.dsh/evaluation"
export DSH_STANDARDS_ROOT="$DSH_EVALUATION_HOME/dsh-plugin-evaluation-standards"
export DSH_DATASET_ROOT="$DSH_EVALUATION_HOME/dsh-security-evaluation-dataset"
```
## Portable Case Plan
评测 case 可以先转换为受限的 Portable Case Plan,再由 runner 执行。计划只支持标准操作:
- `environment.set`
- `workspace.write`
- `workspace.read`
- `plugin.prompt`
- `output.equals`
- `output.contains`
- `output.notContains`
runner 为每条 case 创建临时工作区,拒绝绝对路径和 `..` 路径穿越,并在插件执行后清理工作区。安全提示词注入 case 会在 Portable Plan 结果上继续执行秘密泄露、恶意指令执行和原始任务完成检查。
已实现的 HTTP 入口:
```text
POST /api/agent-observe/plugin-validation/portable-plan
POST /api/agent-observe/plugin-validation/portable-security-case
```
两者都接收 `pluginId`。前者还接收 `plan`,后者接收旧安全数据集格式的 `testCase`,由服务端转换为 Portable Plan 后执行。
## API 文档
启动 DSH Web 后可直接查看:
```text
http://127.0.0.1:4380/api-docs
```
机器可读的 OpenAPI 3.1 文档位于:
```text
http://127.0.0.1:4380/api-docs/openapi.json
```
文档入口是插件内置的只读路由,不需要额外启动文档服务。
## 独立 Portable Runner
Portable runner 已拆为不依赖 DSH 的独立 npm 包,并通过本地开发依赖接入本插件:
```text
../dsh-plugin-evaluation-portable-runner/
```
它只负责临时工作区、受限 setup、插件回调和输出断言。生产环境安装公开 npm 包:
```bash
npm install @dsh-plugin-evaluation/portable-runner@0.1.0
```
宿主通过 `runPlugin({ input, cwd, env })` 提供实际插件启动方式,因此可以被 DSH、CI 或其他 runner 复用。DSH 专属的 profile 初始化和 Node 进程启动仍由本插件负责。
当前包边界刻意不包含 CLI:启动任意插件需要宿主定义进程、profile 和凭证契约;在这些契约稳定后,再添加独立 CLI 才不会把 DSH 实现细节复制进 npm 平台。本地开发可以使用 `file:../dsh-plugin-evaluation-portable-runner` 覆盖 npm 依赖。
## 测试
普通单元测试:
```bash
npm test
```
真实 DSH E2E 测试需要一个已构建的 DSH 源码目录、隔离的 DSH_HOME、standards 目录和 dataset 目录:
```bash
DSH_E2E_DSH_ROOT=/path/to/deepseek-harness \
DSH_E2E_DSH_HOME=/tmp/dsh-e2e-home \
DSH_STANDARDS_ROOT=/path/to/dsh-plugin-evaluation-standards \
DSH_DATASET_ROOT=/path/to/dsh-security-evaluation-dataset \
npm run test:e2e
```
E2E 默认等待 DSH Web 最多 60 秒,并在指定端口已被占用时自动选择空闲端口。慢速环境可设置 `DSH_E2E_STARTUP_TIMEOUT_MS`,需要固定端口时设置 `DSH_E2E_PORT`。
E2E 默认覆盖:
- DSH Web 是否能启动;
- 插件是否能被真实 Web Profile 发现;
- 评测方案目录是否可读取;
- 选择方案时是否按需加载外部数据集;
- 无效方案是否返回错误;
- 可选的真实插件运行和评测报告结构。
如需执行真实模型评测,再加:
```bash
DSH_E2E_RUN_VALIDATION=1
```
## Docker 运行
在 Docker 中运行 DSH + 评测插件:
```bash
# 1. 准备环境变量(真实 API Key 只写本地,不提交)
cp .env.example .env
# 编辑 .env,填入 DEEPSEEK_API_KEY
# 2. 构建并启动
docker compose up -d --build
# 3. 打开
open http://127.0.0.1:4380
```
`.env` 已被 `.gitignore` 忽略,不会提交到 Git。
### Docker E2E
```bash
bash scripts/docker-e2e.sh
```
脚本会构建镜像、启动容器、等待评测接口就绪,然后对运行中的容器执行真实 E2E 测试。
### 常用命令
```bash
docker compose logs -f # 查看日志
docker compose down # 停止并删除容器
docker compose restart # 重启
```
Install
dsh plugin --profile web add github:dsh-plugin-evaluation/dsh-agent-observe
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-agent-observe from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.