releases.shpreview
Inngest/Python SDK

Python SDK

$npx -y @buildinternet/releases show inngest-python-sdk
Mon
Wed
Fri
AprMayJunJulAugSepOctNovDecJanFebMarApr
Less
More
Releases5Avg2/moVersionsinngest@0.5.14 → inngest@0.5.18
Mar 11, 2026

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

Mar 3, 2026

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

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

Jan 26, 2026

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

Jan 20, 2026

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
Nov 25, 2025

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

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.5.12...inngest@0.5.13

Nov 13, 2025

Features

  • Adding a max_worker_concurrency field for Connect to allow maximum number of simultaneous requests for a worker.

What's Changed

New Contributors

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.5.11...inngest@0.5.12

Oct 27, 2025

Fixes

  • Fix failed Connect handshake when concurrency scope is unspecified.

What's Changed

New Contributors

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.5.10...inngest@0.5.11

Oct 21, 2025

Features

  • Add Server-Timing response header.

Fixes

  • Improve Connect close process.

What's Changed

New Contributors

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.5.9...inngest@0.5.10

Sep 25, 2025

Features

  • Realtime publishing. This is still experimental but we don't expect the interface to change much

What's Changed

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.5.8...inngest@0.5.9

Sep 24, 2025

Fixes

  • Fix Connect not handling close frames.

What's Changed

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.5.7...inngest@0.5.8

Sep 22, 2025

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

New Contributors

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.5.6...inngest@0.5.7

Aug 28, 2025

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

Aug 13, 2025

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

Jul 17, 2025

Fixes

  • Fix deserialization error when using PydanticSerializer
Jul 15, 2025
inngest v0.5.3

Fixes

  • Fix occasional reconnect error after draining.
Jun 30, 2025
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

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.5.0...inngest@0.5.1

Jun 23, 2025
inngest v0.5.0

Release blog post here

Full migration guide here

New features

  • First-class Pydantic support in step and function output
  • AI orchestration with step.infer (docs) -- currently experimental
  • Connect is stable (docs)
  • Python 3.13 support
  • Event-sending retries
  • Function singletons (docs)
  • Function timeouts (docs)
  • Improved parallel step performance

Breaking changes

Move step into ctx

The step object will be moved to ctx.step.

Before:

@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:

@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.

@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:

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:

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.

@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:

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 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
May 8, 2025
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 fixes and improvements.

What's Changed

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.4.21...inngest@0.4.22

Apr 3, 2025

New features

  • Add inngest.experimental.connect package for 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

Full Changelog: https://github.com/inngest/inngest-py/compare/inngest@0.4.20...inngest@0.4.21

Previous123Next
Latest
inngest@0.5.18
Tracking Since
Nov 20, 2023
Last fetched Apr 19, 2026