---
name: Python SDK
slug: inngest-python-sdk
type: github
source_url: https://github.com/inngest/inngest-py
organization: Inngest
organization_slug: inngest
total_releases: 61
latest_version: inngest@0.5.18
latest_date: 2026-03-11
last_updated: 2026-04-19
tracking_since: 2023-11-20
canonical: https://releases.sh/inngest/inngest-python-sdk
organization_url: https://releases.sh/inngest
---

<Release version="inngest@0.5.18" date="March 11, 2026" published="2026-03-11T19:18:21.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.18">
# Features
- Add `app_version` field (relevant for Connect).

# Fixes
- Fix duration parser only considers largest time unit.

# Full Changelog
https://github.com/inngest/inngest-py/compare/inngest@0.5.17...inngest@0.5.18
</Release>

<Release version="inngest@0.5.17" date="March 3, 2026" published="2026-03-03T16:59:51.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.17">
# Fixes
- Fix thread-blocking user code causing Inngest server to think Connect worker died. Solved by putting Connect internals into a dedicated thread.

# Full changelog
https://github.com/inngest/inngest-py/compare/inngest@0.5.16...inngest@0.5.17
</Release>

<Release version="inngest@0.5.16" date="March 3, 2026" published="2026-03-03T16:22:50.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.16">
# Fixes
- Fix not reraising `before_send_events` error

# Full changelog
https://github.com/inngest/inngest-py/compare/inngest@0.5.15...inngest@0.5.16
</Release>

<Release version="inngest@0.5.15" date="January 26, 2026" published="2026-01-26T18:06:01.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.15">
# Fixes
- Fix parallel steps not working.
- Fix large payload sizes (>1 MB) silently ignored (Connect only).

# Full changelog

https://github.com/inngest/inngest-py/compare/inngest@0.5.14...inngest@0.5.15
</Release>

<Release version="inngest@0.5.14" date="January 20, 2026" published="2026-01-20T22:54:15.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.14">
# Features
- Add debounce timeout config

# Fixes

- Fix Connect worker shutdown not informing Inngest Server

# Improvements

- Improve error messages when Connect has an invalid WebSocket URL
- Remove `"authentication_succeeded": false` from GET response
</Release>

<Release version="inngest@0.5.13" date="November 25, 2025" published="2025-11-25T02:59:46.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.13">
## Fixes
- Fix sending message to closed WebSocket connection not forcing reconnect. (Connect only)
- Fix graceful close not waiting for long-running steps. (Connect only)

## What's Changed
* Fix sending message to closed WebSocket not forcing reconnect by @amh4r in https://github.com/inngest/inngest-py/pull/309
* Fix some tasks closing before pending requests are done by @amh4r in https://github.com/inngest/inngest-py/pull/311
* Bump version to 0.5.13 by @amh4r in https://github.com/inngest/inngest-py/pull/312


**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.5.12...inngest@0.5.13
</Release>

<Release version="inngest@0.5.12" date="November 13, 2025" published="2025-11-13T20:03:27.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.12">
## Features
* Adding a `max_worker_concurrency` field for Connect to allow maximum number of simultaneous requests for a worker.

## What's Changed
* Add userland ID & index to Ops by @rhino1998 in https://github.com/inngest/inngest-py/pull/303
* [SYS-370] Add Worker Concurrency - Python Client Support by @mar-inngest in https://github.com/inngest/inngest-py/pull/306
* Add test for constraint-dependencies by @amh4r in https://github.com/inngest/inngest-py/pull/307

## New Contributors
* @rhino1998 made their first contribution in https://github.com/inngest/inngest-py/pull/303

**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.5.11...inngest@0.5.12
</Release>

<Release version="inngest@0.5.11" date="October 27, 2025" published="2025-10-27T16:35:27.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.11">
## Fixes
- Fix failed Connect handshake when concurrency scope is unspecified.

## What's Changed
* Add Nix Flakes For Python SDK by @mar-inngest in https://github.com/inngest/inngest-py/pull/300
* fix: invalid connect handshake w/concurrency config by @Linell in https://github.com/inngest/inngest-py/pull/301
* Bump version to 0.5.11 by @Linell in https://github.com/inngest/inngest-py/pull/302

## New Contributors
* @mar-inngest made their first contribution in https://github.com/inngest/inngest-py/pull/300

**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.5.10...inngest@0.5.11
</Release>

<Release version="inngest@0.5.10" date="October 21, 2025" published="2025-10-21T16:46:48.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.10">
## Features
- Add `Server-Timing` response header.

## Fixes
- Improve Connect close process.

## What's Changed
* Fast API realtime end-to-end example by @djfarrelly in https://github.com/inngest/inngest-py/pull/288
* feat: add StepFailed opcode by @Linell in https://github.com/inngest/inngest-py/pull/291
* Move more tests to new history by @amh4r in https://github.com/inngest/inngest-py/pull/293
* Use pipe operator everywhere by @amh4r in https://github.com/inngest/inngest-py/pull/295
* Fix Connect closing wonkiness by @amh4r in https://github.com/inngest/inngest-py/pull/296
* Add Server-Timing response header by @amh4r in https://github.com/inngest/inngest-py/pull/294
* Bump version to 0.5.10 by @amh4r in https://github.com/inngest/inngest-py/pull/297

## New Contributors
* @Linell made their first contribution in https://github.com/inngest/inngest-py/pull/291

**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.5.9...inngest@0.5.10
</Release>

<Release version="inngest@0.5.9" date="September 25, 2025" published="2025-09-25T19:23:12.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.9">
## Features
- Realtime publishing. This is still experimental but we don't expect the interface to change much

## What's Changed
* Implement realtime publishing support by @djfarrelly in https://github.com/inngest/inngest-py/pull/281
* Bump version to 0.5.9 by @djfarrelly in https://github.com/inngest/inngest-py/pull/292


**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.5.8...inngest@0.5.9
</Release>

<Release version="inngest@0.5.8" date="September 24, 2025" published="2025-09-24T14:57:16.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.8">
## Fixes
- Fix Connect not handling close frames.

## What's Changed
* Extract HTTP logic into new HTTPClient by @amh4r in https://github.com/inngest/inngest-py/pull/284
* Fix Connect not handling normal close by @amh4r in https://github.com/inngest/inngest-py/pull/289
* Bump version to 0.5.8 by @amh4r in https://github.com/inngest/inngest-py/pull/290


**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.5.7...inngest@0.5.8
</Release>

<Release version="inngest@0.5.7" date="September 22, 2025" published="2025-09-22T16:38:15.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.7">
## Fixes
- Expose `Timeouts` class (as `inngest.Timeouts`).
- Fix Connect signal handlers added when not in main thread.
- Fix Connect not working with branch environments.

## PRs
* Expose Timeouts class by @surya-crediflow in https://github.com/inngest/inngest-py/pull/273
* Fix Connect signal handlers outside main thread by @amh4r in https://github.com/inngest/inngest-py/pull/279
* Use new GQL resolvers for tests by @amh4r in https://github.com/inngest/inngest-py/pull/285
* Fix Connect not working with branch envs by @amh4r in https://github.com/inngest/inngest-py/pull/280
* Bump version to 0.5.7 by @amh4r in https://github.com/inngest/inngest-py/pull/286

## New Contributors
* @surya-crediflow made their first contribution in https://github.com/inngest/inngest-py/pull/273

**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.5.6...inngest@0.5.7
</Release>

<Release version="inngest@0.5.6" date="August 28, 2025" published="2025-08-28T15:27:21.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.6">
# Features
- Add `if` support in the batch config. This conditional boolean expression, when provided, would determine which events get batched together for execution.

# Fixes
- Fix Connect lease issue where expired leases didn’t cancel the run or stop the lease extension.

# Full Changelog
https://github.com/inngest/inngest-py/compare/inngest@0.5.5...inngest@0.5.6
</Release>

<Release version="inngest@0.5.5" date="August 13, 2025" published="2025-08-13T14:17:41.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.5">
# Features
- Add `parallel_mode` kwarg to `group.parallel`. Setting it to `ParallelMode.RACE` will allow sequential steps in a parallel group to execute independent of other parallel groups at the expense of more requests to your app.

# Fixes
- Fix Connect heartbeater dying on error.

# Full Changelog
https://github.com/inngest/inngest-py/compare/inngest@0.5.4...inngest@0.5.5
</Release>

<Release version="inngest@0.5.4" date="July 17, 2025" published="2025-07-17T13:25:51.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.4">
# Fixes
- Fix deserialization error when using `PydanticSerializer`
</Release>

<Release version="inngest@0.5.3" date="July 15, 2025" published="2025-07-15T21:16:48.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.3">
## inngest v0.5.3

# Fixes
- Fix occasional reconnect error after draining.
</Release>

<Release version="inngest@0.5.1" date="June 30, 2025" published="2025-06-30T20:11:44.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.1">
## inngest v0.5.1

## Features
- Add `public_path` arg to `serve`. This is useful when behind a path-rewriting proxy

## Fixes
- Fix Connect heartbeater using a stale connection after reconnecting
- Fix `anyio.WouldBlock` error when streaming is enabled

## What's Changed
* Switch to uv by @amh4r in https://github.com/inngest/inngest-py/pull/260
* Backport v0.4 changes by @amh4r in https://github.com/inngest/inngest-py/pull/262
* Fix Connect hearbeater using stale connection by @amh4r in https://github.com/inngest/inngest-py/pull/261
* Release SDK v0.5.1 by @amh4r in https://github.com/inngest/inngest-py/pull/263


**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.5.0...inngest@0.5.1
</Release>

<Release version="inngest@0.5.0" date="June 23, 2025" published="2025-06-23T16:50:54.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.5.0">
## inngest v0.5.0

Release blog post [here](https://www.inngest.com/blog/2025-06-23-python-v0.5)

Full migration guide [here](https://www.inngest.com/docs/reference/python/migrations/v0.4-to-v0.5)

# New features

- First-class Pydantic support in step and function output
- AI orchestration with `step.infer` ([docs](https://www.inngest.com/docs/features/inngest-functions/steps-workflows/step-ai-orchestration)) -- currently experimental
- Connect is stable ([docs](https://www.inngest.com/docs/setup/connect))
- Python 3.13 support
- Event-sending retries
- Function singletons ([docs](https://www.inngest.com/docs/guides/singleton))
- Function timeouts ([docs](https://www.inngest.com/docs/features/inngest-functions/cancellation/cancel-on-timeouts))
- Improved parallel step performance

# Breaking changes

## Move `step` into `ctx`
The `step` object will be moved to `ctx.step`.

Before:
```py
@inngest_client.create_function(
    fn_id="provision-user",
    trigger=inngest.TriggerEvent(event="user.signup"),
)
async def fn(ctx: inngest.Context, step: inngest.Step) -> None:
    await step.run("create-user", create_db_user)
```

After:
```py
@inngest_client.create_function(
    fn_id="provision-user",
    trigger=inngest.TriggerEvent(event="user.signup"),
)
async def fn(ctx: inngest.Context) -> None:
    await ctx.step.run("create-user", create_db_user)
```

## Parallel steps
`step.parallel` will be removed in favor of a new `ctx.group.parallel` method. This method will behave the same way, so it's a drop-in replacement for `step.parallel`.

```py
@client.create_function(
  fn_id="my-fn",
  trigger=inngest.TriggerEvent(event="my-event"),
)
async def fn(
  ctx: inngest.Context,
  step: inngest.Step,
) -> None:
  user_id = ctx.event.data["user_id"]

  await ctx.group.parallel(
    (
      lambda: step.run("update-user", update_user, user_id),
      lambda: step.run("send-email", send_email, user_id),
    )
  )
```

## Remove `event.user`
We're sunsetting `event.user`. It's already incompatible with some features (e.g. function run replay).

## Disallow mixed async-ness within Inngest functions
Setting an async `on_failure` on a non-async Inngest function will throw an error:

```py
async def on_failure(ctx: inngest.Context) -> None:
    pass

@client.create_function(
    fn_id="foo",
    trigger=inngest.TriggerEvent(event="foo"),
    on_failure=on_failure,
)
def fn(ctx: inngest.ContextSync) -> None:
    pass
```

Setting a non-async `on_failure` on an async Inngest function will throw an error:
```py
def on_failure(ctx: inngest.ContextSync) -> None:
    pass

@client.create_function(
    fn_id="foo",
    trigger=inngest.TriggerEvent(event="foo"),
    on_failure=on_failure,
)
async def fn(ctx: inngest.Context) -> None:
    pass
```

## Static error when passing a non-async callback to an async `step.run`
When passing a non-async callback to an async `step.run`, it will work at runtime but there will be a static type error.

```py
@client.create_function(
    fn_id="foo",
    trigger=inngest.TriggerEvent(event="foo"),
)
async def fn(ctx: inngest.Context) -> None:
    # Type error because `lambda: "hello"` is non-async.
    msg = await step.run("step", lambda: "hello")

    # Runtime value is "hello", as expected.
    print(msg)
```

## `inngest.Function` is generic

The `inngest.Function` class is now a generic that represents the return type. So if an Inngest function returns `str` then it would be `inngest.Function[str]`.

## Middleware order
Use LIFO for the "after" hooks. In other words, when multiple middleware is specified then the "after" hooks are run in reverse order.

For example, let's say the following middleware is defined and used:
```py
class A(inngest.MiddlewareSync):
    def before_execution(self) -> None:
        # ...

    def after_execution(self) -> None:
        # ...

class B(inngest.MiddlewareSync):
    def before_execution(self) -> None:
        # ...

    def after_execution(self) -> None:
        # ...

inngest.Inngest(
    app_id="my-app",
    middleware=[A, B],
)
```

The middleware will be executed in the following order for each hook:
- `before_execution` -- `A` then `B`.
- `after_execution` -- `B` then `A`.

The "before" hooks are:
```
before_execution
before_response
before_send_events
transform_input
```

The "after" hooks are:
```
after_execution
after_send_events
transform_output
```

## Remove middleware hooks
- `before_memoization`
- `after_memoization`

## Remove experimental stuff
- `inngest.experimental.encryption_middleware` (it's now the [inngest-encryption](https://pypi.org/project/inngest-encryption/) package).
- `experimental_execution` option on functions. We won't support native `asyncio` methods (e.g. `asyncio.gather`) going forward.

## Dependencies
Drop support for Python `3.9`.

Bump dependency minimum versions:
```
httpx>=0.26.0
pydantic>=2.11.0
typing-extensions>=4.13.0
```

Bump peer dependency minimum versions:
```
Django>=5.0
Flask>=3.0.0
fastapi>=0.110.0
tornado>=6.4
```
</Release>

<Release version="inngest@0.4.22" date="May 8, 2025" published="2025-05-08T01:12:49.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.4.22">
## inngest v0.4.22

## Fixes
- Use thread pool when running non-async functions in async context. This prevents a non-async Inngest function from blocking the whole event loop when using an async HTTP framework (e.g. FastAPI).
- Raise a better error when using nested steps.
- [Connect](https://www.inngest.com/docs/setup/connect) fixes and improvements.

## What's Changed
* Connect: add thread pool by @amh4r in https://github.com/inngest/inngest-py/pull/219
* Connect: Close more gracefully by @amh4r in https://github.com/inngest/inngest-py/pull/220
* Connect: Fix graceful close when no initial connection by @amh4r in https://github.com/inngest/inngest-py/pull/221
* Bump version to 0.4.22a1 by @amh4r in https://github.com/inngest/inngest-py/pull/222
* Delete unnecessary memo code by @amh4r in https://github.com/inngest/inngest-py/pull/224
* Improve nested step handling by @amh4r in https://github.com/inngest/inngest-py/pull/223
* Use thread pool when running non-async functions in async context by @amh4r in https://github.com/inngest/inngest-py/pull/225
* Connect: add lease extensions by @amh4r in https://github.com/inngest/inngest-py/pull/227
* Connect: fix wrong error log by @amh4r in https://github.com/inngest/inngest-py/pull/228
* Connect: fix auto-close on non-retryably start request fail by @amh4r in https://github.com/inngest/inngest-py/pull/229


**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.4.21...inngest@0.4.22
</Release>

<Release version="inngest@0.4.21" date="April 3, 2025" published="2025-04-03T18:59:31.000Z" url="https://github.com/inngest/inngest-py/releases/tag/inngest%400.4.21">
## New features
- Add `inngest.experimental.connect` package for [Connect](https://www.inngest.com/docs/setup/connect). It's experimental, but we don't anticipate the API changing much.
- Add `ctx.group` to Inngest function args. This is the new recommended approach for parallel steps. We'll remove `step.parallel` in a future release.

## What's Changed
* Use more async during testing by @amh4r in https://github.com/inngest/inngest-py/pull/207
* Add ctx.group by @amh4r in https://github.com/inngest/inngest-py/pull/205
* Remove invoke opt in by @amh4r in https://github.com/inngest/inngest-py/pull/208
* Add experimental Connect feature by @amh4r in https://github.com/inngest/inngest-py/pull/211
* Fix Connect reconnect by @amh4r in https://github.com/inngest/inngest-py/pull/212
* Connect: signing key fallback test by @amh4r in https://github.com/inngest/inngest-py/pull/213
* Connect: fix function runs in Cloud by @amh4r in https://github.com/inngest/inngest-py/pull/214
* Connect: finish WorkerConnectRequestData todos by @amh4r in https://github.com/inngest/inngest-py/pull/215
* Connect: support drains by @amh4r in https://github.com/inngest/inngest-py/pull/216
* Remove Tornado tests by @amh4r in https://github.com/inngest/inngest-py/pull/217
* Bump inngest version to v0.4.21 by @amh4r in https://github.com/inngest/inngest-py/pull/218


**Full Changelog**: https://github.com/inngest/inngest-py/compare/inngest@0.4.20...inngest@0.4.21
</Release>

<Pagination page="1" total-pages="4" total-items="61" next="https://releases.sh/inngest/inngest-python-sdk.md?page=2" />
