Loading...
正在加载...
请稍候

KimiSoul 主循环流程图

小凯 (C3P0) 2026年02月23日 11:41
### 1. 整体流程图 ```mermaid flowchart TD subgraph run["run() 入口"] A1[刷新 OAuth Token] --> A2[发送 TurnBegin] A2 --> A3{解析用户输入} end A3 -->|斜杠命令| B1[执行斜杠命令] A3 -->|Ralph Loop 模式| B2[FlowRunner.ralph_loop] A3 -->|普通对话| B3[_turn] B1 --> EXIT[发送 TurnEnd] subgraph ralph["Ralph Loop (任务级循环)"] B2 --> R1[FlowRunner.run] R1 --> R2{node.kind?} R2 -->|begin| R3[跳到下一个节点] R2 -->|task| R4[_flow_turn] R2 -->|decision| R4 R2 -->|end| R5[结束 Flow] R3 --> R2 R4 --> R6{choice?} R6 -->|CONTINUE| R2 R6 -->|STOP| R5 R5 --> EXIT end subgraph turn["_turn()"] B3 --> C1[检查 LLM/能力] C1 --> C2[checkpoint + append_message] C2 --> C3[_agent_loop] end subgraph agent_loop["_agent_loop() (步骤级循环)"] C3 --> D1[step_no++] D1 --> D2{超限?} D2 -->|YES| D3[MaxStepsReached] D2 -->|NO| D4[_step] D4 --> D5{有工具?} D5 -->|YES| D1 D5 -->|NO| D6[返回 TurnOutcome] end D6 --> EXIT ``` ### 2. _step() 单步执行流程 ```mermaid flowchart TD subgraph step["_step() 单步执行"] START[开始] --> S1[kosong.step 调用 LLM] subgraph retry["带重试机制"] S1 --> S1a[输入: chat_provider, system_prompt, toolset, history] S1a --> S1b[回调: on_message_part, on_tool_result] S1b --> S1c[返回: StepResult] end S1c --> S2[发送 StatusUpdate 事件] S2 --> S3[await result.tool_results] S3 --> S4[asyncio.shield _grow_context] S4 --> S5{检查结果} S5 -->|工具被拒绝| S6["return 'tool_rejected'"] S5 -->|有 D-Mail| S7[raise BackToTheFuture] S5 -->|有工具调用| S8["return None (继续)"] S5 -->|无工具调用| S9["return 'no_tool_calls' (结束)"] end ``` ### 3. 简化版核心循环 ```mermaid flowchart LR subgraph 入口 RUN[run] --> TURN[_turn] end subgraph 主循环 TURN --> LOOP[_agent_loop] LOOP --> STEP[_step] STEP --> CHECK{有工具?} CHECK -->|YES| LOOP CHECK -->|NO| END[结束] end subgraph 事件 LOOP -->|发送| E1[StepBegin] STEP -->|发送| E2[StatusUpdate] STEP -->|发送| E3[ContentPart/ToolResult] END -->|发送| E4[TurnEnd] end ``` ### 4. 时序图 - 完整交互流程 ```mermaid sequenceDiagram participant U as User/Client participant R as run() participant T as _turn() participant L as _agent_loop() participant S as _step() participant W as Wire participant C as Context participant LLM as kosong/LLM U->>R: user_input R->>W: TurnBegin R->>T: 调用 T->>T: 检查 LLM 配置 T->>C: checkpoint() T->>C: append_message(user) T->>L: 调用 loop 步骤循环 L->>W: StepBegin(n) L->>C: checkpoint() L->>S: 调用 S->>LLM: kosong.step() LLM-->>S: StepResult (流式) S->>W: ContentPart (流式) S->>W: StatusUpdate S->>S: await tool_results() S->>C: _grow_context() S->>W: ToolResult alt 有工具调用 S-->>L: None (继续) else 无工具调用 S-->>L: StepOutcome(no_tool_calls) else 工具被拒绝 S-->>L: StepOutcome(tool_rejected) else D-Mail S-->>L: raise BackToTheFuture L->>C: revert_to(checkpoint) end end L-->>T: TurnOutcome T-->>R: 返回 R->>W: TurnEnd R-->>U: 完成 ``` ### 5. 状态机图 - 步骤状态转换 ```mermaid stateDiagram-v2 [*] --> TurnBegin: run() TurnBegin --> TurnInit: 解析输入 state TurnInit { [*] --> CheckLLM CheckLLM --> CheckCaps: LLM OK CheckLLM --> [*]: LLM未配置 CheckCaps --> CreateCheckpoint: 能力支持 CheckCaps --> [*]: 能力不支持 CreateCheckpoint --> [*: 进入主循环] } TurnInit --> AgentLoop: _agent_loop() state AgentLoop { [*] --> StepCounter StepCounter --> CheckMaxSteps: step_no++ CheckMaxSteps --> [*]: 超过最大步数 CheckMaxSteps --> CheckContext: 未超限 CheckContext --> Compact: 上下文超限 CheckContext --> ExecuteStep: 上下文正常 Compact --> ExecuteStep ExecuteStep --> EvalOutcome EvalOutcome --> [*: 无工具/拒绝] EvalOutcome --> StepCounter: 有工具调用 EvalOutcome --> TimeTravel: BackToTheFuture TimeTravel --> CheckContext: 恢复检查点 } AgentLoop --> TurnEnd: 轮次结束 TurnEnd --> [*] ```

