跳转到主要内容
AbortSignal 是一个轻量级的中断机制,用于在运行中的 Agent 回合里停止流式输出、取消正在执行的工具调用,并尽快收敛到安全的终止状态。 适用场景包括:
  • 用户主动打断长回复
  • UI/服务端超时控制
  • 上下文切换(先停掉旧回合,再启动新回合)

用户主动打断

适合在聊天 UI 中中止长回复,并立刻切换到新问题。

服务端超时控制

适合给单轮执行设置超时上限,避免长时间阻塞。

上下文切换

适合停止旧回合,再以新上下文启动下一轮任务。

核心概念

  • AbortSignal:一个可在多个协程之间共享的中断信号。
  • _abort_signal:调用参数名(推荐用常量 ABORT_SIGNAL_PARAM 避免硬编码)。
  • abort(reason):触发中断,并可附带原因说明。
_abort_signal 只用于运行时控制,不会进入 prompt,也不会传给模型或工具。

基本用法

1

创建 AbortSignal

在调用前创建一个可共享的 AbortSignal 实例。
2

通过 _abort_signal 传入

推荐使用常量 ABORT_SIGNAL_PARAM,避免手写参数名。
3

在其他协程中触发 abort

可调用 abort(reason),让当前回合尽快安全收束。

llm_chat 示例

import asyncio
from SimpleLLMFunc import llm_chat
from SimpleLLMFunc.hooks import AbortSignal, ABORT_SIGNAL_PARAM

@llm_chat(llm_interface=llm, stream=True, enable_event=True)
async def chat(message: str, history=None):
    """你的系统提示"""
    pass

abort_signal = AbortSignal()

async def run():
    async def abort_later():
        await asyncio.sleep(1.5)
        abort_signal.abort("user_interrupt")

    asyncio.create_task(abort_later())

    async for output in chat(
        "请详细解释 transformer",
        history=[],
        **{ABORT_SIGNAL_PARAM: abort_signal},
    ):
        # 正常处理事件流
        ...

asyncio.run(run())

llm_function 示例

import asyncio
from SimpleLLMFunc import llm_function
from SimpleLLMFunc.hooks import AbortSignal, ABORT_SIGNAL_PARAM

@llm_function(llm_interface=llm, enable_event=True)
async def analyze(text: str) -> str:
    """分析文本"""
    pass

abort_signal = AbortSignal()

async def run():
    async def abort_later():
        await asyncio.sleep(1.0)
        abort_signal.abort("timeout")

    asyncio.create_task(abort_later())

    async for output in analyze(
        "一段很长的文本",
        **{ABORT_SIGNAL_PARAM: abort_signal},
    ):
        ...

asyncio.run(run())

运行行为

  • 流式输出:中断后不再接收新的 chunk。
  • 工具调用:正在执行的工具调用会被取消;在事件流中可能看到 ToolCallErrorEvent,其 error_typeCancelledError
  • 事件流收尾:当 enable_event=True 时,ReactEndEvent.extra 会包含:
    • aborted: true
    • abort_reason: "reason"(如果传入了 reason)
  • 非事件流模式:生成器会提前结束,不会额外产出 ReactEndEvent
AbortSignal 是协作式中断。如果工具本身不可取消或处于阻塞状态,实际停止时间可能滞后。

TUI 的内置中断

@tui 场景下,当 Agent 仍在回复时再次发送消息,会自动触发中断:
  • 当前回合被中止,新的用户消息进入队列
  • 新消息会自动加上中断提示语("我要打断你的回复。")以引导模型及时收束
如果你需要更细的控制(比如自定义中断提示语),可以绕过内置流程,手动创建并传入 AbortSignal