PocketFlow 交互式文本转换器实战用 Flow 构建带循环与分支的 CLI 应用【免费下载链接】PocketFlowPocket Flow: 100-line LLM framework. Let Agents build Agents!项目地址: https://gitcode.com/gh_mirrors/poc/PocketFlow导读cookbook/pocketflow-flow是 PocketFlow 官方 Cookbook 中用于演示Flow 循环与分支的最小可运行示例一个交互式命令行文本转换器支持大小写转换、文本反转、多余空格清理并可在一次运行中连续处理多段文本。读完本文你将掌握 PocketFlow 的 Action 驱动转移语法与- action 、如何在 Flow 中构造输入 → 转换 → 再输入的循环回路以及如何用共享存储shared store在节点间传递状态——这些正是后续构建 Agent、RAG、工作流等复杂模式的地基。一、项目概览一个基于 Flow 的交互式文本转换工具本项目是一个构建在 PocketFlow 之上的交互式文本处理工具核心演示能力如下对应 README 的 Features 清单将文本转换为UPPERCASE全大写将文本转换为lowercase全小写反转文本移除多余空格交互式命令行界面CLI支持连续处理多段文本的持续循环Continuous flow整个项目只有三个文件main.py入口、flow.py节点与 Flow 定义、requirements.txt依赖清单是典型的最小 LLM 应用骨架main / flow / nodes 分离的入门版。它不依赖任何 LLM API因此无需密钥即可运行是学习 PocketFlow Flow 抽象的最佳起点。二、快速上手安装与运行按 README 的 Getting Started 步骤两步即可跑起来第 1 步安装依赖pip install -r requirements.txtrequirements.txt 的内容只有一个依赖pocketflow0.1.0即仅需安装 PocketFlow 核心库约 100 行的精简框架无任何第三方运行依赖也可以直接复制 pocketflow/init.py 源码到项目中使用。第 2 步运行应用python main.py程序启动后即可按提示交互先输入一段文本再选择转换类型之后可选择是否继续处理下一段文本。三、架构解析交互式循环与分支路径README 用一张 mermaid 图清晰地描述了整个工作流的拓扑结构这张图揭示了本示例的三大设计要点TextInput 节点收集用户输入文本并处理菜单选择。TextTransform 节点根据用户选择对文本执行对应的转换操作。循环回路TextTransform通过input动作回到TextInput实现连续处理多段文本同时两条exit动作都指向End保证流程可以随时终止。也就是说这个看似简单的应用实际上同时运用了 Flow 的顺序、分支branching、循环looping三种拓扑是 Flow 核心抽象文档 中使用 Action 构造 loops、branching、multi-step flows的活教材。四、源码逐层解析4.1 入口 main.py共享存储与流程启动main.py 只有十几行承担三件事from flow import flow def main(): print(\nWelcome to Text Converter!) print() # Initialize shared store shared {} # Run the flow flow.run(shared) print(\nThank you for using Text Converter!) if __name__ __main__: main()关键点在于shared {}初始化一个空字典作为共享存储shared store。PocketFlow 中所有节点通过这个字典通信它是节点间的数据契约详见 通信机制文档。本示例中shared会动态承载text和choice两个键。flow.run(shared)调用 Flow 的run方法启动整个编排。根据 flow.md 的说明flow.run(shared)会从 start 节点开始依据每个节点post()返回的 Action 字符串不断跳到下一个节点直到无法继续为止。4.2 节点定义 flow.py一TextInput 节点flow.py 中TextInput节点演示了 PocketFlow Node 的标准三步结构prep - exec - post见 Node 文档class TextInput(Node): def prep(self, shared): Get text input from user. if text not in shared: text input(\nEnter text to convert: ) shared[text] text return shared[text] def post(self, shared, prep_res, exec_res): print(\nChoose transformation:) print(1. Convert to UPPERCASE) print(2. Convert to lowercase) print(3. Reverse text) print(4. Remove extra spaces) print(5. Exit) choice input(\nYour choice (1-5): ) if choice 5: return exit shared[choice] choice return transform解读prep(shared)如果shared中还没有text键就通过input()读取用户输入并写入共享存储否则直接复用已有文本。这正是循环回来后不再重复询问文本的关键——因为第一次循环时TextTransform的post()会shared.pop(text, None)清掉旧文本所以下一次循环又会重新询问详见 4.3。post()返回 Action 字符串选择5时返回exit流程结束否则把选择写入shared[choice]并返回transform进入转换节点。根据 flow.mdpost()返回的字符串就是驱动流程转移的 Action若返回None则等价于default。注意TextInput没有重写exec()因为本节点只做交互输入不需要计算逻辑——这印证了 Node 文档 中所有步骤都是可选的可以只实现prep和post的设计。4.3 节点定义 flow.py二TextTransform 节点TextTransformflow.py完整实现了三步结构其中转换逻辑放在exec()中class TextTransform(Node): def prep(self, shared): return shared[text], shared[choice] def exec(self, inputs): text, choice inputs if choice 1: return text.upper() elif choice 2: return text.lower() elif choice 3: return text[::-1] elif choice 4: return .join(text.split()) else: return Invalid option! def post(self, shared, prep_res, exec_res): print(\nResult:, exec_res) if input(\nConvert another text? (y/n): ).lower() y: shared.pop(text, None) # Remove previous text return input return exit值得注意的实现细节职责分离prep()只负责从shared读取数据exec()只做纯计算大小写、反转、去空格post()负责输出结果、改写shared并决定下一步 Action。这正是 PocketFlow 强制prep/exec/post三阶段分离的初衷——数据存取与计算互不干扰。四种转换的实现方式text.upper()转大写、text.lower()转小写、text[::-1]反转字符串、 .join(text.split())把连续空白折叠为单个空格同时去除首尾空白。循环控制post()询问用户是否继续回答y时通过shared.pop(text, None)删除旧文本并返回input跳回TextInput从而开启新一轮输入否则返回exit终止流程。容错兜底当选择既非 1–4 时例如输入0exec()返回Invalid option!作为结果展示不会让程序崩溃。4.4 连接与 Flow 构建Action 驱动的转移语法flow.py 的最后部分定义终止节点并完成拓扑连接class EndNode(Node): pass # Create nodes text_input TextInput() text_transform TextTransform() end_node EndNode() # Connect nodes text_input - transform text_transform text_transform - input text_input text_transform - exit end_node # Create flow flow Flow(starttext_input)这里用到了 PocketFlow 的Action 转移语法详见 flow.md语法含义node_a node_b当node_a.post()返回default或None时转移到node_b等价于node_a - default node_bnode_a - action_name node_b当node_a.post()返回action_name时转移到node_b对照本示例text_input - transform text_transform输入节点返回transform时进入转换节点text_transform - input text_input转换节点返回input时回环到输入节点形成循环text_transform - exit end_node与text_input - exit end_node两条exit路径都终止于EndNode。从底层实现看pocketflow/init.py-运算符会返回一个_ConditionalTransition中间对象再通过触发src.next(tgt, action)把转移关系注册到源节点的successors字典中get_next_nodepocketflow/init.py在执行时根据 Action 查表跳转找不到对应转移时会发出警告并终止 Flow。Flow(starttext_input)则指定text_input为入口节点。Flow 的执行器_orchpocketflow/init.py会循环执行运行当前节点 → 取其post()返回的 Action → 查表得到下一节点 → 继续直到没有后继节点为止。这也解释了为什么退出必须显式连到EndNode——没有后继节点时 Flow 自然结束。五、完整运行示例README 给出了完整的交互输出示例运行python main.py后效果如下Welcome to Text Converter! Enter text to convert: Pocket Flow is a 100-line LLM framework Choose transformation: 1. Convert to UPPERCASE 2. Convert to lowercase 3. Reverse text 4. Remove extra spaces 5. Exit Your choice (1-5): 1 Result: POCKET FLOW IS A 100-LINE LLM FRAMEWORK Convert another text? (y/n): n Thank you for using Text Converter!从输出可以完整回溯一次执行的调用链main.py打印欢迎语并初始化shared {}flow.run(shared)启动TextInput.prep()首次运行时读取输入文本存入shared[text]TextInput.post()打印菜单、读取选择1写入shared[choice]返回transformFlow 沿transform边转移到TextTransformprep()取出(text, choice)exec()执行text.upper()post()打印Result: POCKET FLOW IS A 100-LINE LLM FRAMEWORK用户回答npost()返回exitFlow 转移到EndNode后终止main.py打印结束语。六、源码级佐证测试用例中的循环与分支本项目虽未自带测试文件但仓库的 tests/test_flow_basic.py 恰好覆盖了与本示例相同的两类核心机制可作为理解依据分支测试test_branching_positive/test_branching_negativeCheckPositiveNode.post()根据共享存储中的值返回positive或negative分别转移到不同的后继节点——与本示例中TextInput.post()返回transform或exit的分支模式完全一致。循环测试test_cycle_until_negative_ends_with_signalcheck - positive subtract3与subtract3 check构造循环直到条件满足后沿negative分支进入终止节点——与本示例text_transform - input text_input的回环结构异曲同工。边界警告test_flow_ends_warning_*当post()返回的 Action 在successors中找不到时Flow 会发出UserWarning如Flow ends: specific_action not found in [default]并结束流程。这提醒我们返回的每个 Action 字符串都必须与已注册的转移边严格一致否则流程会意外提前终止。七、扩展思路从文本转换到 LLM 应用TextTransform.exec()目前是纯字符串操作但它的位置正是 PocketFlow 设计中调用 LLM 或外部 API的典型插槽见 Node 文档 对exec()的定位LLM 调用、远程 API、工具使用。你可以沿着prep/exec/post的既有骨架做如下升级而不必改动任何 Flow 连接代码把 exec 换成 LLM 调用如SummarizeFile节点那样node.md在exec()中调用call_llm(prompt)并配合max_retries、wait参数与exec_fallback()实现自动重试与优雅降级引入嵌套 Flow把文本处理整体封装为子 Flow再作为节点接入更大的流水线flow.md 的 Nested Flows 一节提供了订单处理管线的完整示例给节点加参数利用set_params()与 Flow 的参数合并机制为不同分支注入不同的提示词或处理策略。由于flow Flow(starttext_input)已将入口与拓扑封装完毕这些改造都只需在节点类内部进行充分体现了设计 Flow、实现 Node的 Agentic Coding 开发范式参考 guide.md。八、项目文件清单按 README 的 Files 一节本项目共三个文件文件作用main.py程序入口初始化共享存储、启动 Flowflow.py定义TextInput、TextTransform、EndNode三个节点及 Flow 拓扑requirements.txt依赖清单pocketflow0.1.0小结pocketflow-flow示例以不到 70 行代码完整演示了 PocketFlow Flow 抽象的三项核心能力顺序执行输入 → 转换、Action 分支transform/exit、循环回环input回到输入节点并通过共享存储shared完成节点间数据传递。掌握这套机制后再叠加 Node 的容错重试、嵌套 Flow 与各种设计模式Agent、Workflow、RAG 等即可用 PocketFlow 构建任意复杂的 LLM 应用。【免费下载链接】PocketFlowPocket Flow: 100-line LLM framework. Let Agents build Agents!项目地址: https://gitcode.com/gh_mirrors/poc/PocketFlow创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考 SEO 优化官网定制响应式建站教育培训建站