拓冰建站拓冰建站
首页 / 资讯中心 / 正文

OpenAI Agents SDK(Python)确定性测试指南:用 ScriptedModel、脚本化沙箱会话与 Realtime/语音测试组件覆盖智能体工作流

OpenAI Agents SDKPython确定性测试指南用 ScriptedModel、脚本化沙箱会话与 Realtime/语音测试组件覆盖智能体工作流【免费下载链接】openai-agents-pythonA lightweight, powerful framework for multi-agent workflows项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-python本文基于 openai-agents-python 仓库 docs/zh/testing.md 编写系统讲解 SDK 内置的提供商中立测试工具ScriptedModel、scripted_sandbox_session()、ScriptedRealtimeModel以及语音管线脚本化组件。它们全部在内存中运行不向模型、沙箱提供商或 Realtime API 发出任何请求并记录 SDK 管理的规范化交互。读完本文后你将能够编写确定性的智能体工作流测试工具循环、任务转移、安全防护措施、重试、流式传输、沙箱智能体工作流测试、Realtime 会话与工具工作流测试以及语音管线端到端测试并掌握正确选择测试边界的方法。为什么需要确定性测试由应用和 SDK 管理的编排工具执行、任务转移、安全防护措施、重试、流式传输、会话行为、沙箱能力、Realtime 事件处理、语音管线组合应当通过脚本化测试来验证而由外部模型、网络协议、沙箱提供商或音频系统管理的行为则应使用真实的提供商适配器或集成环境。这种划分让单元测试快、稳定、可重复同时把不可控的线上因素隔离到专门的集成测试中。一个实用细节以下可运行配方都会在每次运行时通过RunConfig(tracing_disabledTrue)禁用追踪以便在配置了 OpenAI API 密钥时默认追踪处理器不会上传测试活动。配方选择目标使用参阅返回固定的最终答案带有assistant_message()的ScriptedModel固定响应返回执行多轮工具循环function_call()后接智能体响应工具工作流测试根据请求选择响应ModelStep.respond()或responder映射从请求派生响应断言运行器发送给模型的内容calls、first_call或last_call模型调用检查测试流式运行普通响应步骤或用于精确事件的ModelStep.stream()流式传输测试测试错误或重试决策ModelStep.raise_error()模型故障注入检测意外的工作流变更精确的 FIFO 步骤加assert_complete()工作流漂移检测在不启动沙箱的情况下测试SandboxAgentscripted_sandbox_session()加ScriptedModel沙箱智能体工作流测试匹配沙箱调用或派生其结果沙箱步骤上的match或responder沙箱步骤配置在不建立连接的情况下测试 Realtime 会话ScriptedRealtimeModel和RealtimeStepRealtime 会话测试测试 Realtime 工具工作流发出RealtimeModelToolCallEvent并预期工具输出Realtime 工具工作流测试测试静态或流式语音管线ScriptedSTTModel、ScriptedTTSModel以及脚本化或真实的工作流语音管线测试测试提供商序列化或线上传输载荷使用受控网络传输的真实提供商适配器正确边界选择导入测试 API 与其替代的运行时边界位于同一位置边界导入路径智能体模型和沙箱工作流agents.testingRealtime 模型传输agents.realtime.testing语音 STT、TTS 和工作流组件agents.voice.testing测试符号有意不包含在顶层agents导入中避免污染公共命名空间。对应的实现位于 src/agents/testing/init.py导出ScriptedModel、ModelStep、ModelCall、assistant_message、function_call、scripted_sandbox_session等全部符号、src/agents/realtime/testing.py 与 src/agents/voice/testing.py。智能体工作流配方固定响应返回为每个预期的模型调用传入一个规范化输出项序列。输出序列简写会为一个请求接收确定性的响应 ID 和用量默认response_idresp-789、usage.requests1见 src/agents/testing/model.py 中ModelStep与_next_resolved_step()的实现import pytest from agents import Agent, RunConfig, Runner from agents.testing import ScriptedModel, assistant_message pytest.mark.asyncio async def test_fixed_response() - None: model ScriptedModel( [[assistant_message(Paris is the capital of France.)]] ) agent Agent(nameGeography assistant, modelmodel) result await Runner.run( agent, What is the capital of France?, run_configRunConfig(tracing_disabledTrue), ) assert result.final_output Paris is the capital of France. assert len(model.calls) 1 model.assert_complete()使用model.assert_complete()完成确定性工作流测试。它可以捕获工作流在消耗所有已配置步骤之前停止的情况——例如智能体在应该调用工具时直接给出最终答案导致剩余步骤未被消费。工具工作流测试编写一个调用工具的模型响应脚本再编写一个生成最终答案的响应脚本。真实的 SDK 工具管线会在这些模型调用之间运行import pytest from agents import Agent, RunConfig, Runner from agents.decorators import tool from agents.testing import ScriptedModel, assistant_message, function_call tool def get_weather(city: str) - str: Return the weather for a city. return f{city}: sunny pytest.mark.asyncio async def test_tool_workflow() - None: model ScriptedModel( [ [function_call(get_weather, {city: Tokyo}, call_idcall_1)], [assistant_message(It is sunny in Tokyo.)], ] ) agent Agent(nameWeather assistant, modelmodel, tools[get_weather]) result await Runner.run( agent, What is the weather in Tokyo?, run_configRunConfig(tracing_disabledTrue), ) assert result.final_output It is sunny in Tokyo. assert len(model.calls) 2 assert model.last_call is not None assert any( item.get(type) function_call_output for item in model.last_call.input ) model.assert_complete()此模式涵盖工具输入验证、执行、结果转换、钩子、安全防护措施和下一轮模型调用。直接调用 Python 函数会绕过这些 SDK 行为——这正是该模式的价值所在它验证的是完整运行循环而不仅仅是函数逻辑。function_call()构建器src/agents/testing/model.py会把arguments字典序列化为紧凑 JSON并生成一个规范化的ResponseFunctionToolCall输出项。从请求派生响应当响应确实依赖于规范化模型调用或者断言应位于模型边界时请使用ModelStep.respond()。响应器可以是同步或异步的并且可以返回ScriptedModel接受的任何步骤形式import pytest from agents import Agent, RunConfig, Runner from agents.testing import ModelCall, ModelStep, ScriptedModel, assistant_message def respond(call: ModelCall): assert call.streamed is False assert call.input [{content: Summarize this, role: user}] return {output: [assistant_message(Handled the normalized request.)]} pytest.mark.asyncio async def test_request_aware_response() - None: model ScriptedModel([ModelStep.respond(respond)]) agent Agent(nameAssistant, modelmodel) result await Runner.run( agent, Summarize this, run_configRunConfig(tracing_disabledTrue), ) assert result.final_output Handled the normalized request. model.assert_complete()ScriptedModel接受ModelStep、等效的字典形式ModelStepSpec字段包括output、usage、response_id、request_id、raw_usage、error、responder、stream_events、retry_advice、ModelResponse、规范化输出项序列或异常。从源码的_coerce_step()可以看到字典中任何未支持的字段都会触发InvalidModelStepreasonunsupported_field且一个步骤不能同时组合error、responder与stream_events三种结果reasonconflicting_outcomes。当响应不依赖调用时优先使用固定输出序列因为固定脚本更容易诊断意外轮次。模型调用检查ScriptedModel会在解析每个调用或引发所选步骤之前记录该调用_record_call()在步骤解析前完成快照见 src/agents/testing/model.py成员内容calls按调用顺序排列的每个ModelCallfirst_call第一次调用或Nonelast_call最近一次调用或Noneremaining_steps尚未消耗的已配置步骤数量常见断言包括call.input、call.model_settings、call.tools、call.handoffs和call.streamed。可变请求数据会在调用边界创建快照深拷贝并且每个公共历史记录访问器都会返回分离的快照工具、任务转移、输出模式和追踪对象则保留其运行时标识tools与handoffs仅做浅列表拷贝元素对象本身不深拷贝。结构化的call_index和input_index错误字段从零开始因此可以直接索引calls[...]或提供的步骤序列。供人阅读的错误消息会显示从一开始的调用编号或步骤编号例如Unexpected streaming model call #2: no scripted steps remain.。当一个测试需要逐步追加模型步骤时请使用enqueue()或extend()二者都会对新步骤执行同样的校验与快照。对于独立场景请创建新的ScriptedModel该工具不会重置已消耗的步骤或调用历史记录。流式传输测试普通响应步骤同时支持Runner.run()和Runner.run_streamed()。对于常见的智能体消息、推理项、函数调用和应用补丁调用ScriptedModel会生成规范化的开始、增量、项目完成和终止响应事件response.created、response.in_progress、output_item.added、output_text.delta、output_text.done、function_call_arguments.delta/done、response.completed等完整事件序列由_stream_events_for_step()生成。终止响应包含完整的输出和用量。仅当精确的规范化TResponseStreamEvent序列属于被测行为的一部分时才使用ModelStep.stream()step ModelStep.stream( events, output[assistant_message(The terminal output used by the runner.)], )events可以是固定序列也可以是接收已记录ModelCall的异步工厂ModelStreamFactory。可选的output是在非流式调用中使用同一步骤时返回的响应。精确流事件是 SDK 规范化事件而不是 Responses API 或 Chat Completions 的线上传输分块——后者应使用带受控网络传输的真实适配器测试。自动流式传输会拒绝尚未实现增量生命周期的规范化输出项类型如自定义输出项源码中会抛出ModelBehaviorError并提示改用ModelStep.stream(...)。对于这些项目请使用ModelStep.stream(...)而不要依赖不完整的事件序列。模型故障注入使用ModelStep.raise_error()使一次模型调用失败。可选的重试建议属于该特定脚本错误from agents import ModelRetryAdvice from agents.testing import ModelStep step ModelStep.raise_error( RuntimeError(temporary failure), retry_adviceModelRetryAdvice(suggestedTrue, replay_safetysafe), )运行器的重试策略决定该建议是否会触发另一次尝试。每次重试都是另一次模型调用并会消耗下一个脚本步骤。源码中ScriptedModel.get_retry_advice()会按异常对象身份精确匹配之前raise_error()步骤记录的ModelRetryAdvice。Python 辅助工具接受固定的ModelRetryAdvice值如果重试建议本身需要根据尝试次数动态变化例如第一次建议重试、第二次放弃请使用自定义Model。工作流漂移检测将脚本化调用视为预期的工作流形态。额外的模型请求会引发UnexpectedModelCall提前退出则会留下步骤供assert_complete()报告。如果测试框架支持拆卸或终结器并且还希望在另一个断言失败后报告未消耗的步骤请将assert_complete()放在其中例如pytest的finally:或 teardown 钩子。在常规回归测试中请勿捕获不匹配错误——让异常直接失败测试。错误结构化字段含义InvalidModelStepreason、input_index步骤格式不正确在进入队列前即被拒绝UnexpectedModelCallcall、call_index脚本结束后工作流又进行了一次模型调用UnconsumedModelStepsremaining_steps工作流在使用所有步骤之前结束沙箱智能体配方沙箱智能体工作流测试将ScriptedModel与scripted_sandbox_session()组合使用可以在不创建本地容器或远程沙箱的情况下运行真实的SandboxAgent运行时。模型脚本选择一个能力工具而沙箱脚本定义对应的SandboxSession方法返回什么内容import pytest from agents import RunConfig, Runner from agents.sandbox import ExecResult, SandboxAgent from agents.sandbox.capabilities import Shell from agents.testing import ( ScriptedModel, assistant_message, function_call, scripted_sandbox_session, ) pytest.mark.asyncio async def test_sandbox_workflow() - None: sandbox scripted_sandbox_session( [ { method: exec, match: lambda call: call.args (pwd,), result: ExecResult( stdoutb/workspace\n, stderrb, exit_code0, ), } ] ) model ScriptedModel( [ [function_call(exec_command, {cmd: pwd}, call_idcall_1)], [assistant_message(The workspace is /workspace.)], ] ) agent SandboxAgent( nameWorkspace assistant, modelmodel, capabilities[Shell()], ) async with sandbox: result await Runner.run( agent, Which directory are you in?, run_configRunConfig( sandbox{session: sandbox}, tracing_disabledTrue, ), ) assert result.final_output The workspace is /workspace. assert [call.method for call in sandbox.calls] [exec] sandbox.assert_complete() model.assert_complete()此测试跨越两个规范化 SDK 边界模型边界ScriptedModel与沙箱会话边界scripted_sandbox_session。它涵盖工具参数验证、能力路由、沙箱会话调用、将工具结果传递到下一轮模型调用以及最终输出处理。它不会测试真实模型是否会选择该命令也不会测试真实沙箱提供商如何执行该命令。沙箱步骤配置每个匹配的沙箱调用都会消耗一个全局 FIFO 序列中的下一个步骤。方法不匹配、匹配器拒绝或匹配器异常都会使该步骤保持待处理状态。设置method仅选择一种结果并且仅当调用详情很重要时才添加match。步骤成员适用情形result方法应返回固定的类型化值responder结果取决于分离的SandboxCallerror方法应引发特定异常match除非匹配器返回False以外的值否则应在产生结果前拒绝调用支持的脚本化方法名称为apply_patch、exec、ls、mkdir、pty_exec_start、pty_write_stdin、read、rm和write源码中SandboxMethod字面量类型与_SCRIPTABLE_METHODS集合一致见 src/agents/testing/sandbox.py。仅公开已配置的面向模型的能力未配置的方法会抛出AttributeErrorextract、persist_workspace、hydrate_workspace、resolve_exposed_port等可选生命周期方法一律不可用。当配置了任一 PTY 方法时两个 PTY 方法会一并公开因为它们构成一个交互式 shell 能力但调用仍会消耗全局 FIFO 脚本supports_pty()也据此判断。sandbox.calls包含分离的SandboxCall快照其中含有从零开始的call_index、method、位置参数args和只读的kwargs。创建脚本时也会为静态结果创建快照。支持io.BytesIO和io.StringIO值会复制缓冲与当前位置对于其他实时流对象或生命周期行为请使用自定义沙箱会话_snapshot_value()对其它io.IOBase类型会直接拒绝。错误结构化字段含义InvalidSandboxStepreason、input_index、method步骤格式不正确或指定了不受支持的方法UnexpectedSandboxCallcall、call_index、actual_method、expected_method、remaining_steps工作流调用了错误的方法或在脚本结束后仍继续运行SandboxCallMatcherErrorcall、call_index、method步骤匹配器返回了FalseUnconsumedSandboxStepsremaining_steps、pending_methods工作流在使用所有步骤之前结束返回的对象就是会话本身。请将其直接传给RunConfig(sandbox{session: sandbox})不存在包装器.session属性。SandboxAgent需要会话作为其运行时依赖因此测试中请配合async with sandbox:使用以正确管理脚本化会话的start/stop生命周期。Realtime 配方Realtime 会话测试ScriptedRealtimeModel实现 Python SDK 的规范化RealtimeModel边界。每个RealtimeStep匹配一个出站RealtimeModelSendEvent然后发出规范化的入站RealtimeModelEvent对象或引发注入的错误import pytest from agents.realtime import ( RealtimeAgent, RealtimeModelOutputTextDeltaEvent, RealtimeModelSendUserInput, RealtimeRawModelEvent, RealtimeRunner, ) from agents.realtime.testing import RealtimeStep, ScriptedRealtimeModel pytest.mark.asyncio async def test_realtime_message() - None: reply RealtimeModelOutputTextDeltaEvent( item_iditem_1, deltaHello!, response_idresponse_1, ) model ScriptedRealtimeModel( [ RealtimeStep( expectRealtimeModelSendUserInput(user_inputHello), emit[reply], ) ] ) runner RealtimeRunner( RealtimeAgent(nameAssistant), modelmodel, config{tracing_disabled: True}, ) observed_reply False async with await runner.run() as session: await session.send_message(Hello) async for event in session: if isinstance(event, RealtimeRawModelEvent) and event.data reply: observed_reply True break assert observed_reply assert model.sent_events (RealtimeModelSendUserInput(user_inputHello),) assert model.closed is True model.assert_complete()预期项可以是精确的事件值、通过isinstance匹配的事件类或接收出站事件并在匹配时返回True的可调用对象源码中RealtimeSendMatcher别名明确定义了这三种形式。默认启用严格模式strictTrue。使用strictFalse时无关的出站事件会被记录但不会消耗待处理步骤当会话发出被测行为范围之外的附带事件时这很有用。使用connect_events在连接期间发出入站事件。使用connect_error或close_error注入生命周期故障并使用RealtimeStep(error...)注入与一次匹配发送相关的故障。一个步骤不能同时定义emit和errorRealtimeStep.__post_init__会直接抛出ValueError。Realtime 工具工作流测试将真实的函数工具附加到RealtimeAgent发出规范化工具调用并预期 SDK 通过模型边界发送工具输出。将async_tool_calls设置为False可使这个小型代码示例在连接期间完成而无需测试专用的等待机制import pytest from agents.decorators import tool from agents.realtime import ( RealtimeAgent, RealtimeModelSendToolOutput, RealtimeModelToolCallEvent, RealtimeRunner, ) from agents.realtime.testing import RealtimeStep, ScriptedRealtimeModel tool def lookup_order(order_id: str) - str: Look up an order by ID. return fOrder {order_id} has shipped. pytest.mark.asyncio async def test_realtime_tool_workflow() - None: tool_call RealtimeModelToolCallEvent( namelookup_order, call_idcall_1, arguments{order_id:order_123}, ) def matches_tool_output(event) - bool: return ( isinstance(event, RealtimeModelSendToolOutput) and event.tool_call.call_id call_1 and event.output Order order_123 has shipped. ) model ScriptedRealtimeModel( [RealtimeStep(expectmatches_tool_output)], connect_events[tool_call], ) agent RealtimeAgent( nameOrder assistant, tools[lookup_order], ) runner RealtimeRunner( agent, modelmodel, config{async_tool_calls: False, tracing_disabled: True}, ) async with await runner.run(): pass model.assert_complete()这会运行真实的 Realtime 工具查找、参数验证、执行和输出路由。它无法证明真实模型会选择该工具。Realtime 调用与生命周期检查成员内容connect_calls不含凭据的分离连接快照sent_events按调用顺序排列的分离出站事件快照remaining_steps剩余的预期出站发送listeners当前注册的监听器对象connected、closed、close_calls当前内存中生命周期状态连接历史记录只记录是否提供了 API 密钥或标头字段绝不会存储其值。URL 快照会移除用户信息、查询参数和片段源码中通过sanitize_url_for_trace处理。可变事件数据和设置会被分离而工具、任务转移和播放追踪器等实时 SDK 对象会保留其标识。使用model.assert_complete()完成测试并让RealtimeSession异步上下文管理器关闭模型。Python 工具有意不提供待处理预期项 Promise、隐式超时或单独的assert_closed()辅助工具。错误结构化字段含义UnexpectedRealtimeSendactual、expected严格的出站发送与下一个步骤不匹配或已无剩余步骤UnconsumedRealtimeStepsremaining_steps会话在使用所有预期发送之前结束RealtimeScriptError无脚本在无效的生命周期状态下使用例如在断开连接时发送语音管线配方语音管线测试将脚本化 STT 和 TTS 模型与SingleAgentVoiceWorkflow以及由ScriptedModel支持的智能体组合使用可以在不发出提供商请求的情况下测试完整的语音转文本 → 智能体 → 文本转语音管线import numpy as np import pytest from agents import Agent from agents.testing import ScriptedModel, assistant_message from agents.voice import AudioInput, SingleAgentVoiceWorkflow, VoicePipeline from agents.voice.testing import ( ScriptedSTTModel, ScriptedTTSModel, TTSResult, pcm16_samples, ) pytest.mark.asyncio async def test_voice_pipeline() - None: model ScriptedModel([[assistant_message(Hello there.)]]) stt ScriptedSTTModel(hello) pcm pcm16_samples([0, 100, -100, 0]) tts ScriptedTTSModel([TTSResult([pcm])]) pipeline VoicePipeline( workflowSingleAgentVoiceWorkflow( Agent(nameVoice assistant, modelmodel) ), stt_modelstt, tts_modeltts, config{tracing_disabled: True, tts_settings: {buffer_size: 1}}, ) result await pipeline.run(AudioInput(np.zeros(2, dtypenp.int16))) events [event async for event in result.stream()] assert events assert [call.text for call in tts.calls] [Hello there.] stt.assert_complete() tts.assert_complete() model.assert_complete()当被测对象是管线的 STT/TTS 生命周期而不是智能体编排时请改用ScriptedVoiceWorkflowfrom agents.voice.testing import ScriptedVoiceWorkflow workflow ScriptedVoiceWorkflow( turns[Hello there.], startWelcome., )start步骤由on_start()消耗。VoicePipeline仅针对StreamedAudioInput调用on_start()静态AudioInput运行不会消耗start。每个普通轮次都会记录其转录结果并消耗一个已配置结果。一个字符串代表一个片段字符串序列可在文本拆分和 TTS 之前控制片段边界即每个字符串独立成一个 TTS 调用单元。流式转录测试ScriptedSTTModel接受静态transcriptions和独立脚本化的流式sessions。会话可以是ScriptedTranscriptionSession、转录轮次序列、异常或单个字符串from agents.voice.testing import ScriptedSTTModel, ScriptedTranscriptionSession session ScriptedTranscriptionSession([first turn, second turn]) stt ScriptedSTTModel(sessions[session])关闭ScriptedTranscriptionSession会停止迭代并留下跳过的轮次供assert_complete()报告。类似地ScriptedTTSModel每次调用会消耗一个TTSResult、字节块序列或异常。语音调用检查组件记录的历史ScriptedSTTModelcalls、session_calls和实时created_sessions标识ScriptedTTSModel包含文本和分离设置的callsScriptedVoiceWorkflow按轮次顺序排列的transcriptions静态音频缓冲区和可变设置会在调用时创建快照。StreamedAudioInput和已创建的转录会话对象会保留其实时标识因为管线会继续使用它们。错误结构化字段含义UnexpectedVoiceCalloperation静态转录、流式会话、TTS 调用、工作流启动或工作流轮次没有已配置步骤UnconsumedVoiceStepsremaining_steps仍剩余一个或多个已配置的语音步骤请对测试配置的每个脚本化语音组件调用assert_complete()。ScriptedSTTModel.assert_complete()还会检查其创建的转录会话中的轮次。正确边界选择当测试需要运行 SDK 运行循环、工具、任务转移、安全防护措施、会话、重试或规范化流式传输而不依赖模型提供商时请使用ScriptedModel。当测试需要运行SandboxAgent的能力和编排而不启动沙箱提供商时请将scripted_sandbox_session()与ScriptedModel配合使用。针对真实沙箱提供商的集成测试应保留提供商创建、进程执行、文件系统保真度、持久性、资源限制和隔离检查参见仓库中的 tests/sandbox 集成测试目录。当测试需要运行RealtimeSession行为或RealtimeAgent工具及任务转移编排而不建立 WebSocket 连接时请使用ScriptedRealtimeModel。原始 Realtime 客户端/服务器事件、身份验证、网络恢复和音频传输行为应在真实传输或集成环境中测试。Realtime API 会话会在客户端发送输入和接收事件期间保持连接因此这些网络和协议问题属于规范化模型边界以下的层级。当测试需要在不使用语音提供商的情况下运行 STT/TTS 排序、流式转录清理、工作流片段传递或完整的语音管线组合时请使用语音测试组件。如果测试主题是转录质量、生成语音、编码兼容性、延迟或播放请使用真实的音频模型和具有代表性的音频。请勿使用这些工具测试 Responses API 或 Chat Completions 请求序列化、身份验证标头、提供商默认值、HTTP 载荷、提供商流分块、Realtime 线上传输帧或提供商特定的生命周期行为。对于这些测试请保留真实适配器并替换或控制其网络边界例如通过httpx的自定义Transport。注意使用openaiv3 时OpenAI 适配器测试应使用httpx2的请求、响应、传输和异常类型旧版httpx不是 Agents SDK 的核心依赖项。最终检查清单仅为规范化模型、沙箱会话、Realtime 模型或语音管线边界所管理的交互编写脚本。断言重要的公共请求或调用字段而不是运行器私有状态。优先使用固定响应步骤仅对依赖请求的行为使用响应器。优先使用自动模型流式传输仅当事件级行为很重要时才使用精确流。每个脚本化组件测试结束时都调用其assert_complete()方法。当外围测试拥有相应生命周期时使用异步上下文管理器清理 Realtime 和沙箱生命周期。断言结构化错误字段而不是解析供人阅读的消息。使用带受控网络传输的真实适配器进行提供商线上传输测试。范围与当前限制测试模块有意不提供针对每种规范化模型输出项的便捷构建器。常见情形请使用assistant_message()和function_call()其他规范化项目则直接传入。提供商协议模拟器。精确模型流使用规范化 SDK 事件而不是 Responses API 或 Chat Completions 的线上传输分块。高层级模拟 Realtime 服务器。测试会显式匹配规范化出站发送并发出场景所需的规范化入站事件。无序的沙箱或 Realtime 预期项。这两种工具都会按一个全局 FIFO 顺序消耗预期步骤。测试运行器专用的匹配器、fixture、隐式超时或自动拆卸。重置 API。ScriptedModel支持用于增量脚本的enqueue()和extend()但独立场景应创建新的脚本化组件。当测试需要格式错误的流、受控暂停或并发、精确取消或脚本化工具无法保留的生命周期边界时请使用对应公共接口的自定义实现例如自定义Model或自定义BaseSandboxSession子类并在测试中记录该专用边界。API 参考agents.testingagents.realtime.testingagents.voice.testing配套的源码与测试示例分别位于 src/agents/testing、src/agents/realtime/testing.py、src/agents/voice/testing.py以及仓库的 tests 目录如 tests/test_agent_runner.py、tests/sandbox/test_session_manager.py、tests/realtime/test_session.py 等可作为编写确定性测试的直接参考。【免费下载链接】openai-agents-pythonA lightweight, powerful framework for multi-agent workflows项目地址: https://gitcode.com/GitHub_Trending/op/openai-agents-python创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门