Repository navigation
Conversation
Backport the llm_config lookup proposed by BobClawblaw in ashhart#897, commit 5f09454. Nemotron Omni stores its text vocabulary there, so native 1.0.12 refuses forced tools and structured output despite serving ordinary requests. Isolate the lookup in the existing grammar module, retain text_config priority and root fallback, and check the u32 range before casting. Add the reduced Omni regression and existing-layout precedence cases to the server's normal test harness. Co-authored-by: BobClawblaw <BobClawblaw@users.noreply.github.com>
cwschroeder
left a comment
There was a problem hiding this comment.
Source and CPU review of 80559ad2 on main 46a08c18. The text_config → llm_config → root order matches the documented layouts, Value.get safely skips non-objects, and the integer check excludes bool/string/float values before the cast. The helper is used by grammarCompiler and registered in the standard server test root.
With Zig 0.17.0 on macOS arm64, I independently ran the full CPU server wrapper: 370 server tests, 5 JSON tests and 168 engine-seam tests pass. The focused vocabulary tests also pass in Fast. As a negative control, I copied the server module into a temporary tree and replaced only the helper body with the unchanged main lookup: both new regression tests fail in Debug and Fast. No tracked source was changed. Whole-tree format and patch whitespace pass; lean is 517 on both base and head, zero new. Source review found no new material regression.
One nonblocking ABI-range note is below; the downstream narrowing predates this patch and does not affect the Nemotron vocabulary of 131072. The actual current-head No GPU run 38909568688 is action_required with zero jobs, so remote CI has not executed. These checks do not qualify a patched GPU binary or constrained model output.
|
Tested on hardware: one DGX Spark (GB10), driver 580.178.04.
The forced-tool replies are token-identical to the model's own unconstrained tool choice, and the unconstrained control matches 1.0.12, so the grammar only constrains where it is asked to. |
cwschroeder
left a comment
There was a problem hiding this comment.
Rechecked 022344e9, specifically the signed-C-range follow-up. With Zig 0.17.0 on macOS arm64, test-server-cpu passes 370 server tests and 5 JSON tests; both focused vocabulary tests also pass in Fast. In a temporary copy, reverting only maxInt(c_int) to maxInt(u32) makes the boundary regression fail on 2147483648 while the Omni lookup control still passes. Whole-tree format and patch whitespace pass.
Astra found no material regression in this adoption delta. This closes my lookup narrowing note, including fallback from an oversized nested value. These tests exercise vocabulary selection, not the C grammar compiler at extreme sizes. Current-head remote checks are absent.
The separate GB10 receipt is pinned to the same head and adds strict-schema/forced-tool evidence with an unchanged plain-chat control. That is tovereast's hardware run; I have not run or deployed a GPU binary here.
|
Thank you, @swbiggart, for nested vocabulary discovery and the signed C-ABI boundary check. We merged both commits for 1.1.0 in 93d1116, retaining @BobClawblaw's co-author credit. The server checks The regressions cover nesting, precedence, invalid values and signed boundaries. This addresses #951's Omni grammar vocabulary mismatch. Posted by Ash's AI Assistant Synthena |
Bolt's config.json (model_type nemotron_h_omni) keeps vocab_size under llm_config. grammar.vocab_size read text_config and the top level only, found nothing, and every response_format or guided request got a 400. It now reads text_config, llm_config, then the top level, and a value that is a bool, not positive, or past 2^31 - 1 falls through to the next place. Before, a JSON true passed isinstance(.., int) as a width of 1. Ports upstream TensorFold 80559ad (llm_config lookup, from BobClawblaw's ashhart#897) and 022344e (signed C int bound); ashhart#951, ashhart#953. Tests: tests/test_grammar_vocab.py, with Bolt's real config.json (skipped when absent) and upstream's synthetic cases: 11 of 22 failed before, 22 of 22 pass after. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Qj4LeSvZn6iJnKY4dqjKJ8
Fixes #951.
Nemotron Omni checkpoints store the text vocabulary in
llm_config. The grammar compiler only checkedtext_configand the root, causing native 1.0.12 to reject named/required tools and strict JSON schemas for Super VL. Read the vocabulary intext_config→llm_config→ root order and reject invalid values before casting tou32.The missing lookup was originally proposed by BobClawblaw in #897, specifically commit 5f094543. This PR extracts that fix from the broader Bolt contribution and adds focused regression coverage. The commit includes BobClawblaw's co-author trailer.
The patch uses the existing grammar module, camelCase helper naming, inline arena-backed Zig tests and normal server test registration. It adds no dependencies and preserves existing nested-text priority and root fallback.
Validation on Zig 0.17.0, macOS arm64:
A patched native binary has not been qualified on CUDA. The released-binary config workaround described in #951 supports the diagnosis; it is separate from source-patch runtime qualification.