Release Notes¶
v2.4.3¶
Fixes two task queue issues: pydantic secret params were masked when a task run was serialized to the queue, and a params validation error on the consumer side crashed the worker.
- Secret params now survive the round-trip through the task queue and the
cpu-bound subprocess. Task runs are serialized for the queue with secret
values revealed via the new
params_dumphelper; all other dumps (logs, endpoints) keep secrets masked. (#103) - A task run consumed from the queue with invalid params no longer kills the
consumer worker. The broker raises the new
TaskParamsErrorcarrying the task run, and the consumer logs the error and marks the run as failed. (#103)
v2.4.2¶
Tasks can now be tagged at registration time.
- The task registration methods accept an optional
tagsargument. When provided, the extra tags are merged into each task's own tags as it is registered — applied acrossregister_task,register_from_module, andregister_from_dict. (#102) - Bumped
python-json-loggerto>= 4.1.0and switched JSON logging to the newpythonjsonlogger.jsonformatter path (the oldpythonjsonlogger.jsonloggermodule is deprecated). (#102)
v2.4.1¶
Task history can now be filtered by task tags.
- Added a
tagsfield to task history queries. Runs match when their task carries at least one of the given tags, resolved against the live registry. (#101)
v2.4.0¶
Lazy settings via pydantic-settings, JSONB params filtering for task history, and customisable route prefixes.
- Settings are now lazy — resolved on first access instead of at import
time. Env vars use a
FLUID_prefix by default; legacy unprefixed names are kept as aliases. (#100) - The task database plugin accepts a
route_prefixparameter for customising history route URLs and replaceswith_task_history_router()with aregister_routes()method. (#100) - Task history queries support filtering by run params via a new
paramsfield (renamed fromHistoryQuerytoTaskHistoryQuery). (#99) - Database migration required: the
paramscolumn is nowJSONBwith a GIN index. See the example migration for the schema changes. - Removed
get_loggerfromfluid.utils.log. Task loggers are now obtained directly vialogging.getLogger(module).
v2.3.1¶
v2.3.0 is broken — do not use it.
Fixes a regression in v2.3.0 where the httpx2 dependency was pinned to
>=2.2.0, which fails on Python 3.14 builds missing the _zstd C extension.
Pins httpx2 to >=2.0.0, <2.1.0 and switches all httpx imports to
httpx2 for correct namespace resolution.
httpx2is now pinned to>=2.0.0, <2.1.0— versions 2.1.0+ require thecompression.zstdstdlib module which is not available in all Python 3.14 builds. (#98)- All
import httpxstatements replaced withimport httpx2 as httpx(orfrom httpx2 import ...) to ensure correct namespace resolution regardless ofhttpx2version. - Added test coverage for HttpxClient and HttpxResponse.
v2.3.0¶
Moves development and documentation dependencies from optional-dependencies to
dependency groups, switches to
httpx2 for HTTP client support, and removes
the inflection dependency.
devanddocsdependencies are now declared under[dependency-groups]instead of[project.optional-dependencies]. Installed viauv sync --all-groups.- The
httpextra now useshttpx2instead ofhttpx.httpx2provides the samehttpxmodule so no code changes are required. (#97) - The
inflectiondependency has been removed. (#96)
v2.2.6¶
Adds tag filtering for task listings and fixes a race in the task database plugin.
- Task listings can be filtered by tag: the
GET /tasksendpoint and thelscommand of the task CLI accept a repeatabletagsoption that returns only tasks carrying at least one of the given tags, andTaskInfonow reports each task's tags. (#94) - The task database plugin
now serialises its per-run lifecycle writes with a dedicated task-run lock.
CrudDB.db_upsertis not atomic — it issues anUPDATEand onlyINSERTs when nothing matched — so when the scheduler wrote thequeuedrow and a consumer wrote therunningrow a few milliseconds later, the consumer'sUPDATEcould miss the not-yet-committedINSERT, fall through to its ownINSERTand violate the task-runs primary key. Holding the lock around the upsert removes the race. (#95) - TaskRun.lock
accepts an optional
nameto acquire a named sub-lock for the task run, andtimeoutnow defaults toNone. (#95)
v2.2.5¶
- The task decorator
accepts an
envmapping of extra environment variables, injected into the subprocess for CPU-bound tasks and forwarded to the container for tasks dispatched as Kubernetes Jobs. (#90)
v2.2.4¶
Bug-fix release for the task scheduler.