Skip to content

Wrong implementation of MethodToolCallback.validateToolContextSupport #3466

Open
@jcgouveia

Description

@jcgouveia

Consider the current implementation of validateToolContextSupport compared from 1.0.0 and 1.0.0-M6

	private void validateToolContextSupport(@Nullable ToolContext toolContext) {
		var isNonEmptyToolContextProvided = toolContext != null && !CollectionUtils.isEmpty(toolContext.getContext());
		var isToolContextAcceptedByMethod = Stream.of(this.toolMethod.getParameterTypes())
			.anyMatch(type -> ClassUtils.isAssignable(type, ToolContext.class));
		if (isToolContextAcceptedByMethod && !isNonEmptyToolContextProvided) {
			throw new IllegalArgumentException("ToolContext is required by the method as an argument");
		}
	}

M6

	private void validateToolContextSupport(@Nullable ToolContext toolContext) {
		var isToolContextRequired = toolContext != null && !CollectionUtils.isEmpty(toolContext.getContext());
		var isToolContextAcceptedByMethod = Stream.of(toolMethod.getParameterTypes())
			.anyMatch(type -> ClassUtils.isAssignable(type, ToolContext.class));
		if (isToolContextRequired && !isToolContextAcceptedByMethod) {
			throw new IllegalArgumentException("ToolContext is not supported by the method as an argument");
		}
	}
  1. Both have the same serious bug also refered in The isFunctionalType method of MethodToolVNet Provider is incorrect, resulting in some cases where the tool cannot be registered #3355 , it seems that the writer does not know the semantics of ClassUtils.isAssignable(left, right) => right is assinable to left, so left is the "super" type. All this code has the arguments in incorrect order.

  2. More, in the case of a toolContext not being provided, the change in the validation logic now make it fail due to error 1
    M6 : No context
    => isToolContextRequired = false
    => isToolContextRequired && !isToolContextAcceptedByMethod = false => no exception
    1.0.0 : No context
    => isNonEmptyToolContextProvided = false + isNonEmptyToolContextProvided = true (because of error 1)
    => isToolContextAcceptedByMethod && !isNonEmptyToolContextProvided = true
    => exception is thrown !

Metadata

Metadata

Assignees

Type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions