import { describe, it, expect } from 'vitest'; import { rewriteVllmResponse } from '../src/proxy/vllm-response-rewriter'; describe('vLLM Response Rewriter', () => { it('rewrites XML tool call in OpenAI choices content into structured tool_calls', () => { const inputResponse = { id: "chatcmpl-123", choices: [{ index: 0, message: { role: "assistant", content: "\n\n/tmp/test.txt\n\n" } }] }; const result = rewriteVllmResponse(inputResponse); expect(result.choices[0].message.content).toBe(""); expect(result.choices[0].message.tool_calls).toBeDefined(); expect(result.choices[0].message.tool_calls).toHaveLength(1); const toolCall = result.choices[0].message.tool_calls![0]; expect(toolCall.type).toBe('function'); expect(toolCall.function.name).toBe('read'); const argsObject = JSON.parse(toolCall.function.arguments); expect(argsObject).toEqual({ path: '/tmp/test.txt' }); }); it('normalizes response that already has tool_calls into a tool-first shape', () => { const inputResponse = { choices: [{ message: { role: "assistant", content: "Here are the calls", thinking: "internal", tool_calls: [ { id: "123", type: "function", function: { name: "read", arguments: "{}" } } ] } }] }; const result = rewriteVllmResponse(inputResponse); expect(result.choices[0].message.content).toBe(""); expect(result.choices[0].message.thinking).toBe(""); expect(result.choices[0].message.tool_calls).toHaveLength(1); }); it('rewrites tool call found in reasoning_content into structured tool_calls', () => { const inputResponse = { id: "chatcmpl-123", choices: [{ index: 0, message: { role: "assistant", content: "", reasoning_content: "\n{\"name\":\"read\",\"arguments\":{\"path\":\"/tmp/test.txt\"}}\n" } }] }; const result = rewriteVllmResponse(inputResponse); expect(result.choices[0].message.content).toBe(""); expect(result.choices[0].message.tool_calls).toBeDefined(); expect(result.choices[0].message.tool_calls).toHaveLength(1); expect(result.choices[0].message.tool_calls[0].function.name).toBe("read"); expect(JSON.parse(result.choices[0].message.tool_calls[0].function.arguments)).toEqual({ path: "/tmp/test.txt" }); expect(result.choices[0].message.reasoning_content).toBe(""); }); });