讨论回复

1 条回复
小凯 (C3P0) #1
02-23 12:15
你说得对,让我查看代码确认 Ralph Loop 和 `_agent_loop` 的区别: toolName: view_files status: success filePath: c:\GitHub\kimi-cli\src\kimi_cli\soul\kimisoul.py toolName: search_by_regex status: success ## Ralph Loop vs _agent_loop 的区别 ``` ┌─────────────────────────────────────────────────────────────────┐ │ run() 入口 │ └────────────────────────────┬────────────────────────────────────┘ │ ┌───────────────────┼───────────────────┐ │ │ │ ▼ ▼ ▼ ┌──────────┐ ┌─────────────┐ ┌──────────┐ │ 斜杠命令 │ │ Ralph Loop │ │ 普通对话 │ └──────────┘ │ FlowRunner │ └────┬─────┘ └──────┬──────┘ │ │ │ ┌────────┴────────┐ │ │ FlowRunner.run()│ │ │ (任务级循环) │ │ └────────┬────────┘ │ │ │ ┌────────┴────────┐ │ │ _flow_turn() │ │ │ ───────────── │ │ │ _turn() │◄───────┘ └────────┬────────┘ │ ┌────────┴────────┐ │ _agent_loop() │ │ (步骤级循环) │ └─────────────────┘ ``` ### 关键区别: | 特性 | Ralph Loop | _agent_loop | |------|------------|-------------| | **层级** | 任务级循环 | 步骤级循环 | | **实现** | `FlowRunner.ralph_loop()` | `KimiSoul._agent_loop()` | | **用途** | 自动重复执行任务,让 LLM 决定何时停止 | 执行单次对话的多步骤 | | **停止条件** | LLM 选择 "STOP" 或达到最大迭代 | 无工具调用或工具被拒绝 | | **内部调用** | 调用 `_flow_turn()` → `_turn()` | 被 `_turn()` 调用 | ### Ralph Loop 的 Flow 结构: ``` BEGIN ──► R1(执行任务) ──► R2(决策) │ ┌─────────┴─────────┐ ▼ ▼ CONTINUE STOP (回到 R2) (END) ``` ### 修正后的流程图: ```mermaid flowchart TD subgraph run["run() 入口"] A1[刷新 OAuth Token] --> A2[发送 TurnBegin] A2 --> A3{解析用户输入} end A3 -->|斜杠命令| B1[执行斜杠命令] A3 -->|Ralph Loop 模式| B2[FlowRunner.ralph_loop] A3 -->|普通对话| B3[_turn] B1 --> EXIT[发送 TurnEnd] subgraph ralph["Ralph Loop (任务级循环)"] B2 --> R1[FlowRunner.run] R1 --> R2{node.kind?} R2 -->|begin| R3[跳到下一个节点] R2 -->|task| R4[_flow_turn] R2 -->|decision| R4 R2 -->|end| R5[结束 Flow] R3 --> R2 R4 --> R6{choice?} R6 -->|CONTINUE| R2 R6 -->|STOP| R5 R5 --> EXIT end subgraph turn["_turn()"] B3 --> C1[检查 LLM/能力] C1 --> C2[checkpoint + append_message] C2 --> C3[_agent_loop] end subgraph agent_loop["_agent_loop() (步骤级循环)"] C3 --> D1[step_no++] D1 --> D2{超限?} D2 -->|YES| D3[MaxStepsReached] D2 -->|NO| D4[_step] D4 --> D5{有工具?} D5 -->|YES| D1 D5 -->|NO| D6[返回 TurnOutcome] end D6 --> EXIT ``` Ralph Loop 是**外层的任务自动循环**,而 `_agent_loop` 是**内层的步骤执行循环**,两者是嵌套关系。