diff --git a/.changeset/brown-dodos-relax.md b/.changeset/brown-dodos-relax.md new file mode 100644 index 0000000000000000000000000000000000000000..a3c8068ad1eec68af537a23e9a70f08ac408165c --- /dev/null +++ b/.changeset/brown-dodos-relax.md @@ -0,0 +1,6 @@ +--- +"llamaindex": patch +"@llamaindex/edge": patch +--- + +fix: allow passing empty tools to llms diff --git a/packages/core/src/llm/anthropic.ts b/packages/core/src/llm/anthropic.ts index a708d9b0a29b91b88d3d399e2a121c06ed41d557..e6d4bfa4e85bb0d1b59a0023cfca812cd89797e4 100644 --- a/packages/core/src/llm/anthropic.ts +++ b/packages/core/src/llm/anthropic.ts @@ -1,6 +1,7 @@ import type { ClientOptions } from "@anthropic-ai/sdk"; import { Anthropic as SDKAnthropic } from "@anthropic-ai/sdk"; import type { + MessageCreateParamsNonStreaming, Tool, ToolResultBlockParam, ToolUseBlock, @@ -264,7 +265,7 @@ export class Anthropic extends ToolCallLLM<AnthropicAdditionalChatOptions> { const anthropic = this.session.anthropic; if (tools) { - const response = await anthropic.beta.tools.messages.create({ + const params: MessageCreateParamsNonStreaming = { messages: this.formatMessages<true>(messages), tools: tools.map(Anthropic.toTool), model: this.getModelName(this.model), @@ -272,7 +273,12 @@ export class Anthropic extends ToolCallLLM<AnthropicAdditionalChatOptions> { max_tokens: this.maxTokens ?? 4096, top_p: this.topP, ...(systemPrompt && { system: systemPrompt }), - }); + }; + // Remove tools if there are none, as it will cause an error + if (tools.length === 0) { + delete params.tools; + } + const response = await anthropic.beta.tools.messages.create(params); const toolUseBlock = response.content.find( (content): content is ToolUseBlock => content.type === "tool_use", diff --git a/packages/core/src/llm/openai.ts b/packages/core/src/llm/openai.ts index af450826c4a3ffc4c340b04b351d373d7c76da79..5941f522b1dfae9489e8553e6e878665f41dfd80 100644 --- a/packages/core/src/llm/openai.ts +++ b/packages/core/src/llm/openai.ts @@ -349,6 +349,14 @@ export class OpenAI extends ToolCallLLM<OpenAIAdditionalChatOptions> { ...Object.assign({}, this.additionalChatOptions, additionalChatOptions), }; + if ( + Array.isArray(baseRequestParams.tools) && + baseRequestParams.tools.length === 0 + ) { + // remove empty tools array to avoid OpenAI error + delete baseRequestParams.tools; + } + // Streaming if (stream) { return this.streamChat(baseRequestParams);