MAX Nightly 26.5.0.dev2026071805 (Mojo 1.0.0b3.dev2026071805) Released

:astronaut: A new nightly version has been released! :astronaut:

See the quickstart guide for installation instructions: Quickstart | Modular

MAX changelog updates:

  • Image generation responses on the Open Responses endpoint now report
    usage: output_tokens and total_tokens carry the total pixel count of
    the generated images, counted from the actual output arrays, and
    input_tokens is 0 (prompt text is not counted). Previously usage was
    always null.

  • Added an optional init_value argument to max.graph.ops.buffer_create.
    When set, the buffer becomes persistent state: it is allocated and filled
    with the scalar init_value exactly once when the model is loaded, and the
    same buffer (with its mutations preserved) is reused across every execution,
    rather than being re-created per call. Use it for a buffer that a kernel
    mutates in place and only needs initialized once, such as a counter a kernel
    resets at the end of each call.

  • session.profiling.range(name) is a new context manager that annotates a
    named CPU span in the trace. The span appears as a user_annotation bar in
    Perfetto/HTA with the GPU kernels launched inside it correlated to it, and
    also records during Dynolog-initiated on-demand traces. When no trace is
    live the calls reduce to a single predicted branch, so annotations are safe
    to leave in production code. The companion session.profiling.is_recording
    property reports whether a trace of either origin is live — the right gate
    for eliding annotation work on hot paths (is_enabled reflects only the
    session API and stays False during daemon-driven traces).

  • MAX processes launched with KINETO_USE_DAEMON=1 now register with a
    Dynolog daemon at device
    initialization, so dyno gputrace --pids <pid> captures any such process
    on demand with no profiling flags and no code changes. Set
    profiling_dynolog_enabled = False (or
    MODULAR_MAX_DEBUG_PROFILING_DYNOLOG_ENABLED=0) to opt a process out.

  • Profiling can now be armed and disarmed at runtime for CUDA-graph
    (capture/replay) workloads: a mid-run session.profiling.start() or a
    Dynolog dyno gputrace request captures kernels replayed from graphs that
    were instantiated before profiling was enabled, and replay overhead reverts
    when the trace stops. Enabling at session construction is no longer
    required for these workloads.

Mojo changelog updates:

  • [stdlib] stabilize more list methods
  • [stdlib] Make Tuple conditionally ImplicitlyDeletable
  • [stdlib] Generalize Dict.fromkeys to any iterable
  • [stdlib] Rename StaticConstantOrigin to ImmStaticOrigin
  • [stdlib] Add Tuple.consume_elements for moving out elements

Raw MAX diff: https://github.com/modular/modular/compare/d073bde762f2743d67e1bc9da35d30c819bca394...41222c77ed089a7cf0716b15e83f1f2f07f9309d)>
Current Mojo changelog: https://github.com/modular/modular/blob/main/mojo/docs/nightly-changelog.md