Added
-
Added
BaseAudioResampler.flush()andBaseAudioResampler.reset(), so callers can mark stream boundaries themselves rather than relying onSOXRStreamAudioResampler's inactivity timeout.flush()returns the audio the resampler is still holding, for a stream that has ended;reset()discards it, for one that was abandoned. Both default to no-ops for resamplers that keep no state between calls.
(PR #5386) -
Scripted eval expectations on
function_callaccept aneval:: each matched call is judged by name and arguments, under a judge prompt of its own, so a scenario can check whatargs:cannot match verbatim ("a session about OpenTelemetry tracing, submitted for Jennifer Smith"). A rejected call fails the turn with kindjudge_no.EvalJudgegainsevaluate_call().
(PR #5713) -
AWSTranscribeSTTService.Settingsgainedpartial_results_stability, which selects AWS Transcribe's"high","medium"or"low"interim-result stability. It still defaults to"high".
(PR #5743) -
Added an
effectsetting toAzureTTSServiceandAzureHttpTTSService, which passes Azure's<voice effect>audio effect processor (eq_car,eq_telecomhp8k) through to the synthesis request.
(PR #5744) -
Added a
reasoning_effortfield toGroqLLMService.Settings, which passes Groq's reasoning effort control through to the completion request. Accepted values vary by model:"low","medium"and"high"on the GPT-OSS models andqwen/qwen3.8-27b,"none"and"default"on the Qwen models. Setting"none"also keeps a Qwen model's<think>reasoning out of the spoken response.
(PR #5748) -
Added a
delayfield toOpenAIRealtimeSTTService.Settings, OpenAI's latency-versus-accuracy control for how long the model waits before emitting transcription text (minimal,low,medium,high,xhigh). Supported bygpt-realtime-whisper.
(PR #5750) -
Added a
keywordsfield toOpenAISTTService.Settings, which passes product names, acronyms and other specialized terms to OpenAI's transcription request as hints. Supported bygpt-transcribe.
(PR #5750) -
Added
math_notationtoSmallestTTSService.Settings, Smallest's opt-in flag for reading digit-flanked math operators as words (2 + 2as "two plus two").
(PR #5751) -
Added an
initial_promptfield toWhisperSTTService.Settings, which gives Faster Whisper preceding context for each segment, steering the transcript's style, punctuation and spelling.
(PR #5755) -
SarvamRealtimeSTTServicenow accepts Sarvam's second-generation realtime model,saaras:v4, viasettings=SarvamRealtimeSTTService.Settings(model="saaras:v4"). The default remainssaaras:v3-realtime.
(PR #5758) -
Added video output to
LiveKitTransport. Withvideo_out_enabled, the transport publishes a camera track fromRGB,RGBA,BGRAorARGBframes.video_out_codecselects the codec, and the newLiveKitParams.video_out_max_bitratecaps the bitrate together withvideo_out_framerate.
(PR #5770) -
Added a
bot-llm-markerRTVI message thatRTVIObserversends when its newbot_llm_marker_enabledparameter is on (off by default), reporting the turn-completion marker the bot's LLM produced and what it meant:complete,shortorlong.
(PR #5777) -
Scripted eval scenarios can assert on the turn-completion marker the bot's LLM produced with a new
llm_markerevent and amarker:field naming its meaning:complete,short,long, orincompletefor either of the last two. The bot reports its markers only when a scenario asks for them, so clients never see them by default.- user: "Let me think about it, hmmm" expect: - event: llm_marker marker: incomplete
(PR #5777)
-
A scenario file lists its scenarios under
scenarios:, so one file can hold many short cases of the same behavior. Any key a scenario can have may sit at the top of the file as the default for all of them, and a scenario that sets the same key replaces it whole.turns:at the top with one entry per judge or modality runs the same conversation under each;persona:at the top with agoal:per entry sends the same caller on different errands. Scripted and simulated scenarios can share a file. Each scenario runs on its own, against its own bot, and is named<file>/<scenario>; the suite's-sfilter accepts that name or either half of it.EvalScenarioFile.load()reads a file and holds every scenario in it.name: turn_completion judge: !include ../judge_text.yaml scenarios: - name: short_answer turns: - user: "Japan." expect: - event: response - name: cutoff turns: - user: "I'd go to Japan because" expect: - event: response absent: true within_ms: 3000
(PR #5780)
-
GeminiLiveLLMServicesupportsgemini-3.8-liveandgemini-3.8-live-extended-thinking, includingNON_BLOCKINGfunction calling (the family's default). Synchronous tools are declaredBLOCKINGongemini-3.8-live;gemini-3.8-live-extended-thinkingaccepts onlyNON_BLOCKINGand logs a warning for them. The thinking model requires athinking_leveland getsLOWwhen none is configured.
(PR #5781) -
GeminiLiveLLMServiceholds the bot turn open while Gemini reportsinteraction_status: IN_PROGRESS, so a reply that spans severalturn_completemessages is recorded as a single assistant turn. Requiresgoogle-genai>=2.19.0(now thegoogleextra's floor); older SDKs log a warning.
(PR #5781) -
Added
name:to a manifest entry, its label in the display, the-pfilter,results.jsonl(a newnamefield besidebot) and the artifact file names, which carry the bot path and then the name. It defaults to thebot:path, for entries that share a bot and differ only in theirrunner_body:. Two entries may no longer run the same scenario under one label.
(PR #5786) -
Added
concurrency:to a manifest entry, capping how many runs of that bot execute at once under the suite's own concurrency, for providers that rate-limit concurrent connections.
(PR #5786) -
Added
text_excludes:to a scripted scenario's expectations, the mirror oftext_contains: the event's text must not hold the given substring, for a marker the LLM let slip into its reply. It fails with kindtext_present.
(PR #5786) -
Added
data:to a manifest entry'srunner_body:, the bot's runner-args body written inline as a mapping; the suite writes it to a file and passes it as--runner-body. The runner reads a body file as YAML, so it may be YAML or JSON.
(PR #5786) -
Added
EvalScriptTurnResult.expectations, oneEvalExpectationResultper expectation the turn resolved, with whether it passed and what it matched (the marker of anllm_marker, a function call's signature, a reply's text). The suite'sresults.jsonlrecords carry it too.
(PR #5786) -
Added
LLMMarkerResponseFrame, pushed byUserTurnCompletionLLMServiceMixinwhen a response ends with the raw text the LLM produced, the marker it read and the markers it recognizes. The RTVI observer sends it asbot-llm-markerwhenbot_llm_marker_enabledis on, so the eval harness'sllm_markerevent now carriesrawandmarkers, and a scripted scenario can check the marker protocol withmarker_first,markersandtext_afteron anllm_markerexpectation.
(PR #5786) -
AssemblyAISTTService'slanguage_codessteering now accepts Urdu, Russian, Korean, Catalan, Galician, Romanian, Estonian, Persian, Cantonese, Afrikaans, Marathi, Zulu, Xhosa, and Norwegian Nynorsk, matching the full setuniversal-3-5-proanduniversal-3-6-prosupport.
(PR #5808) -
Added
speedto the eval harness'sspeech:block, Kokoro's rate multiplier, so a scenario can make the synthesized user talk faster or slower. Cached user audio is keyed by the speed too.
(PR #5813)
Changed
-
BasetenLLMServicedefaults tozai-org/GLM-5.3. Setsettings=BasetenLLMService.Settings(model=...)to use a different model.
(PR #5730) -
DeepgramFluxSTTServicenow documents its defaulturlas Deepgram's Flux endpoint,wss://api.deepgram.com/v2/listen.
(PR #5739) -
DeepSeekLLMServicedefaults todeepseek-flash, DeepSeek's current name for V4.1 Flash. The previous default,deepseek-v4-flash, names a retired model and is only temporarily routed to V4.1 Flash. Setsettings=DeepSeekLLMService.Settings(model=...)to use a different model.
(PR #5746) -
Added a
modefield to the OpenAI ResponsesReasoningConfig, selecting thestandardorproreasoning mode on models that offer one, such as gpt-5.6.
(PR #5749) -
SonioxTTSServicesettings now includeclient_reference_id, the identifier Soniox records with each request in its usage logs, matching the fieldSonioxSTTServicealready exposes.
(PR #5752) -
Added
max_session_durationtoLiveAvatarNewSessionRequest, capping a HeyGen LiveAvatar session at a given number of seconds.
(PR #5753) -
InworldRealtimeLLMServicedocstrings now useopenai/gpt-4.1-miniin their examples instead ofopenai/gpt-4.1-nano, which OpenAI shuts down on 2026-10-23.
(PR #5754) -
RimeHttpTTSServicenow sendsnoTextNormalizationto Rime, so the setting takes effect on Mist requests.
(PR #5756) -
SarvamLLMServiceacceptsdeepseekv4-flash, the DeepSeek V4 Flash model Sarvam serves on/v2with a 1M-token context window, tool calling, and reasoning.
(PR #5757) -
pipecat initReact clients (Vite and Next.js) now use Pipecat UI instead of@pipecat-ai/voice-ui-kit. The generated client renders the Pipecat UI console: connect flow, transcript, metrics, device and session info, and a live event stream. Components are installed as source undersrc/components/pipecat, andcomponents.jsonpoints at the@pipecatregistry, sonpx shadcn@latest add @pipecat/<component>adds more. The vanilla JavaScript client is restyled to match.
(PR #5767) -
pipecat eval suitenow takes its queue round-robin across the manifest's entries within each attempt, so a slow or rate-limited provider holds only its share of the concurrency instead of every slot until its scenarios are done.
(PR #5768) -
Rewrote the default instructions that
filter_incomplete_user_turnsappends to the system prompt, so weaker models follow the ●/◐/○ marker protocol more reliably. Short answers such as "yes" or "Tuesday" are now called out as complete, a mid-sentence fragment is explicitly not a request for help, a continuation is judged together with the fragment before it, and the examples are prose rather than arrows or a transcript, since small models reproduce whatever shape they are shown. Bots that setUserTurnCompletionConfig.instructionsare unaffected.
(PR #5768) -
SpeechmaticsSTTServicenow defaultsturn_detection_modetoTurnDetectionMode.EXTERNAL, so Pipecat's own VAD drives turn boundaries throughfinalize(). Setsettings=SpeechmaticsSTTService.Settings(turn_detection_mode=TurnDetectionMode.VAD)to keep letting the Speechmatics service run its own VAD and close turns itself.
(PR #5773) -
The
runnerextra now requirespipecat-ai-prebuilt>=1.1.1. The prebuilt client UI served by the development runner moves to@pipecat-ai/client-js1.13.1,@pipecat-ai/daily-transport1.6.9,@pipecat-ai/small-webrtc-transport1.10.8, and@pipecat-ai/websocket-transport1.7.2.
(PR #5776) -
The
runnerextra now requirespipecat-ai-prebuilt>=1.2.1. The prebuilt client UI served by the development runner is built with Pipecat UI instead of@pipecat-ai/voice-ui-kit, shows the bot video pane in the console, and follows the system light/dark theme on load.
(PR #5799) -
The
sagemakerandaws-nova-sonicextras now requireaws_sdk_sagemaker_runtime_http2>=0.6.0,<0.10andaws_sdk_bedrock_runtime>=0.6.0,<0.10. The two SDKs sharesmithy-core, so they move together.
(PR #5807) -
Async function calls (
cancel_on_interruption=False) now keep settling as ordinary tool results when only assistant output lands in the context while they run, such as filler a tool handler speaks withTTSSpeakFrame. Previously that filler turned the result into a deferred-result message, while the same filler spoken fromon_function_calls_starteddid not. The result is still deferred when a user or developer message arrives first, or when the call sent an intermediate update.
(PR #5820) -
resolve_language(..., use_base_code=True)now resolves a regional variant missing from the map to the map's code for its base language when the map has one (en-USbecomes"eng"for a map withLanguage.EN: "eng"), falling back to the base code ("en") otherwise. This changes the code sent for unmapped regional variants by Meta STT, Pocket TTS, Rime TTS, Camb TTS, Kokoro TTS, XTTS, Neuphonic TTS, and xAI TTS; for example, Rime sends"ara"forLanguage.AR_AEinstead of"ar".
(PR #5824) -
pipecat eval suiteruns each manifest entry's scenarios back to back on one concurrency slot, so an entry's next scenario starts as soon as its previous one ends and a slow provider holds no more than one slot. A repeated sweep is attempt-major, every entry's first attempt before any entry's second. An entry'sconcurrency:now means how many slots it may hold at once, one by default.
(PR #5825)
Deprecated
-
Deprecated
EvalSimulationDriver.transcript(). No replacement: the driver feeds the judge as the conversation happens. Will be removed in 2.0.0.
(PR #5765) -
Deprecated the
transcriptparameter ofEvalJudge.evaluate_run(). The judge keeps the conversation it judges: feed it withadd_user_message,add_assistant_messageand the newadd_tool_call, and callevaluate_run(criteria, success). Will be removed in 2.0.0.
(PR #5765) -
EvalScriptScenario.load()andEvalSimulationScenario.load()are deprecated and will be removed in 2.0.0. UseEvalScenarioFile.load(), which reads a scenario file of either kind.
(PR #5780) -
load_scenario_file()is deprecated and will be removed in 2.0.0. UseEvalScenarioFile.load(), which reads a file and holds every scenario in it.
(PR #5780) -
A scenario file whose top level holds
turns:orpersona:instead of ascenarios:list is deprecated and will stop loading in 2.0.0. It still loads as one scenario under the file's name, with aDeprecationWarning. Wrap the scenario in ascenarios:list with its ownname:.
(PR #5780) -
Deprecated a manifest entry's bare
runner_body: <file>. Userunner_body: {path: <file>}instead. Will be removed in 2.0.0.
(PR #5786)
Fixed
-
Fixed the output transport dropping speech whenever TTS pauses for more than 200 ms between chunks. This only affected pipelines where the TTS render rate differs from the transport's output rate.
(PR #5386) -
Fixed a word-timestamp event that belongs to no sentence being discarded with nothing logged, in streaming mode (a TTS service using
TextAggregationMode.TOKEN). This comes up when a provider reports a punctuation mark as its own event after the preceding word already took it. Such an event used to sit in a buffer until the next turn began and was thrown away there; it is now logged and dropped when its own turn ends.
(PR #5681) -
Fixed
AggregatedFrameSequencer.force_completeemitting the text it force-completes as aTTSTextFramewithout a matchingAggregatedTextProgressFrame, so the progress view stopped where the TTS provider stopped reporting words while the word frames carried the rest of the turn.
(PR #5681) -
Fixed audio eval sessions remaining silent after a text-mode session on the same bot by resetting
skip_ttsfor each connection.
(PR #5722) -
A failed
MCPClienttool call now gives the LLM the error the call raised, cut to 200 characters. The fixed lineSorry, could not call the mcp toolremains only for a call that raised nothing and returned no text content. Code that matched on the old text must read the new one.
(PR #5734) -
CartesiaSTTServicenow sendskeytermfor Cartesia'sink-previewmodels, which support keyterms alongsideink-2.
(PR #5738) -
Corrected the documented range of the Deepgram Flux TTS
speedsetting: Flux accepts 0.5 to 1.5 in steps of 0.05, not 0.85 to 1.15.
(PR #5740) -
Fixed
GoogleLLMServicefailing every request withgemini-3.8-flash. That model rejects theminimalthinking level Pipecat applies by default to Gemini 3 Flash models, so it now getslow, the lowest level it accepts.
(PR #5741) -
The Mem0 RAG example's local-configuration snippet now names
claude-sonnet-4-6instead of the retiredclaude-3-5-sonnet-20240620.
(PR #5742) -
Corrected
MoonshineSTTService's licensing note: Moonshine's models are MIT in every language and size, except the legacy non-streaming (tiny,base) non-English models, which stay under the non-commercial Moonshine Community License.
(PR #5745) -
Updated the Fireworks update-settings example to use
nemotron-3-ultra-nvfp4; Fireworks retiredgpt-oss-20bfrom serverless.
(PR #5747) -
The OpenAI Responses services no longer send
reasoning.effort="none"forgpt-6-astra, which rejects that value. The model now works out of the box.
(PR #5749) -
Fixed
HeyGenVideoServiceavatar state logging, which watched for the LiveAvatar LITE eventagent.state. LiveAvatar renamed it toagent.state_updated.
(PR #5753) -
Fixed the
voice-sarvamexample's optional voice-switch line, which namedanushka, abulbul:v2speaker thatbulbul:v3rejects. It now namesanand, abulbul:v3speaker.
(PR #5759) -
Fixed per-tool
timeout_secs(and globalfunction_call_timeout_secs) being disarmed by an intermediateFunctionCallResultProperties(is_final=False)update. An async tool that reported progress no longer cancels its own deadline; only a final result clears it.
(PR #5760) -
npm run lintin a generated React client failed before linting any file, because the ESLint config used a legacy plugin shape that ESLint 10 rejects. The Vite template now uses the flat react-hooks config, and the Next.js template pins ESLint 9 sinceeslint-config-next16 does not run on 10.
(PR #5767) -
Fixed
SambaNovaLLMServiceignoringfilter_incomplete_user_turns. Its text bypassed the turn-completion mixin, so incomplete turns were never held and the marker character was spoken by TTS.
(PR #5768) -
Fixed
LiveKitTransportreporting a disconnect twice when it disconnected, and reporting one for a connection attempt that failed.
(PR #5770) -
Fixed
LiveKitTransportleaving its audio track unpublished when a track publish failed while connecting and the connection was retried.
(PR #5770) -
Fixed
LiveKitTransportnot releasing its outgoing audio source when it disconnected.
(PR #5770) -
Fixed
GladiaSTTServicetearing down and reconnecting its websocket when Gladia reports a translation addon failure, and silently ignoring rejected audio chunks. Both are now reported upstream as non-fatalErrorFrames while transcription continues on the same connection.
(PR #5772) -
MCPClientnow drops an MCP session that a tool call found dead. The next tool call connects again. A client that was never started, or that its owner closed, still raises on a tool call.
(PR #5778) -
Fixed
ElevenLabsDialogueTTSServiceclosing its WebSocket with a1008policy violation (voices can only be set in the first message), which lost the rest of the turn. A context that had gone quiet was dropped locally while ElevenLabs was still generating for it, so the next sentence of the turn registered that context a second time.
(PR #5795) -
Fixed
VADProcessorignoring itsspeech_activity_periodwhile the user is speaking.
(PR #5805) -
Fixed SageMaker connections with a connection setting the endpoint rejects (such as
language_hintonflux-general-en) hanging until the Flux connection timeout.DeepgramFluxSageMakerSTTServicenow reports SageMaker's 424 error throughon_connection_errorwithin a second. When the session does time out, the error names the endpoint's CloudWatch log group, which holds the container's error text.
(PR #5807) -
AssemblyAISTTServicenow raises a clear error as soon aspromptis set on a non-U3-Pro model, instead of forwarding it and letting the connection fail server-side.
(PR #5808) -
Fixed Gemini 3 rejecting a request with
Function call is missing a thought_signaturewhen the context holds function calls Gemini did not produce, such as those made by another LLM before switching to Gemini or ones added by the application.GeminiLLMAdapternow sends Google's documented placeholder signature for those calls.
(PR #5809) -
Fixed a realtime service configured with its own tools (such as
UltravoxRealtimeLLMServicewithone_shot_selected_tools) answering a tool call with the missing-function result when the model called the tool before the first context frame reached the service. The handlers of a service's own tools are now registered when the service starts.
(PR #5812) -
Fixed
UltravoxRealtimeLLMServicenever reporting an async tool's result when the result arrived while the bot was still speaking. The result was sent as a secondclient_tool_result, which Ultravox ignores after the placeholder it already received; it is now delivered as user-side text like a deferred result.
(PR #5812) -
Fixed
SarvamSTTServicetranscripts arriving withfinalized=False, which made the turn analyzer wait out its timeout for more transcript before ending the user turn. Each transcript is now marked finalized, so the turn can end as soon as the transcript arrives.
(PR #5815) -
Fixed
GoogleLLMService(andGoogleVertexLLMService) failing with a 400 (Requests ending with a model turn are not supported.) on newer Gemini models, such as the defaultgemini-3.6-flash, when the context ends with an assistant message. This happens when a tool handler speaks filler withTTSSpeakFramebefore its result arrives. A minimal"."user turn is now appended to the request in that case, for every model not known to continue a trailing model turn; the stored context is unchanged.
(PR #5821) -
MiniMaxHttpTTSServicenow resolves a regional language variant to its base language's name forlanguage_boost(Language.PT_BRbecomes"Portuguese") instead of sending the rawpt-BRcode.
(PR #5824) -
ElevenLabsRealtimeSTTServicenow converts itslanguagesetting to ElevenLabs' language codes, so a regional variant such asLanguage.EN_USconnects withlanguage_code=enginstead of being rejected with a 1008invalid_requestclose.ElevenLabsSTTServicealso resolves regional variants to their base language's code rather than sendingen-US.
(PR #5824) -
Fixed the eval harness scoring bot speech from before the user's turn as the reply, or losing the reply behind it, when that speech was transcribed late. A send now waits until everything the bot said is transcribed, and a turn that talks over the bot drops the transcripts of what it was saying, by when their audio began.
(PR #5825) -
Fixed an
absent: trueresponse expectation failing on a later sentence of the reply an earlier expectation had already matched. It now counts only a reply the bot began after that match.
(PR #5825)
Performance
- Reduced per-frame memory work for rolling audio volume tracking by retaining the window in a mutable buffer.
(PR #5811)