Agent工坊

【Agent工坊】"Agents Are Suggestions, States Are Laws":用可视化状态机把AI Agent成功率从20%拉到100%

给模型40个工具让它自由发挥 = 崩溃。用状态机把每个阶段只暴露5个工具 = 本地13B模型也能过SWE-bench。Statewright用Rust写的确定性引擎,不是又一层LLM。

前言

如果你用过Claude Code、Cursor或Codex做实际开发,一定经历过这种绝望:让它改个bug,它先读了5遍同一个文件,然后试图在"计划阶段"直接编辑代码,改完了不测试就说"完成了"——最后你发现它不仅没修好bug,还引入了三个新的。


这不是模型不够聪明。是上下文太大、工具太多了


Statewright给出了一个反直觉但有效的答案:不要用更大的模型,用更小的问题空间。这篇文章会带你从零搭建Statewright,看懂它怎么让本地13B模型从20%成功率飙升到100%,以及如何为你的团队定制自己的Agent工作流。


一、AI Agent的死穴:工具越多,越容易崩溃

先看一组真实数据。Statewright团队用5个SWE-bench任务测试了不同规格的模型:


模型大小无Statewright有Statewright
gemma33.3GB失败失败
gemma4:e2b7.2GB失败部分通过*
gpt-oss:20b13.8GB2/5通过5/5通过
gemma4:31b19.9GB2/5通过5/5通过
llama3.342.5GB-2/2通过

SWE-bench成功率对比


▲ SWE-bench成功率对比:13.8GB+模型在Statewright加持下从40%飙升至100%


*需要专门的edit_line工具适配


关键发现:13.8GB的模型(大致相当于13B参数级),不加状态约束只有40%成功率,加上后变成100%。同样的任务,同样的硬件,同样的模型。


为什么?因为当你给一个Agent 40+个工具(读文件、写文件、执行shell、搜索代码、调用API、管理git……),模型在每一步都要在40个选项中做决策。这40个选项的排列组合让搜索空间爆炸。模型开始"乱试"——读同一个文件5次、在计划阶段调用编辑工具、跳过测试直接宣告完成。


这不是"模型不够好",是"问题定义太大"。


二、Statewright的解法:状态机 = 把大海变游泳池

Statewright的核心思想就一句话:Agents are suggestions, states are laws


它不是又一层LLM包装——它是一个用Rust写的确定性引擎。你定义好状态机定义(states、transitions、guards、tool restrictions),它在每个状态下只暴露该状态下允许的工具,强制执行规则。


工作流拆解示例:bugfix

最经典的bugfix工作流被拆成四个状态:


planning → implementing → testing → completed


每个状态只给特定工具:


状态可用工具禁止的操作
planningread_file, search_code, grep任何编辑操作、shell命令
implementingedit_file, read_file, bash(受限)rmshred、重定向写入(>>)
testingbash(仅测试命令)任何编辑操作、非测试命令
completed全部锁定

关键机制:如果你在planning状态调用edit_file,你不会得到"建议你不要这样做"的提示——你会得到硬拒绝,同时引擎告诉你:"当前状态不支持此工具。可用工具:read_file, search_code, grep。要进入编辑状态,请调用statewright_transition。"


这就是"States are laws"的真正含义——不是建议,不是提示词里的"请遵守规则",而是工具层面的硬阻断


各状态工具权限矩阵


▲ 各状态工具权限矩阵:planning只读 → implementing编辑受限 → testing仅测试命令 → completed锁定



三、5分钟上手:在Claude Code中安装Statewright

Statewright状态机工作流


▲ Statewright状态机工作流:planning→implementing→testing→completed,每个状态严格限定可用工具


前提条件

  • Claude Code 已安装
  • 一个Statewright账号(免费层可用)

步骤1:安装插件

在Claude Code终端中执行:


/plugin marketplace add statewright/statewright

/plugin install statewright

/reload-plugins


执行后会自动打开浏览器,引导你注册Statewright账号并生成API Key。


# 看到这个提示说明安装成功

◆ [statewright] Plugin installed. Run /statewright start <workflow> to begin.


步骤2:启动你的第一个工作流

用bugfix工作流修复calc.py中的测试失败:


❯ start the bugfix workflow — fix the failing tests in calc.py

◆ statewright — statewright_start (workflow: bugfix)

◆ [statewright] Workflow activated: bugfix

◆ statewright — statewright_get_state (MCP)

◆ Current phase: planning. Let me read the code first.

Read 2 files ── calc.py, test_calc.py

Found: division by zero not handled in line 47

[statewright] planning => implementing

◆ statewright — statewright_transition (READY)

Edit calc.py: 1 line changed — added ZeroDivisionError guard

[statewright] implementing => testing

◆ statewright — statewright_transition (DONE)

Bash: pytest -x

======================== 7 passed in 0.34s ========================

[statewright] testing => completed

◆ [statewright] Workflow complete. 46 seconds.


步骤3:观察发生了什么

上面的输出里有几个关键点:


  1. planning阶段只读文件——Agent先读了calc.pytest_calc.py,定位到第47行的除零问题。此时它没有编辑权限,所以不会"手痒"直接改代码。
  2. 明确的状态转换——planning => implementing。Agent必须显式调用statewright_transition(READY)才能进入下一阶段。
  3. 编辑受限——implementing阶段只改了1行(加了ZeroDivisionError处理),不是大范围重写。
  4. 强制测试——implementing完成后必须进入testing阶段,运行pytest -x验证。

整个流程46秒完成。对比无约束情况下Agent可能花3分钟反复读文件、乱改代码、忘记测试。


四、自定义工作流:创建你自己的状态机

Statewright的真正威力在于自定义工作流。你可以为团队的特定场景创建专属状态机。


工作流定义格式

一个完整的工作流用JSON定义,包含状态、转换、工具权限和守卫条件:


{

  "name": "code-review",

  "states": {

    "analyze": {

      "description": "Read and understand the diff",

      "allowed_tools": ["read_file", "git_diff", "search_code"],

      "bash": {"mode": "none"}

    },

    "review": {

      "description": "Write review comments",

      "allowed_tools": ["read_file", "write_review"],

      "bash": {"mode": "none"},

      "max_edit_lines": 0,

      "max_files_edited": 0

    },

    "report": {

      "description": "Generate final review report",

      "allowed_tools": ["write_review", "read_file"],

      "bash": {"mode": "none"}

    }

  },

  "transitions": [

    {"from": "analyze", "to": "review", "trigger": "READY", "guard": {"type": "files_read", "op": "gte", "value": 1}},

    {"from": "review", "to": "report", "trigger": "DONE"},

    {"from": "report", "to": null, "trigger": "COMPLETE"}

  ],

  "initial_state": "analyze"

}


五层守卫机制

Statewright提供五种硬守卫,组合使用可以覆盖绝大部分Agent失控场景:


守卫类型作用使用场景
工具白名单 (allowed_tools)每个状态只暴露指定工具防止planning阶段编辑代码
Bash管控禁止销毁命令(rm/shred)、重定向写入、脚本解释器防止Agent误删文件
编辑限制 (max_edit_lines, max_files_edited)限制单状态编辑行数和文件数防止Agent"大改特改"
命令白名单 (allowed_commands)前缀匹配允许的shell命令testing阶段只允许pytest/npm test
条件转换 (guard)程序化前置条件"必须读过至少1个文件才能进入review"

Statewright五层守卫机制


▲ Statewright五层守卫机制:从工具白名单到条件转换,同心圆式层层防护


实战示例:API开发工作流

假设你的团队需要Agent帮忙开发REST API端点:


