Nemotron Cascade mutates nested path literals in tool arguments even with explicit literal-preservation instructions and temperature=0.

#23
by joonsoo-me - opened

Nemotron Cascade Tool-Calling Issue Report

It can emit valid tool calls for simple flat schemas, but it does not reliably preserve exact path literals inside nested tool arguments.

The failure persisted after:

  • strengthening the Jinja template with explicit literal-preservation language
  • adding a negative example
  • switching sampling to temperature: 0

The result is a model-side fidelity problem for agentic tool use, especially for file/repo operations where exact paths must not drift.

Environment

  • Host under test: dgx spark gb10
  • Runtime: llama.cpp
  • llama.cpp commit: 6861f6509a2b
  • Model: Nemotron-Cascade-2-30B-A3B-MXFP4_MOE_F16.gguf - almost same for automation job
  • Chat template: nemotron-opencode-custom-v0.1.jinja - keep base template and added more functions to augment tool-calling
  • Reasoning: off
  • Tested sampling:
    • test 1 : temperature: 0.35
    • test 2 : temperature: 0

What Worked

Flat tool calling is functional.

Test Result
Flat calculator tool call finish_reason=tool_calls
Flat tool round-trip Correct final answer returned

Example:

calculator(128 * 37)

Observed output:

finish_reason=tool_calls
The product is 4736

What Failed

Nested object arguments do not preserve exact path literals.

Reproduction Case

Tool schema conceptually included a nested object like:

{
  "type": "object",
  "properties": {
    "path": { "type": "string" },
    "options": {
      "type": "object",
      "properties": {
        "recursive": { "type": "boolean" },
        "include_hidden": { "type": "boolean" }
      },
      "required": ["recursive"]
    }
  },
  "required": ["path", "options"]
}

Prompt intent:

Use the search_files tool. Preserve exact path literals character-for-character.

Expected behavior:

/home/username1234/llama.cpp

Observed behavior (critical):

/home/username1235/llama.cpp

After re-running with temperature: 0, the drift still occurred:

/home/username1234/llama.cpp
→
/home/username1236/llama.cpp

Impact

This is safe enough for tool selection, but not safe for exact-path automation .

Affected workflows:

  • file search
  • file edit
  • repository navigation
  • any agent flow that must preserve literal paths, IDs, or filenames exactly

Jinja Hardening Already Tried

The following template-level changes were already tested and did not fix the issue:

  • stronger explicit literal-preservation instructions
  • negative example for path copying
  • generic OpenCode-style tool-call formatting
  • non-reasoning default
  • temperature: 0

Conclusion

The model is capable of basic tool calling, but nested tool arguments are not reliable enough for path-sensitive agentic use .

Sign up or log in to comment