Update transformers requirement from !=5.13.0,<5.15,>=5.10.0 to >=5.10.0,!=5.13.0,<5.18 - #462
Open
dependabot[bot] wants to merge 39 commits into
Open
dependabot[bot] wants to merge 39 commits into
dependabot[bot] wants to merge 39 commits into
Conversation
Owner
|
Thanks. Both bumps are covered on the branch for the next release: the darwin/arm64 requirement gets a 5.10.0 floor (the shipped venvs already run 5.14.1) and the lock moves to 5.14.1. Closing this in favour of that change once it ships. |
…iles SessionBankColdTier._cleanup_untracked_cache_once (cache_bank/cold_tier.py) already reconciles the on-disk store against manifest.sqlite and deletes whatever the manifest no longer references. It works; the gap is that it only ever runs as a side effect of a write that finds the store close to its configured size cap. On a Mac with generous free disk that cap is rarely approached, so orphans a user never triggers the cap against just accumulate forever: #493 measured 394,155 orphaned blobs (44.1 GB) against 17 live manifest entries after three weeks of normal use, with no CLI command to reclaim them short of deleting the whole session bank by hand. New module mtplx/session_bank_gc.py reimplements the same reconciliation (entry dirs not in the manifest, blob files no entry's payload.json references, evicted_entries/ leftovers) as a small, standalone utility rather than importing SessionBankColdTier directly: cache_bank/cold_tier.py imports cache_bank/codec.py, which imports mlx.core at module scope purely for the tensor encode/decode path this reconciliation never touches. Routing a disk-cleanup command through that import chain would mean `mtplx gc` stops working exactly when it might matter most -- a broken or absent MLX install -- contradicting the CLI's own "doctor and inspect run on any machine" contract. `mtplx gc` is read-only by default (reports what it would delete); --apply is required to actually delete. Because a concurrently running server writes new entries under a lock this reconciliation does not hold across processes, --apply checks for a running server on the probed ports and requires --force to proceed if one is found, matching the safety pattern `mtplx stop` already uses for daemon discovery. Tests: new tests/test_session_bank_gc.py (reconciliation correctness, dry-run vs --apply, the running-server block and --force override). Full existing suite green; CONTRIBUTING.md checklist (targeted tests, python -m build, scripts/fresh_venv_smoke.sh) all pass; ruff check has zero new findings versus the pre-patch baseline; verified mtplx.session_bank_gc and mtplx.commands.public both import cleanly with mlx/mlx_lm blocked. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
…aned SessionBank SSD cache files
…aim at open, cap prices the whole store (PR #502 follow-up) Issue #493, three reports of the same shape: 394,155 orphaned blobs (44.1 GB) against 17 manifest entries after three weeks (taozhiyuai, M3 Max 128 GB); 471,541 blobs (67 GB) on a 60 GB --ssd-session-cache-max-size after three days of uptime (nomishbhardwaj, M5 Max 128 GB); a third box clean. PR #502 (ArctifoxNL) added `mtplx gc` as a second, standalone copy of the reconciliation so the command would import without MLX. This follow-up keeps the contributor's command and tests and turns the copy into the one implementation both sides use. What was wrong on the engine side, read from the code: 1. The reconciliation (`_cleanup_untracked_cache_once`) ran only when a write found manifest + untracked + pending over the cap, or when a /health poll saw the store over the cap. A 100 GB default cap on a Mac with a big disk never reached either, so garbage accumulated forever. 2. After each cleanup the cap gate zeroed the untracked delta (`_note_orphans_cleaned`). But "untracked" is not only garbage: a blob shared by a later snapshot of the same conversation stays on disk when the entry that paid for it (physical_nbytes) is evicted, and its bytes leave the manifest SUM. Zeroing that delta blinded the gate to live bytes, and the directory could sit above the cap for good. That is the 67 GB on a 60 GB cap. 3. The cleanup ran under _base_lock for the whole walk, on whichever thread priced the cap: the writer thread (only durability delayed) or, through spill_entry, the model-owner thread, where a 40 s walk of a big store is a 40 s TTFT for the next request. It also raced phase 2 of a write: blobs reach disk before their manifest row, and a pass that listed them would have deleted them. What this commit does: - `mtplx/cache_bank/reconcile.py` (git mv of the PR's `mtplx/session_bank_gc.py`) is the single walk: it reads the manifest, classifies every file (database, live entry, live blob, orphan entry dir, orphan blob, evicted_entries/, temp older than an hour) and, in delete mode, removes garbage per directory batch under an optional lock, re-reading the manifest when the store generation moved and honouring a `protected` set of in-flight entry dirs and blob digests. It is pure SQLite + filesystem; `mtplx/cache_bank/__init__.py` resolves the tier's names lazily (PEP 562) so `import mtplx.cache_bank.reconcile` never pulls the tensor codec and its `mlx.core`. - The tier's measurement walk (`_scan_managed_disk_usage`) is that walk in dry-run mode, so the snapshot now carries orphan_file_bytes / orphan_disk_bytes / orphan_file_count next to the totals; the cleanup is the same walk in delete mode and installs the census it took (no second walk). The cap gate prices manifest + untracked (live drift and garbage alike) and never walks; garbage is reclaimed by `_reclaim_orphans_if_over_cap` before admission, inline on the writer thread, scheduled in the background from the owner thread, and bytes a running pass will free are not charged to the write that waits on it. - Writes in flight are counted (`_claim_inflight` / `_release_inflight`, Counters under _base_lock): the writer claims its entry dir and every digest after planning, before the reclaim; the spill sink claims each digest before the blob exists. `_write_blob` re-creates a prefix directory a cleanup pruned between its mkdir and its write. - The tier reconciles once at open when the store has content, in the background, yielding to foreground traffic every 4096 files and stopping on close(); a fresh store skips it. The summary goes to a `reconcile_listener` passed to the constructor (a small store finishes before any attribute set afterwards could be seen); the server wires it to a `mtplx_ssd_session_cache_reconcile` stdout event (the tier's logger.info lines never reach the daemon log: nothing configures Python logging). stats() carries it as `startup_reconcile`. - `mtplx gc` keeps ArctifoxNL's surface (`--dir --apply --force --json`, refusal beside a running daemon without --force) and reports live entries and bytes on disk as well; --dir defaults to the saved config's ssd_session_cache_dir. Tests (all run with the release venv, CPU only): tests/test_cold_tier_reconcile.py (18, new: startup pass reclaims and reports, clean store reports nothing, fresh store skips, off tier never touches the store, in-flight claims survive a pass, a row committed during the pass keeps its blobs, dedupe drift stays priced after a cleanup, the writer reclaims before evicting live entries, the owner path schedules and never walks, a running pass's bytes are not charged, the delete pass installs its census, stale vs fresh temps, pruned prefix directory, interrupted walk is stale, CLI report totals); tests/test_session_bank_gc.py (11, the PR's, re-pointed); tests/test_no_mlx_imports.py (+1: reconcile import and `mtplx gc` dry run and --apply --force with mlx blocked); tests/test_cold_tier_stats_cache.py (waits for the cold-start census before counting; its two manifest reads raced the count and the race is what a slightly longer walk exposed). Existing suites: test_cache_bank, test_cold_tier_disk_usage_scan, test_cold_tier_*, test_ssd_spill, test_ssd_boundary_repersist, test_cold_prefix_ram_shadow, test_session_bank, test_session_bank_env_caps: 146 passed. Ruff: no new findings on any touched file (cold_tier net -1). Docs: docs/server.md gains "SSD session cache (cold tier) limits" next to the MTPLX_SESSION_BANK_* table (the cap's meaning, the effective cap, the startup pass, the event, `mtplx gc`); CHANGELOG [Unreleased] Added (PR #502, ArctifoxNL) and Fixed (#493); docs/releases/v2.11.3.md Session cache. Not measured here: the walk on a 400k-file store (the 2026-08-15 receipt is 41.7 s for 816k files; this pass does the same stat work plus unlinks).
…AR-only sources out of speculative Forge
…ssions (>100k tokens) in RAM and SSD tiers
… MTP evidence (PR #489 follow-up) PR #489 (Philip John Basile) merged as 0533de4: compatibility_for_inspection uses _trunk_weights_present (local dir or remote listing) instead of a local glob, so nex-agi/Nex-N2.5-mini inspects as an AR-only runnable checkpoint; _probe_runtime_mtp_evidence no longer treats can_run as MTP evidence, so Forge refuses AR-only sources with guidance that says it cannot create a head. tests/test_artifacts.py + tests/test_forge_cli.py: 182 passed on the release venv. Ruff: no new findings (registry.py 7->7, forge.py 44->44). This commit adds the CHANGELOG [Unreleased] Fixed entry and the release notes mention; no code.
…llbacks restored (PR #496 follow-up) PR #496 (Dizzler7, merged as 623c8cb) raised four numbers to let a 12.2 GiB Q8-KV 100k-token Qwen3.8-27B snapshot persist: DEFAULT_PER_SESSION_MAX_BYTES 8 -> 32 GiB and DEFAULT_MAX_BYTES 24 -> 48 GiB (session_bank.py), the >=96 GB tier ceiling 24 -> 32 GiB (engine_session.py), the 64 GB Mac SSD cap 32 -> 100 GiB when >= 150 GiB of disk is free, and the hourly SSD write budget 64 -> 128 GiB. Checked against the plan for a 64 GB seat (usable 48 GiB, 27B weights 18.6 GiB): a flat 32 GiB per-session snapshot plus its restore copy is 64 GiB next to 18.6 GiB of weights; that is swap death, and #150 (ArthoPacini) is the receipt for a 15 GiB gate on that seat. The plan already sizes the bank per machine (resolve_session_bank_max_bytes takes memory_plan.bank_idle_max_bytes); only the per-session ceiling was still a flat RAM-tier constant. This commit keeps the contributor's SSD changes and replaces the flat RAM caps with the plan: - per_session_play_ceiling_bytes(plan) = max(1 GiB, (usable - weights - RUNTIME_TRANSIENTS) / 2): one conversation's snapshot must fit twice in the play (the restore materializes it next to the banked copy). resolve_session_bank_per_session_bytes takes memory_plan and uses that ceiling in auto mode; without a plan the RAM-tier ceiling applies as before. Seats: 64 GB + 27B 13.2 GiB (the report's 12.2 GiB snapshot fits), 128 GB + 27B 32 GiB (the PR's number, where the plan has room), 128 GB + Flash-Next 10.5 GiB (below the old flat 24), 48 GB + 27B 7.2 GiB. EngineSessionManager passes its memory_plan through. - DEFAULT_MAX_BYTES back to 24 GiB, DEFAULT_PER_SESSION_MAX_BYTES back to 8 GiB, _HIGH_MEMORY_PER_SESSION_MAX_BYTES back to 24 GiB: these are the fallbacks for a machine whose RAM cannot be detected or that has no plan, the one machine we know nothing about. - Kept: default_cold_tier_max_bytes 64 GB tier -> 100 GiB with >= 150 GiB free (the effective cap is still min(cap, free/4) at write time, so it matters on disks with >= 400 GiB free; the app passes "auto" for the cap, which parse_size_bytes maps to this default, so the tier is live for app users; `mtplx serve` passes its literal 100GB), and MTPLX_SSD_WRITE_BUDGET_PER_HOUR default 128 GiB. Tests: tests/test_engine_session_env.py (+6: the four seats, the ceiling's guards, explicit env over the plan), tests/test_cold_tier_defaults.py (new, 5: tier cap on a tight disk, with 150 GiB free, unreadable disk, smaller tiers, write budget default). Ran test_engine_session_env, test_session_bank_env_caps, test_cold_tier_defaults, test_cold_tier_write_budget, test_memory_plan: 126 passed. Ruff: no new findings. Docs: docs/server.md per-session row and SSD rows; CHANGELOG Fixed (PR #496, Dizzler7); release notes Session cache.
…ow-up) per_session_play_ceiling_bytes caught Exception around an import and two attribute reads; ruff BLE001 flagged it as the one new finding on the file. It now catches ImportError, TypeError and ValueError, which is all that path can raise. tests/test_engine_session_env.py: 55 passed.
…s never persisted (issue #503) Issue #503 (bjornnelson76, app 2.11.2 build 2011020): after a hard freeze the daemon's listening socket survived while /health stopped answering. PortPreflight.classify maps a probe timeout to .foreign, the #409 settle window is for a draining daemon and cannot expire a wedged one, and preflightConfiguredPort's foreign branch moved the app to the next free port AND saved it to settings. Every client pinned to the configured port (a Hermes connector on 8001) was stranded for good while the engine showed Running; recovery took a full Stop and a manual port reset. Fix, app side (MTPLXAppCore): - PortPreflight.appOwnedListener(port:) asks the OS who holds the port (/usr/sbin/lsof -t, bounded by the existing SubprocessWatchdog) and whether that process carries the app's own launch marker: DaemonSupervisor.appLaunchID(ofProcess:) generalizes the exact-match reader over the kernel's argv/env image (KERN_PROCARGS2; never ps text, so an argument containing the token cannot pass as ownership). waitUntilBindable polls the bind after a reap. - preflightConfiguredPort .foreign: an app-owned listener is reaped in place through terminateExternalDaemon (whole process family) and the configured port is kept; the lookup runs off the main actor. A listener without the marker (a stranger's app, a CLI mtplx serve) is never signalled. - A fallback is never persisted: applyPortFallback changes only the in-memory port and records (configured, fallback); every settings write goes through persistConfiguration, which writes the configured port back while the launch runs on a fallback unless the user changed the port on purpose (that ends the fallback); the next user-initiated start restores the configured port and clears the banner. remediatePortConflict's invisible-collision path uses the same helper. New banner copy in all 13 language tables. Fix, CLI twin (SYNC PAIR comment in PortPreflight.swift): daemon_client.describe_foreign_listener (lsof + process_app_launch_id over KERN_PROCARGS2 through ctypes) and port_busy_advice(listener=); the quickstart's configured-port path names the pid and says it is a daemon the app launched that stopped answering, with the fix, instead of "another app". The CLI names it and leaves the process alone. Tests: swift test --filter '(testPreflight|testPortPreflight|testPortFallback)|LocalizationTableTests': 24 passed, 0 failures, 48 s including the build (new: testPreflightReapsWedgedAppOwnedDaemonAndKeepsConfiguredPort with a python listener that accepts and never answers, spawned with the marker; testPreflightNeverReapsAWedgedListenerWithoutTheLaunchMarker; testPortFallbackIsNotPersistedAndLaterSavesKeepTheConfiguredPort; the two existing fallback tests now assert nothing is persisted). DaemonSupervisorTests not run (fan state). No app bundle built or launched. tests/test_daemon_client.py 29 passed (+2); tests/test_public_cli.py -k "port or quickstart" 35 passed. Ruff: no new findings on daemon_client.py, public.py, test_daemon_client.py. CHANGELOG Fixed (#503); release notes.
…l, request-log wall clock and draft totals test (#401)
…cross rewritten turns, with the two exactness follow-ups from 2026-09-09
…irectories, with the 2026-09-09 follow-ups (localization, unmounted-root explanation, doctor roots)
…s slow phase (issue #487) HenriGrimm's flight log shows the app reaping a live daemon four times in one day: each time the daemon was inside a generation-final prefix commit that took 19-25 s on a 110-150k vision agent session, answered nothing on /health for that long, missed two probes in a row and was killed while the commit it was doing succeeded (stored: true). From the client's seat the model "randomly crashes between turns at high context". Two defects, both fixed here (the work was done on the 2026-09-09 branch ov-487-20260909 and is applied onto the integration line with its three conflicts against PR #283's restructured commit resolved by hand): 1. The watchdog treated two missed probes as death. It now gathers process and port evidence (kill(pid, 0) on the daemon's own pid, a TCP connect to its port) before reaping: a daemon whose process is alive and whose port still accepts connections is "busy", never dead, and is reaped only after 90 s of unbroken silence, or the moment its process is gone or its port closes. The single-failure paths (a refresh that timed out, a chat stream that lost its connection) go through the same gate instead of reaping on one failed request. DaemonLivenessPolicy.swift holds the pure decision (11 tests); the store publishes daemonUnresponsiveFor so the UI can say "busy" instead of "offline". 2. The commit itself was slow for a reason the log could not name: a prompt whose screenshots together exceed the vision embed cache's row budget evicted its own images on the way through, so the commit's second walk over the same images re-ran the tower for every one of them on the model-owner thread. The images of the prompt being materialized are now pinned for the pass (the cache may exceed its budget by at most one prompt's rows, which are resident in that prompt's KV anyway), the cache is mutated under a lock, and the commit records the wall of every phase (history flatten, canonicalize, committed decode, render/encode, vision splice, compat, lock wait, bank metadata, put) in the pc flight event so the next slow commit names its phase. Tests: tests/test_server_obs_postcommit_health.py (6: phase receipts, /health answers while a commit holds the model lock, pinned images survive their own eviction pass); tests/test_openai_bridge.py and tests/test_gemma4_session_cache.py green after the conflict resolution.
…arm turns, issue #487 busy daemon
…y stays the default Overnight 2026-09-16 A/B on the founder's own workload (the 88-character flappy prompt at effort xhigh, uncapped, native sampler, Flash-Next Optimized Speed, alternating boots under verified max fans, same venv): arm tree tokens tok/s tokens/round acceptance by depth R1 2.11.2 44,876 66.5 3.02 0.83 / 0.67 / 0.53 B1 line, block verify on 50,797 64.9 2.90 0.80 / 0.62 / 0.48 B2 line, block verify on 45,040 63.7 2.91 0.80 / 0.62 / 0.48 R2 2.11.2 50,115 62.6 3.00 0.83 / 0.66 / 0.51 V0 line, block verify off 46,117 66.8 3.00 0.83 / 0.65 / 0.52 P0 line, block+opdiet off 56,285 65.9 2.98 0.82 / 0.65 / 0.51 The exact block law accepts 3.5 percent fewer draft tokens per round than the standard verify on this workload, on both arms that ran it, and the whole-turn speed follows. The 2026-09-08 receipt on an 8,848-token code prompt was a tie (407/364/323 against 408/361/324 of 441 drafts), which is why the lane was stamped on; the reasoning-heavy turn is the workload users actually run at xhigh. Both laws are distribution-exact, so the faster one is the default: MTPLX_QWEN4_BLOCK_VERIFY is no longer stamped by the server's Flash-Next lane defaults and is honoured when exported. The law fix and its enumeration test stay; anyone opting in gets the exact law. tests/test_env_flag_parsing.py: the key leaves the stamped-on list, the Bare-Speed shape asserts it absent, and an explicit export is carried. Release notes and changelog say what was measured and what the default is.
…ng the main actor (issue #487 follow-up; the release build refused the actor-isolated access)
…all-detection QA test pins its library to the temporary root Two test-target fixes found by running the Swift suite on the integration head: - DaemonLivenessPolicyTests (issue #487 port) called bind(fd, ...) inside the test class, where Swift resolves the name to an instance method and refuses to compile the target; Darwin.bind names the socket call. - testModelInstallDetectionCanBeDisabledForFreshUserQA asserted the explicit temporary candidate through the default library. With the ordered library search of PR #387, a Mac that has the same pack installed in its default library answers with that copy first, so the test read the machine instead of the code. It now builds a ModelLibrary rooted at its temporary directory and asserts through installedLocalPath(in:) / resolvedReference(in:), the same way ModelLibraryTests already do.
…09-16 receipts Full Python suite (6,938 passed, 33 skipped) and Swift suite (965, 0 failures); OpenCode and Pi multi-file projects on 2.11.2 and on this line (ten steps each, all exit code 0, every follow-up a session-bank hit); the founder's flappy workload over seven alternating boots (this line's default 66.8 tok/s against 66.5 / 62.6 on 2.11.2; the exact block-verify lane opt-in at 2.90 tokens per round against 3.00-3.03); the candidate app 2011042 driven through its own daemon for three turns (54,460 tokens at 61.7 tok/s on a 91-100 C chip, a 54,530-token restore in 4 ms, a 96,760-token restore in 8 ms); exactness on both packs scored by exact token ids (partings at 0.000-0.250 nats, sampled distributions within the AR split-half control, a warm restore equal to cold up to a literal coin, padding rows never surfacing).
…s (issue #499, reproduced 2026-09-16)
…son (issue #499) On a 48 GB memory plan a 142k-token turn on the 27B produces an 11 GB snapshot against a 7.4 GB per-session cap (reproduced 2026-09-16, outputs/overnight-20260916/runs/repro499). The bank refused it, a plain client got no SSD copy, and the following turn reported the cold tier's ssd_prefix_miss, which only says the SSD had nothing either; the bank's own docstring already named that masking. The bank now records the refused put per session (prefix length, token hash, size, cap) and, when a later restore of that conversation misses in RAM and on the cold tier, reports oversized_snapshot_skipped as the miss reason; the record is exposed as last_oversized_skip in the bank's health dict. Another conversation in the same session is not blamed. Pinning test added; the full suite is 6,939 passed / 33 skipped on this tree. The refusal itself (an SSD write-only spill for oversized snapshots and a restore that rebuilds the draft head's history over the restored trunk) is the 2.11.4 item named in the release notes.
…SD-restart restore and the KL-vs-bf16 pack figures
…ht defects as a table, every figure kept Same facts as the previous draft, restructured for readers: a short lead, a before-and-after headline table against 2.11.2 (9k context +27 percent, the 8,848-token receipt +12 percent, the 45k-56k-token reference workload a tie, agent sessions +3 percent, acceptance by depth, 261k context, the 32 GB draft head, the Hindi/Thai/Arabic token counts, the Hermes token seam, the OpenCode reply budget, the SSD store), the eight exactness defects as a numbered table with what each did and how it was fixed, the eight speed arms and the 9k lane A/B as tables, spaced bullets per area, the validation section as a table plus the exactness receipts side by side for both packs, and the #499 known limitation and the upgrade note. Checked mechanically against the previous draft: every issue and PR number, every MTPLX_* flag and every figure of the old text is present in the new one (the three tokens that differ are restatements: 45,000 as 45k to 56k, 5,835 as 2,957 + 2,878 per pack, 8.8k as 8,848). No em dashes, no idioms, full sentences. Three bullets were tightened from their commit bodies: the non-finite floats on the dashboard stream (the MTPLX_SESSION_BANK_IDLE_TTL_S=0 case), the #468 first-line hold, and the #472 connect opencode behaviour. The Python suite count is the final head's log (gates/pytest-full-2.log: 6,939 passed, 33 skipped).
Written in the main worktree by the September sessions and never committed: the heredoc-after-a-pipe trap, the ten-minute-bound phase chain, the QA app instance adopting the founder's daemon on a shared port, the pgrep self-match, the A/B flip during an idle postcommit, the 27B thermal throttle read as a policy effect, build-and-run.sh's kill sweep, cua-driver Cmd-Q on an app it did not launch, the running zsh runner edit, the pipe-to-tail boot hang, the release-notes claim of a setting the wrapper rejected, restoring fans to auto over a max-fan daemon, and zsh set -- on an unquoted variable. Filenames are the index, as the ledger protocol says.
Retire cache entries under short lock sections, then reclaim their blobs in a single paced pass. The SSD writer pauses outside the store lock when a request arrives, while an owner-thread spill yields back to its scheduler. Recheck manifest generations and in-flight references before deleting each bounded batch, and recheck the admission budget after yielding. The arrival regression fails against the previous release candidate and passes with this change. Cache coverage also checks lock availability, shared blobs, concurrent references and spill interruption. No sampler, model, or client protocol changes.
Describe the shared server fix and its behavior across the native app, OpenCode, Hermes and Pi. Real two-turn coding checks passed in OpenCode CLI and Desktop, Hermes and Pi; the native app completed the original five-turn sequence. Controlled sampled A/B follow-ups with eviction active averaged 61.2 versus 65.9 tok/s with identical outputs and flat peak memory. This is not a guarantee that every prompt exceeds 50 tok/s.
…l suite count, the 2011044 candidate QA The eviction bullet now carries what was observed (a 66-entry eviction running about 89 seconds alongside two app replies at 33.5 and 42.3 tok/s, with the caveat that the eviction's share of that slowdown was not quantified), what changed (short lock sections, one paced reclaim pass, generation check before deletion, protected shared and in-flight blobs, owner-thread spills yielding to their scheduler), the regression test, and the controlled A/B receipt (61.2 to 65.9 tok/s, +8 percent, against the same build without the fix, identical output, alternating boots, fans verified). The validation table names the final code's suite count (6,942 passed, 33 skipped) and notes that the fix touched no Swift code, and a paragraph records the second candidate bundle 2011044 driven through the native app, OpenCode, Pi, Hermes and OpenCode Desktop. Figures from outputs/ssd-eviction-20260916 (arms B3, C3, B4, C4, client-summary.json, REPORT.md).
Install a small plugin package with the legacy V1 entrypoint and a server entrypoint exposing both V1 server() and V2 setup(). Keep older V1 hooks and register only a provider-scoped model.request header hook in V2. Migrate the managed plugin registration while preserving unrelated plugins. The real 1.18.29 and 2.0.5 clients both emitted MTPLX session headers; focused tests cover both entrypoints and unchanged V1 sampler/cap handling.
Capture per-second flight, thermal, memory and optional GPU evidence without repeating an entire coding-agent task. Require an explicit diagnostic token budget and verified actual max fans; preserve captured prompts and sampling settings. Record the confirmed verify-cost slowdown, the inconclusive tuning experiments, measured 200k decode results, and real OpenCode V1/V2 validation. Keep the intermittent performance defect open rather than claiming an unproven decoder fix.
Stop the native app and CLI agent presets from overriding model-owned distribution evaluation and verify width. The legacy lazy-target pin disabled Flash-Next batching, while the lazy-bonus pin shortened D3 to three rows and bypassed fixed-M4 compilation when used alone. Calibrate recurring draft and verify costs during the existing four-sample warmup before applying the EWMA. A restored compiled call took 125 ms once and 31 ms thereafter, but the previous estimator kept selecting slower eager D2 for hundreds of cycles. Add regressions for client/profile composition, the startup spike and later sustained slowdowns. Controlled 109k ABBA improves from 48.83 to 61.77 tok/s (+26.5%) with flat memory; 200k candidate runs hold near 50 tok/s. Keep native sampling, context, cache budgets and explicit operator overrides unchanged.
Canonicalize JSON object keys in declared tool schemas while preserving every field, value and array order. The native app randomized schema key order between requests, invalidating an entire 19k-token prefix and adding 14 to 15 seconds of prefill. Separate prompt tool declarations from permission to emit calls. A tool_choice none completion keeps the same schema and cache identity, while the existing suffix instruction and output handling still disable calls. Apply the same prompt shape to postcommit and Anthropic token counting. Add regressions that fail on the baseline for JSON ordering and auto/none transitions across app, OpenCode, Pi and Hermes. The focused server, cache, postcommit and observability suite passes. Real-model before-and-after validation is in progress.
Native web-chat QA caught a remaining 2.8-second follow-up: generation-final snapshots included the closing instruction that the app never sends back, invalidating the generated answer as a prefix. Capture the history before appending turn contracts and register both disabled-tool suffixes for exact prefill boundaries. Preserve the instruction during generation and preserve user-authored history. Both regressions fail before this change; 480 server, cache, postcommit, tokenizer and protocol tests pass.
…t QA Document the three prefix defects, the original 14.7-second receipt, matched 19k ABBA, the native post-tool follow-up at 0.291 seconds and the original chat at 0.277 seconds. Preserve cold-refill, background-postcommit and existing app-compaction costs so the results are not presented as a universal latency floor. Record 480 passing tests, real app/OpenCode/Pi/Hermes artifacts, signed build 2011048, runtime backups and unchanged launcher paths. Mark an unused test binding after the changed expectation; all pre-existing lint findings remain outside this scoped repair.
…irs, OpenCode 2, and the suites rerun on the final code The three fixes that landed after the SSD eviction repair are in the notes and the changelog with their measured figures: the 19k-token chat replay (15.26 to 0.57 s and 13.93 to 0.66 s to the first token), the 108,919-token OpenCode turn (48.83 to 61.77 tok/s, four alternating runs), the OpenCode 2 plugin package, the upgrade note on the one-time prefill, and the known wait on the post-tool background commit. Validation rows: Python 6,959 passed, 33 skipped, 0 failures and Swift 965 tests, 2 skipped, 0 failures, both rerun on 436d071; the 2011046 and 2011048 candidates.
…tion stamped 2.11.3 The notes read as a person wrote them: internal words (lane, arm, receipt, law, gate, die, seat, primary, canonical) replaced with plain ones, the longest sentences split, table headers renamed to Run and Version, every number and reference unchanged. The changelog heading moves from Unreleased to 2.11.3 dated 2026-09-17.
Updates the requirements on [transformers](https://github.com/huggingface/transformers) to permit the latest version. - [Release notes](https://github.com/huggingface/transformers/releases) - [Commits](huggingface/transformers@v5.10.0...v5.17.0) --- updated-dependencies: - dependency-name: transformers dependency-version: 5.16.1 dependency-type: direct:production ... Signed-off-by: dependabot[bot] <support@github.com>
dependabot
Bot
force-pushed
the
dependabot/pip/transformers-neq-5.13.0-and-lt-5.17
branch
from
September 17, 2026 05:29
7609f21 to
00ece72
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Updates the requirements on transformers to permit the latest version.
Release notes
Sourced from transformers's releases.
... (truncated)
Commits
856157av5.17.05b7dcb0MRoPE continued (#48594)50bbcc6[fix] Update stale expected strings in HunYuanVL integration tests (#48646)e8bcd79[Quantizaiton]support 5/6/7 bits in AutoRound (#48481)3283d5f[fix] Update stale golden values and fix expected_logits shape in FlavaForPre...5f47b5a[tests] Fix integration test golden values broken by fast image processor def...fc50134Add Fun-ASR-Nano model (#46180)d9fe823Fix YOLOS device mismatch with device_map="auto" (#46886)cbc1651[Generate] Avoid unconditionally downloading remote hub file (#48620)bd05a4bHonorshift_labelsin decoder-only LLM/VLM losses (#48493)