在 Pocketflow 框架中添加 Mermaid 与子图层嵌套的可视化功能

作者: Hyacehila创建于 2026年1月8日更新于 2026年1月8日

为了帮助用户了解会发生什么情况,我们需要对图形进行可视化。此外,可视化还可以帮助设计师检测其设计中的弱点。因此,我创建了一个新方法,用于 Flow 类来可视化整个图形。详细说明和细节请参阅下面。如果您只想使用此功能,请下载 mermaid.py,将其放入源代码目录中,并在 Flow 类中添加新方法,如下所示。请参阅我的 仓库

python
class Flow(BaseNode):
    def __init__(self, start=None): super().__init__(); self.start_node = start
    def start(self, start): self.start_node = start; return start
    def get_next_node(self, curr, action):
        nxt = curr.successors.get(action or "default")
        if not nxt and curr.successors: warnings.warn(f"Flow ends: '{action}' not found in {list(curr.successors)}")
        return nxt
    def _orch(self, shared, params=None):
        curr, p, last_action = copy.copy(self.start_node), (params or {**self.params}), None
        while curr: curr.set_params(p); last_action = curr._run(shared); curr = copy.copy(self.get_next_node(curr, last_action))
        return last_action
    def _run(self, shared): p = self.prep(shared); o = self._orch(shared); return self.post(shared, p, o)
    def post(self, shared, prep_res, exec_res): return exec_res
    
    def visualize(self, namespace: dict, *, direction: str = "LR", show_default: bool = False, highlight_starts: bool = True, max_nodes: int = 1000) -> str:
        from .mermaid import visualize as _visualize
        return _visualize(self, namespace, direction=direction, show_default=show_default, highlight_starts=highlight_starts, max_nodes=max_nodes)
    
我们希望在 Mermaid 中使用变量名称,但由于 Python 对象本身并不知道哪个变量名称引用它们;因此, **用户必须明确传入命名空间:namespace=locals()**。**不要为同一个实例赋予多个变量名称。**这将触发警告,并回退到使用类名作为 Mermaid 图的标签。
`visualize` 会跳过节点逻辑执行,并基于连接图结构(成功者 + 起始节点)导出 Mermaid 图。但是, `pocketflow` **类 `Flow` 是动态的**。我们定义流的子图为从起始节点可达的节点和边(仅通过成功者进行搜索)。然而,这不可避免地导致以下情况…

内容来源: The-Pocket/PocketFlow