From 53af6fd5ac80dd0937ccafc498b0e2b0a65df8d7 Mon Sep 17 00:00:00 2001 From: Ilayaperumal Gopinathan Date: Fri, 28 Mar 2025 13:20:41 +0000 Subject: [PATCH] Restructure Spring AI model module - Pull chat, image, moderation, tool, audio specific api code into spring-ai-model module - Move the corresponding tests Signed-off-by: Ilayaperumal Gopinathan --- .../springframework/ai/util/ParsingUtils.java | 0 spring-ai-core/pom.xml | 13 - .../ai/model/package-info.java | 28 -- .../ai/tool/ToolCallbackTests.java | 42 --- .../DefaultToolDefinitionTests.java | 65 ---- .../tool/definition/ToolDefinitionTests.java | 54 --- .../DefaultToolCallResultConverterTests.java | 95 ------ ...tToolExecutionExceptionProcessorTests.java | 65 ---- .../ToolExecutionExceptionTests.java | 36 -- .../function/FunctionToolCallbackTests.java | 268 --------------- .../metadata/DefaultToolMetadataTests.java | 26 -- .../ai/tool/metadata/ToolMetadataTests.java | 38 --- .../MethodToolCallbackProviderAopTests.java | 219 ------------ .../MethodToolCallbackProviderTests.java | 271 --------------- .../tool/method/MethodToolCallbackTests.java | 323 ------------------ .../DelegatingToolCallbackResolverTests.java | 64 ---- .../SpringBeanToolCallbackResolverTests.java | 175 ---------- .../resolution/StandaloneWeatherFunction.java | 34 -- .../StaticToolCallbackResolverTests.java | 67 ---- .../tool/resolution/TypeResolverHelperIT.java | 99 ------ .../resolution/TypeResolverHelperTests.java | 107 ------ .../component/ComponentWeatherFunction.java | 36 -- .../TypeResolverHelperConfiguration.java | 31 -- .../ai/tool/utils/ToolUtilsTests.java | 204 ----------- spring-ai-model/pom.xml | 25 ++ .../transcription/AudioTranscription.java | 0 .../AudioTranscriptionMetadata.java | 0 .../AudioTranscriptionOptions.java | 0 .../AudioTranscriptionPrompt.java | 0 .../AudioTranscriptionResponse.java | 0 .../AudioTranscriptionResponseMetadata.java | 0 .../ai/chat/messages/AbstractMessage.java | 0 .../ai/chat/messages/AssistantMessage.java | 0 .../ai/chat/messages/Message.java | 0 .../ai/chat/messages/MessageType.java | 0 .../ai/chat/messages/SystemMessage.java | 0 .../ai/chat/messages/ToolResponseMessage.java | 0 .../ai/chat/messages/UserMessage.java | 0 .../chat/metadata/ChatGenerationMetadata.java | 0 .../chat/metadata/ChatResponseMetadata.java | 0 .../DefaultChatGenerationMetadata.java | 0 .../DefaultChatGenerationMetadataBuilder.java | 2 +- .../ai/chat/metadata/EmptyRateLimit.java | 0 .../ai/chat/metadata/PromptMetadata.java | 0 .../ai/chat/metadata/RateLimit.java | 0 .../ai/chat/metadata/UsageUtils.java | 0 .../chat/model/AbstractToolCallSupport.java | 0 .../ai/chat/model/ChatModel.java | 0 .../ai/chat/model/ChatResponse.java | 4 +- .../ai/chat/model/Generation.java | 0 .../ai/chat/model/StreamingChatModel.java | 0 .../ai/chat/model/ToolContext.java | 0 .../ChatModelCompletionObservationFilter.java | 0 ...ChatModelCompletionObservationHandler.java | 0 .../ChatModelMeterObservationHandler.java | 0 .../ChatModelObservationContentProcessor.java | 0 .../ChatModelObservationContext.java | 0 .../ChatModelObservationConvention.java | 0 .../ChatModelObservationDocumentation.java | 0 ...atModelPromptContentObservationFilter.java | 0 ...tModelPromptContentObservationHandler.java | 0 ...DefaultChatModelObservationConvention.java | 0 .../ai/chat/observation/package-info.java | 0 .../chat/prompt/AssistantPromptTemplate.java | 0 .../ai/chat/prompt/ChatOptions.java | 7 +- .../ai/chat/prompt/ChatPromptTemplate.java | 0 .../ai/chat/prompt/DefaultChatOptions.java | 0 .../prompt/DefaultChatOptionsBuilder.java | 0 .../chat/prompt/FunctionPromptTemplate.java | 0 .../ai/chat/prompt/Prompt.java | 0 .../ai/chat/prompt/PromptTemplate.java | 0 .../ai/chat/prompt/PromptTemplateActions.java | 0 .../prompt/PromptTemplateChatActions.java | 0 .../prompt/PromptTemplateMessageActions.java | 0 .../prompt/PromptTemplateStringActions.java | 0 .../ai/chat/prompt/SystemPromptTemplate.java | 0 .../ai/chat/prompt/TemplateFormat.java | 0 .../org/springframework/ai/image/Image.java | 0 .../ai/image/ImageGeneration.java | 0 .../ai/image/ImageGenerationMetadata.java | 0 .../ai/image/ImageMessage.java | 0 .../springframework/ai/image/ImageModel.java | 0 .../ai/image/ImageOptions.java | 0 .../ai/image/ImageOptionsBuilder.java | 0 .../springframework/ai/image/ImagePrompt.java | 0 .../ai/image/ImageResponse.java | 0 .../ai/image/ImageResponseMetadata.java | 0 ...efaultImageModelObservationConvention.java | 0 .../ImageModelObservationContext.java | 0 .../ImageModelObservationConvention.java | 0 .../ImageModelObservationDocumentation.java | 0 ...geModelPromptContentObservationFilter.java | 0 .../ai/image/observation/package-info.java | 0 .../function/AbstractFunctionCallback.java | 0 .../DefaultCommonCallbackInvokingSpec.java | 0 .../DefaultFunctionCallbackBuilder.java | 2 +- .../DefaultFunctionCallbackResolver.java | 0 .../DefaultFunctionCallingOptions.java | 2 +- .../DefaultFunctionCallingOptionsBuilder.java | 0 .../ai/model/function/FunctionCallback.java | 6 +- .../function/FunctionCallbackResolver.java | 0 .../model/function/FunctionCallingHelper.java | 2 +- .../function/FunctionCallingOptions.java | 2 +- .../FunctionInvokingFunctionCallback.java | 0 .../MethodInvokingFunctionCallback.java | 0 .../tool/DefaultToolCallingChatOptions.java | 10 +- .../model/tool/DefaultToolCallingManager.java | 15 +- .../tool/DefaultToolExecutionResult.java | 4 +- .../model/tool/LegacyToolCallingManager.java | 14 +- .../ai/model/tool/ToolCallingChatOptions.java | 14 +- .../ai/model/tool/ToolCallingManager.java | 4 +- .../ai/model/tool/ToolExecutionResult.java | 6 +- .../ai/model/tool/package-info.java | 0 .../ai/moderation/Categories.java | 0 .../ai/moderation/CategoryScores.java | 0 .../ai/moderation/Generation.java | 0 .../ai/moderation/Moderation.java | 0 .../ModerationGenerationMetadata.java | 0 .../ai/moderation/ModerationMessage.java | 0 .../ai/moderation/ModerationModel.java | 0 .../ai/moderation/ModerationOptions.java | 0 .../moderation/ModerationOptionsBuilder.java | 0 .../ai/moderation/ModerationPrompt.java | 0 .../ai/moderation/ModerationResponse.java | 0 .../ModerationResponseMetadata.java | 0 .../ai/moderation/ModerationResult.java | 0 .../ai/tool/StaticToolCallbackProvider.java | 0 .../springframework/ai/tool/ToolCallback.java | 0 .../ai/tool/ToolCallbackProvider.java | 0 .../ai/tool/ToolCallbacks.java | 0 .../ai/tool/annotation/Tool.java | 6 +- .../ai/tool/annotation/ToolParam.java | 0 .../ai/tool/annotation/package-info.java | 0 .../definition/DefaultToolDefinition.java | 0 .../ai/tool/definition/ToolDefinition.java | 4 +- .../ai/tool/definition/package-info.java | 0 .../DefaultToolCallResultConverter.java | 0 ...efaultToolExecutionExceptionProcessor.java | 1 + .../execution/ToolCallResultConverter.java | 4 +- .../execution/ToolExecutionException.java | 0 .../ToolExecutionExceptionProcessor.java | 0 .../ai/tool/execution/package-info.java | 0 .../tool/function/FunctionToolCallback.java | 0 .../ai/tool/function/package-info.java | 0 .../ai/tool/metadata/DefaultToolMetadata.java | 0 .../ai/tool/metadata/ToolMetadata.java | 4 +- .../ai/tool/metadata/package-info.java | 0 .../ai/tool/method/MethodToolCallback.java | 15 +- .../method/MethodToolCallbackProvider.java | 19 +- .../ai/tool/method/package-info.java | 0 .../springframework/ai/tool/package-info.java | 0 .../DelegatingToolCallbackResolver.java | 4 +- .../SpringBeanToolCallbackResolver.java | 15 +- .../StaticToolCallbackResolver.java | 13 +- .../tool/resolution/ToolCallbackResolver.java | 0 .../tool/resolution/TypeResolverHelper.java | 0 .../ai/tool/resolution/package-info.java | 0 .../ai/tool/util/ToolUtils.java | 12 +- .../ai/tool/util/package-info.java | 0 .../ai/util/json/JsonParser.java | 5 +- .../ai/util/json/package-info.java | 0 .../util/json/schema/JsonSchemaGenerator.java | 14 +- .../ai/util/json/schema/SchemaType.java | 0 .../json/schema/SpringAiSchemaModule.java | 5 +- .../ai/util/json/schema/package-info.java | 0 .../function/FunctionCallbackExtensions.kt | 0 .../ai/chat/ChatModelTests.java | 0 .../ai/chat/model/ChatResponseTests.java | 9 +- .../ai/chat/model/GenerationTests.java | 0 ...ModelCompletionObservationFilterTests.java | 0 ...odelCompletionObservationHandlerTests.java | 0 ...ChatModelMeterObservationHandlerTests.java | 0 .../ChatModelObservationContextTests.java | 0 ...elPromptContentObservationFilterTests.java | 0 ...lPromptContentObservationHandlerTests.java | 0 ...ltChatModelObservationConventionTests.java | 0 .../chat/prompt/ChatOptionsBuilderTests.java | 0 ...tImageModelObservationConventionTests.java | 2 + .../ImageModelObservationContextTests.java | 1 + ...elPromptContentObservationFilterTests.java | 2 + .../DefaultFunctionCallbackBuilderTests.java | 0 ...ultFunctionCallingOptionsBuilderTests.java | 0 .../MethodInvokingFunctionCallbackTests.java | 0 .../DefaultToolCallingChatOptionsTests.java | 9 +- .../tool/DefaultToolCallingManagerTests.java | 9 +- .../tool/DefaultToolExecutionResultTests.java | 7 +- .../tool/LegacyToolCallingManagerTests.java | 15 +- .../tool/ToolCallingChatOptionsTests.java | 9 +- .../model/tool/ToolExecutionResultTests.java | 5 +- .../ai/util/json/JsonParserTests.java | 4 +- .../util/json/JsonSchemaGeneratorTests.java | 15 +- .../ai/model/ModelOptionsUtilsTests.kt | 0 .../FunctionCallbackExtensionsTests.kt | 0 ...ringBeanToolCallbackResolverKotlinTests.kt | 0 .../StandaloneWeatherKotlinFunction.kt | 0 .../resolution/TypeResolverHelperKotlinIT.kt | 0 .../TypeResolverHelperKotlinConfiguration.kt | 0 197 files changed, 187 insertions(+), 2500 deletions(-) rename {spring-ai-core => spring-ai-commons}/src/main/java/org/springframework/ai/util/ParsingUtils.java (100%) delete mode 100644 spring-ai-core/src/main/java/org/springframework/ai/model/package-info.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/ToolCallbackTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/definition/DefaultToolDefinitionTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/definition/ToolDefinitionTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverterTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessorTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/execution/ToolExecutionExceptionTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/function/FunctionToolCallbackTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/metadata/DefaultToolMetadataTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/metadata/ToolMetadataTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderAopTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolverTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/StandaloneWeatherFunction.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolverTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/TypeResolverHelperIT.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/TypeResolverHelperTests.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/component/ComponentWeatherFunction.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/config/TypeResolverHelperConfiguration.java delete mode 100644 spring-ai-core/src/test/java/org/springframework/ai/tool/utils/ToolUtilsTests.java rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/audio/transcription/AudioTranscription.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionOptions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionPrompt.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponse.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponseMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/messages/Message.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/messages/MessageType.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/messages/UserMessage.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/metadata/ChatGenerationMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadataBuilder.java (95%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/metadata/EmptyRateLimit.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/metadata/PromptMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/metadata/RateLimit.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/metadata/UsageUtils.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/model/ChatModel.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/model/ChatResponse.java (98%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/model/Generation.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/model/ToolContext.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilter.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandler.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationConvention.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilter.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConvention.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/observation/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/AssistantPromptTemplate.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java (95%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/ChatPromptTemplate.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptionsBuilder.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/FunctionPromptTemplate.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/Prompt.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateActions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateChatActions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateMessageActions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateStringActions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/SystemPromptTemplate.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/chat/prompt/TemplateFormat.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/Image.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImageGeneration.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImageGenerationMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImageMessage.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImageModel.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImageOptions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImageOptionsBuilder.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImagePrompt.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImageResponse.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/ImageResponseMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/observation/DefaultImageModelObservationConvention.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/observation/ImageModelObservationConvention.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilter.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/image/observation/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/AbstractFunctionCallback.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/DefaultCommonCallbackInvokingSpec.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackResolver.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptions.java (98%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilder.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/FunctionCallback.java (97%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/FunctionCallbackResolver.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/FunctionCallingOptions.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/FunctionInvokingFunctionCallback.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/model/tool/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/Categories.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/CategoryScores.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/Generation.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/Moderation.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationGenerationMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationMessage.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationModel.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationOptions.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationOptionsBuilder.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationResponse.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationResponseMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/moderation/ModerationResult.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/StaticToolCallbackProvider.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/ToolCallback.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/ToolCallbackProvider.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/ToolCallbacks.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/annotation/Tool.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/annotation/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/definition/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessor.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/execution/ToolCallResultConverter.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/execution/ToolExecutionException.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/execution/ToolExecutionExceptionProcessor.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/execution/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/function/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/metadata/DefaultToolMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/metadata/ToolMetadata.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/metadata/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/method/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolver.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolver.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/resolution/ToolCallbackResolver.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/resolution/TypeResolverHelper.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/resolution/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/util/ToolUtils.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/tool/util/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/util/json/JsonParser.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/util/json/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/util/json/schema/SchemaType.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java (99%) rename {spring-ai-core => spring-ai-model}/src/main/java/org/springframework/ai/util/json/schema/package-info.java (100%) rename {spring-ai-core => spring-ai-model}/src/main/kotlin/org/springframework/ai/model/function/FunctionCallbackExtensions.kt (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/ChatModelTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/model/ChatResponseTests.java (99%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/model/GenerationTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilterTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandlerTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilterTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConventionTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/chat/prompt/ChatOptionsBuilderTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/image/observation/DefaultImageModelObservationConventionTests.java (96%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java (95%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilterTests.java (95%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilderTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilderTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/function/MethodInvokingFunctionCallbackTests.java (100%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java (99%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java (99%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java (99%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java (95%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/tool/ToolCallingChatOptionsTests.java (99%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java (99%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/util/json/JsonParserTests.java (99%) rename {spring-ai-core => spring-ai-model}/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java (99%) rename {spring-ai-core => spring-ai-model}/src/test/kotlin/org/springframework/ai/model/ModelOptionsUtilsTests.kt (100%) rename {spring-ai-core => spring-ai-model}/src/test/kotlin/org/springframework/ai/tool/resolution/FunctionCallbackExtensionsTests.kt (100%) rename {spring-ai-core => spring-ai-model}/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt (100%) rename {spring-ai-core => spring-ai-model}/src/test/kotlin/org/springframework/ai/tool/resolution/StandaloneWeatherKotlinFunction.kt (100%) rename {spring-ai-core => spring-ai-model}/src/test/kotlin/org/springframework/ai/tool/resolution/TypeResolverHelperKotlinIT.kt (100%) rename {spring-ai-core => spring-ai-model}/src/test/kotlin/org/springframework/ai/tool/resolution/kotlinconfig/TypeResolverHelperKotlinConfiguration.kt (100%) diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/ParsingUtils.java b/spring-ai-commons/src/main/java/org/springframework/ai/util/ParsingUtils.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/util/ParsingUtils.java rename to spring-ai-commons/src/main/java/org/springframework/ai/util/ParsingUtils.java diff --git a/spring-ai-core/pom.xml b/spring-ai-core/pom.xml index 9e3d72604..41016d961 100644 --- a/spring-ai-core/pom.xml +++ b/spring-ai-core/pom.xml @@ -73,19 +73,6 @@ ${jsonschema.version} - - - org.antlr - ST4 - ${ST4.version} - - - - org.antlr - antlr4-runtime - ${antlr.version} - - io.projectreactor reactor-core diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/package-info.java b/spring-ai-core/src/main/java/org/springframework/ai/model/package-info.java deleted file mode 100644 index 207af410e..000000000 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/package-info.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2023-2024 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * Provides a set of interfaces and classes for a generic API designed to interact with - * various AI models. This package includes interfaces for handling AI model calls, - * requests, responses, results, and associated metadata. It is designed to offer a - * flexible and adaptable framework for interacting with different types of AI models, - * abstracting the complexities involved in model invocation and result processing. The - * use of generics enhances the API's capability to work with a wide range of models, - * ensuring a broad applicability across diverse AI scenarios. - * - */ - -package org.springframework.ai.model; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/ToolCallbackTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/ToolCallbackTests.java deleted file mode 100644 index ccc464ca7..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/ToolCallbackTests.java +++ /dev/null @@ -1,42 +0,0 @@ -package org.springframework.ai.tool; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.definition.ToolDefinition; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Unit tests for {@link ToolCallback}. - * - * @author Thomas Vitale - */ -class ToolCallbackTests { - - @Test - void shouldOnlyImplementRequiredMethods() { - var testToolCallback = new TestToolCallback("test"); - assertThat(testToolCallback.getToolDefinition()).isNotNull(); - assertThat(testToolCallback.getToolMetadata()).isNotNull(); - } - - static class TestToolCallback implements ToolCallback { - - private final ToolDefinition toolDefinition; - - public TestToolCallback(String name) { - this.toolDefinition = ToolDefinition.builder().name(name).description(name).inputSchema("{}").build(); - } - - @Override - public ToolDefinition getToolDefinition() { - return toolDefinition; - } - - @Override - public String call(String toolInput) { - return ""; - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/definition/DefaultToolDefinitionTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/definition/DefaultToolDefinitionTests.java deleted file mode 100644 index 141ca4684..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/definition/DefaultToolDefinitionTests.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.springframework.ai.tool.definition; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** - * Unit tests for {@link DefaultToolDefinition}. - * - * @author Thomas Vitale - */ -class DefaultToolDefinitionTests { - - @Test - void shouldCreateDefaultToolDefinition() { - var toolDefinition = new DefaultToolDefinition("name", "description", "{}"); - assertThat(toolDefinition.name()).isEqualTo("name"); - assertThat(toolDefinition.description()).isEqualTo("description"); - assertThat(toolDefinition.inputSchema()).isEqualTo("{}"); - } - - @Test - void shouldThrowExceptionWhenNameIsNull() { - assertThatThrownBy(() -> new DefaultToolDefinition(null, "description", "{}")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("name cannot be null or empty"); - } - - @Test - void shouldThrowExceptionWhenNameIsEmpty() { - assertThatThrownBy(() -> new DefaultToolDefinition("", "description", "{}")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("name cannot be null or empty"); - } - - @Test - void shouldThrowExceptionWhenDescriptionIsNull() { - assertThatThrownBy(() -> new DefaultToolDefinition("name", null, "{}")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("description cannot be null or empty"); - } - - @Test - void shouldThrowExceptionWhenDescriptionIsEmpty() { - assertThatThrownBy(() -> new DefaultToolDefinition("name", "", "{}")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("description cannot be null or empty"); - } - - @Test - void shouldThrowExceptionWhenInputSchemaIsNull() { - assertThatThrownBy(() -> new DefaultToolDefinition("name", "description", null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("inputSchema cannot be null or empty"); - } - - @Test - void shouldThrowExceptionWhenInputSchemaIsEmpty() { - assertThatThrownBy(() -> new DefaultToolDefinition("name", "description", "")) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("inputSchema cannot be null or empty"); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/definition/ToolDefinitionTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/definition/ToolDefinitionTests.java deleted file mode 100644 index 840882b65..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/definition/ToolDefinitionTests.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.springframework.ai.tool.definition; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.annotation.Tool; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Unit tests for {@link ToolDefinition}. - * - * @author Thomas Vitale - */ -class ToolDefinitionTests { - - @Test - void shouldCreateDefaultToolDefinitionBuilder() { - var toolDefinition = ToolDefinition.builder().name("name").description("description").inputSchema("{}").build(); - assertThat(toolDefinition.name()).isEqualTo("name"); - assertThat(toolDefinition.description()).isEqualTo("description"); - assertThat(toolDefinition.inputSchema()).isEqualTo("{}"); - } - - @Test - void shouldCreateToolDefinitionFromMethod() { - var toolDefinition = ToolDefinition.from(Tools.class.getDeclaredMethods()[0]); - assertThat(toolDefinition.name()).isEqualTo("mySuperTool"); - assertThat(toolDefinition.description()).isEqualTo("Test description"); - assertThat(toolDefinition.inputSchema()).isEqualToIgnoringWhitespace(""" - { - "$schema" : "https://json-schema.org/draft/2020-12/schema", - "type" : "object", - "properties" : { - "input" : { - "type" : "string" - } - }, - "required" : [ "input" ], - "additionalProperties" : false - } - """); - } - - static class Tools { - - @Tool(description = "Test description") - public List mySuperTool(String input) { - return List.of(input); - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverterTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverterTests.java deleted file mode 100644 index fb399234c..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverterTests.java +++ /dev/null @@ -1,95 +0,0 @@ -package org.springframework.ai.tool.execution; - -import org.junit.jupiter.api.Test; - -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Unit tests for {@link DefaultToolCallResultConverter}. - * - * @author Thomas Vitale - */ -class DefaultToolCallResultConverterTests { - - private final DefaultToolCallResultConverter converter = new DefaultToolCallResultConverter(); - - @Test - void convertWithNullReturnTypeShouldReturn() { - String result = converter.convert(null, null); - assertThat(result).isEqualTo("null"); - } - - @Test - void convertVoidReturnTypeShouldReturnDone() { - String result = converter.convert(null, void.class); - assertThat(result).isEqualTo("Done"); - } - - @Test - void convertStringReturnTypeShouldReturnJson() { - String result = converter.convert("test", String.class); - assertThat(result).isEqualTo("\"test\""); - } - - @Test - void convertNullReturnValueShouldReturnNullJson() { - String result = converter.convert(null, String.class); - assertThat(result).isEqualTo("null"); - } - - @Test - void convertObjectReturnTypeShouldReturnJson() { - TestObject testObject = new TestObject("test", 42); - String result = converter.convert(testObject, TestObject.class); - assertThat(result).containsIgnoringWhitespaces(""" - "name": "test" - """).containsIgnoringWhitespaces(""" - "value": 42 - """); - } - - @Test - void convertCollectionReturnTypeShouldReturnJson() { - List testList = List.of("one", "two", "three"); - String result = converter.convert(testList, List.class); - assertThat(result).isEqualTo(""" - ["one","two","three"] - """.trim()); - } - - @Test - void convertMapReturnTypeShouldReturnJson() { - Map testMap = Map.of("one", 1, "two", 2); - String result = converter.convert(testMap, Map.class); - assertThat(result).containsIgnoringWhitespaces(""" - "one": 1 - """).containsIgnoringWhitespaces(""" - "two": 2 - """); - } - - static class TestObject { - - private final String name; - - private final int value; - - TestObject(String name, int value) { - this.name = name; - this.value = value; - } - - public String getName() { - return name; - } - - public int getValue() { - return value; - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessorTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessorTests.java deleted file mode 100644 index eadfc10ec..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessorTests.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.execution; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.definition.DefaultToolDefinition; -import org.springframework.ai.tool.definition.ToolDefinition; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** - * Unit tests for {@link DefaultToolExecutionExceptionProcessor}. - * - * @author Thomas Vitale - */ -class DefaultToolExecutionExceptionProcessorTests { - - @Test - void whenDefaultThenReturnMessage() { - ToolExecutionExceptionProcessor processor = DefaultToolExecutionExceptionProcessor.builder().build(); - ToolExecutionException exception = new ToolExecutionException(generateTestDefinition(), - new RuntimeException("Test")); - assertThat(processor.process(exception)).isEqualTo("Test"); - } - - @Test - void whenNotAlwaysThrowThenReturnMessage() { - ToolExecutionExceptionProcessor processor = DefaultToolExecutionExceptionProcessor.builder() - .alwaysThrow(false) - .build(); - ToolExecutionException exception = new ToolExecutionException(generateTestDefinition(), - new RuntimeException("Test")); - assertThat(processor.process(exception)).isEqualTo("Test"); - } - - @Test - void whenAlwaysThrowThenThrow() { - ToolExecutionExceptionProcessor processor = DefaultToolExecutionExceptionProcessor.builder() - .alwaysThrow(true) - .build(); - ToolExecutionException exception = new ToolExecutionException(generateTestDefinition(), - new RuntimeException("Test")); - assertThatThrownBy(() -> processor.process(exception)).isInstanceOf(ToolExecutionException.class); - } - - private ToolDefinition generateTestDefinition() { - return DefaultToolDefinition.builder().name("test").inputSchema("{}").build(); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/ToolExecutionExceptionTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/ToolExecutionExceptionTests.java deleted file mode 100644 index 42f618939..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/execution/ToolExecutionExceptionTests.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.springframework.ai.tool.execution; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.definition.ToolDefinition; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.mock; - -/** - * Unit tests for {@link ToolExecutionException}. - * - * @author Thomas Vitale - */ -class ToolExecutionExceptionTests { - - @Test - void constructorShouldSetCauseAndMessage() { - String errorMessage = "Test error message"; - RuntimeException cause = new RuntimeException(errorMessage); - - ToolExecutionException exception = new ToolExecutionException(mock(ToolDefinition.class), cause); - - assertThat(exception.getCause()).isEqualTo(cause); - assertThat(exception.getMessage()).isEqualTo(errorMessage); - } - - @Test - void getToolDefinitionShouldReturnToolDefinition() { - RuntimeException cause = new RuntimeException("Test error"); - ToolDefinition toolDefinition = mock(ToolDefinition.class); - ToolExecutionException exception = new ToolExecutionException(toolDefinition, cause); - - assertThat(exception.getToolDefinition()).isEqualTo(toolDefinition); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/function/FunctionToolCallbackTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/function/FunctionToolCallbackTests.java deleted file mode 100644 index 293ed1429..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/function/FunctionToolCallbackTests.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.function; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.chat.model.ToolContext; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.definition.ToolDefinition; -import org.springframework.ai.tool.execution.ToolCallResultConverter; -import org.springframework.ai.tool.metadata.ToolMetadata; -import org.springframework.ai.util.json.schema.JsonSchemaGenerator; -import org.springframework.core.ParameterizedTypeReference; - -import java.util.List; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * Unit tests for {@link FunctionToolCallback}. - * - * @author Thomas Vitale - */ -class FunctionToolCallbackTests { - - @Test - void constructorShouldValidateRequiredParameters() { - ToolDefinition toolDefinition = mock(ToolDefinition.class); - ToolMetadata toolMetadata = mock(ToolMetadata.class); - BiFunction toolFunction = (input, context) -> input; - - assertThatThrownBy(() -> new FunctionToolCallback<>(null, toolMetadata, String.class, toolFunction, null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolDefinition cannot be null"); - - assertThatThrownBy(() -> new FunctionToolCallback<>(toolDefinition, toolMetadata, null, toolFunction, null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolInputType cannot be null"); - - assertThatThrownBy(() -> new FunctionToolCallback<>(toolDefinition, toolMetadata, String.class, null, null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolFunction cannot be null"); - } - - @Test - void callShouldExecuteToolFunctionAndConvertResult() { - ToolDefinition toolDefinition = mock(ToolDefinition.class); - when(toolDefinition.name()).thenReturn("test-tool"); - BiFunction toolFunction = (input, - context) -> new TestResponse(input.input()); - - ToolCallback callback = FunctionToolCallback.builder("test-tool", toolFunction) - .inputType(TestRequest.class) - .build(); - - String result = callback.call(""" - { - "input": "test input" - } - """, mock(ToolContext.class)); - - assertThat(result).isEqualToIgnoringWhitespace(""" - { - "output": "test input" - } - """); - } - - @Test - void callShouldValidateInput() { - ToolCallback callback = FunctionToolCallback.builder("test-tool", (input, context) -> input) - .inputType(String.class) - .build(); - - assertThatThrownBy(() -> callback.call("")).isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolInput cannot be null or empty"); - - assertThatThrownBy(() -> callback.call(null)).isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolInput cannot be null or empty"); - } - - @Test - void callWithoutContextShouldWorkCorrectly() { - BiFunction toolFunction = (input, - context) -> new TestResponse(input.input()); - - ToolCallback callback = FunctionToolCallback.builder("test-tool", toolFunction) - .inputType(TestRequest.class) - .build(); - - String result = callback.call(""" - { - "input": "test input" - } - """); - - assertThat(result).isEqualToIgnoringWhitespace(""" - { - "output": "test input" - } - """); - } - - // Builder - - @Test - void builderShouldCreateInstanceWithAllProperties() { - ToolMetadata toolMetadata = mock(ToolMetadata.class); - BiFunction toolFunction = (input, context) -> input; - ToolCallResultConverter resultConverter = mock(ToolCallResultConverter.class); - - ToolCallback callback = FunctionToolCallback.builder("testTool", toolFunction) - .description("A test tool") - .inputSchema(JsonSchemaGenerator.generateForType(String.class)) - .inputType(String.class) - .toolMetadata(toolMetadata) - .toolCallResultConverter(resultConverter) - .build(); - - assertThat(callback.getToolDefinition().name()).isEqualTo("testTool"); - assertThat(callback.getToolDefinition().description()).isEqualTo("A test tool"); - assertThat(callback.getToolMetadata()).isEqualTo(toolMetadata); - } - - @Test - void builderShouldCreateInstanceWithCustomSchema() { - ToolMetadata toolMetadata = mock(ToolMetadata.class); - BiFunction toolFunction = (input, context) -> input; - ToolCallResultConverter resultConverter = mock(ToolCallResultConverter.class); - - ToolCallback callback = FunctionToolCallback.builder("testTool", toolFunction) - .description("A test tool") - // Special schema generation required by Vertex AI. - .inputSchema(JsonSchemaGenerator.generateForType(String.class, - JsonSchemaGenerator.SchemaOption.UPPER_CASE_TYPE_VALUES)) - .inputType(String.class) - .toolMetadata(toolMetadata) - .toolCallResultConverter(resultConverter) - .build(); - - assertThat(callback.getToolDefinition().name()).isEqualTo("testTool"); - assertThat(callback.getToolDefinition().description()).isEqualTo("A test tool"); - assertThat(callback.getToolMetadata()).isEqualTo(toolMetadata); - } - - @Test - void whenBuilderWithRequiredPropertiesThenReturn() { - var builder = FunctionToolCallback.builder("test-tool", (input, context) -> input); - assertThat(builder).isNotNull(); - } - - @Test - void whenToolNameIsNullThenThrow() { - assertThatThrownBy(() -> FunctionToolCallback.builder(null, (input, context) -> input)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("name cannot be null or empty"); - } - - @Test - void whenToolNameIsEmptyThenThrow() { - assertThatThrownBy(() -> FunctionToolCallback.builder("", (input, context) -> input)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("name cannot be null or empty"); - } - - @Test - void whenBuildingFromBiFunctionThenReturn() { - var builder = FunctionToolCallback.builder("test-tool", (input, context) -> input); - assertThat(builder).isNotNull(); - } - - @Test - void whenBuildingFromNullBiFunctionThenReturn() { - assertThatThrownBy(() -> FunctionToolCallback.builder("test-tool", (BiFunction) null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolFunction cannot be null"); - } - - @Test - void whenBuildingFromFunctionThenReturn() { - var builder = FunctionToolCallback.builder("test-tool", (input) -> input); - assertThat(builder).isNotNull(); - } - - @Test - void whenBuildingFromNullFunctionThenReturn() { - assertThatThrownBy(() -> FunctionToolCallback.builder("test-tool", (Function) null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("function cannot be null"); - } - - @Test - void whenBuildingFromSupplierThenReturn() { - var builder = FunctionToolCallback.builder("test-tool", () -> "Hello"); - assertThat(builder).isNotNull(); - } - - @Test - void whenBuildingFromNullSupplierThenReturn() { - assertThatThrownBy(() -> FunctionToolCallback.builder("test-tool", (Supplier) null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("supplier cannot be null"); - } - - @Test - void whenBuildingFromConsumerThenReturn() { - var builder = FunctionToolCallback.builder("test-tool", (input) -> null); - assertThat(builder).isNotNull(); - } - - @Test - void whenBuildingFromNullConsumerThenReturn() { - assertThatThrownBy(() -> FunctionToolCallback.builder("test-tool", (Consumer) null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("consumer cannot be null"); - } - - @Test - void whenInputTypeIsNullThenThrow() { - assertThatThrownBy(() -> FunctionToolCallback.builder("test-tool", (input, context) -> input).build()) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("inputType cannot be null"); - } - - @Test - void whenToolDescriptionIsNullThenComputeFromName() { - ToolCallback callback = FunctionToolCallback.builder("mySuperTestTool", (input, context) -> input) - .inputType(String.class) - .build(); - assertThat(callback.getToolDefinition().description()).isEqualTo("my super test tool"); - } - - @Test - void whenInputTypeIsGenericThenReturn() { - ToolCallback callback = FunctionToolCallback.builder("mySuperTestTool", (input, context) -> input) - .inputType(new ParameterizedTypeReference>() { - }) - .build(); - assertThat(callback).isNotNull(); - } - - public record TestRequest(String input) { - } - - public record TestResponse(String output) { - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/metadata/DefaultToolMetadataTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/metadata/DefaultToolMetadataTests.java deleted file mode 100644 index c9a6d8ad4..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/metadata/DefaultToolMetadataTests.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.springframework.ai.tool.metadata; - -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Unit tests for {@link DefaultToolMetadata}. - * - * @author Thomas Vitale - */ -class DefaultToolMetadataTests { - - @Test - void shouldCreateDefaultToolMetadataWithDefaultValues() { - var toolMetadata = DefaultToolMetadata.builder().build(); - assertThat(toolMetadata.returnDirect()).isFalse(); - } - - @Test - void shouldCreateDefaultToolMetadataWithGivenValues() { - var toolMetadata = DefaultToolMetadata.builder().returnDirect(true).build(); - assertThat(toolMetadata.returnDirect()).isTrue(); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/metadata/ToolMetadataTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/metadata/ToolMetadataTests.java deleted file mode 100644 index 16618df63..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/metadata/ToolMetadataTests.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.springframework.ai.tool.metadata; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.annotation.Tool; - -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * Unit tests for {@link ToolMetadata}. - * - * @author Thomas Vitale - */ -class ToolMetadataTests { - - @Test - void shouldCreateDefaultToolMetadataBuilder() { - var toolMetadata = ToolMetadata.builder().build(); - assertThat(toolMetadata.returnDirect()).isFalse(); - } - - @Test - void shouldCreateToolMetadataFromMethod() { - var toolMetadata = ToolMetadata.from(Tools.class.getDeclaredMethods()[0]); - assertThat(toolMetadata.returnDirect()).isTrue(); - } - - static class Tools { - - @Tool(description = "Test description", returnDirect = true) - public List mySuperTool(String input) { - return List.of(input); - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderAopTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderAopTests.java deleted file mode 100644 index e35ba4893..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderAopTests.java +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright 2025-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.ai.tool.method; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.MockedStatic; -import org.mockito.Mockito; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.annotation.Tool; -import org.springframework.aop.framework.ProxyFactory; -import org.springframework.aop.support.AopUtils; -import org.springframework.aop.support.DefaultPointcutAdvisor; -import org.springframework.aop.support.annotation.AnnotationMatchingPointcut; -import org.aopalliance.intercept.MethodInterceptor; -import org.aopalliance.intercept.MethodInvocation; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.times; - -/** - * Tests for {@link MethodToolCallbackProvider} with AOP proxies. - * - * @author Christian Tzolov - */ -@ExtendWith(MockitoExtension.class) -class MethodToolCallbackProviderAopTests { - - /** - * Test annotation to simulate a Spring AOP aspect - */ - @java.lang.annotation.Target({ java.lang.annotation.ElementType.METHOD }) - @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME) - @java.lang.annotation.Documented - public @interface LogExecution { - - } - - /** - * Sample bean with methods annotated with both @Tool and @LogExecution - */ - @Component - static class ToolsWithAopAnnotations { - - @Tool(description = "Method with AOP annotation") - @LogExecution - public String methodWithAopAnnotation(String input) { - return "Processed: " + input; - } - - @Tool(description = "Another method with AOP annotation") - @LogExecution - public List anotherMethodWithAopAnnotation(String input) { - return List.of("Item: " + input); - } - - @Tool(description = "Method without AOP annotation") - public String methodWithoutAopAnnotation(String input) { - return "Regular: " + input; - } - - } - - @Test - void shouldHandleAopProxiedToolObject() { - // Create the original tool object - ToolsWithAopAnnotations originalToolObject = new ToolsWithAopAnnotations(); - - // Create a proxy for the tool object with an aspect for @LogExecution annotation - ProxyFactory proxyFactory = new ProxyFactory(originalToolObject); - AnnotationMatchingPointcut pointcut = new AnnotationMatchingPointcut(null, LogExecution.class); - - // Create a method interceptor for logging - MethodInterceptor loggingInterceptor = new MethodInterceptor() { - @Override - public Object invoke(MethodInvocation methodInvocation) throws Throwable { - // Simple logging advice - System.out.println("Before executing: " + methodInvocation.getMethod().getName()); - Object result = methodInvocation.proceed(); - System.out.println("After executing: " + methodInvocation.getMethod().getName()); - return result; - } - }; - - proxyFactory.addAdvisor(new DefaultPointcutAdvisor(pointcut, loggingInterceptor)); - - Object proxiedToolObject = proxyFactory.getProxy(); - - // Verify that the object is indeed a proxy - assertThat(AopUtils.isAopProxy(proxiedToolObject)).isTrue(); - assertThat(AopUtils.getTargetClass(proxiedToolObject)).isEqualTo(ToolsWithAopAnnotations.class); - - // Create the provider with the proxied object - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder() - .toolObjects(proxiedToolObject) - .build(); - - // Get the tool callbacks - ToolCallback[] callbacks = provider.getToolCallbacks(); - - // Verify that all methods with @Tool annotation are found, including those with - // @LogExecution - assertThat(callbacks).hasSize(3); - - // Verify that the tool names match the expected method names - assertThat(Stream.of(callbacks).map(ToolCallback::getName)).containsExactlyInAnyOrder("methodWithAopAnnotation", - "anotherMethodWithAopAnnotation", "methodWithoutAopAnnotation"); - } - - /** - * This test specifically validates the AOP proxy handling logic in - * MethodToolCallbackProvider. It uses Mockito to verify that AopUtils.isAopProxy and - * AopUtils.getTargetClass are called correctly when processing a proxied object. - */ - @Test - void shouldUseAopUtilsToHandleProxiedObjects() { - // Create the original tool object - ToolsWithAopAnnotations originalToolObject = new ToolsWithAopAnnotations(); - - // Create a proxy for the tool object - ProxyFactory proxyFactory = new ProxyFactory(originalToolObject); - AnnotationMatchingPointcut pointcut = new AnnotationMatchingPointcut(null, LogExecution.class); - - MethodInterceptor loggingInterceptor = new MethodInterceptor() { - @Override - public Object invoke(MethodInvocation methodInvocation) throws Throwable { - return methodInvocation.proceed(); - } - }; - - proxyFactory.addAdvisor(new DefaultPointcutAdvisor(pointcut, loggingInterceptor)); - Object proxiedToolObject = proxyFactory.getProxy(); - - // Use MockedStatic to verify AopUtils static methods are called - try (MockedStatic mockedAopUtils = Mockito.mockStatic(AopUtils.class)) { - // Set up the mocked behavior - mockedAopUtils.when(() -> AopUtils.isAopProxy(any())).thenReturn(true); - mockedAopUtils.when(() -> AopUtils.getTargetClass(any())).thenReturn(ToolsWithAopAnnotations.class); - - // Create the provider with the proxied object - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder() - .toolObjects(proxiedToolObject) - .build(); - - // Get the tool callbacks - this should trigger the AopUtils methods - provider.getToolCallbacks(); - - // Verify that AopUtils.isAopProxy was called with the proxied object - mockedAopUtils.verify(() -> AopUtils.isAopProxy(proxiedToolObject), times(1)); - - // Verify that AopUtils.getTargetClass was called with the proxied object - mockedAopUtils.verify(() -> AopUtils.getTargetClass(proxiedToolObject), times(1)); - } - } - - @Test - void shouldHandleMixOfProxiedAndNonProxiedToolObjects() { - // Create the original tool objects - ToolsWithAopAnnotations originalToolObject = new ToolsWithAopAnnotations(); - - // Create a proxy for one of the tool objects - ProxyFactory proxyFactory = new ProxyFactory(originalToolObject); - AnnotationMatchingPointcut pointcut = new AnnotationMatchingPointcut(null, LogExecution.class); - - // Create a method interceptor for logging - MethodInterceptor loggingInterceptor = new MethodInterceptor() { - @Override - public Object invoke(MethodInvocation methodInvocation) throws Throwable { - // Simple logging advice - System.out.println("Before executing: " + methodInvocation.getMethod().getName()); - Object result = methodInvocation.proceed(); - System.out.println("After executing: " + methodInvocation.getMethod().getName()); - return result; - } - }; - - proxyFactory.addAdvisor(new DefaultPointcutAdvisor(pointcut, loggingInterceptor)); - - Object proxiedToolObject = proxyFactory.getProxy(); - - // Create a non-proxied tool object - MethodToolCallbackProviderTests.ToolsExtra nonProxiedToolObject = new MethodToolCallbackProviderTests.ToolsExtra(); - - // Create the provider with both proxied and non-proxied objects - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder() - .toolObjects(proxiedToolObject, nonProxiedToolObject) - .build(); - - // Get the tool callbacks - ToolCallback[] callbacks = provider.getToolCallbacks(); - - // Verify that all methods with @Tool annotation are found from both objects - assertThat(callbacks).hasSize(5); // 3 from proxied + 2 from non-proxied - - // Verify that the tool names match the expected method names - assertThat(Stream.of(callbacks).map(ToolCallback::getName)).containsExactlyInAnyOrder("methodWithAopAnnotation", - "anotherMethodWithAopAnnotation", "methodWithoutAopAnnotation", "extraMethod1", "extraMethod2"); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderTests.java deleted file mode 100644 index 0cbd12a24..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackProviderTests.java +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright 2025-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.springframework.ai.tool.method; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.annotation.Tool; - -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Stream; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** - * Unit tests for {@link MethodToolCallbackProvider}. - * - * @author Thomas Vitale - */ -class MethodToolCallbackProviderTests { - - @Nested - class BuilderValidationTests { - - @Test - void shouldRejectNullToolObjects() { - assertThatThrownBy(() -> MethodToolCallbackProvider.builder().toolObjects((Object[]) null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolObjects cannot be null"); - } - - @Test - void shouldRejectNullToolObjectElements() { - assertThatThrownBy(() -> MethodToolCallbackProvider.builder().toolObjects(new Tools(), null).build()) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("toolObjects cannot contain null elements"); - } - - @Test - void shouldAcceptEmptyToolObjects() { - var provider = MethodToolCallbackProvider.builder().toolObjects().build(); - assertThat(provider.getToolCallbacks()).isEmpty(); - } - - } - - @Test - void shouldProvideToolCallbacksFromObject() { - Tools tools = new Tools(); - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder().toolObjects(tools).build(); - - ToolCallback[] callbacks = provider.getToolCallbacks(); - - assertThat(callbacks).hasSize(2); - - var callback1 = Stream.of(callbacks).filter(c -> c.getToolDefinition().name().equals("testMethod")).findFirst(); - assertThat(callback1).isPresent(); - assertThat(callback1.get().getToolDefinition().name()).isEqualTo("testMethod"); - assertThat(callback1.get().getToolDefinition().description()).isEqualTo("Test description"); - - var callback2 = Stream.of(callbacks) - .filter(c -> c.getToolDefinition().name().equals("testStaticMethod")) - .findFirst(); - assertThat(callback2).isPresent(); - assertThat(callback2.get().getToolDefinition().name()).isEqualTo("testStaticMethod"); - assertThat(callback2.get().getToolDefinition().description()).isEqualTo("Test description"); - } - - @Test - void shouldProvideToolCallbacksFromMultipleObjects() { - Tools tools1 = new Tools(); - ToolsExtra tools2 = new ToolsExtra(); - - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder().toolObjects(tools1, tools2).build(); - - ToolCallback[] callbacks = provider.getToolCallbacks(); - assertThat(callbacks).hasSize(4); // 2 from Tools + 2 from ToolsExtra - - assertThat(Stream.of(callbacks).map(ToolCallback::getName)).containsExactlyInAnyOrder("testMethod", - "testStaticMethod", "extraMethod1", "extraMethod2"); - } - - @Test - void shouldEnsureUniqueToolNames() { - ToolsWithDuplicates testComponent = new ToolsWithDuplicates(); - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder().toolObjects(testComponent).build(); - - assertThatThrownBy(provider::getToolCallbacks).isInstanceOf(IllegalStateException.class) - .hasMessageContaining("Multiple tools with the same name (testMethod) found in sources: " - + testComponent.getClass().getName()); - } - - @Test - void shouldHandleToolMethodsWithDifferentVisibility() { - ToolsWithVisibility tools = new ToolsWithVisibility(); - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder().toolObjects(tools).build(); - - ToolCallback[] callbacks = provider.getToolCallbacks(); - assertThat(callbacks).hasSize(3); - - assertThat(Stream.of(callbacks).map(ToolCallback::getName)).containsExactlyInAnyOrder("publicMethod", - "protectedMethod", "privateMethod"); - } - - @Test - void shouldHandleToolMethodsWithDifferentParameters() { - ToolsWithParameters tools = new ToolsWithParameters(); - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder().toolObjects(tools).build(); - - ToolCallback[] callbacks = provider.getToolCallbacks(); - assertThat(callbacks).hasSize(3); - - assertThat(Stream.of(callbacks).map(ToolCallback::getName)).containsExactlyInAnyOrder("noParams", "oneParam", - "multipleParams"); - } - - @Test - void shouldHandleToolMethodsWithDifferentReturnTypes() { - ToolsWithReturnTypes tools = new ToolsWithReturnTypes(); - MethodToolCallbackProvider provider = MethodToolCallbackProvider.builder().toolObjects(tools).build(); - - ToolCallback[] callbacks = provider.getToolCallbacks(); - assertThat(callbacks).hasSize(4); - - assertThat(Stream.of(callbacks).map(ToolCallback::getName)).containsExactlyInAnyOrder("voidMethod", - "primitiveMethod", "objectMethod", "collectionMethod"); - } - - static class Tools { - - @Tool(description = "Test description") - static List testStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - List testMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - Function testFunction(String input) { - // This method should be ignored as it's a functional type - return String::length; - } - - @Tool(description = "Test description") - Consumer testConsumer(String input) { - // This method should be ignored as it's a functional type - return System.out::println; - } - - @Tool(description = "Test description") - Supplier testSupplier() { - // This method should be ignored as it's a functional type - return () -> "test"; - } - - void nonToolMethod() { - // This method should be ignored as it doesn't have @Tool annotation - } - - } - - static class ToolsExtra { - - @Tool(description = "Extra method 1") - String extraMethod1() { - return "extra1"; - } - - @Tool(description = "Extra method 2") - String extraMethod2() { - return "extra2"; - } - - } - - static class ToolsWithDuplicates { - - @Tool(name = "testMethod", description = "Test description") - List testMethod1(String input) { - return List.of(input); - } - - @Tool(name = "testMethod", description = "Test description") - List testMethod2(String input) { - return List.of(input); - } - - } - - static class ToolsWithVisibility { - - @Tool(description = "Public method") - public String publicMethod() { - return "public"; - } - - @Tool(description = "Protected method") - protected String protectedMethod() { - return "protected"; - } - - @Tool(description = "Private method") - private String privateMethod() { - return "private"; - } - - } - - static class ToolsWithParameters { - - @Tool(description = "No parameters") - String noParams() { - return "no params"; - } - - @Tool(description = "One parameter") - String oneParam(String param) { - return param; - } - - @Tool(description = "Multiple parameters") - String multipleParams(String param1, int param2, boolean param3) { - return param1 + param2 + param3; - } - - } - - static class ToolsWithReturnTypes { - - @Tool(description = "Void method") - void voidMethod() { - } - - @Tool(description = "Primitive method") - int primitiveMethod() { - return 42; - } - - @Tool(description = "Object method") - String objectMethod() { - return "object"; - } - - @Tool(description = "Collection method") - List collectionMethod() { - return List.of("collection"); - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackTests.java deleted file mode 100644 index 28a59d6d7..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/method/MethodToolCallbackTests.java +++ /dev/null @@ -1,323 +0,0 @@ -/* - * Copyright 2025-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.method; - -import com.fasterxml.jackson.core.type.TypeReference; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.springframework.ai.chat.model.ToolContext; -import org.springframework.ai.tool.annotation.Tool; -import org.springframework.ai.tool.definition.ToolDefinition; -import org.springframework.ai.tool.execution.ToolExecutionException; -import org.springframework.ai.tool.metadata.ToolMetadata; -import org.springframework.ai.util.json.JsonParser; -import org.springframework.util.ReflectionUtils; - -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** - * Unit tests for {@link MethodToolCallback}. - * - * @author Thomas Vitale - */ -class MethodToolCallbackTests { - - @ParameterizedTest - @ValueSource(strings = { "publicStaticMethod", "privateStaticMethod", "packageStaticMethod", "publicMethod", - "privateMethod", "packageMethod" }) - void shouldCallToolFromPublicClass(String methodName) { - validateAssertions(methodName, new PublicTools()); - } - - @ParameterizedTest - @ValueSource(strings = { "publicStaticMethod", "privateStaticMethod", "packageStaticMethod", "publicMethod", - "privateMethod", "packageMethod" }) - void shouldCallToolFromPrivateClass(String methodName) { - validateAssertions(methodName, new PrivateTools()); - } - - @ParameterizedTest - @ValueSource(strings = { "publicStaticMethod", "privateStaticMethod", "packageStaticMethod", "publicMethod", - "privateMethod", "packageMethod" }) - void shouldCallToolFromPackageClass(String methodName) { - validateAssertions(methodName, new PackageTools()); - } - - @Test - void shouldHandleToolContextWhenSupported() { - Method toolMethod = getMethod("methodWithToolContext", ToolContextTools.class); - MethodToolCallback callback = MethodToolCallback.builder() - .toolDefinition(ToolDefinition.from(toolMethod)) - .toolMetadata(ToolMetadata.from(toolMethod)) - .toolMethod(toolMethod) - .toolObject(new ToolContextTools()) - .build(); - - ToolContext toolContext = new ToolContext(Map.of("key", "value")); - String result = callback.call(""" - { - "input": "test" - } - """, toolContext); - - assertThat(result).contains("value"); - } - - @Test - void shouldThrowExceptionWhenToolContextArgumentIsMissing() { - Method toolMethod = getMethod("methodWithToolContext", ToolContextTools.class); - MethodToolCallback callback = MethodToolCallback.builder() - .toolDefinition(ToolDefinition.from(toolMethod)) - .toolMetadata(ToolMetadata.from(toolMethod)) - .toolMethod(toolMethod) - .toolObject(new PublicTools()) - .build(); - - assertThatThrownBy(() -> callback.call(""" - { - "input": "test" - } - """)).isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("ToolContext is required by the method as an argument"); - } - - @Test - void shouldHandleComplexArguments() { - Method toolMethod = getMethod("complexArgumentMethod", ComplexTools.class); - MethodToolCallback callback = MethodToolCallback.builder() - .toolDefinition(ToolDefinition.from(toolMethod)) - .toolMetadata(ToolMetadata.from(toolMethod)) - .toolMethod(toolMethod) - .toolObject(new ComplexTools()) - .build(); - - String result = callback.call(""" - { - "stringArg": "test", - "intArg": 42, - "listArg": ["a", "b", "c"], - "optionalArg": null - } - """); - - assertThat(JsonParser.fromJson(result, new TypeReference>() { - })).containsEntry("stringValue", "test").containsEntry("intValue", 42).containsEntry("listSize", 3); - } - - @Test - void shouldHandleCustomResultConverter() { - Method toolMethod = getMethod("publicMethod", PublicTools.class); - MethodToolCallback callback = MethodToolCallback.builder() - .toolDefinition(ToolDefinition.from(toolMethod)) - .toolMetadata(ToolMetadata.from(toolMethod)) - .toolMethod(toolMethod) - .toolObject(new PublicTools()) - .toolCallResultConverter((result, type) -> "Converted: " + result) - .build(); - - String result = callback.call(""" - { - "input": "test" - } - """); - - assertThat(result).startsWith("Converted:"); - } - - @Test - void shouldThrowExceptionWhenToolExecutionFails() { - Method toolMethod = getMethod("errorMethod", ErrorTools.class); - MethodToolCallback callback = MethodToolCallback.builder() - .toolDefinition(ToolDefinition.from(toolMethod)) - .toolMetadata(ToolMetadata.from(toolMethod)) - .toolMethod(toolMethod) - .toolObject(new ErrorTools()) - .build(); - - assertThatThrownBy(() -> callback.call(""" - { - "input": "test" - } - """)).isInstanceOf(ToolExecutionException.class).hasMessageContaining("Test error"); - } - - private static void validateAssertions(String methodName, Object toolObject) { - Method toolMethod = getMethod(methodName, toolObject.getClass()); - assertThat(toolMethod).isNotNull(); - MethodToolCallback callback = MethodToolCallback.builder() - .toolDefinition(ToolDefinition.from(toolMethod)) - .toolMetadata(ToolMetadata.from(toolMethod)) - .toolMethod(toolMethod) - .toolObject(toolObject) - .build(); - - String result = callback.call(""" - { - "input": "Wingardium Leviosa" - } - """); - - assertThat(JsonParser.fromJson(result, new TypeReference>() { - })).contains("Wingardium Leviosa"); - } - - private static Method getMethod(String name, Class toolsClass) { - return Arrays.stream(ReflectionUtils.getDeclaredMethods(toolsClass)) - .filter(m -> m.getName().equals(name)) - .findFirst() - .orElseThrow(); - } - - static public class PublicTools { - - @Tool(description = "Test description") - public static List publicStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - private static List privateStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - static List packageStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - public List publicMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - private List privateMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - List packageMethod(String input) { - return List.of(input); - } - - } - - static private class PrivateTools { - - @Tool(description = "Test description") - public static List publicStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - private static List privateStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - static List packageStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - public List publicMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - private List privateMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - List packageMethod(String input) { - return List.of(input); - } - - } - - static class PackageTools { - - @Tool(description = "Test description") - public static List publicStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - private static List privateStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - static List packageStaticMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - public List publicMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - private List privateMethod(String input) { - return List.of(input); - } - - @Tool(description = "Test description") - List packageMethod(String input) { - return List.of(input); - } - - } - - static class ToolContextTools { - - @Tool(description = "Test description") - public String methodWithToolContext(String input, ToolContext toolContext) { - return input + ": " + toolContext.getContext().get("key"); - } - - } - - static class ComplexTools { - - @Tool(description = "Test description") - public Map complexArgumentMethod(String stringArg, int intArg, List listArg, - String optionalArg) { - return Map.of("stringValue", stringArg, "intValue", intArg, "listSize", listArg.size(), "optionalProvided", - optionalArg != null); - } - - } - - static class ErrorTools { - - @Tool(description = "Test description") - public String errorMethod(String input) { - throw new IllegalArgumentException("Test error"); - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolverTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolverTests.java deleted file mode 100644 index 597247c7a..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolverTests.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.resolution; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.definition.ToolDefinition; - -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * Unit tests for {@link DelegatingToolCallbackResolver}. - * - * @author Thomas Vitale - */ -class DelegatingToolCallbackResolverTests { - - @Test - void whenToolCallbackResolversAreNullThenThrowException() { - assertThatThrownBy(() -> new DelegatingToolCallbackResolver(null)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void whenToolCallbackResolversContainNullElementsThenThrowException() { - var toolCallbackResolvers = new ArrayList(); - toolCallbackResolvers.add(null); - assertThatThrownBy(() -> new DelegatingToolCallbackResolver(toolCallbackResolvers)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void whenToolCallbacksAreProvidedThenResolveToolCallback() { - ToolCallback toolCallback = mock(ToolCallback.class); - when(toolCallback.getToolDefinition()) - .thenReturn(ToolDefinition.builder().name("myTool").inputSchema("{}").build()); - StaticToolCallbackResolver staticToolCallbackResolver = new StaticToolCallbackResolver(List.of(toolCallback)); - - DelegatingToolCallbackResolver delegatingToolCallbackResolver = new DelegatingToolCallbackResolver( - List.of(staticToolCallbackResolver)); - - assertThat(delegatingToolCallbackResolver.resolve("myTool")).isEqualTo(toolCallback); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverTests.java deleted file mode 100644 index 7f6df87dd..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverTests.java +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.resolution; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.util.json.schema.SchemaType; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Description; -import org.springframework.context.support.GenericApplicationContext; - -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** - * Unit tests for {@link SpringBeanToolCallbackResolver}. - * - * @author Thomas Vitale - */ -class SpringBeanToolCallbackResolverTests { - - @Test - void whenApplicationContextIsNullThenThrow() { - assertThatThrownBy(() -> new SpringBeanToolCallbackResolver(null, null)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("applicationContext cannot be null"); - - assertThatThrownBy(() -> SpringBeanToolCallbackResolver.builder().build()) - .isInstanceOf(IllegalArgumentException.class) - .hasMessage("applicationContext cannot be null"); - } - - @Test - void whenSchemaTypeIsNullThenUseDefault() { - SpringBeanToolCallbackResolver resolver = new SpringBeanToolCallbackResolver(new GenericApplicationContext(), - null); - assertThat(resolver.getSchemaType()).isEqualTo(SchemaType.JSON_SCHEMA); - - SpringBeanToolCallbackResolver resolver2 = SpringBeanToolCallbackResolver.builder() - .applicationContext(new GenericApplicationContext()) - .build(); - assertThat(resolver2.getSchemaType()).isEqualTo(SchemaType.JSON_SCHEMA); - } - - @Test - void whenSchemaTypeIsNotNullThenUseIt() { - SchemaType schemaType = SchemaType.OPEN_API_SCHEMA; - SpringBeanToolCallbackResolver resolver = new SpringBeanToolCallbackResolver(new GenericApplicationContext(), - schemaType); - assertThat(resolver.getSchemaType()).isEqualTo(schemaType); - - SpringBeanToolCallbackResolver resolver2 = SpringBeanToolCallbackResolver.builder() - .applicationContext(new GenericApplicationContext()) - .schemaType(schemaType) - .build(); - assertThat(resolver2.getSchemaType()).isEqualTo(schemaType); - } - - @Test - void whenRequiredArgumentsAreProvidedThenCreateInstance() { - GenericApplicationContext applicationContext = new GenericApplicationContext(); - SchemaType schemaType = SchemaType.OPEN_API_SCHEMA; - SpringBeanToolCallbackResolver resolver = new SpringBeanToolCallbackResolver(applicationContext, schemaType); - assertThat(resolver).isNotNull(); - - SpringBeanToolCallbackResolver resolver2 = SpringBeanToolCallbackResolver.builder() - .applicationContext(applicationContext) - .schemaType(schemaType) - .build(); - assertThat(resolver2).isNotNull(); - } - - @Test - void whenToolCallbackWithVoidConsumerIsResolvedThenReturnIt() { - GenericApplicationContext applicationContext = new AnnotationConfigApplicationContext(Functions.class); - SpringBeanToolCallbackResolver resolver = new SpringBeanToolCallbackResolver(applicationContext, - SchemaType.JSON_SCHEMA); - ToolCallback resolvedToolCallback = resolver.resolve(Functions.WELCOME_TOOL_NAME); - assertThat(resolvedToolCallback).isNotNull(); - assertThat(resolvedToolCallback.getToolDefinition().name()).isEqualTo(Functions.WELCOME_TOOL_NAME); - assertThat(resolvedToolCallback.getToolDefinition().description()) - .isEqualTo(Functions.WELCOME_TOOL_DESCRIPTION); - } - - @Test - void whenToolCallbackWithConsumerIsResolvedThenReturnIt() { - GenericApplicationContext applicationContext = new AnnotationConfigApplicationContext(Functions.class); - SpringBeanToolCallbackResolver resolver = new SpringBeanToolCallbackResolver(applicationContext, - SchemaType.JSON_SCHEMA); - ToolCallback resolvedToolCallback = resolver.resolve(Functions.WELCOME_USER_TOOL_NAME); - assertThat(resolvedToolCallback).isNotNull(); - assertThat(resolvedToolCallback.getToolDefinition().name()).isEqualTo(Functions.WELCOME_USER_TOOL_NAME); - assertThat(resolvedToolCallback.getToolDefinition().description()) - .isEqualTo(Functions.WELCOME_USER_TOOL_DESCRIPTION); - } - - @Test - void whenToolCallbackWithFunctionIsResolvedThenReturnIt() { - GenericApplicationContext applicationContext = new AnnotationConfigApplicationContext(Functions.class); - SpringBeanToolCallbackResolver resolver = new SpringBeanToolCallbackResolver(applicationContext, - SchemaType.JSON_SCHEMA); - ToolCallback resolvedToolCallback = resolver.resolve(Functions.BOOKS_BY_AUTHOR_TOOL_NAME); - assertThat(resolvedToolCallback).isNotNull(); - assertThat(resolvedToolCallback.getToolDefinition().name()).isEqualTo(Functions.BOOKS_BY_AUTHOR_TOOL_NAME); - assertThat(resolvedToolCallback.getToolDefinition().description()) - .isEqualTo(Functions.BOOKS_BY_AUTHOR_TOOL_DESCRIPTION); - } - - @Configuration(proxyBeanMethods = false) - static class Functions { - - public static final String BOOKS_BY_AUTHOR_TOOL_NAME = "booksByAuthor"; - - public static final String BOOKS_BY_AUTHOR_TOOL_DESCRIPTION = "Get the list of books written by the given author available in the library"; - - public static final String WELCOME_TOOL_NAME = "welcome"; - - public static final String WELCOME_TOOL_DESCRIPTION = "Welcome users to the library"; - - public static final String WELCOME_USER_TOOL_NAME = "welcomeUser"; - - public static final String WELCOME_USER_TOOL_DESCRIPTION = "Welcome a specific user to the library"; - - @Bean(WELCOME_TOOL_NAME) - @Description(WELCOME_TOOL_DESCRIPTION) - Consumer welcome() { - return (input) -> { - }; - } - - @Bean(WELCOME_USER_TOOL_NAME) - @Description(WELCOME_USER_TOOL_DESCRIPTION) - Consumer welcomeUser() { - return user -> { - }; - } - - @Bean(BOOKS_BY_AUTHOR_TOOL_NAME) - @Description(BOOKS_BY_AUTHOR_TOOL_DESCRIPTION) - Function> booksByAuthor() { - return author -> List.of(new Book("Book 1", author.name()), new Book("Book 2", author.name())); - } - - public record User(String name) { - } - - public record Author(String name) { - } - - public record Book(String title, String author) { - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/StandaloneWeatherFunction.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/StandaloneWeatherFunction.java deleted file mode 100644 index aa124fa3f..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/StandaloneWeatherFunction.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.resolution; - -import java.util.function.Function; - -import org.springframework.ai.tool.resolution.TypeResolverHelperIT.WeatherRequest; -import org.springframework.ai.tool.resolution.TypeResolverHelperIT.WeatherResponse; - -/** - * @author Christian Tzolov - */ -public class StandaloneWeatherFunction implements Function { - - @Override - public WeatherResponse apply(WeatherRequest weatherRequest) { - return new WeatherResponse(42.0f); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolverTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolverTests.java deleted file mode 100644 index 2c20b74dd..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolverTests.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.resolution; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.definition.ToolDefinition; - -import java.util.ArrayList; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * Unit tests for {@link StaticToolCallbackResolver}. - * - * @author Thomas Vitale - */ -class StaticToolCallbackResolverTests { - - @Test - void whenToolCallbacksAreNullThenThrowException() { - assertThatThrownBy(() -> new StaticToolCallbackResolver(null)).isInstanceOf(IllegalArgumentException.class); - } - - @Test - void whenToolCallbacksContainNullElementsThenThrowException() { - var toolCallbacks = new ArrayList(); - toolCallbacks.add(null); - assertThatThrownBy(() -> new StaticToolCallbackResolver(toolCallbacks)) - .isInstanceOf(IllegalArgumentException.class); - } - - @Test - void whenToolCallbacksAreEmptyThenReturn() { - StaticToolCallbackResolver resolver = new StaticToolCallbackResolver(List.of()); - assertThat(resolver).isNotNull(); - } - - @Test - void whenToolCallbacksAreProvidedThenResolveToolCallback() { - ToolCallback toolCallback = mock(ToolCallback.class); - when(toolCallback.getToolDefinition()) - .thenReturn(ToolDefinition.builder().name("myTool").inputSchema("{}").build()); - StaticToolCallbackResolver resolver = new StaticToolCallbackResolver(List.of(toolCallback)); - assertThat(resolver.resolve("myTool")).isEqualTo(toolCallback); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/TypeResolverHelperIT.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/TypeResolverHelperIT.java deleted file mode 100644 index fa02472b4..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/TypeResolverHelperIT.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.resolution; - -import java.util.function.Consumer; -import java.util.function.Function; - -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.ValueSource; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.ResolvableType; - -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootTest -public class TypeResolverHelperIT { - - @Autowired - GenericApplicationContext applicationContext; - - @ParameterizedTest(name = "{0} : {displayName} ") - @ValueSource(strings = { "weatherClassDefinition", "weatherFunctionDefinition", "standaloneWeatherFunction", - "scannedStandaloneWeatherFunction", "componentWeatherFunction", "weatherConsumer" }) - void beanInputTypeResolutionWithResolvableType(String beanName) { - assertThat(this.applicationContext).isNotNull(); - ResolvableType functionType = TypeResolverHelper.resolveBeanType(this.applicationContext, beanName); - Class functionInputClass = TypeResolverHelper.getFunctionArgumentType(functionType, 0).getRawClass(); - assertThat(functionInputClass).isNotNull(); - assertThat(functionInputClass.getTypeName()).isEqualTo(WeatherRequest.class.getName()); - } - - public record WeatherRequest(String city) { - - } - - public record WeatherResponse(float temperatureInCelsius) { - - } - - public static class Outer { - - public static class InnerWeatherFunction implements Function { - - @Override - public WeatherResponse apply(WeatherRequest weatherRequest) { - return new WeatherResponse(42.0f); - } - - } - - } - - @Configuration - @ComponentScan({ "org.springframework.ai.tool.resolution.config", - "org.springframework.ai.tool.resolution.component" }) - public static class TypeResolverHelperConfiguration { - - @Bean - Outer.InnerWeatherFunction weatherClassDefinition() { - return new Outer.InnerWeatherFunction(); - } - - @Bean - Function weatherFunctionDefinition() { - return new Outer.InnerWeatherFunction(); - } - - @Bean - StandaloneWeatherFunction standaloneWeatherFunction() { - return new StandaloneWeatherFunction(); - } - - @Bean - Consumer weatherConsumer() { - return System.out::println; - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/TypeResolverHelperTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/TypeResolverHelperTests.java deleted file mode 100644 index a5185bee6..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/TypeResolverHelperTests.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.resolution; - -import java.util.function.Consumer; -import java.util.function.Function; - -import com.fasterxml.jackson.annotation.JsonClassDescription; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.annotation.JsonPropertyDescription; -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.resolution.TypeResolverHelperTests.MockWeatherService.Request; -import org.springframework.ai.tool.resolution.TypeResolverHelperTests.MockWeatherService.Response; - -import static org.assertj.core.api.Assertions.assertThat; - -/** - * @author Christian Tzolov - */ -public class TypeResolverHelperTests { - - @Test - public void testGetConsumerInputType() { - Class inputType = TypeResolverHelper.getConsumerInputClass(MyConsumer.class); - assertThat(inputType).isEqualTo(Request.class); - } - - @Test - public void testGetFunctionInputType() { - Class inputType = TypeResolverHelper.getFunctionInputClass(MockWeatherService.class); - assertThat(inputType).isEqualTo(Request.class); - } - - @Test - public void testGetFunctionOutputType() { - Class outputType = TypeResolverHelper.getFunctionOutputClass(MockWeatherService.class); - assertThat(outputType).isEqualTo(Response.class); - } - - @Test - public void testGetFunctionInputTypeForInstance() { - MockWeatherService service = new MockWeatherService(); - Class inputType = TypeResolverHelper.getFunctionInputClass(service.getClass()); - assertThat(inputType).isEqualTo(Request.class); - } - - public static class OutputFunctionConverter implements Function { - - @Override - public String apply(Response response) { - return response.temp + " " + response.unit; - } - - } - - public static class MyConsumer implements Consumer { - - @Override - public void accept(Request request) { - } - - } - - public static class MockWeatherService implements Function { - - @Override - public Response apply(Request request) { - return new Response(10, "C"); - } - - /** - * Weather Function request. - */ - @JsonInclude(Include.NON_NULL) - @JsonClassDescription("Weather API request") - public record Request(@JsonProperty(required = true, - value = "location") @JsonPropertyDescription("The city and state e.g. San Francisco, CA") String location, - @JsonProperty(required = true, value = "lat") @JsonPropertyDescription("The city latitude") double lat, - @JsonProperty(required = true, value = "lon") @JsonPropertyDescription("The city longitude") double lon, - @JsonProperty(required = true, - value = "unit") @JsonPropertyDescription("Temperature unit") String unit) { - - } - - public record Response(double temp, String unit) { - - } - - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/component/ComponentWeatherFunction.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/component/ComponentWeatherFunction.java deleted file mode 100644 index 2a96dce13..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/component/ComponentWeatherFunction.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.resolution.component; - -import java.util.function.Function; - -import org.springframework.ai.tool.resolution.TypeResolverHelperIT.WeatherRequest; -import org.springframework.ai.tool.resolution.TypeResolverHelperIT.WeatherResponse; -import org.springframework.stereotype.Component; - -/** - * @author Sebastien Deleuze - */ -@Component -public class ComponentWeatherFunction implements Function { - - @Override - public WeatherResponse apply(WeatherRequest weatherRequest) { - return new WeatherResponse(42.0f); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/config/TypeResolverHelperConfiguration.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/config/TypeResolverHelperConfiguration.java deleted file mode 100644 index 7632f317f..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/resolution/config/TypeResolverHelperConfiguration.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2023-2025 the original author or authors. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.springframework.ai.tool.resolution.config; - -import org.springframework.ai.tool.resolution.StandaloneWeatherFunction; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class TypeResolverHelperConfiguration { - - @Bean - StandaloneWeatherFunction scannedStandaloneWeatherFunction() { - return new StandaloneWeatherFunction(); - } - -} diff --git a/spring-ai-core/src/test/java/org/springframework/ai/tool/utils/ToolUtilsTests.java b/spring-ai-core/src/test/java/org/springframework/ai/tool/utils/ToolUtilsTests.java deleted file mode 100644 index e30968747..000000000 --- a/spring-ai-core/src/test/java/org/springframework/ai/tool/utils/ToolUtilsTests.java +++ /dev/null @@ -1,204 +0,0 @@ -package org.springframework.ai.tool.utils; - -import org.junit.jupiter.api.Test; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.ai.tool.annotation.Tool; -import org.springframework.ai.tool.definition.ToolDefinition; -import org.springframework.ai.tool.execution.DefaultToolCallResultConverter; -import org.springframework.ai.tool.execution.ToolCallResultConverter; -import org.springframework.ai.tool.util.ToolUtils; - -import java.lang.reflect.Method; -import java.lang.reflect.Type; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -/** - * Unit tests for {@link ToolUtils}. - * - * @author Thomas Vitale - */ -class ToolUtilsTests { - - @Test - void shouldDetectDuplicateToolNames() { - ToolCallback callback1 = new TestToolCallback("tool_a"); - ToolCallback callback2 = new TestToolCallback("tool_a"); - ToolCallback callback3 = new TestToolCallback("tool_b"); - - List duplicates = ToolUtils.getDuplicateToolNames(callback1, callback2, callback3); - - assertThat(duplicates).isNotEmpty(); - assertThat(duplicates).contains("tool_a"); - } - - @Test - void shouldNotDetectDuplicateToolNames() { - ToolCallback callback1 = new TestToolCallback("tool_a"); - ToolCallback callback2 = new TestToolCallback("tool_b"); - ToolCallback callback3 = new TestToolCallback("tool_c"); - - List duplicates = ToolUtils.getDuplicateToolNames(callback1, callback2, callback3); - - assertThat(duplicates).isEmpty(); - } - - @Test - void shouldGetToolNameFromAnnotation() throws Exception { - Method method = TestTools.class.getMethod("toolWithCustomName"); - assertThat(ToolUtils.getToolName(method)).isEqualTo("customName"); - } - - @Test - void shouldGetMethodNameWhenNoCustomNameInAnnotation() throws Exception { - Method method = TestTools.class.getMethod("toolWithoutCustomName"); - assertThat(ToolUtils.getToolName(method)).isEqualTo("toolWithoutCustomName"); - } - - @Test - void shouldGetMethodNameWhenNoAnnotation() throws Exception { - Method method = TestTools.class.getMethod("methodWithoutAnnotation"); - assertThat(ToolUtils.getToolName(method)).isEqualTo("methodWithoutAnnotation"); - } - - @Test - void shouldGetToolDescriptionFromAnnotation() throws Exception { - Method method = TestTools.class.getMethod("toolWithCustomDescription"); - assertThat(ToolUtils.getToolDescription(method)).isEqualTo("Custom description"); - } - - @Test - void shouldGetToolDescriptionFromName() { - String description = ToolUtils.getToolDescriptionFromName("mySuperSpecialTool"); - assertThat(description).isEqualTo("my super special tool"); - } - - @Test - void shouldGetMethodNameWhenNoCustomDescriptionInAnnotation() throws Exception { - Method method = TestTools.class.getMethod("toolWithoutCustomDescription"); - assertThat(ToolUtils.getToolDescription(method)).isEqualTo("toolWithoutCustomDescription"); - } - - @Test - void shouldGetFormattedMethodNameWhenNoAnnotation() throws Exception { - Method method = TestTools.class.getMethod("camelCaseMethodWithoutAnnotation"); - assertThat(ToolUtils.getToolDescription(method)).isEqualTo("camel case method without annotation"); - } - - @Test - void shouldGetToolReturnDirectFromAnnotation() throws Exception { - Method method = TestTools.class.getMethod("toolWithReturnDirect"); - assertThat(ToolUtils.getToolReturnDirect(method)).isTrue(); - } - - @Test - void shouldGetDefaultReturnDirectWhenNoAnnotation() throws Exception { - Method method = TestTools.class.getMethod("methodWithoutAnnotation"); - assertThat(ToolUtils.getToolReturnDirect(method)).isFalse(); - } - - @Test - void shouldGetToolCallResultConverterFromAnnotation() throws Exception { - Method method = TestTools.class.getMethod("toolWithCustomConverter"); - ToolCallResultConverter converter = ToolUtils.getToolCallResultConverter(method); - assertThat(converter).isInstanceOf(CustomToolCallResultConverter.class); - } - - @Test - void shouldGetDefaultConverterWhenNoAnnotation() throws Exception { - Method method = TestTools.class.getMethod("methodWithoutAnnotation"); - ToolCallResultConverter converter = ToolUtils.getToolCallResultConverter(method); - assertThat(converter).isInstanceOf(DefaultToolCallResultConverter.class); - } - - @Test - void shouldThrowExceptionWhenConverterCannotBeInstantiated() throws Exception { - Method method = TestTools.class.getMethod("toolWithInvalidConverter"); - assertThatThrownBy(() -> ToolUtils.getToolCallResultConverter(method)) - .isInstanceOf(IllegalArgumentException.class) - .hasMessageContaining("Failed to instantiate ToolCallResultConverter"); - } - - static class TestToolCallback implements ToolCallback { - - private final ToolDefinition toolDefinition; - - public TestToolCallback(String name) { - this.toolDefinition = ToolDefinition.builder().name(name).description(name).inputSchema("{}").build(); - } - - @Override - public ToolDefinition getToolDefinition() { - return toolDefinition; - } - - @Override - public String call(String functionInput) { - return ""; - } - - } - - static class TestTools { - - @Tool(name = "customName") - public void toolWithCustomName() { - } - - @Tool - public void toolWithoutCustomName() { - } - - @Tool(description = "Custom description") - public void toolWithCustomDescription() { - } - - @Tool - public void toolWithoutCustomDescription() { - } - - @Tool(returnDirect = true) - public void toolWithReturnDirect() { - } - - @Tool(resultConverter = CustomToolCallResultConverter.class) - public void toolWithCustomConverter() { - } - - @Tool(resultConverter = InvalidToolCallResultConverter.class) - public void toolWithInvalidConverter() { - } - - public void methodWithoutAnnotation() { - } - - public void camelCaseMethodWithoutAnnotation() { - } - - } - - public static class CustomToolCallResultConverter implements ToolCallResultConverter { - - @Override - public String convert(Object result, Type returnType) { - return returnType == null ? "null" : returnType.getTypeName(); - } - - } - - // No-public class with no-public constructor - static class InvalidToolCallResultConverter implements ToolCallResultConverter { - - private InvalidToolCallResultConverter() { - } - - @Override - public String convert(Object result, Type returnType) { - return returnType == null ? "null" : returnType.getTypeName(); - } - - } - -} diff --git a/spring-ai-model/pom.xml b/spring-ai-model/pom.xml index 9d42a3b40..74263df78 100644 --- a/spring-ai-model/pom.xml +++ b/spring-ai-model/pom.xml @@ -74,6 +74,18 @@ reactor-core + + org.antlr + ST4 + ${ST4.version} + + + + org.antlr + antlr4-runtime + ${antlr.version} + + com.github.victools jsonschema-generator @@ -122,6 +134,19 @@ micrometer-observation-test test + + + com.fasterxml.jackson.module + jackson-module-kotlin + test + + + + io.mockk + mockk-jvm + 1.13.13 + test + diff --git a/spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscription.java b/spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscription.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscription.java rename to spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscription.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionOptions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionOptions.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionPrompt.java b/spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionPrompt.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionPrompt.java rename to spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionPrompt.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponse.java b/spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponse.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponse.java rename to spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponse.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponseMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponseMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponseMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/audio/transcription/AudioTranscriptionResponseMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/messages/AbstractMessage.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/messages/AssistantMessage.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/Message.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/Message.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/messages/Message.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/messages/Message.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/MessageType.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/MessageType.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/messages/MessageType.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/messages/MessageType.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/messages/SystemMessage.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/messages/ToolResponseMessage.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/messages/UserMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/messages/UserMessage.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/messages/UserMessage.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/messages/UserMessage.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatGenerationMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/ChatGenerationMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatGenerationMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/ChatGenerationMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/ChatResponseMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadataBuilder.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadataBuilder.java similarity index 95% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadataBuilder.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadataBuilder.java index 0be499ea6..4eb578c9f 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadataBuilder.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/DefaultChatGenerationMetadataBuilder.java @@ -28,7 +28,7 @@ import org.springframework.ai.chat.metadata.ChatGenerationMetadata.Builder; * @since 1.0.0 */ -public class DefaultChatGenerationMetadataBuilder implements ChatGenerationMetadata.Builder { +public class DefaultChatGenerationMetadataBuilder implements Builder { private String finishReason; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/EmptyRateLimit.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/EmptyRateLimit.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/EmptyRateLimit.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/EmptyRateLimit.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/PromptMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/PromptMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/PromptMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/PromptMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/RateLimit.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/RateLimit.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/RateLimit.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/RateLimit.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/UsageUtils.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/UsageUtils.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/metadata/UsageUtils.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/metadata/UsageUtils.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/model/AbstractToolCallSupport.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/ChatModel.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/model/ChatModel.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/model/ChatModel.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/model/ChatModel.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/ChatResponse.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/model/ChatResponse.java similarity index 98% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/model/ChatResponse.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/model/ChatResponse.java index 24eac16a5..4ed1963d5 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/ChatResponse.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/model/ChatResponse.java @@ -66,8 +66,8 @@ public class ChatResponse implements ModelResponse { this.generations = List.copyOf(generations); } - public static ChatResponse.Builder builder() { - return new ChatResponse.Builder(); + public static Builder builder() { + return new Builder(); } /** diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/Generation.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/model/Generation.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/model/Generation.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/model/Generation.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/model/StreamingChatModel.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/model/ToolContext.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/model/ToolContext.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/model/ToolContext.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/model/ToolContext.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilter.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilter.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilter.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilter.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandler.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandler.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandler.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandler.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandler.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContentProcessor.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationContext.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationConvention.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationConvention.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationConvention.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationConvention.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelObservationDocumentation.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilter.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilter.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilter.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilter.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandler.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConvention.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConvention.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConvention.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConvention.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/observation/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/observation/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/observation/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/observation/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/AssistantPromptTemplate.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/AssistantPromptTemplate.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/AssistantPromptTemplate.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/AssistantPromptTemplate.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java similarity index 95% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java index 19cb98a3a..9f051ac05 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/ChatOptions.java @@ -90,11 +90,10 @@ public interface ChatOptions extends ModelOptions { T copy(); /** - * Creates a new {@link ChatOptions.Builder} to create the default - * {@link ChatOptions}. - * @return Returns a new {@link ChatOptions.Builder}. + * Creates a new {@link Builder} to create the default {@link ChatOptions}. + * @return Returns a new {@link Builder}. */ - static ChatOptions.Builder builder() { + static Builder builder() { return new DefaultChatOptionsBuilder(); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/ChatPromptTemplate.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/ChatPromptTemplate.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/ChatPromptTemplate.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/ChatPromptTemplate.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptions.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptionsBuilder.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptionsBuilder.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptionsBuilder.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/DefaultChatOptionsBuilder.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/FunctionPromptTemplate.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/FunctionPromptTemplate.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/FunctionPromptTemplate.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/FunctionPromptTemplate.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/Prompt.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/Prompt.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/Prompt.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/Prompt.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateActions.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateActions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateActions.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateActions.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateChatActions.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateChatActions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateChatActions.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateChatActions.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateMessageActions.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateMessageActions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateMessageActions.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateMessageActions.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateStringActions.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateStringActions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateStringActions.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplateStringActions.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/SystemPromptTemplate.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/SystemPromptTemplate.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/SystemPromptTemplate.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/SystemPromptTemplate.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/TemplateFormat.java b/spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/TemplateFormat.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/chat/prompt/TemplateFormat.java rename to spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/TemplateFormat.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/Image.java b/spring-ai-model/src/main/java/org/springframework/ai/image/Image.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/Image.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/Image.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImageGeneration.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageGeneration.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImageGeneration.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImageGeneration.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImageGenerationMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageGenerationMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImageGenerationMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImageGenerationMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImageMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageMessage.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImageMessage.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImageMessage.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImageModel.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageModel.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImageModel.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImageModel.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImageOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageOptions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImageOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImageOptions.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImageOptionsBuilder.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageOptionsBuilder.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImageOptionsBuilder.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImageOptionsBuilder.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImagePrompt.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImagePrompt.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImagePrompt.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImagePrompt.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImageResponse.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageResponse.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImageResponse.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImageResponse.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/ImageResponseMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageResponseMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/ImageResponseMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/ImageResponseMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/observation/DefaultImageModelObservationConvention.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/DefaultImageModelObservationConvention.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/observation/DefaultImageModelObservationConvention.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/observation/DefaultImageModelObservationConvention.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationContext.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/observation/ImageModelObservationConvention.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationConvention.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/observation/ImageModelObservationConvention.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationConvention.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelObservationDocumentation.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilter.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilter.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilter.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilter.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/image/observation/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/image/observation/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/image/observation/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/image/observation/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/AbstractFunctionCallback.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/AbstractFunctionCallback.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/AbstractFunctionCallback.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/AbstractFunctionCallback.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultCommonCallbackInvokingSpec.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultCommonCallbackInvokingSpec.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultCommonCallbackInvokingSpec.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultCommonCallbackInvokingSpec.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java index d18e0bf5d..ab23de10a 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilder.java @@ -164,7 +164,7 @@ public class DefaultFunctionCallbackBuilder implements FunctionCallback.Builder } final class DefaultMethodInvokingSpec extends DefaultCommonCallbackInvokingSpec - implements FunctionCallback.MethodInvokingSpec { + implements MethodInvokingSpec { private String name; diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackResolver.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackResolver.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackResolver.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallbackResolver.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptions.java similarity index 98% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptions.java index 9d1456f29..5d580e54d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptions.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptions.java @@ -195,7 +195,7 @@ public class DefaultFunctionCallingOptions implements FunctionCallingOptions { } public FunctionCallingOptions merge(ChatOptions options) { - FunctionCallingOptions.Builder builder = FunctionCallingOptions.builder(); + Builder builder = FunctionCallingOptions.builder(); builder.model(StringUtils.hasText(options.getModel()) ? options.getModel() : this.getModel()) .frequencyPenalty( options.getFrequencyPenalty() != null ? options.getFrequencyPenalty() : this.getFrequencyPenalty()) diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilder.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilder.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilder.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilder.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallback.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallback.java similarity index 97% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallback.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallback.java index 08f5b0f1f..0553c0d7f 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallback.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallback.java @@ -87,11 +87,11 @@ public interface FunctionCallback { } /** - * Creates a new {@link FunctionCallback.Builder} instance used to build a default + * Creates a new {@link Builder} instance used to build a default * {@link FunctionCallback} instance. - * @return Returns a new {@link FunctionCallback.Builder} instance. + * @return Returns a new {@link Builder} instance. */ - static FunctionCallback.Builder builder() { + static Builder builder() { return new DefaultFunctionCallbackBuilder(); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackResolver.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallbackResolver.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallbackResolver.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallbackResolver.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java index ececf6fd7..cdbe33ba1 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallingHelper.java @@ -23,7 +23,6 @@ import java.util.Optional; import java.util.Set; import java.util.function.Function; -import org.springframework.ai.model.tool.ToolCallingManager; import reactor.core.publisher.Flux; import org.springframework.ai.chat.messages.AssistantMessage; @@ -35,6 +34,7 @@ import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.model.Generation; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.model.ModelOptionsUtils; +import org.springframework.ai.model.tool.ToolCallingManager; import org.springframework.util.CollectionUtils; /** diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallingOptions.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallingOptions.java index 1e886f6cb..2363bc123 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionCallingOptions.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionCallingOptions.java @@ -38,7 +38,7 @@ public interface FunctionCallingOptions extends ChatOptions { * @return Returns {@link DefaultFunctionCallingOptionsBuilder} to create a new * instance of {@link FunctionCallingOptions}. */ - static FunctionCallingOptions.Builder builder() { + static Builder builder() { return new DefaultFunctionCallingOptionsBuilder(); } diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionInvokingFunctionCallback.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionInvokingFunctionCallback.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/FunctionInvokingFunctionCallback.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/FunctionInvokingFunctionCallback.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java b/spring-ai-model/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/function/MethodInvokingFunctionCallback.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java index 327435a58..dce2f9208 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptions.java @@ -16,11 +16,6 @@ package org.springframework.ai.model.tool; -import org.springframework.ai.chat.prompt.ChatOptions; -import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.lang.Nullable; -import org.springframework.util.Assert; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -29,6 +24,11 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.springframework.ai.chat.prompt.ChatOptions; +import org.springframework.ai.model.function.FunctionCallback; +import org.springframework.lang.Nullable; +import org.springframework.util.Assert; + /** * Default implementation of {@link ToolCallingChatOptions}. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java index 3e38ea6ea..9dcca588f 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolCallingManager.java @@ -16,9 +16,16 @@ package org.springframework.ai.model.tool; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + import io.micrometer.observation.ObservationRegistry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.ToolResponseMessage; @@ -31,19 +38,13 @@ import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; import org.springframework.ai.tool.execution.DefaultToolExecutionExceptionProcessor; -import org.springframework.ai.tool.execution.ToolExecutionExceptionProcessor; import org.springframework.ai.tool.execution.ToolExecutionException; +import org.springframework.ai.tool.execution.ToolExecutionExceptionProcessor; import org.springframework.ai.tool.resolution.DelegatingToolCallbackResolver; import org.springframework.ai.tool.resolution.ToolCallbackResolver; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - /** * Default implementation of {@link ToolCallingManager}. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java index 5129fe40f..81be2caed 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/DefaultToolExecutionResult.java @@ -16,11 +16,11 @@ package org.springframework.ai.model.tool; +import java.util.List; + import org.springframework.ai.chat.messages.Message; import org.springframework.util.Assert; -import java.util.List; - /** * Default implementation of {@link ToolExecutionResult}. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java index f88f7c7b2..71019a803 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/LegacyToolCallingManager.java @@ -16,6 +16,12 @@ package org.springframework.ai.model.tool; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.ToolResponseMessage; @@ -30,18 +36,12 @@ import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; import org.springframework.ai.tool.execution.DefaultToolExecutionExceptionProcessor; -import org.springframework.ai.tool.execution.ToolExecutionExceptionProcessor; import org.springframework.ai.tool.execution.ToolExecutionException; +import org.springframework.ai.tool.execution.ToolExecutionExceptionProcessor; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - /** * Implementation of {@link ToolCallingManager} supporting the migration from * {@link AbstractToolCallSupport} to {@link ToolCallingManager} and ensuring AI diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java index 430fe4ad0..81bfb7fcd 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingChatOptions.java @@ -16,6 +16,13 @@ package org.springframework.ai.model.tool; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.springframework.ai.chat.model.ChatModel; import org.springframework.ai.chat.prompt.ChatOptions; import org.springframework.ai.model.function.FunctionCallback; @@ -25,13 +32,6 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * A set of options that can be used to configure the interaction with a chat model, * including tool calling. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java index c93a38a21..d31a490a7 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolCallingManager.java @@ -16,12 +16,12 @@ package org.springframework.ai.model.tool; +import java.util.List; + import org.springframework.ai.chat.model.ChatResponse; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.tool.definition.ToolDefinition; -import java.util.List; - /** * Service responsible for managing the tool calling process for a chat model. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java index 41db567d4..1b2df957d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/ToolExecutionResult.java @@ -16,15 +16,15 @@ package org.springframework.ai.model.tool; +import java.util.ArrayList; +import java.util.List; + import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.Message; import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.metadata.ChatGenerationMetadata; import org.springframework.ai.chat.model.Generation; -import java.util.ArrayList; -import java.util.List; - /** * The result of a tool execution. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/model/tool/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/model/tool/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/model/tool/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/model/tool/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/Categories.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/Categories.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/Categories.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/Categories.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/CategoryScores.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/CategoryScores.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/CategoryScores.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/Generation.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/Generation.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/Generation.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/Generation.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/Moderation.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/Moderation.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/Moderation.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/Moderation.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationGenerationMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationGenerationMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationGenerationMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationGenerationMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationMessage.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationMessage.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationMessage.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationMessage.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationModel.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationModel.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationModel.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationModel.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationOptions.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationOptions.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationOptions.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationOptions.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationOptionsBuilder.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationOptionsBuilder.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationOptionsBuilder.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationOptionsBuilder.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationPrompt.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationResponse.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResponse.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationResponse.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResponse.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationResponseMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResponseMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationResponseMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResponseMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationResult.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResult.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/moderation/ModerationResult.java rename to spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResult.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/StaticToolCallbackProvider.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/StaticToolCallbackProvider.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/StaticToolCallbackProvider.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/StaticToolCallbackProvider.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/ToolCallback.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/ToolCallback.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/ToolCallback.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/ToolCallback.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/ToolCallbackProvider.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/ToolCallbackProvider.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/ToolCallbackProvider.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/ToolCallbackProvider.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/ToolCallbacks.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/ToolCallbacks.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/ToolCallbacks.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/ToolCallbacks.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/Tool.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/annotation/Tool.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/Tool.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/annotation/Tool.java index 937d498b2..d17b2fc47 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/Tool.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/annotation/Tool.java @@ -16,15 +16,15 @@ package org.springframework.ai.tool.annotation; -import org.springframework.ai.tool.execution.DefaultToolCallResultConverter; -import org.springframework.ai.tool.execution.ToolCallResultConverter; - import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.springframework.ai.tool.execution.DefaultToolCallResultConverter; +import org.springframework.ai.tool.execution.ToolCallResultConverter; + /** * Marks a method as a tool in Spring AI. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/annotation/ToolParam.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/annotation/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/annotation/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/annotation/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/definition/DefaultToolDefinition.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java index 19dc01781..10fef32f0 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/definition/ToolDefinition.java @@ -16,12 +16,12 @@ package org.springframework.ai.tool.definition; +import java.lang.reflect.Method; + import org.springframework.ai.tool.util.ToolUtils; import org.springframework.ai.util.json.schema.JsonSchemaGenerator; import org.springframework.util.Assert; -import java.lang.reflect.Method; - /** * Definition used by the AI model to determine when and how to call the tool. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/definition/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/definition/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/definition/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/definition/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/execution/DefaultToolCallResultConverter.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessor.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessor.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessor.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessor.java index 1998d9515..8dad5c031 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessor.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/execution/DefaultToolExecutionExceptionProcessor.java @@ -18,6 +18,7 @@ package org.springframework.ai.tool.execution; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.util.Assert; /** diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/ToolCallResultConverter.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/execution/ToolCallResultConverter.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/execution/ToolCallResultConverter.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/execution/ToolCallResultConverter.java index 2b933828b..d9d134332 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/ToolCallResultConverter.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/execution/ToolCallResultConverter.java @@ -16,10 +16,10 @@ package org.springframework.ai.tool.execution; -import org.springframework.lang.Nullable; - import java.lang.reflect.Type; +import org.springframework.lang.Nullable; + /** * A functional interface to convert tool call results to a String that can be sent back * to the AI model. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/ToolExecutionException.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/execution/ToolExecutionException.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/execution/ToolExecutionException.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/execution/ToolExecutionException.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/ToolExecutionExceptionProcessor.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/execution/ToolExecutionExceptionProcessor.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/execution/ToolExecutionExceptionProcessor.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/execution/ToolExecutionExceptionProcessor.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/execution/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/execution/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/execution/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/execution/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/function/FunctionToolCallback.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/function/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/function/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/function/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/function/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/metadata/DefaultToolMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/metadata/DefaultToolMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/metadata/DefaultToolMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/metadata/DefaultToolMetadata.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/metadata/ToolMetadata.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/metadata/ToolMetadata.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/metadata/ToolMetadata.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/metadata/ToolMetadata.java index 63d785f11..81963f8b1 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/metadata/ToolMetadata.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/metadata/ToolMetadata.java @@ -16,11 +16,11 @@ package org.springframework.ai.tool.metadata; +import java.lang.reflect.Method; + import org.springframework.ai.tool.util.ToolUtils; import org.springframework.util.Assert; -import java.lang.reflect.Method; - /** * Metadata about a tool specification and execution. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/metadata/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/metadata/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/metadata/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/metadata/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java index e57646647..a3b5f41d0 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallback.java @@ -16,9 +16,17 @@ package org.springframework.ai.tool.method; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.Type; +import java.util.Map; +import java.util.stream.Stream; + import com.fasterxml.jackson.core.type.TypeReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; @@ -32,13 +40,6 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.CollectionUtils; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.lang.reflect.Type; -import java.util.Map; -import java.util.stream.Stream; - /** * A {@link ToolCallback} implementation to invoke methods as tools. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java index 583a2a5da..3df65662b 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/method/MethodToolCallbackProvider.java @@ -16,8 +16,18 @@ package org.springframework.ai.tool.method; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import java.util.stream.Stream; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.ToolCallbackProvider; import org.springframework.ai.tool.annotation.Tool; @@ -29,15 +39,6 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.Stream; - /** * A {@link ToolCallbackProvider} that builds {@link ToolCallback} instances from * {@link Tool}-annotated methods. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/method/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/method/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/method/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/method/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolver.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolver.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolver.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolver.java index 16688b053..de10aca7d 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolver.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/DelegatingToolCallbackResolver.java @@ -16,12 +16,12 @@ package org.springframework.ai.tool.resolution; +import java.util.List; + import org.springframework.ai.model.function.FunctionCallback; import org.springframework.lang.Nullable; import org.springframework.util.Assert; -import java.util.List; - /** * A {@link ToolCallbackResolver} that delegates to a list of {@link ToolCallbackResolver} * instances. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java index 69398dc63..01893049f 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolver.java @@ -16,12 +16,20 @@ package org.springframework.ai.tool.resolution; +import java.util.HashMap; +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Consumer; +import java.util.function.Function; +import java.util.function.Supplier; + import com.fasterxml.jackson.annotation.JsonClassDescription; import kotlin.jvm.functions.Function0; import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.function.FunctionToolCallback; @@ -38,13 +46,6 @@ import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import java.util.HashMap; -import java.util.Map; -import java.util.function.BiFunction; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.function.Supplier; - /** * A Spring {@link ApplicationContext}-based implementation that provides a way to * retrieve a bean from the Spring context and wrap it into a {@link ToolCallback}. diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolver.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolver.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolver.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolver.java index 4e7352edb..d180257ce 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolver.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/StaticToolCallbackResolver.java @@ -16,16 +16,17 @@ package org.springframework.ai.tool.resolution; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.tool.ToolCallback; -import org.springframework.util.Assert; - import java.util.HashMap; import java.util.List; import java.util.Map; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.ai.model.function.FunctionCallback; +import org.springframework.ai.tool.ToolCallback; +import org.springframework.util.Assert; + /** * A {@link ToolCallbackResolver} that resolves tool callbacks from a static registry. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/ToolCallbackResolver.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/ToolCallbackResolver.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/ToolCallbackResolver.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/ToolCallbackResolver.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/TypeResolverHelper.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/TypeResolverHelper.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/TypeResolverHelper.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/TypeResolverHelper.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/resolution/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/resolution/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/util/ToolUtils.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/util/ToolUtils.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/util/ToolUtils.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/util/ToolUtils.java index 101a603f3..4df5383e9 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/tool/util/ToolUtils.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/tool/util/ToolUtils.java @@ -16,6 +16,12 @@ package org.springframework.ai.tool.util; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + import org.springframework.ai.model.function.FunctionCallback; import org.springframework.ai.tool.annotation.Tool; import org.springframework.ai.tool.execution.DefaultToolCallResultConverter; @@ -24,12 +30,6 @@ import org.springframework.ai.util.ParsingUtils; import org.springframework.util.Assert; import org.springframework.util.StringUtils; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - /** * Miscellaneous tool utility methods. Mainly for internal use within the framework. * diff --git a/spring-ai-core/src/main/java/org/springframework/ai/tool/util/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/tool/util/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/tool/util/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/tool/util/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/JsonParser.java b/spring-ai-model/src/main/java/org/springframework/ai/util/json/JsonParser.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/util/json/JsonParser.java rename to spring-ai-model/src/main/java/org/springframework/ai/util/json/JsonParser.java index b4d184de6..88452dbb0 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/util/json/JsonParser.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/util/json/JsonParser.java @@ -16,19 +16,20 @@ package org.springframework.ai.util.json; +import java.lang.reflect.Type; + import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.json.JsonMapper; + import org.springframework.ai.util.JacksonUtils; import org.springframework.lang.Nullable; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; -import java.lang.reflect.Type; - /** * Utilities to perform parsing operations between JSON and Java. */ diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/util/json/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/util/json/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/util/json/package-info.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java b/spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java rename to spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java index 408ecbfc5..9e3c1382a 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/JsonSchemaGenerator.java @@ -16,6 +16,13 @@ package org.springframework.ai.util.json.schema; +import java.lang.reflect.Method; +import java.lang.reflect.Parameter; +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; import com.fasterxml.jackson.databind.JsonNode; @@ -39,13 +46,6 @@ import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.StringUtils; -import java.lang.reflect.Method; -import java.lang.reflect.Parameter; -import java.lang.reflect.Type; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Stream; - /** * Utilities to generate JSON Schemas from Java types and method signatures. It's designed * to work well in the context of tool calling and structured outputs, aiming at ensuring diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SchemaType.java b/spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/SchemaType.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SchemaType.java rename to spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/SchemaType.java diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java b/spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java similarity index 99% rename from spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java rename to spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java index 4ec861d7f..5cc40027c 100644 --- a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java +++ b/spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/SpringAiSchemaModule.java @@ -16,6 +16,8 @@ package org.springframework.ai.util.json.schema; +import java.util.stream.Stream; + import com.fasterxml.jackson.annotation.JsonProperty; import com.github.victools.jsonschema.generator.FieldScope; import com.github.victools.jsonschema.generator.MemberScope; @@ -23,12 +25,11 @@ import com.github.victools.jsonschema.generator.Module; import com.github.victools.jsonschema.generator.SchemaGeneratorConfigBuilder; import com.github.victools.jsonschema.generator.SchemaGeneratorConfigPart; import io.swagger.v3.oas.annotations.media.Schema; + import org.springframework.ai.tool.annotation.ToolParam; import org.springframework.lang.Nullable; import org.springframework.util.StringUtils; -import java.util.stream.Stream; - /** * JSON Schema Generator Module for Spring AI. *

diff --git a/spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/package-info.java b/spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/package-info.java similarity index 100% rename from spring-ai-core/src/main/java/org/springframework/ai/util/json/schema/package-info.java rename to spring-ai-model/src/main/java/org/springframework/ai/util/json/schema/package-info.java diff --git a/spring-ai-core/src/main/kotlin/org/springframework/ai/model/function/FunctionCallbackExtensions.kt b/spring-ai-model/src/main/kotlin/org/springframework/ai/model/function/FunctionCallbackExtensions.kt similarity index 100% rename from spring-ai-core/src/main/kotlin/org/springframework/ai/model/function/FunctionCallbackExtensions.kt rename to spring-ai-model/src/main/kotlin/org/springframework/ai/model/function/FunctionCallbackExtensions.kt diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/ChatModelTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/ChatModelTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/ChatModelTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/ChatModelTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/model/ChatResponseTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/model/ChatResponseTests.java similarity index 99% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/model/ChatResponseTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/model/ChatResponseTests.java index d73054986..a9d673e23 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/chat/model/ChatResponseTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/chat/model/ChatResponseTests.java @@ -16,14 +16,15 @@ package org.springframework.ai.chat.model; -import org.junit.jupiter.api.Test; -import org.springframework.ai.chat.messages.AssistantMessage; -import org.springframework.ai.chat.metadata.ChatGenerationMetadata; - import java.util.List; import java.util.Map; import java.util.Set; +import org.junit.jupiter.api.Test; + +import org.springframework.ai.chat.messages.AssistantMessage; +import org.springframework.ai.chat.metadata.ChatGenerationMetadata; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/model/GenerationTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/model/GenerationTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/model/GenerationTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/model/GenerationTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilterTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilterTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilterTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationFilterTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelCompletionObservationHandlerTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandlerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandlerTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandlerTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelMeterObservationHandlerTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelObservationContextTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilterTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilterTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilterTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationFilterTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/observation/ChatModelPromptContentObservationHandlerTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConventionTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConventionTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConventionTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/observation/DefaultChatModelObservationConventionTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/chat/prompt/ChatOptionsBuilderTests.java b/spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/ChatOptionsBuilderTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/chat/prompt/ChatOptionsBuilderTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/ChatOptionsBuilderTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/image/observation/DefaultImageModelObservationConventionTests.java b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/DefaultImageModelObservationConventionTests.java similarity index 96% rename from spring-ai-core/src/test/java/org/springframework/ai/image/observation/DefaultImageModelObservationConventionTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/image/observation/DefaultImageModelObservationConventionTests.java index 845a03246..b1696576a 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/image/observation/DefaultImageModelObservationConventionTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/DefaultImageModelObservationConventionTests.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Test; import org.springframework.ai.image.ImageOptionsBuilder; import org.springframework.ai.image.ImagePrompt; +import org.springframework.ai.image.observation.DefaultImageModelObservationConvention; +import org.springframework.ai.image.observation.ImageModelObservationContext; import org.springframework.ai.observation.conventions.AiObservationAttributes; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java similarity index 95% rename from spring-ai-core/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java index 6d2da1494..1671f4d29 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelObservationContextTests.java @@ -20,6 +20,7 @@ import org.junit.jupiter.api.Test; import org.springframework.ai.image.ImageOptionsBuilder; import org.springframework.ai.image.ImagePrompt; +import org.springframework.ai.image.observation.ImageModelObservationContext; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilterTests.java b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilterTests.java similarity index 95% rename from spring-ai-core/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilterTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilterTests.java index 075cb6600..791a6e5d8 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilterTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/image/observation/ImageModelPromptContentObservationFilterTests.java @@ -25,6 +25,8 @@ import org.junit.jupiter.api.Test; import org.springframework.ai.image.ImageMessage; import org.springframework.ai.image.ImageOptionsBuilder; import org.springframework.ai.image.ImagePrompt; +import org.springframework.ai.image.observation.ImageModelObservationContext; +import org.springframework.ai.image.observation.ImageModelPromptContentObservationFilter; import org.springframework.ai.observation.conventions.AiObservationAttributes; import static org.assertj.core.api.Assertions.assertThat; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilderTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilderTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilderTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallbackBuilderTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilderTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilderTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilderTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/function/DefaultFunctionCallingOptionsBuilderTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/function/MethodInvokingFunctionCallbackTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/function/MethodInvokingFunctionCallbackTests.java similarity index 100% rename from spring-ai-core/src/test/java/org/springframework/ai/model/function/MethodInvokingFunctionCallbackTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/function/MethodInvokingFunctionCallbackTests.java diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java similarity index 99% rename from spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java index 7c53cb7d1..e121d95b9 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingChatOptionsTests.java @@ -16,15 +16,16 @@ package org.springframework.ai.model.tool; -import org.junit.jupiter.api.Test; -import org.springframework.ai.model.function.FunctionCallback; -import org.springframework.ai.tool.ToolCallback; - import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import org.junit.jupiter.api.Test; + +import org.springframework.ai.model.function.FunctionCallback; +import org.springframework.ai.tool.ToolCallback; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java similarity index 99% rename from spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java index 711fc99c0..76b9c9510 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolCallingManagerTests.java @@ -16,8 +16,12 @@ package org.springframework.ai.model.tool; +import java.util.List; +import java.util.Map; + import io.micrometer.observation.ObservationRegistry; import org.junit.jupiter.api.Test; + import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.messages.UserMessage; @@ -26,15 +30,12 @@ import org.springframework.ai.chat.model.Generation; import org.springframework.ai.chat.prompt.Prompt; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; -import org.springframework.ai.tool.execution.ToolExecutionExceptionProcessor; import org.springframework.ai.tool.execution.ToolExecutionException; +import org.springframework.ai.tool.execution.ToolExecutionExceptionProcessor; import org.springframework.ai.tool.metadata.ToolMetadata; import org.springframework.ai.tool.resolution.StaticToolCallbackResolver; import org.springframework.ai.tool.resolution.ToolCallbackResolver; -import java.util.List; -import java.util.Map; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java similarity index 99% rename from spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java index 9e3384500..786a75932 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/DefaultToolExecutionResultTests.java @@ -16,11 +16,12 @@ package org.springframework.ai.model.tool; -import org.junit.jupiter.api.Test; -import org.springframework.ai.chat.messages.Message; - import java.util.ArrayList; +import org.junit.jupiter.api.Test; + +import org.springframework.ai.chat.messages.Message; + import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java similarity index 95% rename from spring-ai-core/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java index 1d56f629d..048f8f8a9 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/LegacyToolCallingManagerTests.java @@ -16,7 +16,11 @@ package org.springframework.ai.model.tool; +import java.util.List; +import java.util.Map; + import org.junit.jupiter.api.Test; + import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.messages.UserMessage; @@ -27,9 +31,6 @@ import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; import org.springframework.ai.tool.execution.ToolExecutionException; -import java.util.List; -import java.util.Map; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.Mockito.mock; @@ -103,7 +104,7 @@ class LegacyToolCallingManagerTests { @Test void whenSingleToolCallInChatResponseThenExecute() { - ToolCallback toolCallback = new LegacyToolCallingManagerTests.TestToolCallback("toolA"); + ToolCallback toolCallback = new TestToolCallback("toolA"); ToolCallingManager toolCallingManager = LegacyToolCallingManager.builder() .functionCallbacks(List.of(toolCallback)) .build(); @@ -125,8 +126,8 @@ class LegacyToolCallingManagerTests { @Test void whenMultipleToolCallsInChatResponseThenExecute() { - ToolCallback toolCallbackA = new LegacyToolCallingManagerTests.TestToolCallback("toolA"); - ToolCallback toolCallbackB = new LegacyToolCallingManagerTests.TestToolCallback("toolB"); + ToolCallback toolCallbackA = new TestToolCallback("toolA"); + ToolCallback toolCallbackB = new TestToolCallback("toolB"); ToolCallingManager toolCallingManager = LegacyToolCallingManager.builder() .functionCallbacks(List.of(toolCallbackA, toolCallbackB)) .build(); @@ -150,7 +151,7 @@ class LegacyToolCallingManagerTests { @Test void whenToolCallWithExceptionThenReturnError() { - ToolCallback toolCallback = new LegacyToolCallingManagerTests.FailingToolCallback("toolC"); + ToolCallback toolCallback = new FailingToolCallback("toolC"); ToolCallingManager toolCallingManager = LegacyToolCallingManager.builder() .functionCallbacks(List.of(toolCallback)) .build(); diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolCallingChatOptionsTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/ToolCallingChatOptionsTests.java similarity index 99% rename from spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolCallingChatOptionsTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/tool/ToolCallingChatOptionsTests.java index 8077b6bf8..c8a07a986 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolCallingChatOptionsTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/ToolCallingChatOptionsTests.java @@ -15,16 +15,17 @@ */ package org.springframework.ai.model.tool; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.junit.jupiter.api.Test; + import org.springframework.ai.model.function.FunctionCallback; import org.springframework.ai.model.function.FunctionCallingOptions; import org.springframework.ai.tool.ToolCallback; import org.springframework.ai.tool.definition.ToolDefinition; -import java.util.List; -import java.util.Map; -import java.util.Set; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java similarity index 99% rename from spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java index 3baf9d662..acb3bfca0 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/model/tool/ToolExecutionResultTests.java @@ -16,13 +16,14 @@ package org.springframework.ai.model.tool; +import java.util.List; + import org.junit.jupiter.api.Test; + import org.springframework.ai.chat.messages.AssistantMessage; import org.springframework.ai.chat.messages.ToolResponseMessage; import org.springframework.ai.chat.messages.UserMessage; -import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; /** diff --git a/spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonParserTests.java b/spring-ai-model/src/test/java/org/springframework/ai/util/json/JsonParserTests.java similarity index 99% rename from spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonParserTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/util/json/JsonParserTests.java index a1879a4e9..71c7b0920 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonParserTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/util/json/JsonParserTests.java @@ -1,9 +1,11 @@ package org.springframework.ai.util.json; +import java.lang.reflect.Type; + import com.fasterxml.jackson.core.type.TypeReference; import org.junit.jupiter.api.Test; -import java.lang.reflect.Type; +import org.springframework.ai.util.json.JsonParser; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java b/spring-ai-model/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java similarity index 99% rename from spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java rename to spring-ai-model/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java index 2c5a91632..e644f262e 100644 --- a/spring-ai-core/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java +++ b/spring-ai-model/src/test/java/org/springframework/ai/util/json/JsonSchemaGeneratorTests.java @@ -16,6 +16,13 @@ package org.springframework.ai.util.json; +import java.lang.reflect.Method; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.Month; +import java.util.List; + import com.fasterxml.jackson.annotation.JsonClassDescription; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyDescription; @@ -25,16 +32,10 @@ import io.swagger.v3.oas.annotations.media.Schema; import org.junit.jupiter.api.Test; import org.springframework.ai.chat.model.ToolContext; import org.springframework.ai.tool.annotation.ToolParam; +import org.springframework.ai.util.json.JsonParser; import org.springframework.ai.util.json.schema.JsonSchemaGenerator; import org.springframework.lang.Nullable; -import java.lang.reflect.Method; -import java.time.Duration; -import java.time.Instant; -import java.time.LocalDateTime; -import java.time.Month; -import java.util.List; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/spring-ai-core/src/test/kotlin/org/springframework/ai/model/ModelOptionsUtilsTests.kt b/spring-ai-model/src/test/kotlin/org/springframework/ai/model/ModelOptionsUtilsTests.kt similarity index 100% rename from spring-ai-core/src/test/kotlin/org/springframework/ai/model/ModelOptionsUtilsTests.kt rename to spring-ai-model/src/test/kotlin/org/springframework/ai/model/ModelOptionsUtilsTests.kt diff --git a/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/FunctionCallbackExtensionsTests.kt b/spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/FunctionCallbackExtensionsTests.kt similarity index 100% rename from spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/FunctionCallbackExtensionsTests.kt rename to spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/FunctionCallbackExtensionsTests.kt diff --git a/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt b/spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt similarity index 100% rename from spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt rename to spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/SpringBeanToolCallbackResolverKotlinTests.kt diff --git a/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/StandaloneWeatherKotlinFunction.kt b/spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/StandaloneWeatherKotlinFunction.kt similarity index 100% rename from spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/StandaloneWeatherKotlinFunction.kt rename to spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/StandaloneWeatherKotlinFunction.kt diff --git a/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/TypeResolverHelperKotlinIT.kt b/spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/TypeResolverHelperKotlinIT.kt similarity index 100% rename from spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/TypeResolverHelperKotlinIT.kt rename to spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/TypeResolverHelperKotlinIT.kt diff --git a/spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/kotlinconfig/TypeResolverHelperKotlinConfiguration.kt b/spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/kotlinconfig/TypeResolverHelperKotlinConfiguration.kt similarity index 100% rename from spring-ai-core/src/test/kotlin/org/springframework/ai/tool/resolution/kotlinconfig/TypeResolverHelperKotlinConfiguration.kt rename to spring-ai-model/src/test/kotlin/org/springframework/ai/tool/resolution/kotlinconfig/TypeResolverHelperKotlinConfiguration.kt