Skip to content

[r2cn] Code 子命令阶段二 #192

@genedna

Description

@genedna

[任务] Code 子命令阶段二

[任务分值] 80 分

[背景描述] 在完成 #179 命令的基础进行阶段二的工作。

[需求描述]

阶段 02(LLM 接入:rig 驱动工具调用与 diff 输出)详细规划

目标

  • 使用 rig 将阶段 01 的工具注册为可调用工具。
  • 建立一个 “multi-turn 工具调用 → 最终输出 unified diff” 的闭环。
  • 构建 TUI 的接口,接入 Agent 去中心化网络。
  • 交互数据通过内部 MCP 写入版本管理。

阶段 02 的整体做法

  1. LLM 接口层(rig)
  • 选择一个 Provider(OpenAI 或 rig Provider)。
  • 用 AgentBuilder 构建 Agent,注册工具。
  • 使用多轮模式(允许工具调用),直到返回最终 diff。
  1. 工具注册
  • 将 list_dir/read_file/search/apply_patch 封装为 Tool trait 实现。
  • 为每个工具生成 JSON schema(schemars)。
  • 保持工具输出结构与阶段 01 的 ToolResult 一致。
  1. Prompt 与约束
  • System prompt 约束模型输出格式:

    • 必须在最终回复中输出 unified diff
    • 改动前要用工具获取足够上下文
  • 失败策略:

    • 如果 diff 解析失败,返回给模型继续修正
    • 设置最大循环次数(避免死循环)
  1. 执行与结果
  • 对工具调用结果追加进对话(rig 默认机制)。
  • 如果最终输出不是 diff:判为失败并反馈约束。
  • 提供 dry-run:仅返回 diff,不执行 apply_patch。

阶段 02 需要实现的内容

A. LLM 适配与配置

  • VibeModelConfig:model 名称、API key、max_tokens
  • RigClientFactory:从 env 读取配置,创建 provider client
  • Agent 构建器:绑定工具 + prompt

B. Tool 实现

  • 每个工具对应一个 struct 实现 Tool trait:
    • NAME 常量
    • Args / Output 类型(serde + schemars)
    • definition() 返回 JSON schema
    • call() 调用阶段 01 的实现
  • 输出结构化:ToolResult,方便日志与 TUI 复用

C. Diff 输出校验

  • diff_validator:验证 unified diff 结构(---/+++ 和 @@)
  • diff_apply:在 dry-run 时跳过落盘
  • 若 diff 失败:让模型修正(追加 error message)

D. 交互驱动

  • vibe_apply(task) 入口:
    • 生成 system prompt + user task
    • 进入 agent multi-turn loop
    • 直到返回 diff 或达到最大迭代

E. 生成的信息通过 MCP 存入本地;

[代码标准]

  1. 所有 PR 提交必须签署 Signed-off-by 和 使用 GPG 签名,即提交代码时(使用 git commit 命令时)至少使用 -s -S 两个参数,参考 Contributing Guide
  2. 所有 PR 提交必须通过 GitHub Actions 自动化测试,提交 PR 后请关注 GitHub Actions 结果;
  3. 代码注释均需要使用英文;

[PR 提交地址] 提交到 git-internal 仓库的 main 分支 `` 目录;

[开发指导]

  1. 认领任务参考 r2cn 开源实习计划 - 任务认领与确认;

[导师及邮箱] 请申请此题目的同学使用邮件联系导师,或加入到 R2CN Discord 后在 #p-mega 频道和导师交流。

  1. Quanyi Ma genedna@qq.com
  2. Tianxing Ye yetianxing2014@gmail.com

[备注]

  1. 认领实习任务的同学,必须完成测试任务和注册流程,请参考: r2cn 开源实习计划 - 测试任务r2cn 开源实习计划 - 学生注册与审核

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions