No results
1
DSLR参考
shaotao edited this page 2026-06-12 09:09:29 +08:00
DSL 参考
底层状态机 DSL 完整语法
基础结构
{
"name": "状态机名称",
"initial": "初始状态名",
"event_sources": ["message_queue"],
"states": { ... }
}
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
name |
string | ✅ | 状态机名称 |
initial |
string | ✅ | 初始状态 |
event_sources |
string[] | ❌ | 事件源列表,默认 ["message_queue"] |
states |
object | ✅ | 状态定义字典 |
状态定义
| 字段 | 类型 | 说明 |
|---|---|---|
transitions |
array | 转换规则列表 |
on_enter |
string | 进入此状态时执行的动作名 |
on_exit |
string | 离开此状态时执行的动作名 |
compound |
bool | 是否复合状态 |
states |
object | 子状态定义(compound: true 时需要) |
concurrent_tasks |
array | 并发后台任务 |
Transition
{
"event": "EVENT_NAME",
"target": "目标状态",
"action": "动作名",
"guard": "守卫函数名",
"timeout": 5.0,
"on_timeout": "动作名"
}
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
event |
string | ✅ | 触发事件 |
target |
string | ✅ | 目标状态 |
action |
string | ❌ | 转换时执行的动作 |
guard |
string | ❌ | 守卫函数,返回 True 才允许转换 |
timeout |
float | ❌ | 超时秒数 |
on_timeout |
string | ❌ | 超时回调动作 |
守卫
async def only_if_ready(ctx):
return ctx.get("is_ready", False)
{"event": "NEXT", "target": "working", "guard": "only_if_ready"}
并发任务
进入状态时自动启动,离开时自动取消:
{
"concurrent_tasks": [
{"task": "heartbeat", "interval": 5.0}
]
}
async def heartbeat(ctx):
logger.info(f"[{ctx['agent_id']}] 心跳...")
事件冒泡
复合状态中子状态未匹配的事件自动冒泡到父状态。
Parent (compound: true) ← 冒泡
├── Child_A
├── Child_B
└── transitions: [PARENT_EVENT]
完整 DSL 示例
{
"name": "Negotiator",
"initial": "idle",
"states": {
"idle": {
"transitions": [
{"event": "START", "target": "negotiating", "action": "start_nego"}
]
},
"negotiating": {
"on_enter": "decide",
"concurrent_tasks": [
{"task": "heartbeat", "interval": 5.0}
],
"transitions": [
{"event": "PROPOSE", "target": "negotiating", "action": "decide"},
{"event": "ACCEPT", "target": "completed", "action": "on_accept"},
{"event": "REJECT", "target": "failed", "action": "on_reject"},
{"event": "TIMEOUT", "target": "failed", "timeout": 30.0}
]
},
"completed": {"on_enter": "log_end"},
"failed": {"on_enter": "log_end"}
}
}