当工程师同时处理三四个分支的 bugfix、重构和功能开发时,逐个喂 prompt 给 Copilot 式工具效率并不高。Nova 要解决的问题很直接:把编码 Agent 从"单线程聊天"升级为"多会话并行 + 系统级调度"。工程师可以同时开多个编码会话,内部系统也能把 Agent 当作工作流的一环自动调用——不需要人盯着屏幕等结果。
并行会话:从排队到并发
传统编码助手的工作模式是"一问一答、串行等待"。你给一段上下文,Agent 返回一段补全或修改,你再接着问。如果同时有多个任务,只能一个个排队。
Nova 的做法是让每个编码任务独立成为一个 session。每个 session 有自己的上下文窗口、文件树和执行沙箱,互不干扰。工程师可以在一个 dashboard 上同时发起多个 session——比如一个做类型标注、一个修 lint 错误、一个写单元测试——然后去做别的事,回来再看结果。
这种模式的关键收益不是"快了多少秒",而是注意力不必被串行等待锁住。工程师的判断力用在发起任务和审核结果上,中间的执行交给 Agent 并行跑。
系统级调用:Agent 不只是助手,也是工作流节点
更有意思的部分是 Nova 对内部系统的开放。CI/CD、代码审查、安全扫描这些内部系统可以通过 Nova 的接口把 Agent 当作一个可编程步骤嵌入自动化流程。
举个例子:PR 提交后,CI 流程自动触发一个 Nova session,让 Agent 根据 lint 报告尝试自动修复;修复成功则直接 push 一个新 commit,失败则把原始报错回传给作者。整个过程中没有人需要手动复制粘贴错误信息到聊天窗口。
这意味着 Agent 从"人驱动的工具"变成了"系统驱动的 worker"。人设定规则和边界,系统按规则调度 Agent 执行。
实践:用 YAML 定义一个 Agent 工作流
下面是一个模拟 Nova 工作流定义的 YAML 示例。Nova 本身是内部平台,公开细节有限,这里基于摘要描述的"内部系统使用 AI Agent 作为自动化工作流一环"的思路,给出一个可改造的参考结构。假设你有一个类似的 Agent 调度平台,可以这样编排:
# nova-workflow.yaml — 定义一个 PR 提交后的自动修复工作流
name: pr-auto-fix
trigger:
event: pull_request
condition:
lint_failed: true # CI lint 步骤失败时触发
steps:
- name: spawn-fix-session
type: nova.session.create
params:
repo: "{{ event.repo }}"
branch: "{{ event.branch }}"
task_prompt: |
根据 lint 报告修复以下问题,只修改必要的行,
不要重构无关代码:
{{ event.lint_output }}
sandbox:
timeout: 300 # 5 分钟超时
max_file_changes: 5 # 最多改 5 个文件,防止 Agent 跑飞
- name: review-result
type: condition
depends_on: spawn-fix-session
branches:
success:
- name: push-fix-commit
type: git.push
params:
message: "auto-fix: lint errors (agent-generated)"
require_review: true # 仍需人工确认后才合并
failure:
- name: notify-author
type: slack.notify
params:
channel: "{{ event.author }}"
message: "Agent 未能自动修复 lint 问题,请手动处理:{{ steps.spawn-fix-session.log }}"
使用前需要调整的地方:
nova.session.create是假设的 API 类型,替换成你实际平台的 session 创建接口。event.lint_output等变量需要对接你的 CI 系统的输出格式。require_review: true是有意加的安全边界——Agent 生成的代码不应绕过人工审查直接合并。
用 Python 调度多个并行编码会话
如果你想在本地或自己的服务里模拟"多会话并行"的调度逻辑,下面是一个最小可运行的 Python 示例,用 asyncio 并行发起多个编码任务(这里用 OpenAI API 作为 Agent 后端,可替换为任何 LLM 或本地模型):
import asyncio
import os
from openai import AsyncOpenAI
client = AsyncOpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
# 定义多个并行编码任务
TASKS = {
"add_type_hints": "为以下 Python 函数添加类型标注,只加标注不改逻辑:\n{code}",
"fix_lint": "修复以下 lint 错误,每条错误只改最小必要行:\n{lint_report}",
"write_tests": "为以下函数写 3 个 pytest 测试用例,覆盖正常和边界情况:\n{code}",
}
async def run_agent_session(task_name: str, prompt_template: str, context: str) -> dict:
"""模拟一个 Nova 编码会话:发送 prompt,等待结果"""
prompt = prompt_template.format(**{"code": context, "lint_report": context})
resp = await client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": prompt}],
temperature=0.2, # 编码任务用低温度,减少随机性
)
return {"task": task_name, "result": resp.choices[0].message.content}
async def main():
# 假设这是我们要处理的源代码片段
source_code = """
def merge_dicts(a, b):
result = a.copy()
result.update(b)
return result
"""
# 并行发起所有会话
sessions = [
run_agent_session(name, template, source_code)
for name, template in TASKS.items()
]
results = await asyncio.gather(*sessions)
for r in results:
print(f"\n=== {r['task']} ===")
print(r["result"])
if __name__ == "__main__":
asyncio.run(main())
运行前准备:
pip install openai
export OPENAI_API_KEY="sk-..."
python parallel_sessions.py
这个脚本的核心思路就是 Nova 在平台层面做的事:把多个独立任务并发调度,每个任务有自己的 prompt 和上下文,结果分开返回供人工审核。你可以把 run_agent_session 替换成任何 Agent SDK(比如 Anthropic、本地 Codellama 等),也可以加入文件读写让 Agent 直接操作代码文件而非只输出文本。
安全边界与采纳建议
让 Agent 并行跑起来之后,最容易出问题的不是速度,而是失控范围。几个实践建议:
- 限制每个 session 的修改范围——最大文件数、最大行数、禁止删除文件。上面 YAML 里的
max_file_changes: 5就是这类硬边界。 - Agent 生成的代码必须经过人工审查才能进入主分支。自动 push commit 可以,自动 merge 不行。
- 超时机制必须有。Agent 偶尔会陷入循环修改,5 分钟超时是合理的起步值。
- 日志全量保留。每个 session 的 prompt、中间步骤、最终输出都应可追溯,方便事后审计和调优 prompt。
- 从低风险任务开始接入——lint 修复、类型标注、测试生成这些改动局部且易验证的任务,比大规模重构更适合作为第一批自动化场景。
Nova 把编码 Agent 从"聊天框里的助手"推到了"平台级并行 worker"的位置。对工程师来说,这意味着不用再排队等 Agent 回复;对系统来说,这意味着 Agent 可以像 cron job 或 CI step 一样被可靠调度。真正要花心思的不是"怎么让 Agent 更聪明",而是"怎么给 Agent 划清边界、让它在边界内可靠地跑"。