loop
feishu.agent.loop
¶
StreamResult
dataclass
¶
一轮流式响应归并后的完整结果。
由 feishu.agent.loop.accumulate_stream 将逐个 [feishu.agent.llm.StreamChunk][] 归并而成:
text 为拼接后的全部文本,tool_calls 为重组完成的工具调用列表,stop_reason 为归一化的停止原因,
usage 为可选的用量统计。
示例:
| Python Console Session | |
|---|---|
源代码位于: feishu/agent/loop.py
Agent
¶
智能体主循环:驱动大模型与工具协作,自动回复飞书消息。
每收到一条消息,便载入会话历史、调用 feishu.agent.llm.LlmBackend 流式生成响应,并由
feishu.agent.loop.accumulate_stream 归并结果。若模型请求调用工具,则经
feishu.agent.tools.ToolRegistry 分发执行,并将结果回传后继续下一轮,直至产出最终文本或触及
max_iterations 上限。需要审批的工具会先发送审批卡片并挂起本轮,待用户在卡片上批准或拒绝后由
feishu.agent.loop.Agent.handle_card_action 恢复。
经 feishu.agent.dispatch.register_agent 注册到事件分发器后,即可自动处理消息与卡片回调事件。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
LlmBackend
|
大模型后端,须实现 feishu.agent.llm.LlmBackend。 |
必需 |
|
ToolRegistry
|
必需 | |
|
SessionStore | None
|
会话历史存储。默认使用 feishu.agent.session.InMemorySessionStore。 |
None
|
|
FeishuClient | None
|
飞书客户端,用于回复消息与发送卡片;为 |
None
|
|
PendingApprovalStore | None
|
挂起审批存储。默认使用 feishu.agent.session.InMemoryPendingApprovalStore。 |
None
|
|
int
|
单轮对话中模型与工具往返的最大次数。默认为 |
8
|
|
str | None
|
系统提示词。 |
None
|
|
bool
|
是否以流式卡片回复。为 |
False
|
|
Any
|
透传给 feishu.agent.llm.LlmBackend.stream 的额外参数。 |
{}
|
引发:
| 类型 | 描述 |
|---|---|
ValueError
|
|
示例:
源代码位于: feishu/agent/loop.py
| Python | |
|---|---|
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 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 | |
run
async
¶
处理一条飞书消息事件:载入历史、追加用户消息并驱动主循环。
通常无需直接调用,而是经 feishu.agent.dispatch.register_agent 注册为消息事件的处理函数。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
Event
|
飞书消息事件,须具备 |
必需 |
飞书文档
示例:
| Python Console Session | |
|---|---|
源代码位于: feishu/agent/loop.py
handle_card_action
async
¶
处理审批卡片的回传交互,恢复或终止此前挂起的对话。
从卡片回传值中读取 __approval__ 与 decision。决策无效时不消费挂起审批,用户可重试;批准则执行
对应工具并恢复主循环,拒绝则向模型回传一条错误工具结果再恢复。无论恢复过程是否抛错,都会同步返回
包含 toast 与更新后 card 的飞书响应。
通常无需直接调用,而是经 feishu.agent.dispatch.register_agent 注册为卡片回调事件的处理函数。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
Event
|
飞书卡片回调事件,须具备 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
dict[str, Any]
|
供飞书更新卡片的同步响应字典,含 |
飞书文档
示例:
| Python Console Session | |
|---|---|
源代码位于: feishu/agent/loop.py
accumulate_stream
async
¶
accumulate_stream(chunks: AsyncIterator[StreamChunk]) -> StreamResult
将一轮流式响应的增量片段归并为一个 feishu.agent.loop.StreamResult。
文本片段按序拼接;工具调用片段按 index 归并,逐段累积出完整的参数 JSON 字符串,并产出有序的
feishu.agent.llm.ToolCall 列表;停止原因与用量统计取自 feishu.agent.llm.MessageStop。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
AsyncIterator[StreamChunk]
|
逐个产出 [feishu.agent.llm.StreamChunk][] 的异步迭代器,通常来自 feishu.agent.llm.LlmBackend.stream。 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
StreamResult
|
示例:
源代码位于: feishu/agent/loop.py
session_id_for
¶
从消息事件推导会话标识,用于隔离不同会话的对话历史。
优先使用 chat_id;当消息属于话题(thread)回复时,附加 root_id 以将同一话题归为独立会话;
若事件中没有 chat_id,则回退为 message_id。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
Event
|
飞书消息事件,须具备 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
str
|
会话标识字符串。 |
飞书文档
示例:
源代码位于: feishu/agent/loop.py
user_message_from_event
¶
将飞书消息事件转换为一条用户角色的 feishu.agent.llm.Message。
文本提取委托给 feishu.im.inbound.message_text,因此除纯文本外还支持富文本(post)消息,
并会依据消息的 mentions 数组将 @_user_N 提及占位符解析为 @<姓名>;未被解析的开头占位符
(例如事件未携带 mentions 时)会被去除。当无法解析出任何文本时(如图片等非文本消息),退回使用
原始 content 作为文本。
参数:
| 名称 | 类型 | 描述 | 默认 |
|---|---|---|---|
|
Event
|
飞书消息事件,须具备 |
必需 |
返回:
| 类型 | 描述 |
|---|---|
Message
|
角色为 |
引发:
| 类型 | 描述 |
|---|---|
ValueError
|
事件体中不存在 |
飞书文档
示例:
| Python Console Session | |
|---|---|