{

  "name": "api-endpoint-dev",

  "states": {

    "design": {

      "description": "Design the API contract",

      "allowed_tools": ["read_file", "search_code", "write_file"],

      "bash": {"mode": "none"},

      "allowed_paths": ["docs/api/"],

      "max_files_edited": 2

    },

    "implement": {

      "description": "Implement the endpoint",

      "allowed_tools": ["read_file", "edit_file", "search_code"],

      "bash": {"mode": "readonly"},

      "max_edit_lines": 100,

      "max_files_edited": 5

    },

    "test": {

      "description": "Run API tests",

      "allowed_tools": ["read_file", "bash"],

      "bash": {"mode": "restricted", "allowed_commands": ["curl", "pytest", "npm test"]}

    },

    "docs": {

      "description": "Update API documentation",

      "allowed_tools": ["read_file", "edit_file"],

      "allowed_paths": ["docs/api/"],

      "max_edit_lines": 50,

      "max_files_edited": 1

    }

  },

  "transitions": [

    {"from": "design", "to": "implement", "trigger": "READY", "guard": {"type": "files_created", "op": "gte", "value": 1}},

    {"from": "implement", "to": "test", "trigger": "READY"},

    {"from": "test", "to": "docs", "trigger": "DONE", "guard": {"type": "tests_passed", "op": "eq", "value": true}},

    {"from": "test", "to": "implement", "trigger": "FAIL", "guard": {"type": "tests_passed", "op": "eq", "value": false}},

    {"from": "docs", "to": null, "trigger": "COMPLETE"}

  ],

  "initial_state": "design"

}


注意一个关键设计test状态有两个出边——测试通过进入docs,测试失败回到implement。这就是状态机比DAG更适合Agent场景的原因:Agent工作天然需要循环和重试


预期输出示例

当你用这个工作流让Agent开发一个 /users/:id 端点时:


◆ statewright — statewright_start (workflow: api-endpoint-dev)

[design] Reading existing API docs and models...

Created: docs/api/users-endpoint-spec.md

[statewright] design => implement

[implement] Reading User model and router...

Edit routes/users.py: 65 lines added

Edit tests/test_users.py: 42 lines added

[statewright] implement => test

[test] Running: pytest tests/test_users.py -v

FAILED tests/test_users.py::test_get_user_not_found - AssertionError: expected 404, got 500

[statewright] test => implement (retry)

[implement] Fixed: missing try/except for User.DoesNotExist

Edit routes/users.py: 3 lines changed

[statewright] implement => test

[test] Running: pytest tests/test_users.py -v

4 passed in 0.52s

[statewright] test => docs

[docs] Updating API documentation with new endpoint details...

Edit docs/api/README.md: 18 lines added

[statewright] Workflow complete. 2 minutes 13 seconds. 1 retry.


重点:注意中间的失败→重试循环。Agent第一次实现时忘了处理User.DoesNotExist异常,测试失败后自动回到implement修复,再测通过后进入docs。这个重试循环是状态机自动管理的,不需要你手动告诉Agent"再改一次"。


五、踩坑提醒:使用Statewright必须知道的5件事

⚠️ 坑1:缓存失效导致成本上升

每次状态转换时工具列表会变化,这可能触发模型提供商的prompt缓存失效。在长会话中(如30+次工具调用),token成本可能比无状态约束高出10-20%。


对策:对于简单任务(如单文件小改动),不需要Statewright。只在复杂多步骤工作流中使用。HN社区建议:任务超过5次工具调用时再启用。


⚠️ 坑2:流程过僵会扼杀创造力

Statewright的设计哲学是"先约束,再放宽"。但如果你把状态机设计得太死——比如每个状态只允许2种工具、转换条件极其严格——Agent可能会因为无法完成某个微小动作而卡住,反复在状态之间跳转而没有任何进展。


对策:从宽松开始。先给每个状态6-8个工具,运行几轮后根据实际"乱用工具"的日志来收紧。不要一上来就"每个状态只给2个工具"。


⚠️ 坑3:与MCP工具的兼容性问题

