diff --git a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/NativeHints.java b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/NativeHints.java index daa3d0b0e..b778f0e69 100644 --- a/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/NativeHints.java +++ b/spring-ai-spring-boot-autoconfigure/src/main/java/org/springframework/ai/autoconfigure/NativeHints.java @@ -1,25 +1,54 @@ package org.springframework.ai.autoconfigure; +import org.springframework.ai.openai.api.OpenAiApi; import org.springframework.aot.hint.MemberCategory; import org.springframework.aot.hint.RuntimeHints; import org.springframework.aot.hint.TypeReference; import java.io.IOException; +import java.util.Objects; import java.util.Set; +import java.util.stream.Collectors; +import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.aot.hint.RuntimeHintsRegistrar; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import com.fasterxml.jackson.annotation.JsonInclude; + public class NativeHints implements RuntimeHintsRegistrar { @Override public void registerHints(RuntimeHints hints, ClassLoader classLoader) { new KnuddelsHints().registerHints(hints, classLoader); new PdfReaderHints().registerHints(hints, classLoader); + new OpenAiHints().registerHints(hints, classLoader); hints.resources().registerResource(new ClassPathResource("embedding/embedding-model-dimensions.properties")); } + static class OpenAiHints implements RuntimeHintsRegistrar { + + private static Set findJsonAnnotatedClasses(Class packageClass) { + var packageName = packageClass.getPackageName(); + var classPathScanningCandidateComponentProvider = new ClassPathScanningCandidateComponentProvider(false); + classPathScanningCandidateComponentProvider.addIncludeFilter(new AnnotationTypeFilter(JsonInclude.class)); + return classPathScanningCandidateComponentProvider.findCandidateComponents(packageName) + .stream() + .map(bd -> TypeReference.of(Objects.requireNonNull(bd.getBeanClassName()))) + .collect(Collectors.toUnmodifiableSet()); + } + + @Override + public void registerHints(RuntimeHints hints, ClassLoader classLoader) { + var mcs = MemberCategory.values(); + for (var tr : findJsonAnnotatedClasses(OpenAiApi.class)) + hints.reflection().registerType(tr, mcs); + } + + } + static class KnuddelsHints implements RuntimeHintsRegistrar { @Override