流式传输
流式传输允许你在智能体运行过程中订阅其更新。这对于向最终用户展示进度更新和部分响应很有用。
要进行流式传输,你可以调用Runner.run_streamed(),它将返回一个RunResultStreaming。调用result.stream_events() 会得到一个由StreamEvent对象构成的异步流,详见下文。
原始响应事件
RawResponsesStreamEvent 是直接从 LLM 传递的原始事件。它们采用 OpenAI Responses API 格式,这意味着每个事件都有一个类型(如response.created、response.output_text.delta 等)和数据。如果你希望在生成后立即将响应消息流式传输给用户,这些事件很有用。
例如,下面将逐个 token 输出由 LLM 生成的文本。
importasynciofromopenai.types.responsesimportResponseTextDeltaEventfromagentsimportAgent,Runnerasyncdefmain():agent=Agent(name="Joker",instructions="You are a helpful assistant.",)result=Runner.run_streamed(agent,input="Please tell me 5 jokes.")asyncforeventinresult.stream_events():ifevent.type=="raw_response_event"andisinstance(event.data,ResponseTextDeltaEvent):print(event.data.delta,end="",flush=True)if__name__=="__main__":asyncio.run(main())运行项事件与智能体事件
RunItemStreamEvent 属于更高层次的事件。它们会在某个项完全生成时通知你。这样你就可以在“消息已生成”“工具运行完成”等层面推送进度更新,而不是每个 token。类似地,AgentUpdatedStreamEvent 会在当前智能体发生变化时向你提供更新(例如由于一次任务转移)。
例如,下面将忽略原始事件,仅向用户流式传输更新。
importasyncioimportrandomfromagentsimportAgent,ItemHelpers,Runner,function_tool@function_tooldefhow_many_jokes()->int:returnrandom.randint(1,10)asyncdefmain():agent=Agent(name="Joker",instructions="First call the `how_many_jokes` tool, then tell that many jokes.",tools=[how_many_jokes],)result=Runner.run_streamed(agent,input="Hello",)print("=== Run starting ===")asyncforeventinresult.stream_events():# We'll ignore the raw responses event deltasifevent.type=="raw_response_event":continue# When the agent updates, print thatelifevent.type=="agent_updated_stream_event":print(f"Agent updated:{event.new_agent.name}")continue# When items are generated, print themelifevent.type=="run_item_stream_event":ifevent.item.type=="tool_call_item":print("-- Tool was called")elifevent.item.type=="tool_call_output_item":print(f"-- Tool output:{event.item.output}")elifevent.item.type=="message_output_item":print(f"-- Message output:\n{ItemHelpers.text_message_output(event.item)}")else:pass# Ignore other event typesprint("=== Run complete ===")if__name__=="__main__":asyncio.run(main())