Skip to content

The overload tools or defaultTools method in ChatClientBuilder causes FunctionToolCallback not taking effect. #2495

Open
@chickenlj

Description

@chickenlj

Bug Desception

I have the following FunctionToolCallback instance created and registered to ChatClient Builder as below:

FunctionToolCallback toolCallback1 = ...
FunctionToolCallback toolCallback2 = ...
ChatClient.create(chatModel)
    .prompt("What's the weather like in Copenhagen?")
    .tools(toolCallback1, toolCallback2)
    .call()
    .content();

The above tool registration will not take effect because it actually calls the Builder defaultTools(Object... toolObjects); overload method instead of the Builder defaultTools(List<ToolCallback> toolCallbacks);.

Builder defaultTools(Object... toolObjects); method only works for Method tool, because inside ToolCallbacks.from(toolObjects) it only accepts Method tools:

@Override
public ChatClientRequestSpec tools(Object... toolObjects) {
	Assert.notNull(toolObjects, "toolObjects cannot be null");
	Assert.noNullElements(toolObjects, "toolObjects cannot contain null elements");
	this.functionCallbacks.addAll(Arrays.asList(ToolCallbacks.from(toolObjects))); // here only accepts Method tools
	return this;
}

Only the following form is correct:

ToolCallback toolCallback1 = ... // must be ToolCallback type but not FunctionToolCallback type.
ToolCallback toolCallback2 = ... // must be ToolCallback type but not FunctionToolCallback type.
ChatClient.create(chatModel)
    .prompt("What's the weather like in Copenhagen?")
    .tools(toolCallback1, toolCallback2)
    .call()
    .content();

It's very easy to make the above mistake. There's no compilation error because of the overload methods and it's not easy to debug and find the problem.

Environment

1.0.0-M6

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions