关于 Echoproof
Echoproof 将录制的 HTTP 流量重放到基准版和修改版构建中,并报告 API 行为差异,供团队依据真实请求检查代码变更。它支持按变更意图评估回归,并生成 CI 可用的结果。
主要功能
- 01录制并脱敏真实 HTTP 流量
- 02向两个构建重放请求
- 03按字段比较 JSON 变化
- 04过滤噪声并处理有状态服务
- 05依据声明的意图评估变化
- 06生成 CI 和 Agent 报告
适用场景
- 01合并变更前检查 API 行为
- 02发现单元测试遗漏的回归
- 03用真实流量验证编码 Agent 的改动
MCP 相关
Echoproof 包含供编码 Agent 使用的 MCP 服务,可基于录制流量检查其工作。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。
工具
本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。
详细介绍
Echoproof
印度尼西亚语 | English
基于真实流量,验证每次代码变更对 API 行为的影响。
Echoproof 会记录服务的真实请求和响应,将其重放到变更后的代码构建版本中,然后报告哪些内容发生了变化、涉及哪些端点和字段、影响了多少比例的请求,以及这些变化是否符合预期。它既可用作 CI 中的门禁,也可直接供编码 Agent(Claude Code、Cursor 等)检查自己的工作。
record -> replay ke build lama dan baru -> diff semantik -> nilai terhadap niat -> gate
目录
为什么选择 Echoproof
当大部分代码都由 AI Agent 编写时,代码变更的数量增长速度远超人类审查能力。测试通过、差异看起来整洁,并不能保证系统行为仍然正确,因为测试基于假设编写,而 Bug 往往来自意料之外的真实数据组合。
Echoproof 回答了单元测试和代码审查都无法回答的问题:
这次变更是否改变了系统对真实流量的行为?如果改变了,这是否符合预期?
Echoproof 能捕获这样的情况:某个 PR 的目标是“在目录中添加 currency 字段”,但却意外地把一个参数放错了位置。结果是 8 道菜单中有 3 道的价格发生变化,另外 5 道仍然正确。单元测试通过了,代码差异看起来也很正常。Echoproof 会报告每个目录请求中的 products[*].price: 18000 -> 22000,并将其标记为回归。
主要功能
- 从真实流量录制。 反向代理会录制每个请求和响应,并在写入磁盘前遮蔽敏感数据。
- 语义差异比较。 按字段比较 JSON,而非按文本行比较。变更会按端点和字段分组,并分类为
breaking、behavior或additive。 - 抵御噪声。 自动识别 UUID、时间戳和随机值。通过将旧构建重放两次,学习不同运行之间自行变化的字段。
- 保障状态安全。 除非按端点允许,否则不会重放写入请求。新旧构建基于相同数据进行比较,并在每轮运行之间执行重置命令。
- 识别变更意图。 Claude 可根据 PR 或 Agent 任务描述评估每组变更。未能由变更意图解释的变更会被标记为回归。
- 适用于 CI 和 Agent。 提供合并门禁退出码、用于 PR 评论的 Markdown 报告、供自动化使用的 JSON,以及面向编码 Agent 的 MCP 服务。
安装
Homebrew(macOS 和 Linux)
brew install est57/tap/echoproof
预编译二进制文件(推荐)
从发布页面下载适用于您平台的压缩包,或通过终端下载:
VERSION=v0.1.0
TARGET=aarch64-apple-darwin # atau x86_64-apple-darwin, x86_64-unknown-linux-gnu, aarch64-unknown-linux-gnu
curl -sLO https://github.com/est57/echoproof/releases/download/$VERSION/echoproof-$VERSION-$TARGET.tar.gz
curl -sLO https://github.com/est57/echoproof/releases/download/$VERSION/echoproof-$VERSION-$TARGET.tar.gz.sha256
shasum -a 256 -c echoproof-$VERSION-$TARGET.tar.gz.sha256
tar -xzf echoproof-$VERSION-$TARGET.tar.gz
sudo mv echoproof-$VERSION-$TARGET/echoproof /usr/local/bin/
echoproof --version
使用 Cargo
如果已安装 Rust 1.85 或更高版本:
cargo install echoproof
从源代码构建
**要求:**Rust 1.85 或更高版本。运行演示需要 curl。
git clone https://github.com/est57/echoproof.git
cd echoproof
cargo install --path crates/echoproof-cli
二进制文件 echoproof 会安装到 ~/.cargo/bin。确保该文件夹已加入 PATH:
echo 'export PATH="$HOME/.cargo/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc
echoproof --version
快速开始
以下步骤会检查在测试环境中运行的服务上的代码更改。
1. 创建配置文件(可选,所有设置均有默认值):
echoproof init
**2. 录制流量。**在服务前运行代理,然后将应用、Postman 或自动化测试指向代理地址:
echoproof record --upstream http://127.0.0.1:8000 --listen 127.0.0.1:8080 --out traffic.jsonl
收集到有代表性的流量后,按 Ctrl-C 停止。
Laravel 应用无需代理即可录制,可使用 echoproof/laravel:运行 composer require echoproof/laravel,在 .env 中设置 ECHOPROOF_RECORD=true,流量便会写入 storage/echoproof/traffic.jsonl,并遵循相同的脱敏规则。
3. 运行两个构建版本:更改前的版本(base)和更改后的版本(PR),并使用相同的数据库。
4. 进行比较:
echoproof check -s traffic.jsonl --base http://127.0.0.1:8001 -t http://127.0.0.1:8002
**5. 查看结果。**退出代码 0 表示没有意外更改,1 表示存在回归,2 表示发生错误。请参阅阅读报告。
要根据更改意图评估结果,请添加 PR 描述和代码差异:
git diff main...HEAD > change.diff
echoproof check -s traffic.jsonl --base http://127.0.0.1:8001 -t http://127.0.0.1:8002 \
--intent-file pr-description.md --code-diff change.diff --output echoproof-report.md
演示
完整演示耗时约 10 秒,无需运行自己的服务:
./scripts/demo.sh
演示使用一个小型 POS 后端(examples/demo-shop),其中包含状态:每次下单都会减少产品库存。一个“来自 Agent 的 PR”意在为产品添加 currency 字段,但也更改了促销折扣与优惠券的合并方式。
| 步骤 | 展示内容 |
|---|---|
| 1. 录制来自生产版本的 2,000 个请求 | 录制过程 |
| 2. 将流量回放到相同版本,并与录制结果比较 | 因状态导致的误报:录制期间库存已减少 |
3. 使用 --base 和 --reset 比较 base 和 PR 构建版本,采用安全模式 | 误报消失。检测到 currency。写入请求被报告为尚未验证 |
4. 与步骤 3 相同,但使用 --allow-writes "POST /orders" | 捕获到折扣错误,仅出现在同时使用促销和优惠券的订单中 |
5. 由 Claude 评估更改意图(如果存在 ANTHROPIC_API_KEY) | currency 被评为符合预期,折扣更改被评为回归 |
概念
快照
快照是一个 JSONL 文件,每行包含一组请求和响应。写入文件前,标头和敏感字段会经过脱敏。同一个快照可以重复用于检查多个 PR。
两种比较模式
| 模式 | 命令 | 适用场景 |
|---|---|---|
| 与录制结果比较 | echoproof check -s traffic.jsonl -t URL_PR | 无状态服务,或数据与录制时相同的环境 |
| Base 与 PR 比较 | echoproof check -s traffic.jsonl --base URL_BASE -t URL_PR | 使用数据库的服务(推荐) |
在 base 与 PR 模式下,不会将录制的响应作为参照。Echoproof 会将相同流量回放到使用相同数据的两个构建版本:
reset -> replay ke base -> acuan
reset -> replay ke base lagi -> field yang berbeda dicatat sebagai noise
reset -> replay ke PR -> kandidat
diff acuan dan kandidat, abaikan noise
每个构建版本的服务器地址(例如图片 URL 或分页链接中的 http://127.0.0.1:8001)会自动标准化,因此即使两个构建版本运行在不同端口上,也可以进行比较。
安全模式
默认情况下,只会重放 GET、HEAD 和 OPTIONS 方法。写入请求会被跳过,且不计为通过:报告会注明跳过的数量,并提醒这些行为尚未经过验证。
仅针对可更改或可重置的环境,按端点允许写入请求:
echoproof check ... --allow-writes "POST /orders" --allow-writes "PUT /cart/*"
使用 --reset(或 replay.reset)在每轮前还原状态,例如恢复数据库转储或调用测试环境中的重置端点。学习噪声时,如果没有重置,Echoproof 会拒绝重放写入请求,因为运行之间的状态变化也会被视为噪声,从而掩盖回归问题。
语义差异
-
JSON 按字段比较。
5和5.0视为相同,且忽略键的顺序。 -
每项变化都会分类:
分类 示例 breaking字段缺失、类型变化(包括变为 null)、状态码从 2xx 变为错误behavior值变化、数组长度变化、状态变化 additive新增字段 -
路径会经过规范化:
/products/42会变为GET /products/{id},items[3].price会变为$.items[*].price。每项变化在每个请求中只计一次。 -
形态相同的 UUID、ULID 和 date-time 会被视为噪声。仅日期(例如
2026-10-14)仍会进行比较。
变更意图
有两种方式可以告诉 Echoproof 哪些变化是预期的。
| 方式 | 粒度 | 适用场景 |
|---|---|---|
--expect "GET /products/*" | 端点 | 快捷、免费,无需外部服务 |
--intent "..." | 端点、字段和值 | 预期变化与 bug 可能出现在同一端点时 |
--expect 会放行指定端点上的所有变化。如果某个 PR 确实修改了商品目录,却意外破坏了目录中的价格,--expect "GET /catalog" 就无法捕获这个问题。
使用 --intent 时,Claude 会评估每组变化,并给出 intended、regression 或 unclear 结论,同时提供引用示例值的理由。评估依据包括变更意图、代码差异(可选)、受影响请求的百分比、发生变化的请求示例及其变更前后的值,以及同一端点上未发生变化的请求示例作为对照。unclear 结论和未评估的组都会被视为回归(默认拒绝)。
评估变更意图需要 Anthropic API key。每次运行只会进行一次 API 调用,且仅在存在变化时进行。使用默认模型时,每次运行的典型费用约为 USD 0.01 到 0.02。
第三方调用
调用支付网关、消息服务或其他 API 的服务,在重放期间不得真正连接这些服务。使用 echoproof/laravel 时,这些调用会与每个请求一同录制;使用 ECHOPROOF_REPLAY=true 运行的构建会根据录制内容响应,并阻止所有其他调用。两个构建都会收到完全相同的第三方响应,随后 Echoproof 会比较每个构建发送的内容:
x POST /checkout 3/3 changed (100.0%) unexpected
behavior value changed outbound[POST pay.example.com/v2/charges] $.amount (3 requests)
outbound[POST pay.example.com/v2/charges] $.amount: 18000 -> 1800000
在此示例中,结账响应完全相同;只有发送到网关的金额发生变化。对于从未录制过的调用,报告会将其列为 call added,级别为 breaking。如果某个构建报告的调用无法被 Echoproof 读取,该请求会导致检查失败,而不会在未经验证的情况下通过。
任意语言:出站代理
对于非 Laravel 服务,或通过自有 HTTP 客户端的 SDK 调用第三方的服务,Echoproof 可以充当服务出站调用的代理:
echoproof ca init # CA per proyek di .echoproof/, kunci mode 0600
echoproof ca env --runtime php # atau node, python, go: setting untuk service
echoproof record --upstream http://127.0.0.1:8000 --listen 127.0.0.1:8080 -o traffic.jsonl \
--outbound-listen 127.0.0.1:8899 # merekam setiap panggilan bersama request yang berjalan
echoproof check -s traffic.jsonl --base http://127.0.0.1:8001 -t http://127.0.0.1:8002 \
--outbound-proxy 127.0.0.1:8899 # menjawab setiap panggilan dari rekaman
只在受测服务上设置代理和 CA。Echoproof 自身会忽略环境中的代理变量。回放时,代理无法连接到原始目标。忽略代理设置的客户端(Node 22.21 之前的版本未设置 NODE_USE_ENV_PROXY=1,或自行设置代理的代码)仍会调用真实服务,但会显示为 call removed,绝不会显示为通过;如有可能,请在无法连接外部网络的环境中运行测试构建。第三方返回的机密值(返回 URL 中的 API key、返回 header 中的 token)也会被屏蔽。只有在请求逐个到达时,录制才能准确归因调用,因此请在 staging 环境中录制,或录制脚本生成的流量。
命令参考
| 命令 | 功能 |
|---|---|
echoproof init | 创建 echoproof.toml,并说明每项设置 |
echoproof record --upstream URL --out FILE | 运行用于录制流量的反向代理 |
echoproof replay -s FILE -t URL -o FILE | 将快照回放到目标并保存响应 |
echoproof diff BASELINE CANDIDATE | 比较两个快照 |
echoproof check -s FILE -t URL | 一步完成回放和 diff,对比录制内容 |
echoproof check -s FILE --base URL -t URL | 回放并 diff,在相同状态下对比 base 和 PR |
echoproof accept CANDIDATE --baseline FILE | 将经过审核的响应设为新基线 |
echoproof mcp | 为编码 Agent 运行 MCP 服务 |
通用选项:
| 选项 | 适用于 | 说明 |
|---|---|---|
--config FILE | 全部 | 配置文件,默认为 echoproof.toml |
--expect PATTERN | diff、check | 预期会变化的端点。可重复使用 |
--intent TEXT、--intent-file FILE | diff、check | 用于由 Claude 评估的变更意图 |
--code-diff FILE | diff、check | 作为意图评估依据的代码 diff |
--format text|markdown|json | diff、check | 终端输出格式,默认为 text |
--output FILE | diff、check | 保存报告。格式根据扩展名确定(.md、.json) |
--max-examples N | diff、check | 每个变更组的示例数量,默认为 2 |
--base URL | check | 用于 base 与 PR 模式的基准构建 |
--reset CMD | check | 用于在每轮之前恢复状态的 shell 命令 |
--noise-runs N | check | 对 base 额外回放的次数,用于学习噪声,默认为 1 |
--allow-writes PATTERN | replay、check | 允许回放写入请求的端点。可重复使用 |
--concurrency N | replay、check | 并行请求数,默认为 1 |
--save FILE | check | 保存候选快照 |
端点模式:POST /orders、GET /products/*(* 匹配单个路径段)、/admin/**(** 匹配多个路径段),或用 * 匹配全部。
退出码:0 表示通过或仅有预期变更,1 表示存在回归,2 表示错误(配置、网络、重置失败或意图评估失败)。
配置
所有设置均为可选。运行 echoproof init 可创建包含全部设置及其说明的文件。
[record]
upstream = "http://127.0.0.1:8000"
listen = "127.0.0.1:8080"
[sanitize]
# Diterapkan saat merekam dan saat replay, sehingga nilai yang disamarkan tetap sebanding.
redact_headers = ["authorization", "cookie", "set-cookie", "x-api-key"]
redact_fields = ["password", "token", "pin", "card_number", "phone", "email"]
[replay]
concurrency = 1 # naikkan hanya untuk endpoint tanpa state
timeout_ms = 10000
headers = { authorization = "Bearer ${STAGING_TOKEN}" } # menggantikan header yang disamarkan
safe_methods = ["GET", "HEAD", "OPTIONS"]
allow_writes = ["POST /orders"] # default kosong (mode aman)
reset = "./scripts/restore-test-db.sh"
noise_runs = 1
[diff]
ignore = ["updated_at", "$.meta.trace_id", "items[*].etag"]
expect = ["GET /products/*"]
auto_noise = true
compare_headers = ["content-type"]
[judge]
model = "claude-opus-5-5"
effort = "high" # low, medium, high, xhigh, max
fallbacks = true
[mcp]
allowed_hosts = [] # host selain localhost yang boleh dipakai agent
ignore 模式:仅名称(updated_at)可匹配任意深度。以 $ 开头或包含点号的模式($.meta.trace_id、items[*].etag)以 body 根节点为基准。
环境变量:
| 变量 | 说明 |
|---|---|
ANTHROPIC_API_KEY | 用于意图评估的 API key(替代项:ANTHROPIC_AUTH_TOKEN) |
ANTHROPIC_WORKSPACE_ID | 如果 API key 未绑定到单个 workspace,则必须设置 |
ANTHROPIC_BASE_URL | 替代 API 端点。必须使用 https,localhost 除外 |
ECHOPROOF_JUDGE_TRACE | 将评估器的请求和响应保存到文件(权限为 0600),以便调试 |
阅读报告
终端报告示例:
echoproof: REGRESSION - 83 exchanges, 5 changed, 78 unchanged
ignored 1 noisy fields that differ between runs of the base build: GET /up body
intent judged by claude-opus-5-5: The currency field is added as intended. ...
x GET /catalog 5/5 changed (100.0%) unexpected
behavior value changed $.result.products[*].price (5 requests)
[regression] The diff swaps the third argument of products() ...
GET /catalog [00e36fd43ade]
$.result.products[1].price: 18000 -> 22000
additive added $.result.currency (5 requests)
[intended] Adding 'currency' => 'IDR' matches the intent.
- GET /branches 0/5 changed (0.0%) unchanged
result: FAIL
| 标记 | 含义 |
|---|---|
x | 端点以非预期方式发生变化(回归) |
~ | 端点按预期或意图发生变化 |
- | 端点未发生变化,或其请求未被重放 |
(N requests) | 发生此类变化的请求数量 |
[intended]、[regression]、[unclear] | 意图评估的判定及理由 |
其他格式:
--format markdown会生成可直接用作 PR 评论的报告。--format json会生成结构化数据,其中包含findings:每个问题对应一句可直接返回给编码 Agent 的说明。
审查并批准更改后,将结果设为新的基线:
echoproof replay -s traffic.jsonl -t URL_PR -o candidate.jsonl
echoproof accept candidate.jsonl --baseline traffic.jsonl
CI 集成
使用 Echoproof GitHub Action。该 Action 会安装发布的二进制文件、运行 echoproof check、将报告写入作业摘要,并将判定作为输出提供:
- name: Start base and PR builds
run: ./scripts/start-builds.sh # base on :8001, PR on :8002, same test database
- run: git diff origin/${{ github.base_ref }}...HEAD > change.diff
- name: Behavior check
id: echoproof
uses: est57/echoproof-action@v1
with:
snapshot: traffic/baseline.jsonl
base: http://127.0.0.1:8001
target: http://127.0.0.1:8002
reset: ./scripts/reset-db.sh
intent: ${{ github.event.pull_request.title }}
code-diff: change.diff
anthropic-api-key: ${{ secrets.ANTHROPIC_API_KEY }}
- name: Comment on PR
if: always()
run: gh pr comment ${{ github.event.number }} --body-file "${{ steps.echoproof.outputs.report }}"
env:
GH_TOKEN: ${{ github.token }}
回归会导致步骤失败并阻止合并。如果只想报告而不阻止,请使用 fail-on-regression: false。在其他 CI 系统中,安装二进制文件并直接运行 echoproof check;退出代码 1 表示存在回归。
编码 Agent 集成(MCP)
在这段录制中,Claude Code(Sonnet)被要求整理订单服务中的收银员名称。此前,同一文件中已埋入一个折扣 Bug。检查失败后,Agent 沿着回归追查到一个并非由它引入的 Bug,将其修复,并在检查通过后才宣布任务完成。
echoproof mcp 通过 stdio 运行 Model Context Protocol 服务,使编码 Agent 能够在宣布工作完成之前检查自己所做的更改。
在编码 Agent 中安装
先安装二进制文件 echoproof(brew install est57/tap/echoproof 或 cargo install echoproof)。以下每个 Agent 都会在项目文件夹中运行 echoproof mcp,以便访问本地构建和快照文件。
Claude Code,作为插件(推荐)。该插件会安装 MCP 服务和 verify-behavior 技能,告知 Claude 何时以及如何检查更改,因此无需在 CLAUDE.md 中添加额外说明:
/plugin marketplace add est57/echoproof
/plugin install echoproof@echoproof
在 shell 中运行:claude plugin marketplace add est57/echoproof 和 claude plugin install echoproof@echoproof。
Claude Code,仅 MCP 服务:
claude mcp add echoproof -- echoproof mcp
Cursor(项目中的 .cursor/mcp.json 或 ~/.cursor/mcp.json)、Claude Desktop(claude_desktop_config.json)以及读取 mcpServers 映射的其他客户端:
{ "mcpServers": { "echoproof": { "command": "echoproof", "args": ["mcp"] } } }
VS Code,使用 Copilot Agent 模式(.vscode/mcp.json):
{ "servers": { "echoproof": { "type": "stdio", "command": "echoproof", "args": ["mcp"] } } }
Codex CLI:codex mcp add echoproof -- echoproof mcp,或在 ~/.codex/config.toml 中配置:
[mcp_servers.echoproof]
command = "echoproof"
args = ["mcp"]
Gemini CLI:gemini mcp add echoproof echoproof mcp,该命令会在项目中写入 .gemini/settings.json。
Claude Code 集成已通过端到端测试。其他客户端使用相同的标准 MCP stdio,但尚未经过测试;欢迎反馈使用情况。ChatGPT 和 Claude.ai 等基于 Web 的助手无法使用 Echoproof,因为它们运行在服务提供商的服务器上,无法访问您计算机上的构建。
Echoproof 已以以下名称登记在 MCP 官方注册表:
mcp-name: io.github.est57/echoproof
工具
| 工具 | 主要输入 | 功能 |
|---|---|---|
echoproof_check | snapshot、target、base、intent、expect、allow_writes | 重放并比较差异。返回面向 Agent 的报告、结构化 JSON 和 run_id |
echoproof_diff | baseline、candidate、intent、expect | 比较两个现有快照 |
echoproof_exchange | run_id、id | 完整请求、基准响应与候选响应,以及逐字段更改 |
Agent 工作流:修改代码、运行构建、调用 echoproof_check 并将任务作为 intent 传入;如果结果显示回归,则通过 echoproof_exchange 打开示例、修复代码并重新检查。服务不会提供 accept,因为是否批准新的基准仍由人工决定。
安全与隐私
记录的数据
- 写入磁盘前,
[sanitize]中列出的标头和字段会被替换为[REDACTED]。请添加您所在领域中包含个人数据的字段,例如电话号码、电子邮件或身份证号。 - 快照包含业务数据。请将其保存在公共仓库之外,或确保将其加入
.gitignore。
使用 --intent 时发送给 Anthropic 的数据
意图文本、代码差异(如有提供)、端点和字段名称、受影响的请求数量,以及经过脱敏处理的请求正文和值的前后示例。超过 4.000 个字符的正文示例会被截断。不使用 --intent 时不会发送任何数据。
内置防护措施
- 未获得每个端点的明确许可时,不会重放写入请求。
- 会验证快照中的路径,防止请求和嵌入的凭据被定向到其他主机。
- 响应大小上限为 32 MB。
- API key 仅通过
https发送,localhost除外。 - 外部文本(意图、差异、流量)无法更改评估器提示词的结构,也无法破坏 Markdown 报告中的表格。
编码 Agent 防护措施(MCP)
target和base只能是localhost,除非主机已在[mcp] allowed_hosts中登记。重放会携带replay.headers中的标头,因此 Agent 不应将其发送到其他主机。- 文件路径(
snapshot、save、code_diff_file)必须位于项目文件夹内。拒绝指向文件夹外部的符号链接。 - 重置命令只从
echoproof.toml读取,绝不从 Agent 读取。
限制
- 写入请求需要可重置的测试环境。没有此类环境时,请使用安全模式,该模式仅验证读取请求。
- 第三方调用通过 echoproof/laravel(Laravel
Http客户端)或出站代理使用录制结果响应(适用于任何遵循代理设置的客户端)。忽略代理设置的客户端和非 HTTP 依赖项(SMTP、队列、通过原始套接字使用的 gRPC)仍会进行真实调用;前者会显示为call removed。 - 跨请求 ID:在顺序重放(
concurrency = 1)时,重放期间生成的 ID 与录制时不同(录制时订单 ID 为 9812,重放时为 57),此 ID 会传递到同一实体的后续请求中(/orders/9812、order_id)。流量录制时已存在的数据 ID 无法映射;使用--base时,此类请求会报告为 not reproduced,而不是判定为未变化。使用--no-id-mapping或[replay] map_ids = false可关闭映射。 - 请求顺序通过顺序重放(
concurrency = 1)保持。大量流量可能会导致重放缓慢;并行重放仅适用于无状态端点。 - 应当发生却未发生的更改难以检测,因为 Echoproof 会报告发生变化的请求。
- 一次学习运行可能无法捕获偶发噪声。必要时可提高
--noise-runs,或添加ignore模式。
开发
仓库结构
crates/echoproof-core format snapshot, sanitasi, diff, laporan, penilaian niat
crates/echoproof-cli binary `echoproof`: perekam, replay, CLI, server MCP
examples/demo-shop backend POS untuk demo dan eval
eval/judge eval penilai niat: kasus uji, runner, dan grader
scripts/demo.sh demo end-to-end
运行测试
cargo test
cargo clippy --all-targets -- -D warnings
意图判定器评测
eval/judge 包含 26 个带标签的 PR 场景(54 组更改),用于衡量判定器区分有意更改与回归的准确度。在默认配置下,判定器在 78 次运行中实现了 100% 的正确门禁判定,且没有误报。当前场景已不足以区分更优的配置,因此正在添加真实系统中的案例。案例列表见 eval/judge/CASES.md。
eval/judge/prepare.sh # buat fixture, tanpa biaya API
node eval/judge/run-eval.mjs --flow eval/judge/runs/intent-judge --variant baseline --reps 3
node eval/judge/summarize.mjs eval/judge/runs/intent-judge/baseline
必须先使用 --approve-harness 批准一次测试框架,Runner 才会运行;每当 Runner 代码、案例或判定器发生变化时,都需要重新批准。
许可证
Echoproof 根据您的选择,采用以下两种许可证之一进行授权:
- Apache License, Version 2.0 (LICENSE-APACHE)
- MIT License (LICENSE-MIT)
除非另有说明,您提交并纳入本项目的任何贡献均以相同方式采用双重许可,且不附加任何条款。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。