Actor 模型
wesgine 的 Actor 是运行时一等标识符,引擎基于 Actor 做记忆隔离、资源调度、认知路由和行为归因。
Tenant + Actor 两层模型
Tenant(Cell) 物理隔离域
└── Actor 运行时行为主体
| 层 | 隔离方式 | 引擎 enforce |
|---|
| Tenant(Cell) | 物理隔离(独立 DB 文件,表内无 cell_id) | ✅ 完全 |
| Actor | 运行时行为过滤 | ✅ 记忆/Session/HITL/Token 归属 |
Actor 是什么
- AppRunRequest 的必填一等字段
- 空 →
ErrActorRequired
- 引擎做记忆隔离、资源调度、认知路由和行为归因的依据
结构资源 vs 运行时行为
| 类别 | 例子 | Actor 维度? |
|---|
| 结构资源 | Agent/Skill/MCP/Knowledge/Cron/Channel | ❌ 归 Cell |
| 运行时行为 | Memory/Session/HITL/Token Usage | ✅ 按 Actor 隔离 |
Actor 边界四面
引擎内 Actor 边界有四个面,每面各自收敛判据:
| 面 | 单点 | 不变量 |
|---|
| Memory | ActorVisible / RequireActor | INV-MEM-38~47 |
| Session | AssertActor | INV-SESS-01~03 |
| Observe | actorClause / RunVisible | INV-OBS-08~10 |
| Cron | jobVisible / ownedJob | INV-CRON-10 |
各产品 Actor 派生
| 产品 | Actor 来源 |
|---|
| wesclaw 桌面 | authSvc.OwnerID() 或 "local" |
| wescode | 固定 "local" |
| wescraft 个人 | 固定 "local" |
| wescraft 团队 | SSO user_id |
| teleclaw | JWT claim userId |
AX-2 身份无关
wesgine 不定义用户身份体系(认证/授权/组织架构归应用层):
- 引擎不知道"张三是法务部的"
- 引擎只知道"这条记忆属于 actor=zhangsan"
- 应用层负责从 JWT/SSO 提取 actor 并传入
委派 Actor 传播
delegate_task 的子 Run 必须继承父 Run 的 Actor:
// tool.go 把 tc.Actor 同时写进
pp.Actor = tc.Actor // 一等字段
pp.Tags["actor"] = tc.Actor // 审计标签
反模式
| 禁止 | 正确做法 |
|---|
| Run 不传 Actor | 必填一等字段,空 → ErrActorRequired |
只传 Tags["actor"] | Actor 一等字段 + Tags 同步 |
| 在引擎层做 Agent 的 per-actor 过滤 | 结构资源归 Cell,应用层过滤 |
| 委派子 Run 不传 actor | 从父 Run 继承 |