Everett Kleven
11/14/2025, 2:41 AMprompt function supports sending requests via either the v1/chat/completions/ or v1/responses endpoints to any OpenAI API compatible Server.
Since it's introduction, the OpenAI API has been adopted by a majority industry as the standard means of chatting with Language Models. This includes use-cases like structured outputs where users can specify Pydantic Models to coerce model outputs to a specific schema. Weβve added compatibility with the completions endpoint so you can still leverage prompts structured outputs even if your provider doesnβt yet support responses.
Additionally, as you can see below, prompt now supports daft.DataType.Images and daft.Files .
In fact, the actual OpenAI Responses API only works with PDFs, but with prompt , @Colin Ho added the ability to inject any text/* mime type into the prompt context. This means that any markdown, html, or csv file you reference in a prompt is automatically added to your prompt input wrapped in xml tags!
# /// script
# description = "Prompt Gemini 2.5 Flash Lite on OpenRouter with Images and Files"
# requires-python = ">=3.10, <3.13"
# dependencies = ["daft>=0.6.13", "openai", "numpy", "pillow"]
# ///
import os
import daft
from daft.functions import prompt, download, decode_image, file
daft.set_provider(
"openai",
base_url="<https://openrouter.ai/api/v1>",
api_key=os.environ.get("OPENROUTER_API_KEY")
)
df = daft.from_pydict({
"prompt": ["Whats in this image and file?"],
"my_image": ["/Users/MyName/Desktop/SomeImage.png"],
"my_file": ["/Users/MyName/Downloads/SomePdf.pdf"],
})
# Decode the image and file paths
df = df.with_column(
"my_image",
decode_image(download(daft.col("my_image")))
)
df = df.with_column(
"my_file",
file(daft.col("my_file"))
)
# Prompt Usage for Chat Completions with Images and Files
df = df.with_column(
"result",
prompt(
messages=[daft.col("prompt"), daft.col("my_image"), daft.col("my_file")],
system_message="You are a helpful assistant.",
model="google/gemini-2.5-flash-lite",
provider="openai",
use_chat_completions=True,
)
)
print(df.select("result").to_pydict())
There has been a tremendous amount of development on the prompt api recently to get to this point.
We can't wait to see what you build with prompt!Everett Kleven
12/09/2025, 9:57 PMEverett Kleven
12/18/2025, 3:04 AMprompt
β’ New daft.AudioFile subtype to daft.File
!!! Additionally 0.7.0 comes with a few important removals
β’ removal of daft spark connect π₯ BREAKING CHANGE
β’ removal of the legacy ray runner
We've been waiting to hear back from PyPi to increase our quota for storage, but responses have been slow. For this reason we have needed to delete an older release with an existing duplicate under the old getdaft package. If you are using daft==0.4.7, please switch to getdaft==0.4.7 as daft release 0.4.7 no longer exists.
π As always lets celebrate all of the hard work from our amazing contributors that have made this project possible!Everett Kleven
12/18/2025, 4:16 PMEverett Kleven
12/19/2025, 9:54 PMEverett Kleven
12/22/2025, 6:52 PMEverett Kleven
02/17/2026, 6:56 PMEverett Kleven
02/18/2026, 9:20 PMEverett Kleven
02/21/2026, 1:33 AMEverett Kleven
02/26/2026, 12:25 AMuv add "daft=>0.7.4"Everett Kleven
03/02/2026, 11:41 PMEverett Kleven
03/17/2026, 6:02 PMEverett Kleven
03/24/2026, 3:09 PMEverett Kleven
04/06/2026, 10:21 PMEverett Kleven
04/07/2026, 5:50 PMdaft.from_files(uri) and daft will glob your skills into a dataframe. Have Claude extract structured insights with daft.functions.prompt (use structured outputs)!
Heres what makes daft.File different:
π Lazy by default β point at a million S3 files, nothing downloads until you need it
π Subtypes β VideoFile, AudioFile carry domain-specific operations (seek, keyframes, resample)
π Open and seek β distributed concurrent reads across byte ranges, like WebDatasets but native to the type system
π Extensible β any Python library works via .open() and .to_tempfile() in UDFs
PDFs, video, audio, code β all processed as first-class data with distributed execution and cloud-native I/O.
Daft is the data engine for AI.
daft.File is the type that makes it possible.
Blog: https://www.daft.ai/blog/daftfile-work-with-any-file-anywhere
Docs: https://docs.daft.ai/en/stable/modalities/files/
Example: https://github.com/Eventual-Inc/daft-examples/blob/main/pipelines/context\_engineering/claude\_insights.pyEverett Kleven
04/08/2026, 6:00 PMEverett Kleven
04/09/2026, 9:19 PMEverett Kleven
04/11/2026, 5:53 PMEverett Kleven
04/13/2026, 5:00 PMEverett Kleven
04/14/2026, 10:23 PMEverett Kleven
04/16/2026, 2:55 PMEverett Kleven
04/20/2026, 6:23 PMEverett Kleven
04/21/2026, 2:55 PMEverett Kleven
04/22/2026, 6:23 PMEverett Kleven
05/13/2026, 8:14 PMread_video_frames β filter on keyframes; supports S3, GCS, & YouTube URLs.
β’ video_metadata β resolution, fps, duration, frame count from file headers.
β’ video_frames(start_time, end_time) β decode a 10-second window from a 90-minute file.
Frames land as Image columns in the same DataFrame.
Feed them to a vision model, compute embeddings, and write to Iceberg.
Check out the blog
https://www.daft.ai/blog/daft-videofile-seek-lazily-get-framesEverett Kleven
05/14/2026, 6:27 PMmerge_asof but rewrites it to a correlated subquery under the hood. If you're running TB-scale pipelines, none of these work.
Daft now has native distributed ASOF joins. Here's what it took to get there:
β’ V1 (sort + two pointers): 133s on 100M rows β 3.75x slower than pandas; string comparisons dominated every sort comparison
β’ V2 (hash grouping): 36s β hash by entity key first, then sort only the integer timestamp column within each group
β’ V3 (streaming probe): 21s, 4 GB peak β right table streams in parallel batches; parallelism is now batch count, not entity cardinality
β’ V4 (range partitioned + distributed): 283s β 31s scaling from 2 to 8 nodes, skew-resistant via carryovers
Daft is the first distributed DataFrame library with a native ASOF join built-in.
Link in the comments.Everett Kleven
05/27/2026, 5:53 PMEverett Kleven
06/09/2026, 5:20 PMEverett Kleven
07/01/2026, 4:33 PMEverett Kleven
07/09/2026, 4:43 AM