Repository navigation
Releases
v0.10.0
Minor Changes
-
#85
1840a07Thanks @polvallverdu! - TTS audio cache (pipedog only):TTSServicetakes an optionalaudioCache(TTSAudioCache, an in-memory LRU bounded by size, or anyget/setstore), andwarmAudioCache(text)synthesizes fixed lines ahead of time so they play without a request to the provider. Only warmed lines are stored unlesscacheSynthesizedAudioallows live synthesis. Works with services that yield audio fromrunTts(HTTP and streaming-RPC). -
#85
1840a07Thanks @polvallverdu! -MinWordsUserTurnStartStrategytakes two opt-in options:startOnVadWhenBotQuietstarts the turn
on VAD while the bot is silent instead of waiting for a transcript, andkeepBotSpeakingOnTurnStart
keeps the bot-speaking state across turn starts. New user mute strategies:
OpeningUserMuteStrategy(mute until the bot's first speech ends or has played formaxSeconds)
andEndingUserMuteStrategy(mute for good once the conversation is ending).
Patch Changes
- Updated dependencies []:
- @pipedog/asyncio@0.10.0
- @pipedog/resampler-wasm@0.10.0
- @pipedog/sentencex-wasm@0.10.0
All @pipedog/* packages are released at 0.10.0:
@pipedog/ai-sdk@pipedog/anthropic@pipedog/assemblyai@pipedog/asyncai@pipedog/asyncio@pipedog/audio-ducking@pipedog/audio-rnnoise-filter@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/audio-soundfile-mixer@pipedog/aws@pipedog/azure@pipedog/baseten@pipedog/bland@pipedog/camb@pipedog/cartesia@pipedog/cerebras@pipedog/cli@pipedog/cloudflare@pipedog/core@pipedog/crusoe@pipedog/deepgram@pipedog/deepseek@pipedog/effect@pipedog/elevenlabs@pipedog/espeak-ng@pipedog/evals@pipedog/extensions@pipedog/fireworks@pipedog/fish@pipedog/flows@pipedog/funasr@pipedog/gladia@pipedog/google@pipedog/gradium@pipedog/grok@pipedog/groq@pipedog/heygen@pipedog/hume@pipedog/inception@pipedog/inworld@pipedog/kokoro@pipedog/langchain@pipedog/mcp-client@pipedog/mcp@pipedog/meta@pipedog/minimax@pipedog/mistral@pipedog/moonshine@pipedog/nebius@pipedog/neuphonic@pipedog/novita@pipedog/ollama@pipedog/onnx@pipedog/openai@pipedog/openrouter@pipedog/perplexity@pipedog/piper@pipedog/pocket-tts@pipedog/qwen@pipedog/resampler-wasm@pipedog/resembleai@pipedog/rime@pipedog/runner@pipedog/sambanova@pipedog/sarvam@pipedog/sentencex-wasm@pipedog/sentry@pipedog/serializer-exotel@pipedog/serializer-genesys@pipedog/serializer-plivo@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/serializer-twilio@pipedog/serializer-vonage@pipedog/smallest@pipedog/soniox@pipedog/speechify@pipedog/speechmatics@pipedog/together@pipedog/tracing@pipedog/transport-cloudflare-realtime@pipedog/transport-heygen@pipedog/transport-livekit@pipedog/transport-local@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/transport-whatsapp@pipedog/ultravox@pipedog/whisper@pipedog/xai
v0.9.0
Minor Changes
-
#76
72c00c8Thanks @polvallverdu! - Frames move through a pipeline about twice as fast (per-frame latency through 10 processors: 83 → 40 µs on Node, 370 → 180 µs on Cloudflare Workers), with the same behavior:- The pipeline worker no longer wakes an observer for events it doesn't handle:
onProcessFrameevents only go to observers that overrideonProcessFrame(the default observers only watch pushes). - New
BaseObserver.acceptsPush(data): a synchronous filter the worker calls before queueing a push for an observer.RTVIObserveruses it to skip the repeated pushes it ignores, so it is no longer woken at every hop of every frame. FrameProcessorskips the per-frameon_before/after_process_frameandon_before/after_push_frameevents when nothing listens to them, and builds its trace log line only when trace logging is on.
- The pipeline worker no longer wakes an observer for events it doesn't handle:
-
#72
f7dc044Thanks @polvallverdu! - AdddefineTool(@pipedog/core/adapters/schemas/standard_tool): typed function-calling tools from any Standard Schema (Zod, Valibot, ArkType). The JSON schema comes from Standard JSON Schema (~standard.jsonSchema) or an explicitjsonSchema, the handler'sargsare inferred, and arguments are validated before the handler runs; invalid arguments are returned to the LLM as the result. It returns a regularFunctionSchema, so existing APIs are unchanged. Also addsregisterToolsand the copied Standard Schema interfaces in@pipedog/core/utils/standard_schema.
Patch Changes
- Updated dependencies []:
- @pipedog/asyncio@0.9.0
- @pipedog/resampler-wasm@0.9.0
- @pipedog/sentencex-wasm@0.9.0
All @pipedog/* packages are released at 0.9.0:
@pipedog/ai-sdk@pipedog/anthropic@pipedog/assemblyai@pipedog/asyncai@pipedog/asyncio@pipedog/audio-rnnoise-filter@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/audio-soundfile-mixer@pipedog/aws@pipedog/azure@pipedog/baseten@pipedog/bland@pipedog/camb@pipedog/cartesia@pipedog/cerebras@pipedog/cli@pipedog/cloudflare@pipedog/core@pipedog/crusoe@pipedog/deepgram@pipedog/deepseek@pipedog/effect@pipedog/elevenlabs@pipedog/espeak-ng@pipedog/evals@pipedog/extensions@pipedog/fireworks@pipedog/fish@pipedog/flows@pipedog/funasr@pipedog/gladia@pipedog/google@pipedog/gradium@pipedog/grok@pipedog/groq@pipedog/heygen@pipedog/hume@pipedog/inception@pipedog/inworld@pipedog/kokoro@pipedog/langchain@pipedog/mcp-client@pipedog/mcp@pipedog/meta@pipedog/minimax@pipedog/mistral@pipedog/moonshine@pipedog/nebius@pipedog/neuphonic@pipedog/novita@pipedog/ollama@pipedog/onnx@pipedog/openai@pipedog/openrouter@pipedog/perplexity@pipedog/piper@pipedog/pocket-tts@pipedog/qwen@pipedog/resampler-wasm@pipedog/resembleai@pipedog/rime@pipedog/runner@pipedog/sambanova@pipedog/sarvam@pipedog/sentencex-wasm@pipedog/sentry@pipedog/serializer-exotel@pipedog/serializer-genesys@pipedog/serializer-plivo@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/serializer-twilio@pipedog/serializer-vonage@pipedog/smallest@pipedog/soniox@pipedog/speechify@pipedog/speechmatics@pipedog/together@pipedog/tracing@pipedog/transport-cloudflare-realtime@pipedog/transport-heygen@pipedog/transport-livekit@pipedog/transport-local@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/transport-whatsapp@pipedog/ultravox@pipedog/whisper@pipedog/xai
v0.8.0
Patch Changes
-
#69
d6e6f45Thanks @polvallverdu! - Fixes for apps bundled withbun build(andbun build --compile) and run withoutnode_modules:@pipedog/transport-smallwebrtcloadsreflect-metadatafirst itself (a new dependency, pinned). werift's X.509 code needs it beforetsyringe, and a bundle that loads the transport lazily, as@pipedog/runnerdoes, could put the import after it, which disabled the runner's WebRTC routes. Hosts don't import or externalizereflect-metadata; it does not belong in core.@pipedog/runnercounts its own transports (@pipedog/transport-websocket,@pipedog/transport-smallwebrtc) as available instead of resolving them by name, which fails in a bundle: every telephony and WebSocket route answered 404.- Silero, Smart Turn and RNNoise read their default model or
.wasmfile next to the package's source, which a bundle does not copy. The error now names themodeloption (orinitRnnoise()) and thewith { type: "file" }import that fixes it, instead of a bare file-not-found for a path nobody recognizes. - Core's Smart Turn fallback warning says that a bundled app has to pass
createLocalSmartTurnAnalyzerV3()to the turn strategy, since a bundler can't see core's by-name import.
Docs: a Bundling page under Deployment, with the tested
bun buildrecipe, a snippet per asset, and what has to stay outside the bundle and why.examples/bundle-checkbundles and runs a sample bot per configuration in CI. -
Updated dependencies []:
- @pipedog/asyncio@0.8.0
- @pipedog/resampler-wasm@0.8.0
- @pipedog/sentencex-wasm@0.8.0
All @pipedog/* packages are released at 0.8.0:
@pipedog/anthropic@pipedog/assemblyai@pipedog/asyncai@pipedog/asyncio@pipedog/audio-rnnoise-filter@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/audio-soundfile-mixer@pipedog/aws@pipedog/azure@pipedog/baseten@pipedog/bland@pipedog/camb@pipedog/cartesia@pipedog/cerebras@pipedog/cli@pipedog/core@pipedog/crusoe@pipedog/deepgram@pipedog/deepseek@pipedog/elevenlabs@pipedog/espeak-ng@pipedog/evals@pipedog/extensions@pipedog/fireworks@pipedog/fish@pipedog/flows@pipedog/funasr@pipedog/gladia@pipedog/google@pipedog/gradium@pipedog/grok@pipedog/groq@pipedog/heygen@pipedog/hume@pipedog/inception@pipedog/inworld@pipedog/kokoro@pipedog/langchain@pipedog/mcp-client@pipedog/mcp@pipedog/meta@pipedog/minimax@pipedog/mistral@pipedog/moonshine@pipedog/nebius@pipedog/neuphonic@pipedog/novita@pipedog/ollama@pipedog/onnx@pipedog/openai@pipedog/openrouter@pipedog/perplexity@pipedog/piper@pipedog/pocket-tts@pipedog/qwen@pipedog/resampler-wasm@pipedog/resembleai@pipedog/rime@pipedog/runner@pipedog/sambanova@pipedog/sarvam@pipedog/sentencex-wasm@pipedog/sentry@pipedog/serializer-exotel@pipedog/serializer-genesys@pipedog/serializer-plivo@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/serializer-twilio@pipedog/serializer-vonage@pipedog/smallest@pipedog/soniox@pipedog/speechify@pipedog/speechmatics@pipedog/together@pipedog/tracing@pipedog/transport-heygen@pipedog/transport-livekit@pipedog/transport-local@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/transport-whatsapp@pipedog/ultravox@pipedog/whisper@pipedog/xai
v0.7.0
Minor Changes
-
#68
20a84e7Thanks @polvallverdu! - Traces say pipedog now. The library's tracers are calledpipedogandpipedog.turn(they were
pipecatandpipecat.turn, as upstream), andsetupTracing()defaultsservice.nameto
"pipedog"(was"pipecat"). Span names and attribute keys are unchanged.If a dashboard, alert or query filters on the Pipecat tracer names, bring them back at startup,
before creating a pipeline, withsetTracerName("pipecat")orsetupTracing({ tracerName: "pipecat" }).getTracerName()andDEFAULT_TRACER_NAMEare exported too. Set your own
serviceNamein production either way.
Patch Changes
- Updated dependencies []:
- @pipedog/asyncio@0.7.0
- @pipedog/resampler-wasm@0.7.0
- @pipedog/sentencex-wasm@0.7.0
All @pipedog/* packages are released at 0.7.0:
@pipedog/anthropic@pipedog/assemblyai@pipedog/asyncai@pipedog/asyncio@pipedog/audio-rnnoise-filter@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/audio-soundfile-mixer@pipedog/aws@pipedog/azure@pipedog/baseten@pipedog/bland@pipedog/camb@pipedog/cartesia@pipedog/cerebras@pipedog/cli@pipedog/core@pipedog/crusoe@pipedog/deepgram@pipedog/deepseek@pipedog/elevenlabs@pipedog/espeak-ng@pipedog/evals@pipedog/extensions@pipedog/fireworks@pipedog/fish@pipedog/flows@pipedog/funasr@pipedog/gladia@pipedog/google@pipedog/gradium@pipedog/grok@pipedog/groq@pipedog/heygen@pipedog/hume@pipedog/inception@pipedog/inworld@pipedog/kokoro@pipedog/langchain@pipedog/mcp-client@pipedog/mcp@pipedog/meta@pipedog/minimax@pipedog/mistral@pipedog/moonshine@pipedog/nebius@pipedog/neuphonic@pipedog/novita@pipedog/ollama@pipedog/onnx@pipedog/openai@pipedog/openrouter@pipedog/perplexity@pipedog/piper@pipedog/pocket-tts@pipedog/qwen@pipedog/resampler-wasm@pipedog/resembleai@pipedog/rime@pipedog/runner@pipedog/sambanova@pipedog/sarvam@pipedog/sentencex-wasm@pipedog/sentry@pipedog/serializer-exotel@pipedog/serializer-genesys@pipedog/serializer-plivo@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/serializer-twilio@pipedog/serializer-vonage@pipedog/smallest@pipedog/soniox@pipedog/speechify@pipedog/speechmatics@pipedog/together@pipedog/tracing@pipedog/transport-heygen@pipedog/transport-livekit@pipedog/transport-local@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/transport-whatsapp@pipedog/ultravox@pipedog/whisper@pipedog/xai
v0.6.1
Patch Changes
- Updated dependencies [
9f1ce7a]:- @pipedog/asyncio@0.6.1
- @pipedog/resampler-wasm@0.6.1
- @pipedog/sentencex-wasm@0.6.1
All @pipedog/* packages are released at 0.6.1:
@pipedog/anthropic@pipedog/asyncio@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/aws@pipedog/azure@pipedog/baseten@pipedog/cartesia@pipedog/cerebras@pipedog/core@pipedog/crusoe@pipedog/deepgram@pipedog/deepseek@pipedog/elevenlabs@pipedog/fireworks@pipedog/google@pipedog/grok@pipedog/groq@pipedog/inworld@pipedog/langchain@pipedog/mcp@pipedog/mistral@pipedog/nebius@pipedog/novita@pipedog/ollama@pipedog/onnx@pipedog/openai@pipedog/openrouter@pipedog/perplexity@pipedog/qwen@pipedog/resampler-wasm@pipedog/runner@pipedog/sambanova@pipedog/sentencex-wasm@pipedog/serializer-exotel@pipedog/serializer-genesys@pipedog/serializer-plivo@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/serializer-twilio@pipedog/serializer-vonage@pipedog/together@pipedog/tracing@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/ultravox@pipedog/whisper@pipedog/xai
v0.6.0
Minor Changes
-
#32
dd4712bThanks @polvallverdu! - Speech-to-speech providers: Inworld and Ultravox.@pipedog/inworld:InworldRealtimeLLMService(Inworld's Realtime API, with its events and
adapter), andInworldTTSService(WebSocket) andInworldHttpTTSService.@pipedog/ultravox:UltravoxRealtimeLLMService, with agent, one-shot and join-URL calls.@pipedog/core:ServiceSettings.fromMapping()builds the subclass it is called on again, so
TTSSettings.fromMapping({ voice_id: "alice" })setsvoiceinstead of putting every key in
extra.
Both run on Bun, Node, Deno and Cloudflare Workers.
Patch Changes
- Updated dependencies [
b53032d]:- @pipedog/asyncio@0.6.0
- @pipedog/resampler-wasm@0.6.0
- @pipedog/sentencex-wasm@0.6.0
All @pipedog/* packages are released at 0.6.0:
@pipedog/anthropic@pipedog/asyncio@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/aws@pipedog/azure@pipedog/baseten@pipedog/cartesia@pipedog/cerebras@pipedog/core@pipedog/crusoe@pipedog/deepgram@pipedog/deepseek@pipedog/elevenlabs@pipedog/fireworks@pipedog/google@pipedog/grok@pipedog/groq@pipedog/inworld@pipedog/langchain@pipedog/mcp@pipedog/mistral@pipedog/nebius@pipedog/novita@pipedog/ollama@pipedog/onnx@pipedog/openai@pipedog/openrouter@pipedog/perplexity@pipedog/qwen@pipedog/resampler-wasm@pipedog/runner@pipedog/sambanova@pipedog/sentencex-wasm@pipedog/serializer-exotel@pipedog/serializer-genesys@pipedog/serializer-plivo@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/serializer-twilio@pipedog/serializer-vonage@pipedog/together@pipedog/tracing@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/ultravox@pipedog/whisper@pipedog/xai
v0.5.0
Patch Changes
-
#28
70dce6fThanks @polvallverdu! -GoogleLLMServicesendsfrequencyPenaltyandpresencePenaltywhen they are set.
GeminiFileAPI.uploadFile()takes the file's contents (aUint8Array, anArrayBuffer, a
Blobor aReadableStream, with an optionalmimeType) as well as a path, so uploads work on
Cloudflare Workers. A path on a runtime withoutnode:fsthrows an error that says what to pass
instead.GeminiLiveLLMServicelogs a warning when it drops anLLMSetToolsFrame. Comments and
docs now say that WebSocket auth headers are sent on Cloudflare Workers. -
#20
566fb45Thanks @polvallverdu! - Package READMEs on npm.@pipedog/core,@pipedog/asyncio,@pipedog/openai,
@pipedog/anthropic,@pipedog/deepgram,@pipedog/cartesia,@pipedog/elevenlabs,
@pipedog/tracingand@pipedog/whispernow ship a README with install steps, a usage snippet,
runtimes and links to the docs. Every package gains npmkeywords, and the@pipedog/elevenlabs
description no longer lists Text-to-Dialogue, which is not ported yet. -
Updated dependencies [
566fb45]:- @pipedog/asyncio@0.5.0
- @pipedog/resampler-wasm@0.5.0
- @pipedog/sentencex-wasm@0.5.0
All @pipedog/* packages are released at 0.5.0:
@pipedog/anthropic@pipedog/asyncio@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/cartesia@pipedog/core@pipedog/deepgram@pipedog/elevenlabs@pipedog/google@pipedog/langchain@pipedog/mcp@pipedog/onnx@pipedog/openai@pipedog/resampler-wasm@pipedog/sentencex-wasm@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/tracing@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/whisper
v0.4.0
Minor Changes
-
#18
b88231aThanks @polvallverdu! - Lighter sessions, working default turn detection, and WebSockets with headers on Workers.@pipedog/onnx:sharedSession(backend, model, options)shares one inference session per
backend, model and options; runs are serialized on onnxruntime-web.disposeSharedSessions()
releases them.@pipedog/audio-silero,@pipedog/audio-smart-turn: analyzers share their session by default
(shareSession: falseopts out). Each further call now costs about 1.3 MB instead of about 52 MB.@pipedog/core:LocalSmartTurnAnalyzerV3withoutcreateSessionloads
@pipedog/audio-smart-turnwhen it's installed, on first use. Without it, turns end on the VAD's
silence, with one warning, instead of failing. On Cloudflare Workers, service websockets connect
withfetch(), so their auth headers are sent. Warning and error logs mask credentials in their
message and attached error, for every sink.@pipedog/transport-websocket:websocketConnecton Workers connects withfetch()and sends
additionalHeaders.
Patch Changes
- Updated dependencies []:
- @pipedog/asyncio@0.4.0
- @pipedog/resampler-wasm@0.4.0
- @pipedog/sentencex-wasm@0.4.0
All @pipedog/* packages are released at 0.4.0:
@pipedog/anthropic@pipedog/asyncio@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/cartesia@pipedog/core@pipedog/deepgram@pipedog/elevenlabs@pipedog/google@pipedog/langchain@pipedog/onnx@pipedog/openai@pipedog/resampler-wasm@pipedog/sentencex-wasm@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/tracing@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/whisper
v0.3.0
Minor Changes
-
#8
6aa3dacThanks @polvallverdu! - First providers and transports.@pipedog/google:GoogleSTTService(Cloud Speech v2, Chirp 3),GoogleTTSService(Chirp 3 HD
streaming),GoogleHttpTTSService,GeminiTTSServiceandGeminiSTTService(Gemini Live,
gemini-3.5-transcribe-live). The Gemini classes run everywhere, Workers included; the Cloud
classes need the optional@google-cloud/speech/@google-cloud/text-to-speechpeers (Bun,
Node, Deno).@pipedog/langchain:LangchainProcessorfor any LangChainRunnable, LangGraph graphs included.@pipedog/transport-websocket:WebsocketServerTransport,WebsocketClientTransport,
FastAPIWebsocketTransport(bring your own socket: Bun, Deno, Nodews, Hono, Cloudflare
WebSocketPair) andRTVIClientTransport.@pipedog/transport-smallwebrtc:SmallWebRTCTransportand its request handler, compatible with
Pipecat's@pipecat-ai/small-webrtc-transportclient (Bun, Node, Deno).- Serializers, byte-identical to upstream:
ProtobufFrameSerializer,RTVIClientSerializer,
TelnyxFrameSerializer. @pipedog/core:utils/py_json(Python'sjson.dumps/json.loads) andutils/base64. The
protobuf codec rejects invalid UTF-8 in string fields, andFrameSerializer.shouldIgnoreFrame
raises for a transport message that is not a dict, as upstream does.
Patch Changes
- Updated dependencies []:
- @pipedog/asyncio@0.3.0
- @pipedog/resampler-wasm@0.3.0
- @pipedog/sentencex-wasm@0.3.0
All @pipedog/* packages are released at 0.3.0:
@pipedog/anthropic@pipedog/asyncio@pipedog/audio-silero@pipedog/audio-smart-turn@pipedog/core@pipedog/google@pipedog/langchain@pipedog/onnx@pipedog/openai@pipedog/resampler-wasm@pipedog/sentencex-wasm@pipedog/serializer-protobuf@pipedog/serializer-rtvi-client@pipedog/serializer-telnyx@pipedog/tracing@pipedog/transport-smallwebrtc@pipedog/transport-websocket@pipedog/whisper
v0.2.0
Minor Changes
-
#4
f59cf26Thanks @polvallverdu! -SOXRAudioResamplerandSOXRStreamAudioResamplernow resample instead of throwing "not ported yet" when the rates differ. This also fixescreateFileResampler(),createStreamResampler(), the μ-law/A-law helpers at other rates,loadDtmfAudio()at rates other than 8 kHz,LocalSmartTurnAnalyzerV3at rates other than 16 kHz, and output transports and TTS services whose rates differ. The resampling goes through a small engine interface in@pipedog/core/audio/resamplers/engine:- The default engine is
@pipedog/resampler-wasm, which core now depends on. It loads lazily on first use, and on Cloudflare Workers it loads through the package'sworkerdexport condition. - If WebAssembly cannot be loaded, core logs one warning and falls back to a pure-TypeScript windowed-sinc engine with soxr-like presets (
createSincResamplerEngine()). setResamplerEngine(engine)lets apps inject their own engine, for example a native soxr binding.getResamplerEngine()resolves to the engine in use.
The quality presets (VHQ by default, then HQ, MQ, LQ and QQ), clearing after inactivity,
flush()andreset()behave as before. Equal rates still return the input unchanged.@pipedog/resampler-wasm:initResampler()falls back to an embedded copy of the module (src/wasm_bytes.ts) when the.wasmfile next to the package cannot be read, for example after bundling.@pipedog/resampler-wasm: the quality presets now follow libsoxr's quality table. The stopband starts at the Nyquist frequency of the lower rate. MQ, HQ and VHQ are flat to about 0.91 of it and differ mainly in attenuation: about 111, 138 and at least 157 dB. LQ (about 112 dB) and QQ (about 75 dB) have earlier roll-offs. The filter is stretched when downsampling, so it no longer leaks aliases at large ratios: a 5 kHz tone resampled from 48 kHz to 8 kHz is now 87 to 163 dB down, depending on the preset. Processing is now done in f64. Output samples, filter delays (about 8.5 ms at VHQ) andqualityInfo()values change; the output lengths do not. - The default engine is
-
#4
f59cf26Thanks @polvallverdu! - Fill four gaps in core that upstream tests exercise:- Resampling works:
SOXRAudioResampler,SOXRStreamAudioResamplerandsoxrResamplerun on
@pipedog/resampler-wasm(now a dependency) instead of throwing, so TTS services, output
transports and the audio buffer processor can convert sample rates. Callawait initSoxr()
before the synchronoussoxrResample; the async resamplers do it themselves. encodeImage()JPEG-encodes rawL/LA/RGB/RGBA/RGBXpixels with a built-in baseline
encoder (utils/jpeg_encoder), so raw image frames reach LLMs and classifiers.utils/yaml:includeLoader()/addIncludeConstructor()work, with a PyYAML-style
SafeLoader(YAML 1.1 resolvers, per-class constructors) andload()on top of theyaml
package. Included files are read with an injectedreadFile.LocalFileStoragesaves, loads, deletes and trims files through an injectedfs
(node:fs/promisesfits as is).
- Resampling works:
-
#4
f59cf26Thanks @polvallverdu! - Core is fully ported (all 361 upstream modules): the text transforms that make text speakable for
TTS (numbers, currency, dates, percentages, phone numbers, units, acronyms, email, markdown,
replacements, pronunciations,VoiceFormatter) and the WebSocket proxy client. Numbers are spoken
withnum2words-ts, as upstream usesnum2words; Unicode digits (e.g. "٥٠") are recognised and
read like upstream does. -
#6
72b8cb8Thanks @polvallverdu! - Local ONNX models.@pipedog/onnxis a small inference backend overonnxruntime-node(native,
fastest) oronnxruntime-web(WASM), both optional peer dependencies;createOnnxBackend()picks
the native one when it is installed. On Cloudflare Workers theworkerdexport condition runs
onnxruntime-web from its.wasmimported as a module.@pipedog/audio-sileroports
SileroVADAnalyzerwith the upstreamsilero_vad.onnxincluded, and
@pipedog/audio-smart-turnprovidescreateLocalSmartTurnAnalyzerV3(), core's analyzer wired to
an ONNX backend and the upstreamsmart-turn-v3.2-cpu.onnx. On Workers both models are passed in
as bytes. In core,VADAnalyzer.voiceConfidence()may now return a promise. -
#6
72b8cb8Thanks @polvallverdu! - OpenTelemetry tracing, as in Pipecat'spipecat-ai[tracing]extra, on Bun, Node, Deno and Cloudflare Workers.@pipedog/core:@opentelemetry/apiis now an optional peer dependency. When it is installed, core imports it on its own (a dynamicimport()started whenutils/tracing/setuploads, with no top-level await), andisTracingAvailable()turns true, like upstream'sis_tracing_available(). Without it, core runs as before and tracing stays a no-op.PipelineWorkerawaits that import in its async setup before deciding whether to trace, so construction order does not matter (a worker built at module top level traces too);loadOpenTelemetry()exposes the same wait.registerOpenTelemetry()still registers the modules explicitly and now wins over the automatic import. The structural OpenTelemetry types accept the real@opentelemetry/apiand@opentelemetry/sdk-trace-basemodules (array attribute values may holdnull/undefined, as in OpenTelemetry). Span names, attributes and hierarchy are unchanged and match upstream's.@pipedog/tracing(new):setupTracing({ serviceName, exporter, consoleExport }), matching upstream'ssetup_tracing(): it registers@opentelemetry/api,@opentelemetry/sdk-trace-baseand@opentelemetry/resourceswith core and installs a global tracer provider with batch span processors for the given exporter and, optionally, the console. It re-exportsOTLPTraceExporter(OTLP/HTTP JSON, from@opentelemetry/exporter-trace-otlp-http),ConsoleSpanExporter,InMemorySpanExporterand the span processors.forceFlushTracing()andshutdownTracing()export what the batch processors still hold, e.g.ctx.waitUntil(forceFlushTracing())on Cloudflare Workers.@opentelemetry/apiis a peer dependency.
Patch Changes
-
#7
122b72fThanks @polvallverdu! -@pipedog/asyncionow schedules like asyncio, so ported code interleaves exactly as it does in
Python. Waking a waiter (a future's result,Event.set(),Queue.put(), a task finishing, a
timer) no longer resumes it on the next microtask: the wakeup goes on a FIFO ready queue
(callSoon), and queued wakeups run one at a time, each once the microtask queue is empty. A task
therefore runs until it awaits something that is not done;get()on a non-empty queue,put()on
an unbounded one,wait()on a set event and awaiting a done task do not let any other task run,
andsleep(0)yields exactly one turn. The turn is driven by a MessageChannel on Node,
setImmediateon Bun and Deno, and a body read on Cloudflare Workers.- New:
Future(asyncio.Future:setResult,setException,cancel, done callbacks; awaitable),
callSoon/callLaterreturning a cancellableHandle,isFuture.TaskextendsFuture. Event,Queue(andPriorityQueue,LifoQueue),Lock,Semaphore,gather,wait,
shield,waitForandtimeoutare ported from CPython on top ofFuture, with its wakeup
rules: a wokenget()takes whatever is at the head when it runs (so aPriorityQueuehands
out the smallest item of a burst), a cancellation that arrives after the wakeup was queued wins,
gatherraises a cancellation once its children are done, andaddDoneCallbackcallbacks run
on the ready queue.waitFor(fn, t)andtimeout(t, fn)runfnin the current task, like Python 3.12+: on
expiry the task is cancelled and theCancelledErrorbecomesTimeoutError. When every
cancellation request has been withdrawn withuncancel(),task.signalis a fresh signal.Queueuses O(1) removal from the front (it usedArray.shift(), which is O(n) on V8 and made
long queues quadratic on Node, Deno and Workers).- 32 interleaving scenarios recorded from CPython 3.14 (
test/python/scenarios.py) are replayed in
the tests and in the compat smoke test on all four runtimes.
@pipedog/core:LLMAssistantAggregatorruns the LLM once for a burst of
LLMMessagesAppendFrame/FunctionCallResultFrameinstead of once per frame. Its
hasQueuedFrame(...)check now sees the later frames of the burst queued, as upstream does, so
there are no more duplicate responses. Other frame orderings that depend on asyncio scheduling
(system frames overtaking queued data frames, bus priority, interruption handling) now match
upstream too. - New:
-
Updated dependencies [
122b72f, [f59cf26](h...