对话运行时 —— 把 API、工具、权限、Session 全部组合在一起。 这就是 Claude Code 的核心引擎。 对应源码: conversation.rs:100-168 在 Rust 源码里它是泛型的:ConversationRuntime C = ApiClient 类型, T = ToolExecutor 类型 Python 里我们直接用 Protocol,效果一样。
| 230 | |
| 231 | |
| 232 | class ConversationRuntime: |
| 233 | """ |
| 234 | 对话运行时 —— 把 API、工具、权限、Session 全部组合在一起。 |
| 235 | |
| 236 | 这就是 Claude Code 的核心引擎。 |
| 237 | 对应源码: conversation.rs:100-168 |
| 238 | |
| 239 | 在 Rust 源码里它是泛型的:ConversationRuntime<C, T> |
| 240 | C = ApiClient 类型, T = ToolExecutor 类型 |
| 241 | Python 里我们直接用 Protocol,效果一样。 |
| 242 | """ |
| 243 | |
| 244 | def __init__( |
| 245 | self, |
| 246 | session: Session, |
| 247 | api_client: ApiClient, |
| 248 | tool_executor: ToolExecutor, |
| 249 | permission_policy: PermissionPolicy, |
| 250 | system_prompt: list[str], |
| 251 | max_iterations: int = 10, |
| 252 | ): |
| 253 | self.session = session |
| 254 | self.api_client = api_client |
| 255 | self.tool_executor = tool_executor |
| 256 | self.permission_policy = permission_policy |
| 257 | self.system_prompt = system_prompt |
| 258 | self.max_iterations = max_iterations |
| 259 | self.usage_tracker = UsageTracker() |
| 260 | |
| 261 | def run_turn( |
| 262 | self, |
| 263 | user_input: str, |
| 264 | prompter: Optional[PermissionPrompter] = None, |
| 265 | ) -> TurnSummary: |
| 266 | """ |
| 267 | 执行一个完整的对话轮次。 |
| 268 | |
| 269 | 这就是 Tutorial 01 里的 run_turn,但现在是完整版! |
| 270 | |
| 271 | 对应源码: conversation.rs:170-283 |
| 272 | """ |
| 273 | # 步骤 1: 添加用户消息 |
| 274 | self.session.messages.append(ConversationMessage.user_text(user_input)) |
| 275 | |
| 276 | assistant_messages: list[ConversationMessage] = [] |
| 277 | tool_results: list[ConversationMessage] = [] |
| 278 | iterations = 0 |
| 279 | |
| 280 | # 步骤 2: Agentic Loop |
| 281 | while True: |
| 282 | iterations += 1 |
| 283 | if iterations > self.max_iterations: |
| 284 | raise RuntimeError("exceeded maximum iterations") |
| 285 | |
| 286 | # 步骤 2a: 调用 API |
| 287 | request = ApiRequest( |
| 288 | system_prompt=self.system_prompt, |
| 289 | messages=self.session.messages, |