Quixstreams

Latest version: v3.12.0

Safety actively analyzes 722491 Python packages for vulnerabilities to keep your Python projects secure.

Scan your dependencies

Page 1 of 9

3.12.0

What's Changed
* Gracefully handle `None` values in built-in windowed aggregations like `sum()` and `count()` by gwaramadze in https://github.com/quixio/quix-streams/pull/789
* Add a flag to automatically convert integers to floats to InfluxDB3Sink by tim-quix in https://github.com/quixio/quix-streams/pull/793
* Upgrade confluent-kafka to >=2.8.2,<2.9 by gwaramadze in https://github.com/quixio/quix-streams/pull/799
* Include optional dependencies for confluent-kafka and fix anaconda dependencies by gwaramadze in https://github.com/quixio/quix-streams/pull/804


**Full Changelog**: https://github.com/quixio/quix-streams/compare/v3.11.0...v3.12.0

3.11.0

What's Changed
πŸ’Ž Stop conditions for `Application.run()`
`Application.run()` now accepts additional `count` and `timeout` parameters to stop itself when the condition is met.

It is intended for interactive debugging of the applications on smaller portions of data.

How it works:
- `count` - a number of messages to process from main SDF input topics (default 0 == infinite)
- `timeout` - the maximum time in seconds to wait for a new message to appear (default 0.0 == infinite).

**Example:**

python
from quixstreams import Application

app = Application(...)
... some processing happening here ...

app.run(
count=20, Process 20 messages from input topics
timeout=5, Wait for 5s if fewer than 20 messages are available in the topics.
)


