approval
feishu.agent.approval
¶
人在环(human-in-the-loop)审批引擎:把「确认即执行」升级为「校验—认领—执行—记账」。
feishu.agent.approval.ApprovalEngine 是 feishu.agent.loop.Agent 审批环节的可插拔策略对象。
默认实现 feishu.agent.approval.DefaultApprovalEngine 在执行被审批工具前依次完成:负载防篡改校验、
幂等重放(同一请求重复确认只执行一次)、并发认领(防止重复执行)、执行后记账与审计,并在执行结果未知时
冻结审批而非放任重试。所有面向用户的措辞均通过 outcome_status 注入,SDK 仅保留中性英文兜底,不内置任何
产品文案。
与 feishu.agent.loop.Agent 的对接(集成步骤,非本模块职责):
_request_approval改为构造带payload_sha256/idempotency_key/ 归属信息的 feishu.agent.session.PendingApproval,调用await approval_engine.on_request(approval),并由可注入的 卡片构造器渲染携带payload_sha256的确认卡片;handle_card_action从回传值读取payload_sha256,调用await approval_engine.on_decision(approval_id, decision, expected_payload_sha256=..., dispatch=...), 依据返回的 feishu.agent.approval.ApprovalOutcome 决定回传给模型的工具结果与更新后的卡片。
ApprovalStatus
¶
一次审批决策的归一化结果,驱动回传给模型的工具结果与卡片更新。
由于继承自 str,枚举成员可直接与字符串字面量比较。面向用户的具体措辞由
feishu.agent.approval.DefaultApprovalEngine 的 outcome_status 注入,本枚举仅作稳定的机器可读标识。
示例:
源代码位于: feishu/agent/approval.py
ApprovalOutcome
dataclass
¶
审批决策的结构化结果,告知 feishu.agent.loop.Agent 如何回传模型与更新卡片。
content 是回传给模型的工具结果:EXECUTED/REPLAYED 时为真实执行结果,其余情形为一段状态说明文本。
is_error 为 True 时模型据此调整后续行为;status 供产品侧映射卡片样式与展示措辞。
示例:
| Python Console Session | |
|---|---|
源代码位于: feishu/agent/approval.py
ExecutionResultStore
¶
Bases: Protocol
幂等执行结果缓存协议:按负载摘要键存取一次成功执行的结果,供重复确认时重放。
用于实现「已执行的写操作被再次确认时,返回先前结果而非二次提交」。纯机制,不含任何产品语义。
源代码位于: feishu/agent/approval.py
AuditLog
¶
Bases: Protocol
仅追加(append-only)审计日志协议:记录审批生命周期事件,供排障与合规复盘。
事件类型字符串由调用方给出(如 write_request/confirm/execute/cancel),存储仅负责落盘。
源代码位于: feishu/agent/approval.py
ApprovalEngine
¶
Bases: Protocol
审批引擎协议,是 feishu.agent.loop.Agent 人在环环节的可插拔策略契约。
on_request 在工具要求审批时被调用以持久化并准备审批;on_decision 在用户于卡片上做出决策后被调用,
完成校验、执行与记账并返回 feishu.agent.approval.ApprovalOutcome。内置实现为
feishu.agent.approval.DefaultApprovalEngine。该协议标注了 runtime_checkable。
示例:
| Python Console Session | |
|---|---|
源代码位于: feishu/agent/approval.py
on_request
async
¶
on_request(approval: PendingApproval) -> None
on_decision
async
¶
on_decision(approval_id: str, decision: Decision, *, expected_payload_sha256: str | None = None, dispatch: DispatchTool) -> ApprovalOutcome
依据用户决策完成校验、执行与记账,返回 feishu.agent.approval.ApprovalOutcome。
源代码位于: feishu/agent/approval.py
DefaultApprovalEngine
¶
feishu.agent.approval.ApprovalEngine 的参考实现:防篡改 + 幂等重放 + 并发认领 + 冻结未知 + 审计。
一次 approve 决策依次经历:可选的幂等重放命中检查 → 携 expected_payload_sha256 的并发认领
(feishu.agent.session.PendingApprovalStore.claim)→ 经 dispatch 执行工具 → 记录执行结果与审计;
执行抛错时冻结审批(execution_unknown)而非放任重试。reject 决策直接取消。所有面向用户的措辞均取自
注入的 outcome_status(缺省回退到中性英文),SDK 不内置任何产品文案;idempotency_namespace 由产品
提供以隔离 id 空间。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
PendingApprovalStore
|
必需 | |
|
ExecutionResultStore | None
|
可选的幂等执行结果缓存 feishu.agent.approval.ExecutionResultStore。 |
None
|
|
AuditLog | None
|
可选的审计日志 feishu.agent.approval.AuditLog。 |
None
|
|
Mapping[str, str] | None
|
由 feishu.agent.approval.ApprovalStatus 值到展示措辞的映射,覆盖中性英文兜底。 |
None
|
|
str
|
派生幂等键 / id 时的命名空间,用于隔离不同产品的 id 空间。默认为 |
'feishu'
|
示例:
| Python Console Session | |
|---|---|
源代码位于: feishu/agent/approval.py
| Python | |
|---|---|
205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 | |
on_request
async
¶
on_request(approval: PendingApproval) -> None
持久化挂起审批并写入 write_request 审计事件;缺省时按命名空间派生幂等键。
源代码位于: feishu/agent/approval.py
on_cancel
async
¶
on_cancel(approval_id: str) -> None
撤销一次尚未决策的挂起审批:移除记录并写入 cancel 审计事件。
用于确认卡片下发失败等「审批已落库但永远不会被决策」的情形清理,避免留下用户无法确认的悬挂审批。
无需先 claim:调用方场景下卡片从未送达,不存在并发确认与之竞争(与 on_decision 的 reject 分支不同)。
审批不存在时为无操作。
源代码位于: feishu/agent/approval.py
on_decision
async
¶
on_decision(approval_id: str, decision: Decision, *, expected_payload_sha256: str | None = None, dispatch: DispatchTool) -> ApprovalOutcome
依据用户决策完成校验、执行与记账。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
str
|
审批标识。 |
必需 |
|
Decision
|
用户决策, |
必需 |
|
str | None
|
卡片回传携带的负载摘要,用于防篡改校验。 |
None
|
|
DispatchTool
|
工具分发函数,通常为 feishu.agent.tools.ToolRegistry.dispatch。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
ApprovalOutcome
|
源代码位于: feishu/agent/approval.py
| Python | |
|---|---|
272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 | |