Skip to content
7 changes: 7 additions & 0 deletions frontend/docs/pages/reference/changelog/python.mdx
Original file line number Diff line number Diff line change
@@ -1,5 +1,12 @@
{/* AUTOGENERATED — do not edit. Run `task sync-changelog` to regenerate from sdks/python/CHANGELOG.md */}

## v1.33.13 - 2026-06-26

### Fixed

- Reworks the internals of event pushes and stream event pubs to use `grpc.aio` directly to limit threading overhead on high-throughput workers.
- Reworks how logs are forwarded to the engine to publish from a thread instead of from an `asyncio.Task` to try to avoid event loop blocking issues.

## v1.33.12 - 2026-06-21

### Fixed
Expand Down
7 changes: 7 additions & 0 deletions sdks/python/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,13 @@ All notable changes to Hatchet's Python SDK will be documented in this changelog
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.33.13] - 2026-06-26

### Fixed

- Reworks the internals of event pushes and stream event pubs to use `grpc.aio` directly to limit threading overhead on high-throughput workers.
- Reworks how logs are forwarded to the engine to publish from a thread instead of from an `asyncio.Task` to try to avoid event loop blocking issues.

## [1.33.12] - 2026-06-21

### Fixed
Expand Down
35 changes: 35 additions & 0 deletions sdks/python/examples/events/test_event.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,41 @@ async def test_async_event_bulk_push(hatchet: Hatchet) -> None:
assert returned_event.key == hatchet.config.apply_namespace(original_event.key)


@pytest.mark.asyncio(loop_scope="session")
async def test_event_bulk_push(hatchet: Hatchet) -> None:
events = [
BulkPushEventWithMetadata(
key="event1",
payload={"message": "This is event 1", "should_skip": False},
additional_metadata={"source": "test", "user_id": "user123"},
),
BulkPushEventWithMetadata(
key="event2",
payload={"message": "This is event 2", "should_skip": False},
additional_metadata={"source": "test", "user_id": "user456"},
),
BulkPushEventWithMetadata(
key="event3",
payload={"message": "This is event 3", "should_skip": False},
additional_metadata={"source": "test", "user_id": "user789"},
),
]

e = hatchet.event.bulk_push(events)

assert len(e) == 3

# Sort both lists of events by their key to ensure comparison order
sorted_events = sorted(events, key=lambda x: x.key)
sorted_returned_events = sorted(e, key=lambda x: x.key)

# Check that the returned events match the original events
for original_event, returned_event in zip(
sorted_events, sorted_returned_events, strict=False
):
assert returned_event.key == hatchet.config.apply_namespace(original_event.key)


@pytest.fixture(scope="function")
def test_run_id() -> str:
return str(uuid4())
Expand Down
Loading
Loading