跳转至

03. 入口如何汇入核心

Claude Code 有多种入口形态:交互式终端界面、一次性执行、SDK 调用、服务端桥接、内部智能体或分叉技能。它们表面上差别很大,但进入核心运行时之前都要完成同一组准备工作:解析配置、确定工作目录、加载设置、建立应用状态、收集工具和斜杠命令、连接 MCP、构造权限上下文,并提供工具可用性回调。

入口层不直接实现智能体循环。它的职责更像装配器:把外部请求转换成查询引擎能理解的配置。交互式入口会提供界面回调,用于展示流式文本、工具进度、权限弹窗和通知;非交互式入口会提供更严格的策略,例如禁止询问模式下遇到需要确认的工具就直接拒绝。SDK 入口还要把最终用量、权限拒绝、结构化输出和停止原因返回给调用方。

flowchart TB CLI[命令行 / 终端界面] --> Config[配置解析] SDK[SDK / 一次性执行] --> Config Server[服务端 / 桥接层] --> Config Config --> State[应用状态] Config --> Tools[工具池] Config --> Commands[斜杠命令 / 技能] Config --> MCP[MCP 客户端状态] Config --> Permission[permission context] State --> Engine[查询引擎] Tools --> Engine Commands --> Engine MCP --> Engine Permission --> Engine

入口层还会决定“这次输入是本地命令还是模型任务”。斜杠命令、技能命令、模式切换、配置修改等可能只在本地处理。比如某个命令只是更新允许工具,或者把一个技能的提示词展开成用户消息,这些动作不一定需要模型采样。查询引擎接到输入后会先运行输入处理流程,得到新的消息、允许工具、是否继续查询,以及可能的本地状态更新。

这种结构让不同入口保持一致。终端界面中用户敲下一句话,SDK 中调用方传入一个提示词,内部子智能体中父智能体派发一个任务,最终都会变成同样的查询引擎配置和消息流。差异留在边缘:是否有权限界面、是否允许交互、是否展示 JSX、是否记录某些进度、是否启用自定义系统提示。核心循环不需要为每种入口重写一套流程。

入口层还有一个容易被忽略的职责:把可恢复信息尽早交给存储层。查询引擎会在进入模型请求前记录用户消息,入口则负责提供会话 id、对话 id、转录记录位置和恢复所需的上下文。这样用户可以从终端界面切到别的入口继续会话,也可以在进程中断后恢复主线。

入口失败通常表现为配置无法标准化、权限模式冲突、MCP 连接失败或非交互入口无法处理审批。此时请求不会伪装成模型失败,而是在进入核心循环前返回本地错误。进入核心以后,后续模型采样和工具执行就按统一流程推进。