文章目录

AI Agents SDK:建立安全可靠的文档设计、开发、测试、发布一体自动化

用久了 AI,恨不得将所有的工作都安排给它。

按现有成型的产品方案,就是把今天的任务汇总成一个 TODO list/loop 一下,就可以刷刷视频、看看热搜、喝杯咖啡摸摸鱼,下班前验收一下,一天就轻轻松松过去了。

我没有这样试过:第一,我消费不起这个量级的 token;第二,我认为 Agent 无法高效、安全地完成这么长的工作流。

如何解决这个问题?

拆分流程,一个流程一个 Agent

开发者的日常工作流程可以分为:开发文档设计、编码、review、bug 修复、测试、部署测试环境。据此便可以拆分为六个角色,每个角色都有一份系统提示词,有各自的职能范围、权限、边界:写文档的就不要去写代码,测试只需要把 bug 反馈给修复 bug 的角色,流程随之转向;测试通过之后再流转到部署。bug 有可能是测试部门手工录入 TAPD,这个时候就需要有一个定时任务去抓取,分配给 bug 修复的角色。

即使 Claude Code、Codex、Cursor Agent、Workbuddy 等这一类 Agent 工具能完成以上任务,开发者自始至终都只是扮演一个监工的角色。

使用 Agent SDK 赋予角色的读写和执行能力

以 Cursor Agent SDK 为例:

options = AgentOptions(
    api_key=api_key,
    model=model,
    mode="agent",
    local=LocalAgentOptions(
        cwd=workdir,
        setting_sources=["user", "project"],
    ),
)

api_keyhttps://cursor.com/dashboard/api?section=user-keys#user-api-keys 中设置。

Cursor Api key Setting

mode 有 agentplan 两种模式。plan 用于编写执行文档(只对 plan 的文档有读写权限);agent 拥有修改代码和执行命令的权限。

local 的 cwd 是项目目录,setting_sources 存放 SKILL 和 Agent 等配置。

记录 Agent 输入输出日志,有迹可循

开发者最害怕的是一条命令执行下去,半天没响应。使用流式输出,每截取一个 chunk 就写入日志文件。

try:
    with Agent.create(options) as agent:
        cursor_agent_id = getattr(agent, "agent_id", "") or new_session_id
        logger.info("cwd=%s model=%s mode=agent agent_id=%s", workdir, model, cursor_agent_id)
        run = agent.send(effective_prompt)
        run_id = getattr(run, "id", "") or ""
        if run_id:
            logger.info("run_id=%s", run_id)

        # 流式输出,与 claude agent 行为一致便于日志/Tee 接收
        try:
            for message in run.messages():
                _collect_cursor_status_message(message, status_messages)
                msg_type = getattr(message, "type", "")
                if msg_type == "assistant":
                    inner = getattr(message, "message", message)
                    content = getattr(inner, "content", None) or []
                    for block in content:
                        block_type = getattr(block, "type", "")
                        # text/tool_use/tool_result/thinking...
                        ...
                else:
                    # system/error/result 等其它消息打印类型即可
                    logger.debug("[CursorMsg.%s] %s", msg_type or "unknown", _truncate(str(message)))
        except Exception as stream_err:  # noqa: BLE001
            # 流式异常不直接判定失败,等 wait() 拿最终结果
            logger.info("stream interrupted: %s", stream_err)

        result = run.wait()

用状态机把角色关联起来

角色之间可以流转,单个角色可以重复触发,角色任务可以按条件并发,hook 角色记录日志、发送警报等。

状态可编程的好处:可以用代码的条件控制流程转向,定时获取任务,触发任务分发,并控制角色处理任务的并发能力。

flowchart TD Doc[文档设计] --> Code[编码] Code --> Review[Review] Review -->|不通过| Code Review -->|通过| Test[测试] Test -->|发现 Bug| BugFix[Bug 修复] BugFix --> Test Test -->|通过| Deploy[部署]

不必担心这个产品如此复杂的编码工作,大胆的设计,然后全部交给 AI,像编写一个工具一样去实现一个产品。

总而言之,AI 时代,人人都可以上线自己的产品。


推荐阅读