diff --git a/lua/avante/llm.lua b/lua/avante/llm.lua index 8cfef6a..69edc97 100644 --- a/lua/avante/llm.lua +++ b/lua/avante/llm.lua @@ -464,6 +464,10 @@ function M.generate_prompts(opts) if opts.tools then tools = vim.list_extend(tools, opts.tools) end if opts.prompt_opts and opts.prompt_opts.tools then tools = vim.list_extend(tools, opts.prompt_opts.tools) end + -- Set tools to nil if empty to avoid sending empty arrays to APIs that require + -- tools to be either non-existent or have at least one item + if #tools == 0 then tools = nil end + local agents_rules = Prompts.get_agents_rules_prompt() if agents_rules then system_prompt = system_prompt .. "\n\n" .. agents_rules end local cursor_rules = Prompts.get_cursor_rules_prompt(selected_files) diff --git a/tests/llm_spec.lua b/tests/llm_spec.lua index 91e7cc0..435532a 100644 --- a/tests/llm_spec.lua +++ b/tests/llm_spec.lua @@ -112,4 +112,42 @@ describe("generate_prompts", function() llm.generate_prompts(opts) assert.are.same(opts.instructions, nil) end) + + it("should set tools to nil when no tools are provided", function() + local opts = {} + local result = llm.generate_prompts(opts) + assert.are.same(result.tools, nil) + end) + + it("should set tools to nil when empty tools array is provided", function() + local opts = { + tools = {}, + } + local result = llm.generate_prompts(opts) + assert.are.same(result.tools, nil) + end) + + it("should set tools to nil when empty prompt_opts.tools array is provided", function() + local opts = { + prompt_opts = { + tools = {}, + }, + } + local result = llm.generate_prompts(opts) + assert.are.same(result.tools, nil) + end) + + it("should include tools when non-empty tools are provided", function() + local mock_tool = { + name = "test_tool", + description = "A test tool", + func = function() end, + } + local opts = { + tools = { mock_tool }, + } + local result = llm.generate_prompts(opts) + assert.are.same(#result.tools, 1) + assert.are.same(result.tools[1].name, "test_tool") + end) end)