想象一下,你正坐在深夜的终端前,手指在键盘上飞舞,却突然发现自己不是在写代码,而是在导演一场智能代理的冒险剧。每一个节点都是一段对话,每一条分支都是一次命运的选择。过去,Kimi CLI像一位忠实的助手,只等你一句指令就行动;现在,它学会了阅读“剧本”——一张用流程图绘制的剧本,然后按照剧本一步步演出,直到谢幕。这就是KLIP-10带给我的惊喜:Agent Flow,一种让AI代理拥有“剧情”的全新能力。
我第一次接触这个提案时,心跳加速。它不再是简单的问答,而是像一本互动小说:你决定走向,代理随之起舞。今天,就让我带你一起走进这个故事,细细品味Agent Flow如何从一张流程图,变成终端里活生生的智能旅程。
一切从一个简单的痛点开始。以前的Kimi CLI虽然强大,却像一位只听单句指令的骑士:你说一句,它做一件事;任务复杂了,你就得不停输入,重复解释上下文。开发者们希望代理能“自己看剧本”,一次性理解整个流程,按照节点一步步推进,甚至在关键时刻根据情况选择不同路径。
于是KLIP-10诞生了。它把Agent Skill扩展成两种类型:传统的standard,以及全新的flow。flow类型技能的核心,是一张用Mermaid或D2语言绘制的流程图。图里用BEGIN标记起点,END标记终点,中间的节点是提示词,分支节点则用边的标签标出可能的选择。代理会从BEGIN开始,一站一站走下去,直到END。
为什么用流程图而不是代码? 流程图天生直观。程序员写代码时习惯抽象,但当我们想表达“先做A,再根据结果决定做B还是C”时,画一张图往往比写一堆if-else更清晰。更重要的是,Mermaid和D2都是声明式语言,写在Markdown里就能渲染,门槛极低,却能表达复杂的控制流。
Agent Flow并不追求解析完整的Mermaid或D2语法,那会让实现变得臃肿。它只支持最精简的子集,却已经足够覆盖99%的实际场景。
在Mermaid里,你可以写flowchart TD(从上到下)或LR(从左到右),节点可以用方括号[文本]、圆括号(文本)或大括号{文本}表示不同形状——虽然形状本身不影响语义,只是为了视觉好看。边可以用-->连接,如果需要分支标签,就写-->|是|或-- 是 -->。甚至支持在边上内联定义节点,写起来行云流水。
D2的语法更简洁:节点写成ID: 标签,边用->连接,标签放在最后一段边上。注释用#开头,节点ID支持字母、数字、下划线、点、斜杠、减号,足够灵活。
这些限制并非偷懒,而是深思熟虑。完整的Mermaid支持子图、样式、点击事件,但代理只需要“谁连接谁、标签是什么”这些核心信息。忽略复杂特性,既降低了解析难度,又避免了用户不小心写出代理无法理解的“花哨剧本”。
一个简单的例子会让一切更清楚 想象你要让代理帮你写一封邮件,先草拟内容,再问你要不要正式语气。如果你要,它润色;如果不要,直接发送。流程图可能是: BEGIN → 草拟邮件 → 需要正式语气吗?{是/否} → 润色/直接发送 → END 代理会先执行“草拟邮件”节点,把草稿发给你;然后在分支节点提示你选择“是”或“否”;你回复后,它自动走相应路径。
在代码层面,Agent Flow被抽象成一个优雅的Flow类,包含节点字典、出边列表、起点ID和终点ID。每个节点有id、label(可以是纯文本或富文本内容块)和kind(begin、end、task、decision)。边则记录源、目标和可选标签。
校验规则像一位严厉的导演:
Agent Flow完全复用现有的Agent Skill发现机制。内置技能、用户主目录下的技能、项目目录下的技能,三处都会被扫描。只要SKILL.md里声明了type: flow,并且包含一个mermaid或d2代码块,解析器就会尝试构建Flow对象,挂在Skill.flow属性上。
如果解析失败或没有找到有效流程图,系统不会崩溃,而是悄无声息地降级成普通standard技能,并记录一条日志。这样既保证了向后兼容,又不会因为一张写错的图就让整个技能不可用。
加载完成后,standard技能依然通过/skill:
真正让流程图“活起来”的,是FlowRunner类。它像一位导演,手持剧本(Flow对象),指挥代理(KimiSoul)一步步演出。
每执行一个节点,FlowRunner会:
KimiSoul本身也做了精巧重构:slash commands不再全局注册,而是实例级构建。这样每个对话session都能拥有属于自己的技能命令集合,flow命令自然融入其中。
Ralph模式是Agent Flow的隐藏彩蛋。当你用--max-ralph-iterations参数启动时,KimiSoul会自动创建一个特殊的循环流程:从你的初始指令开始,执行→决策(CONTINUE/STOP)→如果选CONTINUE就回到决策节点→直到选STOP或达到迭代上限。
这个循环完全由FlowRunner.ralph
loop静态方法动态生成,无需用户手写任何流程图。它特别适合“让代理自己不断优化一个方案,直到满意为止”的场景,比如反复润色代码、迭代设计方案。为什么叫Ralph? 可能是致敬某个经典的“反复尝试直到正确”的梗,也可能只是开发者的幽默。无论如何,它让“自动迭代”从实验特性变成了开箱即用的强大功能。
好消息是:你不需要学习任何新命令。只要把流程图写进SKILL.md,声明type: flow,重启Kimi CLI后,就能在对话中直接输入/flow:<技能名>启动演出。整个过程依然在熟悉的shell UI里进行:代理输出节点结果,你输入选择(或普通消息),代理自动推进。
错误处理也非常人性化:语法错会指出具体行号,结构错会说明缺了BEGIN还是分支标签重复,选择失败会自动重试并提醒模型。所有关键事件都会记录到日志,帮助你调试复杂流程。
KLIP-10深知“完美是好的敌人”。它明确声明不支持子图、样式、链接、点击事件等高级特性,也不支持完整的Mermaid/D2语法。这些取舍让实现轻量、可靠,也让用户更专注于核心逻辑而非美化。
BEGIN和END必须用这些词(不区分大小写),分支标签建议短小稳定,避免多行或特殊字符。循环图被允许,但会受maxmoves限制,防止意外的无限循环。
最妙的是,向后兼容做得滴水不漏。老技能不受影响,新flow技能解析失败时自动降级,一切都安静而优雅。
当我第一次用/flow:email-assistant启动一个自己画的流程图,看着代理一步步草拟、询问语气、润色、最终“发送”时,突然意识到:我们不再只是在使用工具,而是在与一个会读剧本的智能伙伴合作。
Agent Flow把静态的提示词变成了动态的旅程,把单向的指令变成了双向的互动。它提醒我们,AI代理的未来不在于更强的模型,而在于更自然的控制方式——就像导演一部电影,而不是一句句台词喂给演员。
下次当你打开终端,不妨试着画一张小小的流程图。或许你会发现,代码的世界,从此多了一份属于剧本的浪漫。
参考文献