总体来说,gemini-cli的ReAct循环核心可以分为如下层级:

  • A. 用户层
  • B. packages/cli 交互层
  • C. packages/core 内核层
  • D. LLM
  • E. 本地/外部工具

ReAct循环的主要步骤如下:

  1. 用户输入prompt指令(MT-3000上对于核函数进行优化)
  2. packages/cli接收到用户prompt,通过入口useGeminiStream.submitQuery()准备并发送查询
  3. packages/core发起流式推理请求(sendMessageStream)给LLM处理

Phase1: 推理

  1. LLM返回行动计划ToolCallRequest给packages/core内核层
  2. packages/core内核层通过事件流传递计划给packages/cli层(调度: useReactToolScheduler)
  3. packages/cli交互层向packages/core内核层请求执行工具(CoreToolScheduler.schedule)
    • 6a. [optional] packages/core内核层接收到后,如果是高风险操作(比如shell)需要向用户请求确认(返回给packages/cli交互层)
    • 6b. [optional] packages/cli交互层向用户层渲染对话框
    • 6c. [optional] 用户层授权,结果返回给packages/cli交互层
    • 6d. [optional] packages/cli交互层返回确认结果给packages/core内核层
  4. packages/core内核层 执行 本地/外部工具 比如(WriteFile, RunShell)

Phase2: 行动

  1. 本地/外部工具返回执行结果给packages/core内核层(执行完成,触发回调)
  2. packages/core内核层回调onAllToolCallsComplete(results)交给packages/cli交互层(闭环点:handleCompletedTools)

Phase3: 观察[ReAct循环]

  1. packages/cli将工具结果作为新上下文,再次调用submitQuery()给packages/core内核层 {和第2步一样}

  2. packages/core内核层发起新一轮推理给LLM {和第3步一样}

  3. LLM返回最终答案(无工具调用)给packages/core内核层

  4. packages/core内核层将最终答案传递给packages/cli交互层

  5. packages/cli交互层渲染最终结果给用户层

我们的技术栈主要用LangChain/LangGraph

gemini-cli的源码主要参考~/Documents/code/projects/gemini-cli

现在请你生成详细的开发计划,将目前的项目做成类似gemini-cli或者claude code的coding agent

生成的开发计划放置在项目根目录,命名PLAN.md

请ultrathink: