2b800c73 Thanks @scottnuma! - Support parsing operation name for AI Metadata Extraction#1599 c02cc265 Thanks @scottnuma! - Support deprecated gen_ai.system for AI Metadata Extraction
#1600 2462e875 Thanks @scottnuma! - Support parsing finish reasons for AI Metadata Extraction
#1605 cd18ed18 Thanks @Linell! - Suppress unnecessary warning log for inngest.experiment.score.
#1602 e2e89ead Thanks @amh4r! - Fix Extended Traces not appearing when checkpointing disabled
#1594 124e55f8 Thanks @scottnuma! - Expand AI step metadata extraction to more OTel GenAI span attributes. The SDK now records additional model, provider, response id, token, and request parameter fields from OTel GenAI spans while continuing to ignore prompt and response content.
This removes the previous metadata extraction for Open Inference, Vercel AI SDK-specific, and Langfuse-specific span attributes.
#1595 aa315c7e Thanks @amh4r! - Add opt-out for AI metadata extraction
#1521 a69ec0e2 Thanks @jakobevangelista! - Add experimental createScorer function
#1521 a69ec0e2 Thanks @jakobevangelista! - Add experimental scoring primitives for writing run- and step-scoped inngest.score metadata via inngest.score() and scoreMiddleware()-gated step.score().
748c6cc4 Thanks @amh4r! - Deprecate Extended Traces provider creation. behaviour: "createProvider" and the "auto" fallback remain functional, but now direct users to preload @inngest/otel/node and extend that provider instead.#1577 1bc2ac7c Thanks @scottnuma! - Add metadata to steps containing LLM calls instrumented with OTel by Langfuse
#1547 04a79c95 Thanks @jakobevangelista! - Add sessions to event payloads
50a349b7 Thanks @rhino1998! - fix(extended traces): Emit extended trace spans parented to the finalized step span#1567 1c3ad876 Thanks @Linell! - Deprecate optimizeParallelism: false — use group.parallel({ mode: "race" }) for race semantics instead. Opting out prevents runs from resuming checkpointing after a Promise.all.
#1568 bd6016c1 Thanks @scottnuma! - Add metadata to steps containing OTel instrumented LLM calls
ba9874dc Thanks @rhino1998! - feat(experiments): Rename experiment_name -> experiment in metadata#1551 0af90c3c Thanks @rhino1998! - fix: Add step attribution attributes to all extended trace spans
#1556 5bd87775 Thanks @Linell! - Update internal tracing values used for identifying checkpointed data.
#1548 7be1cee3 Thanks @amh4r! - Fix unnecessary outgoing Durable Endpoint request
#1511 79558be2 Thanks @Linell! - Fix duplicate execution when response terminates early
#1522 ebeb4516 Thanks @Linell! - Bump minimum @opentelemetry/auto-instrumentations-node to 0.75.0 to address
GHSA-q7rr-3cgh-j5r3 in the
transitive @opentelemetry/sdk-node / @opentelemetry/exporter-prometheus packages.
Note that upstream auto-instrumentations-node@0.72.0 dropped bundled Fastify,
instrumentation, so if you relied on it for tracing your Fastify routes, add
@opentelemetry/instrumentation-fastify directly.
#1540 10dad398 Thanks @amh4r! - Fix attempt count not resetting during checkpointing
#1544 f1ee6f34 Thanks @jacobheric! - Allow useRealtime to accept direct client subscription tokens from getClientSubscriptionToken() when channel and topics are provided as hook options, and avoid reconnecting solely because an inline token factory or token object gets a new render identity.
#1506 342a7369 Thanks @amh4r! - Add option to disable unauthed PUT requests
#1518 fd71a95b Thanks @Linell! - Fix RetryAfterError not respected
#1512 be675a3d Thanks @amh4r! - Fix waitForSignal not in middleware StepType union
#1513 cbad05c3 Thanks @jakobevangelista! - Standardize variant naming to variant instead of variant_selected
#1516 1bca44a8 Thanks @BrunoScheufler! - - Add Request ID & Job ID to context and logs
5c8f50e1 Thanks @scottnuma! - Accept Temporal.Duration, Temporal.Instant, and Temporal.ZonedDateTime (and their *Like variants) wherever a timeout or sleep duration is taken: step.sleep(), step.waitForEvent(), step.waitForSignal(), step.invoke(), and function-level cancelOn timeouts. Durations are treated as relative waits; instants and zoned date-times as absolute deadlines.60cda73f Thanks @mar-inngest! - Fix Connect shutdown getting stuck when a late lease-extension ACK recreates a stale in-flight lease entry after request completion or lease loss#1492 68dcd8aa Thanks @amh4r! - Reduce response info when unauthorized
#1490 a8027116 Thanks @amh4r! - Authed introspection returns partial signing key hash
#1479 6b9769ca Thanks @scottnuma! - Fix step.sendSignal() return type to match runtime: Promise<InngestApi.SendSignalResponse> ({ runId: string | undefined }) instead of Promise<null>
#1483 d0a59629 Thanks @Linell! - Fix run IDs not URL encoded in Durable Endpoints
#1481 970ded9b Thanks @Linell! - Improves HMAC signature verification by using a constant-time comparison, which mitigates a potential timing-based signature-recovery attack against the request signature. Also improves handling of timestamps in signatures, including malformed or future-dated values.
#1472 9df36dee Thanks @Linell! - Fix empty body on Vercel serverless Node handlers
#1482 e34972d3 Thanks @Linell! - Hash the signing key used when exporting OTel traces
#1460 ce5110de Thanks @amh4r! - Fix multi-byte UTF-8 chars corrupted when split over chunks
#1461 d75b59ce Thanks @amh4r! - Fix CountQueuingStrategy erroring when stubbed in edge runtimes
#1366 aca72f88 Thanks @Linell! - Fix extendProvider() for OTel SDK v2 where addSpanProcessor() was removed.
Move @opentelemetry/auto-instrumentations-node and related imports from static top-level to dynamic await import() inside createProvider(). This prevents module-level monkey-patching side effects that broke inngest.send() when combined with host app OTel setups (e.g. Sentry). See #1324.
#1457 d151b404 Thanks @amh4r! - Fix using CountQueuingStrategy when not available
#1455 15495e03 Thanks @amh4r! - Fix dependencyInjection not working statically at function level
#1435 d8fc84b2 Thanks @KiKoS0! - Fix Connect worker blocking flushing & termination issues
#1437 ad7ae27a Thanks @amh4r! - Fix worker thread strategy missing graceful shutdown
#1420 38c6e27c Thanks @BrunoScheufler! - Connect: Refactor internal architecture
#1412 556a32eb Thanks @rhino1998! - Extended Traces: Include step attributes in userland spans
#1414 7e699a06 Thanks @rhino1998! - Step Metadata: Collapse step/step_attempt behavior
#1418 31300308 Thanks @BrunoScheufler! - Fix graceful shutdown cleanup in case of draining connection replacement
494364eb Thanks @jpwilliams! - Fix type exports not being available for composite: true projects
627c0720 Thanks @jacobheric! - Adds first class, internal realtime support with improved DX for publishing and subscribing to typed channels and topics. See: https://www.inngest.com/docs/features/realtime#1395 c4861ff8 Thanks @amh4r! - Error when function config is v3-style
#1389 905d4b24 Thanks @amh4r! - Ensure we track retries when creating a new run
#1396 9baa304f Thanks @amh4r! - Fix onRunError hook's isFinalAttempt not true on final attempt
#1387 983f527b Thanks @amh4r! - Fix checkpointing maxRuntime causing function run hang
#1387 983f527b Thanks @amh4r! - Fallback to async flow on checkpoint error
e8024132 Thanks @amh4r! - See list of changes in the migration guide: https://www.inngest.com/docs/reference/typescript/v4/migrations/v3-to-v4#1359 b4d9833f Thanks @Linell! - fix: use deterministic IDs for correct checkpointed parenting
#1370 037336dc Thanks @amh4r! - Fix mishandling drain message (Connect only)
#1350 470fdb98 Thanks @amh4r! - Fix false NESTING_STEPS error
#1356 2e961c21 Thanks @amh4r! - Fix checkpointing maxRuntime causing function run hang
4f45adb7 Thanks @jakobevangelista! - Fix signing key propagation from serve() options to InngestApi for outgoing API calls#1258 e17a148f Thanks @amh4r! - Connect: add worker thread support
#1313 bbdab785 Thanks @tonyhb! - Add step names and IDs to step not found error
#1306 b74bd1b9 Thanks @amh4r! - Add a log before the 405 response
#1288 daf858f0 Thanks @jpwilliams! - Add the ability to create Durable Endpoint Proxies, used to redirect to Inngest run results using a user's own domain.
import { Inngest, step } from "inngest";
import { endpointAdapter } from "inngest/edge";
const inngest = new Inngest({
id: "bun-sync-example",
endpointAdapter: endpointAdapter.withOptions({
asyncRedirectUrl: "/poll",
}),
});
#1297 32b59507 Thanks @ptts! - Fix extendProvider() failing to extend existing OTel providers by unwrapping the ProxyTracerProvider returned by trace.getTracerProvider(). Previously, the proxy wrapper hid the underlying provider's addSpanProcessor method, causing "auto" mode to fall through to createProvider() and register duplicate instrumentations.
#1292 9c8f5d94 Thanks @jpwilliams! - Fix Durable Endpoints not capturing and obeying step plan forcing, resulting in strange behaviour during parallel flows
#1285 9a7b0528 Thanks @jpwilliams! - Handle checkpointing failures more gracefully across async checkpointing and Durable Endpoints
8e377c27 Thanks @jpwilliams! - Add isInngestRequest() export for lightly checking if a Request looks like it comes from Inngest#1269 8e377c27 Thanks @jpwilliams! - Stabilise execution version when switching from sync to async
#1269 8e377c27 Thanks @jpwilliams! - Use endpoint adapters for experimental Durable Endpoints instead of wrappers
#1250 ad078067 Thanks @Linell! - NonRetriableError && RetryAfterError instanceof checks help resolve issues of errors not working as expected in monorepos.
#1168 4371be38 Thanks @Linell! - Add Anthropic Open Telemetry instrumentation so that calls to the Anthropic API are automatically captured.
#1269 8e377c27 Thanks @jpwilliams! - Rename http/run.started event created from Durable Endpoints to inngest/http.request
#1266 b6361ee1 Thanks ! - Fix issue where middleware transformOutput is not called.
#1226 dab4607c Thanks @jpwilliams! - Adds the ability to configure the number of bufferedSteps and maxInterval when checkpointing.
import { inngest } from "./client";
export const helloWorld = inngest.createFunction(
{
id: "hello-world",
checkpointing: { bufferedSteps: Infinity, maxInterval: "5s" },
},
{ event: "demo/event.sent" },
async ({ event
#1267 093c4f96 Thanks @amh4r! - Fix not properly handling transfer chunked requests
#1233 df7d3023 Thanks @Linell! - Lazily load ulid to avoid issues in edge environments.
#1257 0eb6b473 Thanks @Linell! - Use native Web Crypto API for HMAC-SHA256 signing with hash.js fallback
This change improves performance by using the native Web Crypto API when available for request signature verification. Falls back to hash.js for environments without crypto support.
#1226 dab4607c Thanks @jpwilliams! - Correctly access parallel step IDs from resumed sync requests
#1226 dab4607c Thanks @jpwilliams! - Default to v2 execution version when checkpointing
#1244 f5c565e8 Thanks @jpwilliams! - Ensure execution version doesn't slide when going to/from checkpointing
#1245 6694bccc Thanks @jpwilliams! - Fix async data fetching not happening with optimizedParallelism: true
#1215 29307e2e Thanks @rhino1998! - Fix step.fetch response status code
#1222 ecf46a58 Thanks @amh4r! - Remove "authentication_succeeded: false" when responding to unsigned requests
#1214 326fe06b Thanks @djfarrelly! - Fix Connect heartbeater stops too soon during shutdown
28ffbc89 Thanks @jpwilliams! - Bring checkpointing out of experimental90b14e92 Thanks @jpwilliams! - Add experimentalCheckpointing: { maxRuntime?: number | string | Temporal.DurationLike } to set max runtime duration before re-entry during checkpointing#1190 cb286c5e Thanks @jpwilliams! - Recover from checkpointing failures by falling back to async mode
#1179 9c88fd19 Thanks @jpwilliams! - Fix sync execution looking for step in the wrong place
#1173 75820c72 Thanks @jpwilliams! - Add async checkpointing to functions and clients. Only allows checkpointing after every step (maxSteps: 1) currently.
Can be enabled on the client:
import { Inngest } from "inngest";
const inngest = new Inngest({
id: "...",
experimentalCheckpointing: true,
});
...or on each function...
inngest.createFunction(
{
id: "..."
ef6fd33d Thanks @Linell! - Updated OpenTelemetry dependencies to support broader version ranges and adapted code for OTEL 2.x API compatibilty#1155 9fa34d12 Thanks @mar-inngest! - Connect - Adding support for worker concurrency limits
#1160 ab446473 Thanks @jpwilliams! - Widen zod dependency range to support v3/v4 across libraries
#1165 b5139f04 Thanks @jpwilliams! - Remove setImmediate use (Node only)
ead9837b Thanks @jpwilliams! - Add experimental APIs for supporting synchronous execution#1149 9d5d7131 Thanks @Linell! - Refactor otelMiddleware to extendedTracesMiddleware so that its purpose is more easily understood
#1150 68e67d80 Thanks @faizanu94! - Fix custom loggers dumbly waiting 1s to flush; they now correctly call flush() if available
#1148 9cf36f4d Thanks @BrunoScheufler! - Include retry count in the error message if gracefully flushing connect worker progress fails after all attempts
#1139 6366f557 Thanks @rhino1998! - Add userland ID & index to Ops
#1133 e7494a67 Thanks @jpwilliams! - Export the full runtime enum for ConnectionState from "inngest/connect"
#1129 7a7c2f5f Thanks @de-tester! - Expose types that are used for step result signature
c2b249aa Thanks @jpwilliams! - Build targets no specific platform, solving some issues with edge runtimes where the library would internally attempt to require() some node:* dependencies#1284 5717c64b Thanks @jpwilliams! - Add a Durable Endpoints Next.js Adapter
// app/api/my-endpoint/route.ts
import { Inngest, step } from "inngest";
import { endpointAdapter } from "inngest/next";
const inngest = new Inngest({
id: "my-app",
endpointAdapter,
});
export const GET = inngest.endpoint(async (req) => {
const foo = await step.run("my-step", () => ({ foo: "bar" }));
return new Response(`Result: ${JSON.stringify(foo)}`);
});
If checkpointing: true is used, bufferedSteps defaults to 1 and no maxInterval is set.
#1093 ad044e05 Thanks @jpwilliams! - Add realtime client methods to inngest:
inngest.realtime.publish()inngest.realtime.getSubscriptionToken()step.realtime.publish()