We're happy to share the April Pixeltable release cycle, covering v0.5.24 through v0.6.0. Pixeltable lets developers build multimodal AI apps in Python with tables that store data, run model calls, transform media, and index embeddings.
You can upgrade with:
April brought a shower of PRs: 74 across 6 releases, bringing Pixeltable to 223 merged PRs across 20 releases in 2026 so far.
This post pulls out the highlights from that cycle. For April, we focused those highlights around the messy middle of multimodal AI apps: the point where prompts, source media, generated outputs, embeddings, provider calls, and review state start spreading across too many places.
The release adds more ways to keep that work visible in tables: transform media, call providers, shape structured outputs, reuse existing embeddings, stream larger results, and keep provider-heavy jobs inside rate limits.
You can see a full list of changes in the Pixeltable changelog or the GitHub compare view.
OpenAI Responses API support#
There is a new openai.responses() UDF for the OpenAI Responses API. It handles response creation, tool invocation, and adaptive rate-limit-aware execution from a Pixeltable provider call.
For simple computed-column use cases, the API fits the same Pixeltable pattern as other provider calls:
The Responses API work also sits next to a provider scheduling fix in this release. Pixeltable accounts for in-flight OpenAI and Gemini requests more accurately, which helps avoid a burst of undercounted work turning into a cascade of 429 errors.
Sources: OpenAI SDK docs · #1293
More video work inside video columns#
April added a broader set of FFmpeg-backed video UDFs. The release includes common transforms such as reverse(), scroll(), zoom(), speed(), rotate(), and grayscale(), along with helpers for audio and overlays like mix_audio() and overlay_text().
These are the edits that often turn into one-off FFmpeg scripts next to an otherwise table-based workflow: add a caption, pan across an image sequence, mix in background audio, rotate a clip, or generate a grayscale variant for downstream processing.
A few details make these operations easier to compose. pan() works better as an expression UDF, and mix_audio() and overlay_text() gained more controls for duration, normalization, alignment, and multi-line text spacing.
For a full example, the new image-to-video slideshow cookbook shows how to build a slideshow from table rows with pans, overlays, concatenation, and background music.
Sources: Video SDK docs · Image-to-video slideshow cookbook · #1226 · #1240 · #1284 · #1300
Gemini audio and reference-image video#
Gemini support also expanded in April. New UDFs add speech generation with generate_speech() and audio transcription with transcribe(), while generate_videos() accepts up to three reference images for Veo 3.1-style video generation.
For audio transcription, the flow stays close to the data:
Generated audio and transcripts can stay alongside the prompts, source media, labels, and review state that produced them, rather than being stitched together after the fact.
Sources: Gemini SDK docs · Working with Gemini · #1221
Structured outputs, embeddings, and larger results#
Another April thread was turning model output into application data.
list_iterator turns JSON lists and tuples into Pixeltable component views with inferred schemas. Structured outputs can become table-shaped data without a separate unpacking step before joins, filters, or inspection.
JSON schemas also got richer. Pixeltable handles tuples, lists, dictionaries, TypedDict, and Pydantic models in JSON column schemas. Rich JSON computed columns also got a fix for values that contain offloadable objects such as PIL images, NumPy arrays, and bytes.
For retrieval workflows, add_embedding_index() indexes embedding vectors already stored in Array columns. That helps when embeddings were computed outside Pixeltable, or when you are migrating an existing vector workflow and want those vectors to participate in Pixeltable similarity search.
For larger reads, April introduced streaming ResultSets via ResultCursor. Instead of materializing a large query result all at once with collect(), Python clients have a row-by-row path for result processing.
Sources: Iterator docs · Embedding index docs · #1231 · #1096 · #1259
Smaller fixes that show up in real apps#
Some April fixes are less visible than a new UDF, but they show up quickly once you rerun the same workflow:
- Pixeltable catches duplicate primary keys earlier when inserting or validating app data.
- UDF argument errors are clearer when a function call has the wrong shape.
- Per-function rate-limit estimates help the scheduler choose the right estimator when UDFs share provider pools.
- Hugging Face DETR object-detection UDFs load without special revision pins or config patches for
dilationandno_timm.
Sources: #1203 · #1215 · #1291 · #1275 · #1191 · #1176 · #1294 · #1241 · #1256
What's next?#
April showers bring May multimodal apps. Follow us on LinkedIn this week for PyCon US 2026; we'll have more to share on serving.
Acknowledgements#
A big thank you to everyone who contributed PRs, reviews, tests, docs, and release work for this cycle.

