主要特性
1.2.1 节点即原语
在 AmritaSense 中,一切皆是节点。条件判断、循环体、异常处理器、跳转目标——它们都是普通的 Python 函数或协程,由 @Node() 装饰器包装而成,无需特殊继承。
每个节点都被视为原子执行单元:它要么完全执行,要么完全不执行。工作流解释器通过指针向量(PointerVector)和调用栈管理节点间的跳转与嵌套,而非依赖图结构。所有高级控制流在编译期被展开为线性指令序列,运行时只有整数运算和函数调用。
1.2.2 流式优先
AmritaSense 内建了全双工流控基座 SuspendObjectStream,让流式控制流的编写像普通迭代一样自然:
- 原生挂起/恢复:工作流可在任意节点之间精确挂起,等待外部输入或异步操作完成后恢复执行。这套机制完全基于 Python 的
asyncio.Future,零阻塞开销 - 双向控制通道:支持外部系统通过
push_object主动向工作流注入消息或指令,实现中断调用与上下文注入 - 与 LLM 流式生成天然适配:无论是工具调用循环、嵌套子工作流,还是挂起等待用户输入,都能以最直接的方式表达
1.2.3 原生控制流
AmritaSense 提供了一级公民的控制流指令集,无需依赖外部图引擎或状态机:
- 条件分支:
IF/ELIF/ELSE,无需强制配对ELSE,支持链式组合 - 循环结构:
WHILE(前置条件)和DO...WHILE(后置条件),支持BreakLoop跳出 - 跳转指令:
GOTO配合ALIAS实现无条件跳转,CALL配合ARCHIVED_NODES实现子程序调用与返回 - 异常处理:
TRY...CATCH...THEN...FIN,完整对齐 Python 的异常处理语义,支持异常穿透控制
所有控制流指令在编译期展开为底层节点组合,运行时完全通过指针偏移完成,无需图遍历、字符串路由或状态字典查找。
1.2.4 异步原生
- 全程支持
async/await,与 Python 现代异步生态无缝融合 - 工作流执行器基于
asyncio,所有 I/O 密集型操作均可非阻塞执行 - 挂起/恢复机制完全异步,不会阻塞事件循环
- 同步函数可通过
wrap_to_async自动在线程池中执行,避免阻塞事件循环
1.2.5 声明式依赖注入
- 节点和事件处理器通过函数签名声明所需参数,框架自动从工作流上下文中解析
- 基于关键词优先 + 类型匹配的解析策略,告别位置参数的脆弱性
- 支持
Depends声明自定义依赖工厂,灵活控制对象的创建与作用域 - 依赖清单(
DependencyMeta)是纯数据结构,可缓存、可动态生成
1.2.6 自包含运行时
- 内建事件系统:工作流节点可触发自定义事件,事件处理器与节点共享同一套依赖注入机制。事件系统是发散式的,与工作流中断机制明确分工
- 内建日志系统:基于
loguru的高性能日志器,支持环境变量控制日志级别、自动桥接标准库logging - 零外部强制依赖:核心引擎仅数千行代码,无重型抽象,仅依赖
aiologic和anyio - 编译时展开高级结构:运行时开销几乎为零,可嵌入任何 Python 项目
1.2.7 解释器树与子图隔离
FUN_BLOCK指令 — 将已编译的NodeCompose作为隔离子工作流在子解释器中执行,拥有独立的中间件、I/O 流和生命周期。- 解释器树模型 —
fork_interpreter()创建子解释器形成树结构;parent/top_interpreter/sub_interpreters属性提供完整可见性。 - 并行执行 — 通过
asyncio.gather或wait_all并发运行多个子解释器。 - 生命周期管理 —
terminate()/terminate_all()优雅关闭;is_running/pending_stop状态查询。 - Unsafe 配置标志 —
_unsafe.__flags__提供内部开关(FORCE_NOT_WRAP_TO_ASYNC、DISABLE_EXC_IGNORED等),用于少数极端场景下调整引擎行为。
