Repository navigation
Conversation
ThunderAgent's public model card was built from a fresh ModelRuntimeConfig, so frontend admission never saw backend policy such as token_budget. Copy the wrapped worker's runtime_config wholesale, then overlay CLI parsers. Signed-off-by: Jasim Kareem <mj9034812@gmail.com> Co-authored-by: Jasim Kareem <mj9034812@gmail.com>
Prudctual
had a problem deploying
to
external_collaborator
September 15, 2026 07:58 — with
GitHub Actions
Failure
There was a problem hiding this comment.
2 issues found across 6 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="components/src/dynamo/thunderagent_router/tests/test_main.py">
<violation number="1" location="components/src/dynamo/thunderagent_router/tests/test_main.py:303">
P2: This assertion does not verify that the inherited token budget is preserved. Compare the exact serialized value so parser overlays cannot silently replace it with an incorrect budget.</violation>
</file>
<file name="components/src/dynamo/thunderagent_router/proxy_card.py">
<violation number="1" location="components/src/dynamo/thunderagent_router/proxy_card.py:129">
P1: When a backend card contains a typed field without a writable Python binding, this assignment raises and the handler silently drops it. The proxy therefore does not inherit the full runtime contract; add support for these fields and carry LoRA capacity through registration instead of swallowing the failures.</violation>
</file>
Reply with feedback, questions, or to request a fix.
Re-trigger cubic
| if key == "taints" and isinstance(value, (list, tuple, set)): | ||
| assigned = set(value) | ||
| try: | ||
| setattr(cfg, key, assigned) |
There was a problem hiding this comment.
P1: When a backend card contains a typed field without a writable Python binding, this assignment raises and the handler silently drops it. The proxy therefore does not inherit the full runtime contract; add support for these fields and carry LoRA capacity through registration instead of swallowing the failures.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At components/src/dynamo/thunderagent_router/proxy_card.py, line 129:
<comment>When a backend card contains a typed field without a writable Python binding, this assignment raises and the handler silently drops it. The proxy therefore does not inherit the full runtime contract; add support for these fields and carry LoRA capacity through registration instead of swallowing the failures.</comment>
<file context>
@@ -0,0 +1,159 @@
+ if key == "taints" and isinstance(value, (list, tuple, set)):
+ assigned = set(value)
+ try:
+ setattr(cfg, key, assigned)
+ except Exception as exc:
+ logger.warning(
</file context>
| assert runtime_cfg is overlay | ||
| assert runtime_cfg.tool_call_parser == "hermes" | ||
| assert runtime_cfg.reasoning_parser == "qwen" | ||
| assert runtime_cfg.get_engine_specific("token_budget") is not None |
There was a problem hiding this comment.
P2: This assertion does not verify that the inherited token budget is preserved. Compare the exact serialized value so parser overlays cannot silently replace it with an incorrect budget.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At components/src/dynamo/thunderagent_router/tests/test_main.py, line 303:
<comment>This assertion does not verify that the inherited token budget is preserved. Compare the exact serialized value so parser overlays cannot silently replace it with an incorrect budget.</comment>
<file context>
@@ -223,3 +227,78 @@ async def test_a_placed_program_does_not_consult_the_first_chunk():
+ assert runtime_cfg is overlay
+ assert runtime_cfg.tool_call_parser == "hermes"
+ assert runtime_cfg.reasoning_parser == "qwen"
+ assert runtime_cfg.get_engine_specific("token_budget") is not None
+ assert block_size == 64
</file context>
Suggested change
| assert runtime_cfg.get_engine_specific("token_budget") is not None | |
| assert runtime_cfg.get_engine_specific("token_budget") == ( | |
| '{"combined_limit":131072,"reject_prompt_overflow":true,' | |
| '"reject_total_overflow":true}' | |
| ) |
This branch had an error being deployed
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.
Overview:
ThunderAgent was registering a synthetic public
ModelDeploymentCardwith a freshModelRuntimeConfig. Frontend admission therefore never saw the wrapped backend's runtime contract (token_budget, effective context length, engine capabilities), so over-limit prompts were admitted and then rejected after routing.This PR copies the backend card's
runtime_config(including allruntime_data) onto the proxy card before registration, then overlays CLI parser flags.Details:
token_budget).runtime_dataviaset_engine_specific, plus typed fields, structural-tag settings, and disagg bootstrap metadata.--dyn-tool-call-parser/--dyn-reasoning-parser/--publish-sglang-generateon top of the inherited contract.kv_cache_block_sizeonregister_model.This is the smallest fix for the reported admission hole. Removing ThunderAgent's public model registration entirely (the issue's longer-term direction) is left as follow-up; that would require invoking ThunderAgent as a post-preprocess router/flow-control policy.
Upstream compare (403 opening
ai-dynamo/dynamofrom this token):https://github.com/ai-dynamo/dynamo/compare/main...Prudctual:dynamo:cursor/thunderagent-proxy-runtime-config-7cc2?expand=1
Where should the reviewer start?
components/src/dynamo/thunderagent_router/proxy_card.py— inherit/select/wait helperscomponents/src/dynamo/thunderagent_router/__main__.py—_proxy_runtime_config()used atregister_modelcomponents/src/dynamo/thunderagent_router/tests/test_proxy_card.py— token_budget preservationRelated Issues
🔗 This PR is linked to an issue:
Summary
Proxy registration now inherits the backend
ModelRuntimeConfiginstead of publishing an incomplete synthetic card, so frontend token-budget admission matches the engine.Validation
pytestoncomponents/src/dynamo/thunderagent_router/tests/test_proxy_card.pyandtest_capacity.py(22 passed;dynamo.llmstubbed in this environment).test_main.pyasserts CLI parsers do not drop inheritedtoken_budget.Summary by cubic
Fixes ThunderAgent's public model card so frontend admission sees the backend's runtime contract (
token_budget, context length, capabilities) instead of a synthetic empty config. Previously, over-limit prompts were admitted then rejected after routing. Closes ai-dynamo#14762.Bug Fixes
runtime_dataand structural‑tag settings.--dyn-tool-call-parser,--dyn-reasoning-parser, and--publish-sglang-generateon top of the inherited contract.kv_cache_block_sizeonregister_model.Written for commit e2e1479. Summary will update on new commits.