Statewright通过MCP协议与Agent通信。如果你的Agent已经在用其他MCP服务器(如文件搜索、数据库查询),需要确保工具名称不冲突。Statewright会注入自己的MCP工具(statewright_start, statewright_get_state, statewright_transition),这些名称是保留的。


对策:检查你的MCP配置,确保没有自定义工具用了statewright_前缀。


⚠️ 坑4:本地模型的"能力地板"

研究数据明确显示:13GB以下的模型即使在Statewright约束下也无法可靠完成任务。不是因为状态机不好,而是模型连基本的"读懂文件内容并生成准确编辑"都做不到。


对策:本地模型至少13GB(≈13B参数)。低于这个门槛,先用云端模型。


⚠️ 坑5:API Key的"粘贴两次"问题

最新版本的Claude Code可能会在你粘贴API Key时警告安全问题——你只需要再粘贴一次并确认"我确实要这样做"。这不是Statewright的问题,是Claude Code对来自外部插件的敏感操作过度保护。HN上有多个用户报告了同样的体验。


六、Statewright vs 竞品:什么时候用它,什么时候不用

方案原理适用场景局限
StatewrightRust确定性状态机+工具拦截多步骤开发/部署/审核流程需要预先定义工作流
提示词约束在system prompt中写规则简单任务、单步骤操作模型经常忽略长prompt中的规则
可观测性工具事后记录+分析调试、性能分析不能防止错误发生
更大模型指望模型自己"更聪明"探索性任务、创意工作成本高、仍有不确定性

选择指南


  • 任务有明确的步骤和交付物 → Statewright
  • 任务是探索性的、没有固定流程 → 不要用Statewright,用更大的模型+事后审查
  • 任务简单(3步以内)→ 提示词约束就够了

七、生产环境部署建议

团队共享工作流

Statewright支持将工作流定义导出为JSON文件,可以通过Git管理:


# 导出工作流

statewright export bugfix > workflows/bugfix.json

# 团队成员导入

statewright import workflows/bugfix.json

# Git版本控制

git add workflows/ && git commit -m "Update bugfix workflow: add security review state"


CI/CD集成

可以将Statewright作为CI流水线的一部分,强制执行代码审查和测试:


# .github/workflows/agent-review.yml

name: AI Agent Code Review

on: [pull_request]

jobs:

  review:

    runs-on: ubuntu-latest

    steps:

      - uses: actions/checkout@v4

      - name: Run Statewright review workflow

        run: |

          statewright run code-review \

            --diff="${{ github.event.pull_request.diff_url }}" \

            --output=review-report.md

      - name: Post review as PR comment

        uses: actions/github-script@v7

        with:

          script: |

            const fs = require('fs');

            const report = fs.readFileSync('review-report.md', 'utf8');

            github.rest.issues.createComment({

              issue_number: context.issue.number,

              owner: context.repo.owner,

              repo: context.repo.repo,

              body: report

            });


总结

Statewright解决的不是"模型不够聪明"的问题,而是"模型被太多选择淹没"的问题。它的核心洞察简单而深刻:缩小每一步的决策空间 = 大幅提升每一步的决策质量


三个最值得记住的数字:


  • 13.8GB模型 + 状态机 = 5/5 SWE-bench通过(无状态机:2/5)
  • 46秒:一个完整的bugfix工作流(定位→修复→测试→完成)
  • 5种守卫:工具白名单、Bash管控、编辑限制、命令白名单、条件转换——组合使用覆盖绝大部分Agent失控场景

对于AI创业者来说,这不是一个工具选择问题,而是一个架构决策:你的Agent流水线是用"一个超大prompt管一切",还是"每个阶段精准控制工具和权限"?前者看起来简单,后者才是工程上的正确解。


#AI创业 #Agent工坊 #Statewright #状态机 #AI编程工具 #一人公司


本文由AI辅助创作,经人工审核编辑发布