For more info, see the [Inspecting Data & Debugging](https://quix.io/docs/quix-streams/debugging.html#applicationrun-stop-conditions) docs page.


by tim-quix in https://github.com/quixio/quix-streams/pull/780

[breaking] πŸ’₯ Changes to `Sink.flush()`
This release introduces breaking changes to the `Sink.flush()` method and Sinks API overall in order to accommodate future features like joins.

- Sinks are now flushed first on each checkpoint before producing changelogs to minimize potential over-production in case of Sink's failure.
_Previously, changelogs were produced first, and only then Sinks were flushed._

- Sink.flush() is now expected to flush all the accumulated data for all TPs.
**The custom implementations of Sinks need to be updated.**
_Previously, `Sink.flush()` was called for each processed topic partition._


- `SinkBackpressureError` now pauses the whole assignment instead of certain partitions only.


By daniil-quix in https://github.com/quixio/quix-streams/pull/786


🦠Bugfixes
- default sink connect fail callback should raise by tim-quix in https://github.com/quixio/quix-streams/pull/794
πŸ› οΈ Other changes
* Refactor recovery to support Stores belonging to multiple topics by daniil-quix in https://github.com/quixio/quix-streams/pull/774

* windows: Split Aggregations and collectors into classes in https://github.com/quixio/quix-streams/pull/772
* tweak Source to have a defined setup method for easier simple use cases by tim-quix in https://github.com/quixio/quix-streams/pull/783
* remove all source and sink setup abstracts by tim-quix in https://github.com/quixio/quix-streams/pull/784
* InfluxDb v3 sink tags improvements by tomas-quix in https://github.com/quixio/quix-streams/pull/795

⚠️ Upgrade considerations
In https://github.com/quixio/quix-streams/pull/774, the format of the changelog message headers was changed.
When updating the existing application running with `processing_guarantee="at-least-once"` (default), ensure the app is stopped normally and the last checkpoint is committed successfully before upgrading to the new version.
See https://github.com/quixio/quix-streams/pull/774 for more details.

**Full Changelog**: https://github.com/quixio/quix-streams/compare/v3.10.0...v3.11.0

3.10.0

What's Changed
πŸ’Ž Window closing strategies
Previously, windows used the **`"key"`** closing strategy.
With this strategy, messages advance time and close only windows with the same message key.
It helps to capture more data when it's not aligned in time (e.g. some keys are produced irregularly), but the latest windows can remain unprocessed until the message with the same key is received.

In this release, we added a new `"partition"` strategy, and an API to configure the strategy for tumbling and hopping windows (sliding windows don't support it yet).

With `"partition"` closing strategy, messages advance time and close windows for the whole partition to which this key belongs.
It helps to close windows faster because different keys advance time at the cost of potentially skipping more out-of-order messages.

**Example:**


from datetime import timedelta
from quixstreams import Application

app = Application(...)
sdf = app.dataframe(...)

Define a window with the "partition" closing strategy.
sdf = sdf.tumbling_window(timedelta(seconds=10)).sum().final(closing_strategy="partition")


Learn more about closing strategies in the docs - https://quix.io/docs/quix-streams/windowing.html#closing-strategies

Added by quentin-quix in https://github.com/quixio/quix-streams/pull/747


πŸ’Ž Connectors status callbacks
Sinks and Sources now accept optional `on_client_connect_success` and `on_client_connect_failure` callbacks and can trigger them to inform about the Connector status during setup.

By tim-quix in 708 775

🦠 Bugfixes
* fix bad timestamps in test_app by tim-quix in https://github.com/quixio/quix-streams/pull/768
* Bound protobuf<6.0 in tests by quentin-quix in https://github.com/quixio/quix-streams/pull/773
* Bugfix for recovering from exactly 1 changelog message by tim-quix in https://github.com/quixio/quix-streams/pull/769
* print_table method handles non-dict values by gwaramadze in https://github.com/quixio/quix-streams/pull/767

πŸ› οΈ Other changes

* Create topics eagerly the moment they are defined by daniil-quix in https://github.com/quixio/quix-streams/pull/763
* Increase default timeout and retries for `Producer.produce` by quentin-quix in https://github.com/quixio/quix-streams/pull/771
* Add rich license by gwaramadze in https://github.com/quixio/quix-streams/pull/776
* update docs and tutorials based on connect callback addition by tim-quix in https://github.com/quixio/quix-streams/pull/775
* typing: make state protocols and ABCs generic by quentin-quix in https://github.com/quixio/quix-streams/pull/777



**Full Changelog**: https://github.com/quixio/quix-streams/compare/v3.9.0...v3.10.0

3.9.0

What's Changed
πŸ’ŽTable-style printing of StreamingDataFrames
You can now examine the incoming data streams in a table-like format `StreamingDataFrame.print_table()` feature.

For interactive terminals, it can print new rows row-by-row in a **live mode** with an artificial delay, allowing you to glance at the data stream easily.
For non-interactive environments (stdout, file, etc.) or if `live=False`, it will print rows in batches as soon as the data is available to the application.

This is an experimental feature, so feel free to submit an issue with your feedback πŸ‘

See [the docs](https://quix.io/docs/quix-streams/processing.html#table-printing) to learn more about `StreamingDataFrame.print_table()`.



sdf = app.dataframe(...)
some SDF transformations happening here ...

Print last 5 records with metadata columns in live mode
sdf.print_table(size=5, title="My Stream", live=True)

For wide datasets, limit columns to improve readability
sdf.print_table(
size=5,
title="My Stream",
columns=["id", "name", "value"],
column_widths={"name": 20}
)


Live output:
My Stream
┏━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━┓
┃ _key ┃ _timestamp ┃ id ┃ name ┃ value ┃
┑━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━┩
β”‚ b'53fe8e4' β”‚ 1738685136 β”‚ 876 β”‚ Charlie β”‚ 42.5 β”‚
β”‚ b'91bde51' β”‚ 1738685137 β”‚ 11 β”‚ Alice β”‚ 18.3 β”‚
β”‚ b'6617dfe' β”‚ 1738685138 β”‚ 133 β”‚ Bob β”‚ 73.1 β”‚
β”‚ b'f47ac93' β”‚ 1738685139 β”‚ 244 β”‚ David β”‚ 55.7 β”‚
β”‚ b'038e524' β”‚ 1738685140 β”‚ 567 β”‚ Eve β”‚ 31.9 β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


By gwaramadze in 740, 760


Bugfixes
- ⚠️ Fix default state dir for Quix Cloud apps by gwaramadze in https://github.com/quixio/quix-streams/pull/759
Please note that the state may be recovered to a different directory when updating existing deployments in Quix Cloud if `state_dir` is not set.

- [Issue 440] ignore errors in rmtree by ulisesojeda in https://github.com/quixio/quix-streams/pull/753
- Fix `QuixPortalApiService` failing in multiprocessing environment by daniil-quix in https://github.com/quixio/quix-streams/pull/755

Docs
* Add missing "how to install" section for `PandasDataFrameSource` by daniil-quix in https://github.com/quixio/quix-streams/pull/751

New Contributors
* ulisesojeda made their first contribution in https://github.com/quixio/quix-streams/pull/753

**Full Changelog**: https://github.com/quixio/quix-streams/compare/v3.8.1...v3.9.0

3.8.1

What's Changed
- New [PandasDataFrameSource connector](https://quix.io/docs/quix-streams/connectors/sources/pandas-source.html) to stream data from pandas.DataFrames during development and debugging by JotaBlanco and daniil-quix in https://github.com/quixio/quix-streams/pull/748

- Made logging of common Kafka ACL issues more helpful by providing potentially missing ACLs and topic names by tim-quix in
https://github.com/quixio/quix-streams/pull/742

* Fix docs for MongoDBSink by tim-quix in https://github.com/quixio/quix-streams/pull/746
* Bump mypy from 1.13.0 to 1.15.0 by dependabot in https://github.com/quixio/quix-streams/pull/744

**Full Changelog**: https://github.com/quixio/quix-streams/compare/v3.8.0...v3.8.1

3.8.0

What's Changed
πŸ’Ž Count-based windows
Count-based windows allow aggregating events based on their number instead of time.
They can be helpful when time is not relevant to the particular aggregation or when a large number of out-of-order events are expected in the data stream.
Count-based windows support the same aggregations as time-based windows, including `.reduce()` and `.collect()`.
Supported window types:
- `tumbling_count_window()` - slice incoming stream into fixed-sized batches
- `hopping_count_window()` - slice incoming stream into overlapping batches of a fixed size with a fixed step.
- `sliding_count_window()` - same as to count-based hopping windows with a step of 1 (e.g., last 10 events in the stream)

**Example:**

from quixstreams import Application

app = Application(...)
sdf = app.dataframe(...)


sdf = (
Define a count-based tumbling window of size 3
sdf.tumbling_count_window(count=3)

Specify the "collect" aggregate function
.collect()

Emit updates once the window is closed
.final()
)

Expected output:
{
"value": [<event1>, <event2>, <event3>],
"start": <min timestamp in the batch>,
"end": <max timestamp in the batch>
}


See the ["Windowed Aggregations"](https://quix.io/docs/quix-streams/windowing.html) docs page for more info.

By quentin-quix in https://github.com/quixio/quix-streams/pull/736 #739

πŸ’Ž New Connectors
* [MongoDB Sink](https://quix.io/docs/quix-streams/connectors/sinks/mongodb-sink.html)
* [Neo4j Sink](https://quix.io/docs/quix-streams/connectors/sinks/neo4j-sink.html)

By tim-quix in https://github.com/quixio/quix-streams/pull/733 #727

πŸ’Ž A callback to react to late messages in Windows
Time-based windows can now accept `on_late` callbacks to react to late messages in the windows.
You can use this callback to customize the logging of such messages or to send them to some dead-letter queue, for example.

**Example**:

from typing import Any

from datetime import timedelta
from quixstreams import Application

app = Application(...)
sdf = app.dataframe(...)


def on_late(
value: Any, Record value
key: Any, Record key
timestamp_ms: int, Record timestamp
late_by_ms: int, How late the record is in milliseconds
start: int, Start of the target window
end: int, End of the target window
name: str, Name of the window state store
topic: str, Topic name
partition: int, Topic partition
offset: int, Message offset
) -> bool:
"""
Define a callback to react on late records coming into windowed aggregations.
Return `False` to suppress the default logging behavior.
"""
print(f"Late message is detected at the window {(start, end)}")
return False

Define a 1-hour tumbling window and provide the "on_late" callback to it
sdf.tumbling_window(timedelta(hours=1), on_late=on_late)


Start the application
if __name__ == '__main__':
app.run()


See more in [the docs](https://quix.io/docs/quix-streams/windowing.html#reacting-on-late-events)

by daniil-quix in 701 732

🦠 Bugfixes
* Do not process late messages in sliding windows by gwaramadze in https://github.com/quixio/quix-streams/pull/728

Other Changes
* StreamingDataFrame.merge(): prep work by daniil-quix in https://github.com/quixio/quix-streams/pull/725
* windows: extract base class for windows and window definitions by quentin-quix in https://github.com/quixio/quix-streams/pull/730
* state: refactor collection store to not rely on timestamp by quentin-quix in https://github.com/quixio/quix-streams/pull/734


**Full Changelog**: https://github.com/quixio/quix-streams/compare/v3.7.0...v3.8.0

Page 1 of 9

Β© 2025 Safety CLI Cybersecurity Inc. All Rights Reserved.