diff --git a/tests/unit/grok-web.test.ts b/tests/unit/grok-web.test.ts index 273e728179..9d5c614c39 100644 --- a/tests/unit/grok-web.test.ts +++ b/tests/unit/grok-web.test.ts @@ -609,7 +609,9 @@ test("Non-streaming: routes native Grok webSearch to URL fetch tool when user as const result = await executor.execute({ model: "grok-4.1-fast", body: { - messages: [{ role: "user", content: "Haz webfetch de http://endless.horse/ y dime que hay" }], + messages: [ + { role: "user", content: "Haz webfetch de http://endless.horse/ y dime que hay" }, + ], stream: false, tools: [ { @@ -645,7 +647,10 @@ test("Non-streaming: routes native Grok webSearch to URL fetch tool when user as }); const json = (await result.response.json()) as any; assert.equal(json.choices[0].message.tool_calls[0].function.name, "webfetch"); - assert.equal(json.choices[0].message.tool_calls[0].function.arguments, JSON.stringify({ url: "http://endless.horse/" })); + assert.equal( + json.choices[0].message.tool_calls[0].function.arguments, + JSON.stringify({ url: "http://endless.horse/" }) + ); } finally { restore(); } @@ -678,7 +683,11 @@ test("Non-streaming: keeps native Grok webSearch on search tool when user asks s function: { name: "public_search_tool", description: "Search the web for any topic", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -686,7 +695,11 @@ test("Non-streaming: keeps native Grok webSearch on search tool when user asks s function: { name: "webfetch", description: "Fetch a URL and extract page content", - parameters: { type: "object", properties: { url: { type: "string" } }, required: ["url"] }, + parameters: { + type: "object", + properties: { url: { type: "string" } }, + required: ["url"], + }, }, }, ], @@ -729,7 +742,11 @@ test("Non-streaming: native Grok webSearch does not choose context memory search function: { name: "memory_context_tool", description: "Search across project memories and conversation history", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -737,7 +754,11 @@ test("Non-streaming: native Grok webSearch does not choose context memory search function: { name: "public_search_tool", description: "Search the web for current public information", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, ], @@ -778,7 +799,12 @@ test("Non-streaming: maps native Grok browsePage to URL fetch tool", async () => const result = await executor.execute({ model: "grok-4.1-fast", body: { - messages: [{ role: "user", content: "Busca la release oficial de Ubuntu y abre la pagina del anuncio" }], + messages: [ + { + role: "user", + content: "Busca la release oficial de Ubuntu y abre la pagina del anuncio", + }, + ], stream: false, tools: [ { @@ -786,7 +812,11 @@ test("Non-streaming: maps native Grok browsePage to URL fetch tool", async () => function: { name: "public_search_tool", description: "Search the web for any topic", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -794,7 +824,11 @@ test("Non-streaming: maps native Grok browsePage to URL fetch tool", async () => function: { name: "webfetch", description: "Fetch a URL with better extraction for static/docs pages", - parameters: { type: "object", properties: { url: { type: "string" }, prompt: { type: "string" } }, required: ["url"] }, + parameters: { + type: "object", + properties: { url: { type: "string" }, prompt: { type: "string" } }, + required: ["url"], + }, }, }, ], @@ -849,7 +883,15 @@ test("Non-streaming: does not repeat a tool call that already has a tool result" { role: "tool", tool_call_id: "call_1", name: "bash", content: "413 /tmp/a" }, ], stream: false, - tools: [{ type: "function", function: { name: "bash", parameters: { type: "object", properties: { command: { type: "string" } } } } }], + tools: [ + { + type: "function", + function: { + name: "bash", + parameters: { type: "object", properties: { command: { type: "string" } } }, + }, + }, + ], }, stream: false, credentials: { apiKey: "test-sso-token" }, @@ -894,7 +936,10 @@ test("Non-streaming: does not repeat equivalent terminal command with different type: "function", function: { name: "bash", - arguments: JSON.stringify({ command: 'wc -l "/tmp/a"', description: "previous run" }), + arguments: JSON.stringify({ + command: 'wc -l "/tmp/a"', + description: "previous run", + }), }, }, ], @@ -953,15 +998,31 @@ test("Non-streaming: allows a different tool after a completed call", async () = role: "assistant", content: null, tool_calls: [ - { id: "call_1", type: "function", function: { name: "bash", arguments: JSON.stringify({ command: "wc -l /tmp/a" }) } }, + { + id: "call_1", + type: "function", + function: { name: "bash", arguments: JSON.stringify({ command: "wc -l /tmp/a" }) }, + }, ], }, { role: "tool", tool_call_id: "call_1", name: "bash", content: "413 /tmp/a" }, ], stream: false, tools: [ - { type: "function", function: { name: "bash", parameters: { type: "object", properties: { command: { type: "string" } } } } }, - { type: "function", function: { name: "read", parameters: { type: "object", properties: { filePath: { type: "string" } } } } }, + { + type: "function", + function: { + name: "bash", + parameters: { type: "object", properties: { command: { type: "string" } } }, + }, + }, + { + type: "function", + function: { + name: "read", + parameters: { type: "object", properties: { filePath: { type: "string" } } }, + }, + }, ], }, stream: false, @@ -1011,11 +1072,19 @@ test("Non-streaming: raw_function_result is not emitted as final content", async { id: "call_1", type: "function", - function: { name: "bash", arguments: JSON.stringify({ command: "wc -l /tmp/project/config.json" }) }, + function: { + name: "bash", + arguments: JSON.stringify({ command: "wc -l /tmp/project/config.json" }), + }, }, ], }, - { role: "tool", tool_call_id: "call_1", name: "bash", content: "413 /tmp/project/config.json" }, + { + role: "tool", + tool_call_id: "call_1", + name: "bash", + content: "413 /tmp/project/config.json", + }, ], stream: false, }, @@ -1099,7 +1168,9 @@ test("Request: forwards tool results into Grok prompt for the next turn", async status: 200, headers: new Headers({ "Content-Type": "application/json" }), text: null, - body: mockGrokStream([{ result: { response: { modelResponse: { message: "It is sunny." } } } }]), + body: mockGrokStream([ + { result: { response: { modelResponse: { message: "It is sunny." } } } }, + ]), }; }); try { @@ -1113,7 +1184,11 @@ test("Request: forwards tool results into Grok prompt for the next turn", async role: "assistant", content: null, tool_calls: [ - { id: "call_weather", type: "function", function: { name: "get_weather", arguments: "{}" } }, + { + id: "call_weather", + type: "function", + function: { name: "get_weather", arguments: "{}" }, + }, ], }, { role: "tool", tool_call_id: "call_weather", name: "get_weather", content: "sunny" }, @@ -1127,7 +1202,11 @@ test("Request: forwards tool results into Grok prompt for the next turn", async }); const payload = JSON.parse(capturedBody); assert.ok(payload.message.includes("Previous assistant tool calls")); - assert.ok(payload.message.includes("CLIENT TOOL RESULT from caller runtime for get_weather (call_weather)")); + assert.ok( + payload.message.includes( + "CLIENT TOOL RESULT from caller runtime for get_weather (call_weather)" + ) + ); assert.ok(payload.message.includes("do not call the same tool again")); assert.ok(payload.message.includes("sunny")); } finally { @@ -1209,7 +1288,9 @@ test("Request: leaves native Grok search enabled when client tools are absent", }); test("Request: places tool manifest next to latest user after noisy history", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1218,7 +1299,10 @@ test("Request: places tool manifest next to latest user after noisy history", as messages: [ { role: "user", content: "old question" }, { role: "assistant", content: "old answer claiming file does not exist" }, - { role: "user", content: "/tmp/project/config.json dime cuantas lineas tiene este archivo" }, + { + role: "user", + content: "/tmp/project/config.json dime cuantas lineas tiene este archivo", + }, ], stream: false, tools: [ @@ -1227,7 +1311,11 @@ test("Request: places tool manifest next to latest user after noisy history", as function: { name: "bash", description: "Run a shell command", - parameters: { type: "object", properties: { command: { type: "string" } }, required: ["command"] }, + parameters: { + type: "object", + properties: { command: { type: "string" } }, + required: ["command"], + }, }, }, ], @@ -1250,7 +1338,9 @@ test("Request: places tool manifest next to latest user after noisy history", as }); test("Request: strips injected internal reminders from Grok prompt", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1270,7 +1360,11 @@ test("Request: strips injected internal reminders from Grok prompt", async () => function: { name: "fetch_url_tool", description: "Fetch URL or browse web page content", - parameters: { type: "object", properties: { url: { type: "string" } }, required: ["url"] }, + parameters: { + type: "object", + properties: { url: { type: "string" } }, + required: ["url"], + }, }, }, ], @@ -1290,7 +1384,9 @@ test("Request: strips injected internal reminders from Grok prompt", async () => }); test("Request: old completed tools do not suppress fresh latest-user tool calls", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1320,7 +1416,11 @@ test("Request: old completed tools do not suppress fresh latest-user tool calls" function: { name: "bash", description: "Run a shell command", - parameters: { type: "object", properties: { command: { type: "string" } }, required: ["command"] }, + parameters: { + type: "object", + properties: { command: { type: "string" } }, + required: ["command"], + }, }, }, ], @@ -1339,7 +1439,9 @@ test("Request: old completed tools do not suppress fresh latest-user tool calls" }); test("Request: appends tool manifest after tool results during multi-step continuation", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1351,7 +1453,11 @@ test("Request: appends tool manifest after tool results during multi-step contin role: "assistant", content: "", tool_calls: [ - { id: "read_call", type: "function", function: { name: "read", arguments: JSON.stringify({ filePath: "/tmp/a" }) } }, + { + id: "read_call", + type: "function", + function: { name: "read", arguments: JSON.stringify({ filePath: "/tmp/a" }) }, + }, ], }, { role: "tool", tool_call_id: "read_call", name: "read", content: "file content" }, @@ -1363,7 +1469,11 @@ test("Request: appends tool manifest after tool results during multi-step contin function: { name: "memory_context_tool", description: "Search across project memories and raw conversation history.", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -1371,7 +1481,11 @@ test("Request: appends tool manifest after tool results during multi-step contin function: { name: "public_search_tool", description: "Search the web for any topic and get clean content.", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, ], @@ -1393,7 +1507,9 @@ test("Request: appends tool manifest after tool results during multi-step contin }); test("Request: keeps generic manifest ordered for file understanding tasks", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1412,7 +1528,11 @@ test("Request: keeps generic manifest ordered for file understanding tasks", asy function: { name: "bash", description: "Execute shell command", - parameters: { type: "object", properties: { command: { type: "string" }, description: { type: "string" } }, required: ["command"] }, + parameters: { + type: "object", + properties: { command: { type: "string" }, description: { type: "string" } }, + required: ["command"], + }, }, }, { @@ -1420,7 +1540,11 @@ test("Request: keeps generic manifest ordered for file understanding tasks", asy function: { name: "read", description: "Read a file or directory from the local filesystem", - parameters: { type: "object", properties: { filePath: { type: "string" } }, required: ["filePath"] }, + parameters: { + type: "object", + properties: { filePath: { type: "string" } }, + required: ["filePath"], + }, }, }, ], @@ -1448,21 +1572,33 @@ test("Request: keeps generic manifest ordered for file understanding tasks", asy }); test("Request: keeps generic manifest ordered for official web facts", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ model: "grok-4.1-fast", body: { - messages: [{ role: "user", content: "contrasta con una fuente web oficial la ultima release de Ubuntu 24.04" }], + messages: [ + { + role: "user", + content: "contrasta con una fuente web oficial la ultima release de Ubuntu 24.04", + }, + ], stream: false, tools: [ { type: "function", function: { name: "memory_context_tool", - description: "Search across project memories, indexed git commits, and raw conversation history.", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + description: + "Search across project memories, indexed git commits, and raw conversation history.", + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -1470,7 +1606,11 @@ test("Request: keeps generic manifest ordered for official web facts", async () function: { name: "public_search_tool", description: "Search the web for any topic and get clean, ready-to-use content.", - parameters: { type: "object", properties: { query: { type: "string" }, numResults: { type: "number" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" }, numResults: { type: "number" } }, + required: ["query"], + }, }, }, ], @@ -1498,7 +1638,9 @@ test("Request: keeps generic manifest ordered for official web facts", async () }); test("Request: base manifest order puts public web search before context memory", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1512,7 +1654,11 @@ test("Request: base manifest order puts public web search before context memory" function: { name: "memory_context_tool", description: "Search across project memories and conversation history", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -1520,7 +1666,11 @@ test("Request: base manifest order puts public web search before context memory" function: { name: "public_search_tool", description: "Search the web for current public information", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, ], @@ -1531,14 +1681,18 @@ test("Request: base manifest order puts public web search before context memory" log: null, }); const prompt = String(capture.body.message); - assert.ok(prompt.indexOf("name: public_search_tool") < prompt.indexOf("name: memory_context_tool")); + assert.ok( + prompt.indexOf("name: public_search_tool") < prompt.indexOf("name: memory_context_tool") + ); } finally { capture.restore(); } }); test("Request: ranks public web search before infrastructure search", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1551,8 +1705,13 @@ test("Request: ranks public web search before infrastructure search", async () = type: "function", function: { name: "tool_discovery_search", - description: "Search and discover available upstream tools using BM25 full-text search", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + description: + "Search and discover available upstream tools using BM25 full-text search", + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -1560,7 +1719,11 @@ test("Request: ranks public web search before infrastructure search", async () = function: { name: "public_search_tool", description: "Search the web for current public information", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, ], @@ -1571,14 +1734,18 @@ test("Request: ranks public web search before infrastructure search", async () = log: null, }); const prompt = String(capture.body.message); - assert.ok(prompt.indexOf("name: public_search_tool") < prompt.indexOf("name: tool_discovery_search")); + assert.ok( + prompt.indexOf("name: public_search_tool") < prompt.indexOf("name: tool_discovery_search") + ); } finally { capture.restore(); } }); test("Request: ranks URL fetch before generic MCP read", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1591,8 +1758,13 @@ test("Request: ranks URL fetch before generic MCP read", async () => { type: "function", function: { name: "mcp_read_tool", - description: "Execute a read-only upstream tool such as fetch, get, query, list, or search", - parameters: { type: "object", properties: { name: { type: "string" }, args: { type: "object" } }, required: ["name"] }, + description: + "Execute a read-only upstream tool such as fetch, get, query, list, or search", + parameters: { + type: "object", + properties: { name: { type: "string" }, args: { type: "object" } }, + required: ["name"], + }, }, }, { @@ -1600,7 +1772,11 @@ test("Request: ranks URL fetch before generic MCP read", async () => { function: { name: "fetch_url_tool", description: "Fetch URL or browse web page content", - parameters: { type: "object", properties: { url: { type: "string" } }, required: ["url"] }, + parameters: { + type: "object", + properties: { url: { type: "string" } }, + required: ["url"], + }, }, }, ], @@ -1618,7 +1794,9 @@ test("Request: ranks URL fetch before generic MCP read", async () => { }); test("Request: ranks shell command before infrastructure command config", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1632,7 +1810,11 @@ test("Request: ranks shell command before infrastructure command config", async function: { name: "upstream_server_config", description: "Manage upstream MCP servers, including stdio command configuration", - parameters: { type: "object", properties: { command: { type: "string" }, name: { type: "string" } }, required: ["name"] }, + parameters: { + type: "object", + properties: { command: { type: "string" }, name: { type: "string" } }, + required: ["name"], + }, }, }, { @@ -1640,7 +1822,11 @@ test("Request: ranks shell command before infrastructure command config", async function: { name: "shell_command_tool", description: "Execute a shell command and return output", - parameters: { type: "object", properties: { command: { type: "string" } }, required: ["command"] }, + parameters: { + type: "object", + properties: { command: { type: "string" } }, + required: ["command"], + }, }, }, ], @@ -1651,20 +1837,26 @@ test("Request: ranks shell command before infrastructure command config", async log: null, }); const prompt = String(capture.body.message); - assert.ok(prompt.indexOf("name: shell_command_tool") < prompt.indexOf("name: upstream_server_config")); + assert.ok( + prompt.indexOf("name: shell_command_tool") < prompt.indexOf("name: upstream_server_config") + ); } finally { capture.restore(); } }); test("Request: commit wording does not prioritize memory over shell", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ model: "grok-4.1-fast", body: { - messages: [{ role: "user", content: "ejecuta git rev-parse HEAD para ver el commit actual" }], + messages: [ + { role: "user", content: "ejecuta git rev-parse HEAD para ver el commit actual" }, + ], stream: false, tools: [ { @@ -1672,7 +1864,11 @@ test("Request: commit wording does not prioritize memory over shell", async () = function: { name: "memory_context_tool", description: "Search project memories and conversation history", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -1680,7 +1876,11 @@ test("Request: commit wording does not prioritize memory over shell", async () = function: { name: "shell_command_tool", description: "Execute a shell command and return output", - parameters: { type: "object", properties: { command: { type: "string" } }, required: ["command"] }, + parameters: { + type: "object", + properties: { command: { type: "string" } }, + required: ["command"], + }, }, }, ], @@ -1691,14 +1891,18 @@ test("Request: commit wording does not prioritize memory over shell", async () = log: null, }); const prompt = String(capture.body.message); - assert.ok(prompt.indexOf("name: shell_command_tool") < prompt.indexOf("name: memory_context_tool")); + assert.ok( + prompt.indexOf("name: shell_command_tool") < prompt.indexOf("name: memory_context_tool") + ); } finally { capture.restore(); } }); test("Request: explicit memory request prioritizes context over public web", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1712,7 +1916,11 @@ test("Request: explicit memory request prioritizes context over public web", asy function: { name: "public_search_tool", description: "Search the web for current public information", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, { @@ -1720,7 +1928,11 @@ test("Request: explicit memory request prioritizes context over public web", asy function: { name: "memory_context_tool", description: "Search project memories and conversation history", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, ], @@ -1731,14 +1943,18 @@ test("Request: explicit memory request prioritizes context over public web", asy log: null, }); const prompt = String(capture.body.message); - assert.ok(prompt.indexOf("name: memory_context_tool") < prompt.indexOf("name: public_search_tool")); + assert.ok( + prompt.indexOf("name: memory_context_tool") < prompt.indexOf("name: public_search_tool") + ); } finally { capture.restore(); } }); test("Request: explicit tool_choice exposes only the forced tool", async () => { - const capture = mockFetchCapture([{ result: { response: { modelResponse: { message: "{}" } } } }]); + const capture = mockFetchCapture([ + { result: { response: { modelResponse: { message: "{}" } } } }, + ]); try { const executor = new GrokWebExecutor(); await executor.execute({ @@ -1753,7 +1969,11 @@ test("Request: explicit tool_choice exposes only the forced tool", async () => { function: { name: "other_tool", description: "Other available tool", - parameters: { type: "object", properties: { input: { type: "string" } }, required: ["input"] }, + parameters: { + type: "object", + properties: { input: { type: "string" } }, + required: ["input"], + }, }, }, { @@ -1761,7 +1981,11 @@ test("Request: explicit tool_choice exposes only the forced tool", async () => { function: { name: "forced_tool", description: "Forced tool", - parameters: { type: "object", properties: { input: { type: "string" } }, required: ["input"] }, + parameters: { + type: "object", + properties: { input: { type: "string" } }, + required: ["input"], + }, }, }, ], @@ -1843,7 +2067,11 @@ test("Non-streaming: routes URL-like webfetch requests conservatively", async () function: { name: "fetch_url_tool", description: "Fetch URL or browse web page content", - parameters: { type: "object", properties: { url: { type: "string" } }, required: ["url"] }, + parameters: { + type: "object", + properties: { url: { type: "string" } }, + required: ["url"], + }, }, }, { @@ -1851,7 +2079,11 @@ test("Non-streaming: routes URL-like webfetch requests conservatively", async () function: { name: "public_search_tool", description: "Search the web for current public information", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, ], @@ -1862,8 +2094,16 @@ test("Non-streaming: routes URL-like webfetch requests conservatively", async () log: null, }); const json = (await result.response.json()) as any; - assert.equal(json.choices[0].message.tool_calls[0].function.name, item.expectedName, item.title); - assert.equal(json.choices[0].message.tool_calls[0].function.arguments, JSON.stringify(item.expectedArgs), item.title); + assert.equal( + json.choices[0].message.tool_calls[0].function.name, + item.expectedName, + item.title + ); + assert.equal( + json.choices[0].message.tool_calls[0].function.arguments, + JSON.stringify(item.expectedArgs), + item.title + ); } finally { restore(); } @@ -1963,7 +2203,11 @@ test("Streaming: handles Grok card closing tags split across chunks", async () = test("Streaming: strips self-closing Grok render cards without swallowing later text", async () => { const restore = mockFetch(200, [ { result: { response: { token: "Alpha " } } }, - { result: { response: { token: ' omega' } } }, + { + result: { + response: { token: ' omega' }, + }, + }, { result: { response: { modelResponse: { message: "Alpha omega" } } } }, ]); try { @@ -2040,10 +2284,39 @@ test("Streaming: maps structured Grok thinking to reasoning_content", async () = test("Streaming: routes Grok thinking tokens separately from content", async () => { const restore = mockFetch(200, [ - { result: { response: { token: "Thinking about your request", isThinking: true, messageTag: "header", messageStepId: 0 } } }, - { result: { response: { token: "Buscando fecha de lanzamiento", isThinking: true, messageTag: "header" } } }, - { result: { response: { token: "- Tool calls succeeded, confirming Ubuntu 24.04.4.\n", isThinking: true, messageTag: "summary" } } }, - { result: { response: { token: "Tool call ejecutado.\nweb_search ejecutado correctamente.\n" } } }, + { + result: { + response: { + token: "Thinking about your request", + isThinking: true, + messageTag: "header", + messageStepId: 0, + }, + }, + }, + { + result: { + response: { + token: "Buscando fecha de lanzamiento", + isThinking: true, + messageTag: "header", + }, + }, + }, + { + result: { + response: { + token: "- Tool calls succeeded, confirming Ubuntu 24.04.4.\n", + isThinking: true, + messageTag: "summary", + }, + }, + }, + { + result: { + response: { token: "Tool call ejecutado.\nweb_search ejecutado correctamente.\n" }, + }, + }, { result: { response: { token: "Resultados clave:\n- Ubuntu 24.04.4 LTS liberado.\n" } } }, { result: { @@ -2322,7 +2595,11 @@ test("Request: preserves selected mode and native search state when client tools function: { name: "public_search_tool", description: "Search the public web", - parameters: { type: "object", properties: { query: { type: "string" } }, required: ["query"] }, + parameters: { + type: "object", + properties: { query: { type: "string" } }, + required: ["query"], + }, }, }, ],