diff --git a/nemoclaw-blueprint/scripts/nemotron-inference-fix.js b/nemoclaw-blueprint/scripts/nemotron-inference-fix.js index dc9a26ded66..70e20e2251f 100644 --- a/nemoclaw-blueprint/scripts/nemotron-inference-fix.js +++ b/nemoclaw-blueprint/scripts/nemotron-inference-fix.js @@ -539,17 +539,23 @@ var origRequest = mod.request; mod.request = function (options, callback) { - if (typeof options === 'string' || !options) { + var isUrlForm = + typeof options === 'string' || + (typeof URL !== 'undefined' && options instanceof URL); + var requestOptions = + isUrlForm && callback && typeof callback === 'object' ? callback : options; + if (!requestOptions || typeof requestOptions !== 'object') { return origRequest.apply(mod, arguments); } - var upstreamProvider = upstreamProviderFromHeaders(options.headers); + var upstreamProvider = upstreamProviderFromHeaders(requestOptions.headers); var req = origRequest.apply(mod, arguments); if (upstreamProvider !== undefined && req.removeHeader) { req.removeHeader(UPSTREAM_PROVIDER_HEADER); } // Only intercept object-form calls with a recognisable path. + if (isUrlForm) return req; var path = options.path || ''; if (!isChatCompletionsPost(options.method, path)) { return req; diff --git a/test/nemotron-inference-fix.test.ts b/test/nemotron-inference-fix.test.ts index 8f2a22ecb40..fc202b01528 100644 --- a/test/nemotron-inference-fix.test.ts +++ b/test/nemotron-inference-fix.test.ts @@ -309,6 +309,46 @@ console.log(JSON.stringify(records)); expect(missingProvider.thinking).toBe(false); }); + it("preload removes the runtime provider marker from URL-form Node requests (#6913)", () => { + const preload = extractStartScriptHeredoc(src, "NEMOTRON_FIX_EOF"); + const harness = ` +const http = require('http'); +const https = require('https'); +${preload} +function inspectHeaders(mod, url, headers) { + const request = mod.request(url, { headers }); + const actualHeaders = request.getHeaders(); + request.on('error', () => {}); + request.destroy(); + return actualHeaders; +} +const headers = [ + inspectHeaders(http, 'http://127.0.0.1:9/v1/models', { + 'X-NemoClaw-Upstream-Provider': 'nvidia-prod', + 'X-Keep': 'http', + }), + inspectHeaders(https, new URL('https://127.0.0.1:9/v1/models'), { + 'x-nemoclaw-upstream-provider': 'compatible-endpoint', + 'X-Keep': 'https', + }), +]; +console.log(JSON.stringify(headers)); +`; + + const result = spawnSync(process.execPath, ["-e", harness], { + encoding: "utf-8", + timeout: 5000, + }); + expect(result.status, result.stderr).toBe(0); + const headers = JSON.parse(result.stdout.trim()); + + expect(headers).toHaveLength(2); + expect(headers[0]["x-nemoclaw-upstream-provider"]).toBeUndefined(); + expect(headers[0]["x-keep"]).toBe("http"); + expect(headers[1]["x-nemoclaw-upstream-provider"]).toBeUndefined(); + expect(headers[1]["x-keep"]).toBe("https"); + }); + it("preload also injects model-specific kwargs for stubbed fetch requests", () => { const preload = extractStartScriptHeredoc(src, "NEMOTRON_FIX_EOF"); const harness = `