每轮是带检查点的多步状态机,不是单次聊天请求
run 先刷新 OAuth、建立 approval source、运行 UserPromptSubmit hook,再进入 _turn;_turn 先 checkpoint、持久化 user message,然后 _agent_loop 逐 step 做压缩、checkpoint、LLM+工具执行,直到无工具调用、拒绝或重复调用强停。
一次用户输入可能触发多次“模型思考—调工具—看结果—再思考”,每一步前都留存档点。
长任务可恢复、可插话,也需要严格的步数上限和副作用治理。
659 async def run(
660 self,
661 user_input: str | list[ContentPart],
662 *,
663 skip_user_prompt_hook: bool = False,
664 ):
665 approval_source_token = None
666 created_approval_source: ApprovalSource | None = None
667 turn_started = False
668 turn_finished = False
669 interrupt_reason: str | None = None
670 turn_t0 = time.monotonic()
671 self._set_trace_id(None)
672 if get_current_approval_source_or_none() is None:
673 created_approval_source = ApprovalSource(kind="foreground_turn", id=uuid.uuid4().hex)
674 approval_source_token = set_current_approval_source(created_approval_source)
675 try:
676 # Refresh OAuth tokens on each turn to avoid idle-time expirations.
677 await self._runtime.oauth.ensure_fresh(self._runtime)
678
679 # Set session_id ContextVar for toolset hooks
680 from kimi_cli.soul.toolset import set_session_id
681
682 set_session_id(self._runtime.session.id)
… 50 lines omitted; exact range 659–742 …
733 await ret
734 elif self._loop_control.max_ralph_iterations != 0:
735 runner = FlowRunner.ralph_loop(
736 user_message,
737 self._loop_control.max_ralph_iterations,
738 )
739 await runner.run(self, "")
740 else:
741 await self._turn(user_message)
742
查看全部 3 处证据
-
实现
src/kimi_cli/soul/kimisoul.py:659–742turn 初始化、hook、slash/flow/普通 turn 路由。 -
实现
src/kimi_cli/soul/kimisoul.py:841–852checkpoint、user message 落盘、进入 agent loop。 -
实现
src/kimi_cli/soul/kimisoul.py:998–1041step guard、auto compaction、checkpoint 和 step execution。