microsoft/waza
GitHub: microsoft/waza
微软推出的 AI Agent 技能评估 CLI 框架,用于创建、测试和持续改进 Agent 技能的质量与有效性。
Stars: 627 | Forks: 31
# Waza
一个用于评估 AI Agent 技能的 Go CLI 工具 —— 搭建评估套件、运行基准测试并比较不同模型的结果。
📖 **[快速入门 / 文档](https://microsoft.github.io/waza/)**
## 安装说明
### 二进制文件安装 (推荐)
使用安装脚本下载并安装最新的预编译二进制文件:
```
curl -fsSL https://raw.githubusercontent.com/microsoft/waza/main/install.sh | bash
```
该脚本会自动检测你的操作系统和架构 (linux/darwin/windows, amd64/arm64),下载二进制文件,校验其校验和,并将其安装到 `/usr/local/bin` (如果没有写入权限,则安装到 `~/bin`)。
或者直接从 [最新发行版](https://github.com/microsoft/waza/releases/latest) 下载二进制文件。
### 从源码安装
需要 Go 1.26+:
请注意,由于使用了 LFS 产物,你无法使用 `go install` 来安装 waza。要在常规发行版之外安装 waza,你需要克隆该代码库:
```
git clone https://github.com/microsoft/waza.git
cd waza
# 确保基于 git LFS 的 artifacts 可用(用于嵌入式 copilot 二进制文件)
git lfs install
git lfs pull
go build -o waza ./cmd/waza
./waza
```
### Azure Developer CLI (azd) 扩展
Waza 也可作为 [azd 扩展](https://learn.microsoft.com/azure/developer/azure-developer-cli/extensions/overview) 使用:
```
# 添加 waza 扩展 registry
azd ext source add -n waza -t url -l https://raw.githubusercontent.com/microsoft/waza/main/registry.json
# 安装扩展
azd ext install microsoft.azd.waza
# 验证其是否正常工作
azd waza --help
```
安装后,所有 waza 命令都可以通过 `azd waza` 使用。例如:
```
azd waza init my-eval --interactive
azd waza run examples/code-explainer/eval.yaml -v
```
## 更新通知
Waza 会在后台自动检查新版本。如果有可用更新,命令输出后会显示一条通知:
```
A newer version of waza is available: v0.24.0 → v0.28.0. Run: curl -fsSL ... | bash
```
该检查是非阻塞的(绝不会减慢命令执行速度),会缓存 24 小时,并且可以通过 `--no-update-check` 或 `WAZA_NO_UPDATE_CHECK=1` 来禁用。
## 快速入门
### 新用户:5 分钟快速上手
查看 **[快速入门指南](docs/GETTING-STARTED.md)** 获取完整的操作演示:
```
# 初始化新项目
waza init my-project && cd my-project
# 创建新 skill
waza new skill my-skill
# 在 skills/my-skill/SKILL.md 中定义 skill
# 在 evals/my-skill/tasks/ 中编写评估 tasks
# 在 evals/my-skill/fixtures/ 中添加测试 fixtures
# 运行评估
waza run my-skill
# 检查 skill 就绪状态
waza check my-skill
```
### 所有命令
```
# Build
make build
# 初始化项目 workspace
waza init [directory]
# 创建新 skill
waza new skill skill-name
# 基于现有 SKILL.md 创建新 eval scaffold
waza new eval skill-name
# 通过记录 prompt 运行生成 task YAML
waza new task from-prompt "Explain this code and suggest fixes" evals/code-explainer/tasks/recorded-task.yaml
# 检查 skill 是否准备好提交
waza check skills/my-skill
# 从 SKILL.md 建议 eval suite
waza suggest skills/my-skill --dry-run
waza suggest skills/my-skill --apply
# 注意:'generate' 可作为 'new' 的别名(有关 new 命令请参见下文)
# 注意:支持 Custom agents (.agent.md) — 参见 https://microsoft.github.io/waza/guides/custom-agents/
# 运行评估(适用于 skills 和 custom agents)
waza run examples/code-explainer/eval.yaml --context-dir examples/code-explainer/fixtures -v
# 对先前 `waza run --output results.json ...` 的输出进行 Grade
waza grade eval.yaml --results results.json
# 跨 models 比较结果
waza compare results-gpt4.json results-sonnet.json
# 生成 eval coverage 网格
waza coverage --format markdown
# 统计 skill 文件中的 tokens 数
waza tokens count skills/
# 比较 skill token 预算与 main
waza tokens compare main --skills --threshold 10
# 建议 token 优化方案
waza tokens suggest skills/
```
## 命令
### `waza init [directory]`
初始化一个包含独立的 `skills/` 和 `evals/` 目录的 waza 项目工作区。该操作是幂等的 —— 只创建缺失的文件。
| 标志 | 描述 |
|------|-------------|
| `--no-skill` | 跳过首个技能创建提示 |
创建内容:
- `skills/` — 技能定义目录
- `evals/` — 评估套件目录
- `.github/workflows/eval.yml` — 用于在 PR 上运行评估的 CI/CD 流水线
- `.gitignore` — Waza 特定的排除项
- `README.md` — 你的项目快速入门指南
**示例:**
```
waza init my-project
# 可选交互式创建首个 skill
waza init my-project --no-skill
# 跳过 skill 创建提示
```
### `waza new skill `
创建一个包含脚手架结构和评估套件的新技能。检测工作区上下文并调整输出。
| 标志 | 缩写 | 描述 |
|------|-------|-------------|
| `--template` | `-t` | 模板包 (即将推出) |
**模式:**
*项目模式* (检测到 `skills/` 目录):
```
project/
├── skills/{skill-name}/SKILL.md
└── evals/{skill-name}/
├── eval.yaml
├── tasks/*.yaml
└── fixtures/
```
*独立模式* (未检测到 `skills/`):
```
{skill-name}/
├── SKILL.md
├── evals/
│ ├── eval.yaml
│ ├── tasks/*.yaml
│ └── fixtures/
├── .github/workflows/eval.yml
├── .gitignore
└── README.md
```
**示例:**
```
# 在 project 模式下(在上文“Modes”部分有解释):创建 skills/code-explainer/SKILL.md + evals/code-explainer/
waza new skill code-explainer
# 在 standalone 模式下(在上文“Modes”部分有解释):创建 code-explainer/ 自包含目录
waza new skill code-explainer
```
### `waza new eval `
从现有的 `SKILL.md` 脚手架生成一个评估套件 (从 `USE FOR` 和 `DO NOT USE FOR` 读取前置元数据触发提示)。
创建内容:
- `evals//eval.yaml`
- `evals//tasks/positive-trigger-1.yaml`
- `evals//tasks/positive-trigger-2.yaml`
- `evals//tasks/negative-trigger-1.yaml`
| 标志 | 描述 |
|------|-------------|
| `--output ` | `eval.yaml` 的自定义路径 (任务在同级 `tasks/` 目录下生成) |
**示例:**
```
# 默认输出位置
waza new eval code-explainer
# 自定义 eval 路径
waza new eval code-explainer --output evals/custom-code-explainer/eval.yaml
```
### `waza new task from-prompt `
通过 Copilot 运行一个提示词,并根据观察到的行为 (响应文本、工具使用情况和调用的技能) 生成一个带有推断验证器的任务 YAML。
| 标志 | 描述 |
|------|-------------|
| `--model ` | 用于录制的 Copilot 模型 (默认: `claude-sonnet-4.5`) |
| `--testname ` | 写入生成任务的测试名称和 ID (默认: `auto-generated-test`) |
| `--tags ` | 附加到生成任务的逗号分隔标签 |
| `--timeout ` | 提示词执行的最长时间 (默认: `5m`) |
| `--overwrite` | 如果输出任务文件已存在则覆盖 |
| `--root ` | 用于技能发现的根目录 (默认: `.`) |
**示例:**
```
# 记录 prompt 并生成可复用的 task YAML
waza new task from-prompt "Refactor this function for readability" evals/code-explainer/tasks/refactor-readability.yaml
# 添加 metadata 并覆盖现有文件
waza new task from-prompt "Explain this diff and risks" evals/code-explainer/tasks/diff-analysis.yaml \
--testname diff-analysis \
--tags recorded,regression \
--overwrite
```
### `waza run `
从规格文件运行评估基准测试。
| 标志 | 缩写 | 描述 |
|------|-------|-------------|
| `--context-dir ` | | 夹具目录 (默认: 相对于规格文件的 `./fixtures`) |
| `--output ` | `-o` | 将结果保存为 JSON |
| `--output-dir ` | | 结构化输出目录;每次运行都会创建一个带 UTC 时间戳的 `` 子目录。与 `--output` 互斥。 |
| `--verbose` | `-v` | 详细的进度输出 |
| `--transcript-dir ` | | 保存每个任务的记录 JSON 文件 |
| `--task ` | | 按名称/ID模式过滤任务 (可重复) |
| `--parallel` | | 并发运行任务 |
| `--workers ` | | 并发工作线程数 (默认: 4, 需要指定 `--parallel`) |
| `--trials ` | | 将每个任务运行 `n` 次以检测不稳定性 (省略则使用 `config.trials_per_task`;如果提供,`n` 必须 >= 1) |
| `--interpret` | | 打印通俗语言的结果解释 |
| `--format ` | | 输出格式: `default` 或 `github-comment` (默认: `default`) |
| `--cache` | | 启用结果缓存以加速重复运行 |
| `--no-cache` | | 显式禁用结果缓存 |
| `--cache-dir ` | | 缓存目录 (默认: `.waza-cache`) |
| `--reporter ` | | 输出报告器: `json` (默认), `junit:` (可重复) |
| `--baseline` | | A/B 测试模式 — 将每个任务运行两次 (无技能 = 基线, 有技能 = 正常) 并计算改进分数 |
| `--discover` | | 自动技能发现 — 遍历目录树以查找 SKILL.md + eval.yaml (root/tests/evals) |
| `--strict` | | 如果任何 SKILL.md 缺少评估覆盖则失败 (与 `--discover` 一起使用) |
| `--suggest` | | 根据测试结果生成 Copilot 建议报告 (`mock` 引擎会发出确定性的虚假报告) |
| `--output-dir ` | | 结构化输出目录;每次运行都会创建一个带 UTC 时间戳的子目录。与 `--output` 互斥。 |
| `--tags ` | | 使用 glob 模式按标签过滤任务 (可重复) |
| `--model ` | | 覆盖模型 (可重复,用于多模型比较) |
| `--recommend` | | 在多模型运行后生成启发式建议 |
| `--judge-model ` | | 用于 LLM-as-judge 评分器的模型 (覆盖执行模型) |
| `--session-log` | | 启用会话事件日志记录 (NDJSON) |
| `--session-dir ` | | 会话日志文件的目录 (默认: 当前目录) |
| `--no-summary` | | 跳过为多技能运行写入组合的 summary.json |
| `--update-snapshots` | | 更新或创建差异评分器快照文件以匹配当前输出 |
| `--skip-graders` | | 跳过评分 (仅执行);稍后使用 `waza grade` 进行评分 |
| `--keep-workspace` | | 在执行后保留临时工作区以便调试 |
**结果缓存**
使用 `--cache` 启用缓存,以存储测试结果并在重复运行时跳过重新执行:
```
# 首次运行执行所有测试并缓存结果
waza run eval.yaml --cache
# 第二次运行使用缓存结果(速度更快)
waza run eval.yaml --cache
# 在需要时清除缓存
waza cache clear
```
缓存的结果会在以下情况自动失效:
- 规格配置发生更改 (模型、超时、评分器等)
- 任务定义发生更改
- 夹具文件发生更改
**注意:** 对于使用非确定性评分器 (`behavior`, `prompt`) 的评估,缓存会自动禁用。
**退出代码**
`run` 命令使用退出代码来启用 CI/CD 集成:
| 退出代码 | 条件 | 描述 |
|-----------|-----------|-------------|
| `0` | 成功 | 所有测试通过 |
| `1` | 测试失败 | 一个或多个测试验证失败 |
| `2` | 配置错误 | 无效的规格、文件缺失或运行时错误 |
CI 使用示例:
```
# 如果任何测试失败则使 build 失败
waza run eval.yaml || exit $?
# 捕获特定的 exit codes
waza run eval.yaml
EXIT_CODE=$?
if [ $EXIT_CODE -eq 1 ]; then
echo "Tests failed - check results"
elif [ $EXIT_CODE -eq 2 ]; then
echo "Configuration error"
fi
# 将结果发布为 PR 评论 (GitHub Actions)
waza run eval.yaml --format github-comment > comment.md
gh pr comment $PR_NUMBER --body-file comment.md
# 生成用于 CI 测试报告的 JUnit XML
waza run eval.yaml --reporter junit:results.xml
# 同时输出 JSON 和 JUnit XML
waza run eval.yaml -o results.json --reporter junit:results.xml
```
**注意:** `waza generate` 是 `waza new` 的别名。这两个命令都支持相同的功能,可以使用 `--output-dir` 标志指定自定义输出位置。
### `waza compare [files...]`
并排比较来自多个评估运行的结果 —— 包含每个任务评分差异、通过率差异和汇总统计数据。
| 标志 | 缩写 | 描述 |
|------|-------|-------------|
| `--format ` | `-f` | 输出格式: `table` 或 `json` (默认: `table`) |
### `waza coverage [root]`
生成一个技能到评估的覆盖矩阵,显示哪些技能被完全覆盖、部分覆盖或缺少评估。
**注意**:完全覆盖需要任务 (通过 `tasks:` 或 `tasks_from:`) 和 2 种以上的评分器类型。覆盖率百分比仅反映完全覆盖的技能。
| 标志 | 缩写 | 描述 |
|------|-------|-------------|
| `--format ` | `-f` | 输出格式: `text`、`markdown` 或 `json` (默认: `text`) |
| `--path ` | | 要扫描 skills/evals 的附加目录 (可重复) |
### `waza models`
列出可通过 Copilot SDK 用于评估的模型。显示模型 ID 和元数据,可在 `waza run`、`waza quality` 和其他命令中与 `--model` 标志一起使用。
需要通过 `copilot login` 进行身份验证。
| 标志 | 描述 |
|------|-------------|
| `--json` | 输出为 JSON |
**示例:**
```
# 以表格格式列出可用 models
waza models
# 以 JSON 输出可用 models
waza models --json
```
### `waza cache clear`
清除所有缓存的评估结果,以强制在下次运行时重新执行。
| 标志 | 描述 |
|------|-------------|
| `--cache-dir ` | 要清除的缓存目录 (默认: `.waza-cache`) |
### `waza dev [skill-path]`
迭代评分并改进 SKILL.md 文件中的技能前置元数据。
使用 `--copilot` 生成一个非交互式的单次 markdown 报告,该报告:
1. 总结当前技能细节和 token 使用情况
2. 加载触发器测试提示词作为示例 (当 `trigger_tests.yaml` 存在时)
3. 请求 Copilot 提供改进技能选择的建议
4. 将报告打印到标准输出而不应用任何更改
当设置了 `--copilot` 时,迭代模式标志 (`--target`、`--max-iterations`、`--auto`) 将失效。
| 标志 | 描述 |
|------|-------------|
| `--target ` | 迭代模式的目标遵循级别: `low`、`medium`、`medium-high`、`high` (默认: `medium-high`) |
| `--max-iterations ` | 迭代模式的最大改进迭代次数 (默认: 5) |
| `--auto` | 在迭代模式下不提示直接应用改进 |
| `--copilot` | 生成包含 Copilot 建议的非交互式 markdown 报告 |
| `--model ` | 与 `--copilot` 一起使用的模型 |
### `waza check [skill-path]`
通过一份全面的就绪报告来检查技能是否已准备好提交。
执行五种类型的检查:
1. **合规性评分** — 验证前置元数据遵循程度 (低/中/中高/高)
2. **Token 预算** — 检查 SKILL.md 是否在 token 限制内 (可在 `.waza.yaml` 的 `tokens.limits` 中配置)
3. **评估套件** — 检查是否存在 eval.yaml
4. **规格合规性** — 根据 agentskills.io 规范验证技能 (前置元数据结构、必填字段、命名规则、目录匹配、描述长度、兼容性许可证和版本)
5. **咨询检查** — 检测质量和可维护性问题 (引用模块数量、复杂性分类、负向增量风险模式、过程式内容和过度具体化)
提供通俗语言的总结和改进技能的可执行后续步骤。
**示例输出:**
```
🔍 Skill Readiness Check
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Skill: code-explainer
📋 Compliance Score: High
✅ Excellent! Your skill meets all compliance requirements.
📊 Token Budget: 450 / 500 tokens
✅ Within budget (50 tokens remaining).
🧪 Evaluation Suite: Found
✅ eval.yaml detected. Run 'waza run eval.yaml' to test.
📐 Spec Compliance (agentskills.io)
✅ spec-frontmatter Frontmatter structure valid with required fields
✅ spec-allowed-fields All frontmatter fields are spec-allowed
✅ spec-name Name follows spec naming rules
✅ spec-dir-match Directory name matches skill name
✅ spec-description Description is valid
✅ spec-license License field present
✅ spec-version metadata.version present
🔬 Advisory Checks
✅ module-count Found 2 reference modules (2-3 is optimal)
✅ complexity Complexity: detailed (350 tokens, 2 modules)
✅ negative-delta-risk No negative delta risk patterns detected
✅ procedural-content Description contains procedural language
✅ over-specificity No over-specificity patterns detected
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📈 Overall Readiness
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ Your skill is ready for submission!
🎯 Next Steps
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✨ No action needed! Your skill looks great.
Consider:
• Running 'waza run eval.yaml' to verify functionality
• Sharing your skill with the community
```
**用法:**
```
# 检查当前目录
waza check
# 检查特定 skill
waza check skills/my-skill
# 建议的工作流
waza check skills/my-skill # Check readiness
waza dev skills/my-skill # Improve compliance if needed
waza check skills/my-skill # Verify improvements
```
### `waza quality `
使用 LLM-as-Judge 跨五个维度评估技能内容质量:
清晰度、完整性、触发精度、范围覆盖和反模式。
| 标志 | 描述 |
|------|-------------|
| `--model ` | 用作评判的模型 (默认: 项目默认模型) |
| `--format table\|json` | 输出格式 (默认: `table`) |
| `--rubric ` | 自定义评分标准文件路径 (保留供将来使用) |
**示例:**
```
# 评估 skill 质量(表格输出)
waza quality skills/code-explainer
# 用于 CI 集成的 JSON 输出
waza quality skills/code-explainer --format json
# 使用特定 model 作为 judge
waza quality skills/code-explainer --model gpt-4o
```
### `waza suggest `
使用 LLM 分析 `SKILL.md` 并生成建议的评估工件。
| 标志 | 描述 |
|------|-------------|
| `--model ` | 用于生成建议的模型 (默认: 项目默认模型) |
| `--dry-run` | 将建议输出打印到标准输出 (默认) |
| `--apply` | 将文件写入磁盘 |
| `--output-dir ` | 输出目录 (默认: `/evals`) |
| `--format yaml\|json` | 输出格式 (默认: `yaml`) |
**示例:**
```
# 以 YAML 预览生成的 eval/task/fixture 文件
waza suggest skills/code-explainer --dry-run
# 将生成的文件写入磁盘
waza suggest skills/code-explainer --apply
# 输出 JSON 格式的 suggestion payload
waza suggest skills/code-explainer --format json
```
### `waza tokens count [paths...]`
计算 markdown 文件中的 token 数。路径可以是文件或目录 (递归扫描 `.md`/`.mdx`)。
| 标志 | 描述 |
|------|-------------|
| `--format ` | 输出格式: `table` 或 `json` (默认: `table`) |
| `--sort ` | 排序方式: `tokens`、`name` 或 `path` (默认: `path`) |
| `--min-tokens ` | 过滤掉低于 n 个 token 的文件 |
| `--no-total` | 在表格输出中隐藏合计行 |
### `waza tokens compare [refs...]`
比较 git 引用之间的 markdown token 数量。
不带参数时,会比较 HEAD 和工作区。
带一个参数时,会比较该引用和工作区。
带两个参数时,会比较第一个引用和第二个引用。
| 标志 | 描述 |
|------|-------------|
| `--format ` | 输出格式: `table` 或 `json` (默认: `table`) |
| `--show-unchanged` | 在输出中包含未更改的文件 |
| `--strict` | 如果任何文件超过其绝对 token 限制,则以代码 1 退出 |
| `--skills` | 仅比较已配置技能根目录下的 SKILL.md 文件 |
| `--threshold ` | 当任何现有文件增加超过 n 百分比时失败 (0 = 禁用) |
使用 `--skills` 将比较范围限制在已配置技能根目录 (`skills/`、`.github/skills/` 以及来自 `.waza.yaml` 的 `paths.skills`) 下的 SKILL.md 文件。在技能模式下,默认的基础引用是 `origin/main` (回退到 `main`)。
使用 `--threshold` 进行 CI 门控 —— 新增文件免于阈值检查 (无基线),但仍受 `--strict` 绝对限制检查的约束。
```
# 比较 HEAD 和 working tree 之间的所有 markdown tokens
waza tokens compare
# 在具备 CI 阈值的情况下,具有 skill 感知能力地与 main 进行比较
waza tokens compare main --skills --threshold 10
# 用于 CI pipelines 的 JSON 输出
waza tokens compare main --skills --threshold 10 --strict --format json
```
### `waza tokens profile [skill-name | path]`
对 SKILL.md 文件进行结构分析 —— 报告 token 数量、段落数量、代码块数量和工作流步骤检测,并提供一行摘要和警告。
| 标志 | 描述 |
|------|-------------|
| `--format ` | 输出格式: `text` 或 `json` (默认: `text`) |
| `--tokenizer ` | 分词器: `bpe` 或 `estimate` (默认: `bpe`) |
**示例输出:**
```
📊 my-skill: 1,722 tokens (detailed ✓), 8 sections, 4 code blocks
⚠️ no workflow steps detected
```
### `waza tokens suggest [paths...]`
提供减少 markdown 文件中 token 使用量的建议。路径可以是文件或目录 (递归扫描 `.md`/`.mdx`)。
| 标志 | 描述 |
|------|-------------|
| `--format ` | 输出格式: `text` 或 `json` (默认: `text`) |
| `--min-savings ` | 启发式建议的最小预估 token 节省量 |
| `--copilot` | 启用 Copilot 驱动的建议 |
| `--model ` | 与 `--copilot` 一起使用的模型 |
### `waza serve`
启动 waza 仪表板服务器以可视化评估结果。HTTP 服务器会自动在浏览器中打开,并扫描指定目录以查找 `.json` 结果文件。
(可选) 使用 `--tcp` 标志运行 JSON-RPC 2.0 服务器 (用于 IDE 集成),而不是 HTTP 仪表板。
| 标志 | 默认值 | 描述 |
|------|---------|-------------|
| `--port ` | `3000` | HTTP 服务器端口 |
| `--no-browser` | `false` | 不自动打开浏览器 |
| `--results-dir ` | `.` | 扫描结果文件的目录 |
| `--tcp ` | (关) | 用于 JSON-RPC 的 TCP 地址 (例如, `:9000`);出于安全考虑默认为环回地址 |
| `--tcp-allow-remote` | `false` | 允许 TCP 绑定到非环回地址 (⚠️ 无身份验证) |
**示例:**
在端口 3000 启动 HTTP 仪表板:
```
waza serve
```
在自定义端口启动 HTTP 仪表板并扫描结果目录:
```
waza serve --port 8080 --results-dir ./results
```
启动仪表板但不自动打开浏览器:
```
waza serve --no-browser
```
启动用于 IDE 集成的 JSON-RPC 服务器:
```
waza serve --tcp :9000
```
**仪表板视图:**
仪表板显示的评估结果包括:
- 任务级别的通过/失败状态
- 跨试验的分数分布
- 模型比较
- 汇总指标和趋势
有关仪表板和结果可视化的详细文档,请参阅 [docs/GUIDE.md](docs/GUIDE.md)。
### `waza results`
管理存储在云端或本地存储中的评估结果。
#### `waza results list`
列出配置的云存储或本地结果目录中的所有评估运行。
| 标志 | 描述 |
|------|-------------|
| `--limit ` | 显示的最大结果数 (默认: 20) |
| `--format ` | 输出格式: `table` 或 `json` (默认: `table`) |
```
# 列出最近的结果
waza results list
# 使用自定义限制列出
waza results list --limit 20
# 以 JSON 输出
waza results list --format json
```
#### `waza results compare `
并排比较两次评估运行。显示每个任务的评分差异、通过率差异和关键指标。
| 标志 | 描述 |
|------|-------------|
| `--format ` | 输出格式: `table` 或 `json` (默认: `table`) |
```
# 比较两次运行
waza results compare run-20250226-001 run-20250226-002
# 以 JSON 输出以供进一步处理
waza results compare run-20250226-001 run-20250226-002 --format json
```
### `waza grade `
对 Agent 输出运行评分器,而不执行 Agent。专为对以前的评估运行进行独立评分而设计。
| 标志 | 描述 |
|------|-------------|
| `--task ` | 要评分的任务 ID |
| `--results ` | waza 运行输出 JSON 的路径 |
| `--workspace ` | 基于文件的评分器的 Agent 工作区目录;必须指向 Agent 的实际工作区 (默认: `.`) |
| `--judge-model ` | 用于提示词评分器的模型 |
| `-o, --output ` | 写入完整的 EvaluationOutcome JSON (与 `waza compare` 兼容) |
| `-v, --verbose` | 详细输出 |
```
waza run eval.yaml --output results.json
waza grade eval.yaml --results results.json
```
### `waza session list`
列出目录中的会话事件日志。
| 标志 | 描述 |
|------|-------------|
| `--dir ` | 搜索会话日志的目录 (默认: `.`) |
```
waza session list
waza session list --dir ./sessions
```
### `waza session view `
从 NDJSON 事件日志渲染会话时间线。
```
waza session view session-2025-06-15.ndjson
```
## 云存储
Waza 可以自动将评估结果上传到 Azure Blob Storage,以便团队协作和历史跟踪。
### 配置
在你的 `.waza.yaml` 中添加 `storage:` 部分:
```
storage:
provider: azure-blob
accountName: "myteamwaza"
containerName: "waza-results"
enabled: true
```
| 字段 | 描述 | 是否必填 |
|-------|-------------|----------|
| `provider` | 云提供商 (目前支持 `azure-blob`) | 是 |
| `accountName` | Azure 存储账户名称 | 是 |
| `containerName` | Blob 容器名称 (默认: `waza-results`) | 否 |
| `enabled` | 启用/禁用上传 (配置后默认为 `true`) | 否 |
### 身份验证
Waza 使用 **DefaultAzureCredential** —— 它会按以下顺序自动检测并使用可用的凭证:
1. **环境变量** (`AZURE_CLIENT_ID`, `AZURE_CLIENT_SECRET`, `AZURE_TENANT_ID`)
2. **托管标识** (在 Azure 服务上)
3. **Azure CLI** (`az login`)
4. **Visual Studio Code** (如果已登录)
5. **Azure PowerShell** (如果已登录)
在大多数情况下,只需运行 `az login` 即可:
```
az login
waza run eval.yaml # Results auto-upload to Azure Storage
```
### 工作原理
1. **运行时自动上传:** 当配置了 `storage:` 时,`waza run` 会自动将结果上传到 Azure Blob Storage
2. **按技能组织:** 结果存储为 `{skill-name}/{run-id}.json`
3. **保留本地副本:** 结果也会在本地保存 (通过 `-o` 标志)
4. **列出远程结果:** 使用 `waza results list` 浏览上传的运行记录
5. **比较运行:** 使用 `waza results compare` 比较两个远程结果的差异
### 示例工作流
```
# 配置一次(编辑 .waza.yaml)
cat > .waza.yaml <
标签:AI代理, AI效能分析, AI质量度量, azd扩展, Azure开发工具, DNS解析, EVTX分析, Go语言, LNA, 人工智能, 大模型评估, 威胁情报, 属性图, 开发框架, 开发者工具, 开源项目, 微软, 技能评估, 数据管道, 日志审计, 模型比较, 测试套件, 用户模式Hook绕过, 程序破解, 脚手架, 请求拦截, 软件工程