pocketflow-agui


Namepocketflow-agui JSON
Version 0.1.0 PyPI version JSON
download
home_pagehttps://github.com/yourusername/pocketflow-agui
SummaryPocketFlow的AGUI扩展版本 - 支持前端事件回调的轻量级工作流编排框架
upload_time2025-08-01 09:50:32
maintainerNone
docs_urlNone
authorAGUI Team
requires_python>=3.8
licenseMIT
keywords workflow orchestration agui frontend events
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # 🚀 PocketFlow-AGUI

PocketFlow的AGUI扩展版本 - 支持前端事件回调的轻量级工作流编排框架

[![PyPI version](https://badge.fury.io/py/pocketflow-agui.svg)](https://badge.fury.io/py/pocketflow-agui)
[![Python Support](https://img.shields.io/pypi/pyversions/pocketflow-agui.svg)](https://pypi.org/project/pocketflow-agui/)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)

## ✨ 特性

- 🔄 **轻量级工作流编排** - 简洁的API设计,易于使用
- 🎯 **AGUI事件支持** - 内置前端事件回调机制
- ⚡ **同步/异步支持** - 支持同步和异步节点执行
- 🔀 **并行处理** - 支持批量和并行节点处理
- 📦 **零依赖** - 核心功能无外部依赖
- 🎨 **类型提示** - 完整的TypeScript风格类型支持

## 📦 安装

```bash
pip install pocketflow-agui
```

## 🚀 快速开始

### 基础用法

```python
from pocketflow import BaseNode, Flow

class HelloNode(BaseNode):
    def run(self, shared):
        print(f"Hello, {shared.get('name', 'World')}!")
        return "success"

# 创建工作流
flow = Flow()
flow.start_node = HelloNode()

# 执行工作流
shared_data = {"name": "PocketFlow"}
result = flow.run(shared_data)
```

### AGUI事件支持

```python
from pocketflow import BaseNode, Flow

class EventNode(BaseNode):
    def run(self, shared):
        # 发送事件到前端
        self.emit_agui_event("progress", {
            "step": "processing",
            "message": "正在处理数据...",
            "progress": 50
        })
        
        # 执行业务逻辑
        result = self.process_data(shared)
        
        # 发送完成事件
        self.emit_agui_event("complete", {
            "result": result,
            "message": "处理完成"
        })
        
        return "success"

# 设置AGUI回调
def agui_callback(event_type, data):
    print(f"前端事件: {event_type}, 数据: {data}")

flow = Flow()
flow.set_agui_callback(agui_callback)
flow.start_node = EventNode()

# 执行工作流
flow.run({"input": "test data"})
```

### 异步工作流

```python
from pocketflow import AsyncNode, AsyncFlow
import asyncio

class AsyncProcessNode(AsyncNode):
    async def run_async(self, shared):
        # 异步处理
        await asyncio.sleep(1)
        
        # 发送AGUI事件
        self.emit_agui_event("async_complete", {
            "message": "异步处理完成"
        })
        
        return "success"

# 创建异步工作流
async def main():
    flow = AsyncFlow()
    flow.start_node = AsyncProcessNode()
    
    result = await flow.run_async({"data": "async test"})
    print(f"结果: {result}")

# 运行
asyncio.run(main())
```

## 🔧 API 文档

### BaseNode

所有节点的基类,支持AGUI事件发送。

**方法:**
- `run(shared)` - 执行节点逻辑
- `set_agui_callback(callback)` - 设置AGUI回调函数
- `emit_agui_event(event_type, data)` - 发送AGUI事件

### Flow

工作流编排器,支持节点链式执行。

**方法:**
- `set_agui_callback(callback)` - 设置AGUI回调函数
- `run(shared)` - 执行工作流

### AsyncFlow

异步工作流编排器。

**方法:**
- `run_async(shared)` - 异步执行工作流

## 🙏 致谢

本项目基于 [PocketFlow](https://github.com/original-repo) 进行扩展开发,感谢原作者的贡献。

### 主要扩展功能:
- 添加了AGUI事件回调机制
- 支持前端实时状态更新
- 增强了类型提示支持

## 📄 许可证

MIT License

## 🤝 贡献

欢迎提交 Issue 和 Pull Request!

## 📞 联系

如有问题,请通过 GitHub Issues 联系我们。

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/yourusername/pocketflow-agui",
    "name": "pocketflow-agui",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.8",
    "maintainer_email": null,
    "keywords": "workflow, orchestration, agui, frontend, events",
    "author": "AGUI Team",
    "author_email": "AGUI Team <agui@example.com>",
    "download_url": "https://files.pythonhosted.org/packages/f6/6e/b9d7864e5cdfbbd46f4ad450148230c597be9d2f21b1b21d24530580d6bb/pocketflow_agui-0.1.0.tar.gz",
    "platform": null,
    "description": "# \ud83d\ude80 PocketFlow-AGUI\n\nPocketFlow\u7684AGUI\u6269\u5c55\u7248\u672c - \u652f\u6301\u524d\u7aef\u4e8b\u4ef6\u56de\u8c03\u7684\u8f7b\u91cf\u7ea7\u5de5\u4f5c\u6d41\u7f16\u6392\u6846\u67b6\n\n[![PyPI version](https://badge.fury.io/py/pocketflow-agui.svg)](https://badge.fury.io/py/pocketflow-agui)\n[![Python Support](https://img.shields.io/pypi/pyversions/pocketflow-agui.svg)](https://pypi.org/project/pocketflow-agui/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n## \u2728 \u7279\u6027\n\n- \ud83d\udd04 **\u8f7b\u91cf\u7ea7\u5de5\u4f5c\u6d41\u7f16\u6392** - \u7b80\u6d01\u7684API\u8bbe\u8ba1\uff0c\u6613\u4e8e\u4f7f\u7528\n- \ud83c\udfaf **AGUI\u4e8b\u4ef6\u652f\u6301** - \u5185\u7f6e\u524d\u7aef\u4e8b\u4ef6\u56de\u8c03\u673a\u5236\n- \u26a1 **\u540c\u6b65/\u5f02\u6b65\u652f\u6301** - \u652f\u6301\u540c\u6b65\u548c\u5f02\u6b65\u8282\u70b9\u6267\u884c\n- \ud83d\udd00 **\u5e76\u884c\u5904\u7406** - \u652f\u6301\u6279\u91cf\u548c\u5e76\u884c\u8282\u70b9\u5904\u7406\n- \ud83d\udce6 **\u96f6\u4f9d\u8d56** - \u6838\u5fc3\u529f\u80fd\u65e0\u5916\u90e8\u4f9d\u8d56\n- \ud83c\udfa8 **\u7c7b\u578b\u63d0\u793a** - \u5b8c\u6574\u7684TypeScript\u98ce\u683c\u7c7b\u578b\u652f\u6301\n\n## \ud83d\udce6 \u5b89\u88c5\n\n```bash\npip install pocketflow-agui\n```\n\n## \ud83d\ude80 \u5feb\u901f\u5f00\u59cb\n\n### \u57fa\u7840\u7528\u6cd5\n\n```python\nfrom pocketflow import BaseNode, Flow\n\nclass HelloNode(BaseNode):\n    def run(self, shared):\n        print(f\"Hello, {shared.get('name', 'World')}!\")\n        return \"success\"\n\n# \u521b\u5efa\u5de5\u4f5c\u6d41\nflow = Flow()\nflow.start_node = HelloNode()\n\n# \u6267\u884c\u5de5\u4f5c\u6d41\nshared_data = {\"name\": \"PocketFlow\"}\nresult = flow.run(shared_data)\n```\n\n### AGUI\u4e8b\u4ef6\u652f\u6301\n\n```python\nfrom pocketflow import BaseNode, Flow\n\nclass EventNode(BaseNode):\n    def run(self, shared):\n        # \u53d1\u9001\u4e8b\u4ef6\u5230\u524d\u7aef\n        self.emit_agui_event(\"progress\", {\n            \"step\": \"processing\",\n            \"message\": \"\u6b63\u5728\u5904\u7406\u6570\u636e...\",\n            \"progress\": 50\n        })\n        \n        # \u6267\u884c\u4e1a\u52a1\u903b\u8f91\n        result = self.process_data(shared)\n        \n        # \u53d1\u9001\u5b8c\u6210\u4e8b\u4ef6\n        self.emit_agui_event(\"complete\", {\n            \"result\": result,\n            \"message\": \"\u5904\u7406\u5b8c\u6210\"\n        })\n        \n        return \"success\"\n\n# \u8bbe\u7f6eAGUI\u56de\u8c03\ndef agui_callback(event_type, data):\n    print(f\"\u524d\u7aef\u4e8b\u4ef6: {event_type}, \u6570\u636e: {data}\")\n\nflow = Flow()\nflow.set_agui_callback(agui_callback)\nflow.start_node = EventNode()\n\n# \u6267\u884c\u5de5\u4f5c\u6d41\nflow.run({\"input\": \"test data\"})\n```\n\n### \u5f02\u6b65\u5de5\u4f5c\u6d41\n\n```python\nfrom pocketflow import AsyncNode, AsyncFlow\nimport asyncio\n\nclass AsyncProcessNode(AsyncNode):\n    async def run_async(self, shared):\n        # \u5f02\u6b65\u5904\u7406\n        await asyncio.sleep(1)\n        \n        # \u53d1\u9001AGUI\u4e8b\u4ef6\n        self.emit_agui_event(\"async_complete\", {\n            \"message\": \"\u5f02\u6b65\u5904\u7406\u5b8c\u6210\"\n        })\n        \n        return \"success\"\n\n# \u521b\u5efa\u5f02\u6b65\u5de5\u4f5c\u6d41\nasync def main():\n    flow = AsyncFlow()\n    flow.start_node = AsyncProcessNode()\n    \n    result = await flow.run_async({\"data\": \"async test\"})\n    print(f\"\u7ed3\u679c: {result}\")\n\n# \u8fd0\u884c\nasyncio.run(main())\n```\n\n## \ud83d\udd27 API \u6587\u6863\n\n### BaseNode\n\n\u6240\u6709\u8282\u70b9\u7684\u57fa\u7c7b\uff0c\u652f\u6301AGUI\u4e8b\u4ef6\u53d1\u9001\u3002\n\n**\u65b9\u6cd5:**\n- `run(shared)` - \u6267\u884c\u8282\u70b9\u903b\u8f91\n- `set_agui_callback(callback)` - \u8bbe\u7f6eAGUI\u56de\u8c03\u51fd\u6570\n- `emit_agui_event(event_type, data)` - \u53d1\u9001AGUI\u4e8b\u4ef6\n\n### Flow\n\n\u5de5\u4f5c\u6d41\u7f16\u6392\u5668\uff0c\u652f\u6301\u8282\u70b9\u94fe\u5f0f\u6267\u884c\u3002\n\n**\u65b9\u6cd5:**\n- `set_agui_callback(callback)` - \u8bbe\u7f6eAGUI\u56de\u8c03\u51fd\u6570\n- `run(shared)` - \u6267\u884c\u5de5\u4f5c\u6d41\n\n### AsyncFlow\n\n\u5f02\u6b65\u5de5\u4f5c\u6d41\u7f16\u6392\u5668\u3002\n\n**\u65b9\u6cd5:**\n- `run_async(shared)` - \u5f02\u6b65\u6267\u884c\u5de5\u4f5c\u6d41\n\n## \ud83d\ude4f \u81f4\u8c22\n\n\u672c\u9879\u76ee\u57fa\u4e8e [PocketFlow](https://github.com/original-repo) \u8fdb\u884c\u6269\u5c55\u5f00\u53d1\uff0c\u611f\u8c22\u539f\u4f5c\u8005\u7684\u8d21\u732e\u3002\n\n### \u4e3b\u8981\u6269\u5c55\u529f\u80fd\uff1a\n- \u6dfb\u52a0\u4e86AGUI\u4e8b\u4ef6\u56de\u8c03\u673a\u5236\n- \u652f\u6301\u524d\u7aef\u5b9e\u65f6\u72b6\u6001\u66f4\u65b0\n- \u589e\u5f3a\u4e86\u7c7b\u578b\u63d0\u793a\u652f\u6301\n\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\n\nMIT License\n\n## \ud83e\udd1d \u8d21\u732e\n\n\u6b22\u8fce\u63d0\u4ea4 Issue \u548c Pull Request\uff01\n\n## \ud83d\udcde \u8054\u7cfb\n\n\u5982\u6709\u95ee\u9898\uff0c\u8bf7\u901a\u8fc7 GitHub Issues \u8054\u7cfb\u6211\u4eec\u3002\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "PocketFlow\u7684AGUI\u6269\u5c55\u7248\u672c - \u652f\u6301\u524d\u7aef\u4e8b\u4ef6\u56de\u8c03\u7684\u8f7b\u91cf\u7ea7\u5de5\u4f5c\u6d41\u7f16\u6392\u6846\u67b6",
    "version": "0.1.0",
    "project_urls": {
        "Documentation": "https://github.com/yourusername/pocketflow-agui/blob/main/README.md",
        "Homepage": "https://github.com/yourusername/pocketflow-agui",
        "Issues": "https://github.com/yourusername/pocketflow-agui/issues",
        "Repository": "https://github.com/yourusername/pocketflow-agui"
    },
    "split_keywords": [
        "workflow",
        " orchestration",
        " agui",
        " frontend",
        " events"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "00e6f72022072cb6e1fa8257e13c7c1d6eca7d9153747cf3fe80011c2f316212",
                "md5": "a92f3dd30e05d70463aba3c4a830245d",
                "sha256": "899d1525f24b9a6372191836a1b6c67f39a6637b722d49e60caaa974c1831038"
            },
            "downloads": -1,
            "filename": "pocketflow_agui-0.1.0-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "a92f3dd30e05d70463aba3c4a830245d",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.8",
            "size": 5776,
            "upload_time": "2025-08-01T09:50:30",
            "upload_time_iso_8601": "2025-08-01T09:50:30.995775Z",
            "url": "https://files.pythonhosted.org/packages/00/e6/f72022072cb6e1fa8257e13c7c1d6eca7d9153747cf3fe80011c2f316212/pocketflow_agui-0.1.0-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "f66eb9d7864e5cdfbbd46f4ad450148230c597be9d2f21b1b21d24530580d6bb",
                "md5": "98e7fbc4eb1d0576cef4ccf2c08532ff",
                "sha256": "2b7f973cb87afe52a196adc3634af34a5885a81c46b25f78cb27630343d3da8b"
            },
            "downloads": -1,
            "filename": "pocketflow_agui-0.1.0.tar.gz",
            "has_sig": false,
            "md5_digest": "98e7fbc4eb1d0576cef4ccf2c08532ff",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.8",
            "size": 7584,
            "upload_time": "2025-08-01T09:50:32",
            "upload_time_iso_8601": "2025-08-01T09:50:32.301992Z",
            "url": "https://files.pythonhosted.org/packages/f6/6e/b9d7864e5cdfbbd46f4ad450148230c597be9d2f21b1b21d24530580d6bb/pocketflow_agui-0.1.0.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-01 09:50:32",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "yourusername",
    "github_project": "pocketflow-agui",
    "github_not_found": true,
    "lcname": "pocketflow-agui"
}
        
Elapsed time: 1.60990s