55import static io .quarkiverse .langchain4j .deployment .LangChain4jDotNames .IMAGE_MODEL ;
66import static io .quarkiverse .langchain4j .deployment .LangChain4jDotNames .MODEL_NAME ;
77import static io .quarkiverse .langchain4j .deployment .LangChain4jDotNames .MODERATION_MODEL ;
8+ import static io .quarkiverse .langchain4j .deployment .LangChain4jDotNames .SCORING_MODEL ;
89import static io .quarkiverse .langchain4j .deployment .LangChain4jDotNames .STREAMING_CHAT_MODEL ;
910import static io .quarkiverse .langchain4j .deployment .LangChain4jDotNames .TOKEN_COUNT_ESTIMATOR ;
1011
2425import dev .langchain4j .model .embedding .EmbeddingModel ;
2526import dev .langchain4j .model .image .ImageModel ;
2627import dev .langchain4j .model .moderation .ModerationModel ;
28+ import dev .langchain4j .model .scoring .ScoringModel ;
2729import io .quarkiverse .langchain4j .auth .ModelAuthProvider ;
2830import io .quarkiverse .langchain4j .deployment .config .LangChain4jBuildConfig ;
2931import io .quarkiverse .langchain4j .deployment .items .AutoCreateEmbeddingModelBuildItem ;
3335import io .quarkiverse .langchain4j .deployment .items .InProcessEmbeddingBuildItem ;
3436import io .quarkiverse .langchain4j .deployment .items .ModerationModelProviderCandidateBuildItem ;
3537import io .quarkiverse .langchain4j .deployment .items .ProviderHolder ;
38+ import io .quarkiverse .langchain4j .deployment .items .ScoringModelProviderCandidateBuildItem ;
3639import io .quarkiverse .langchain4j .deployment .items .SelectedChatModelProviderBuildItem ;
3740import io .quarkiverse .langchain4j .deployment .items .SelectedEmbeddingModelCandidateBuildItem ;
3841import io .quarkiverse .langchain4j .deployment .items .SelectedImageModelProviderBuildItem ;
3942import io .quarkiverse .langchain4j .deployment .items .SelectedModerationModelProviderBuildItem ;
43+ import io .quarkiverse .langchain4j .deployment .items .SelectedScoringModelProviderBuildItem ;
4044import io .quarkiverse .langchain4j .runtime .LangChain4jRecorder ;
4145import io .quarkiverse .langchain4j .runtime .NamedConfigUtil ;
4246import io .quarkus .arc .deployment .BeanDiscoveryFinishedBuildItem ;
@@ -70,6 +74,7 @@ void indexDependencies(BuildProducer<IndexDependencyBuildItem> producer) {
7074 @ BuildStep
7175 public void handleProviders (BeanDiscoveryFinishedBuildItem beanDiscoveryFinished ,
7276 List <ChatModelProviderCandidateBuildItem > chatCandidateItems ,
77+ List <ScoringModelProviderCandidateBuildItem > scoringCandidateItems ,
7378 List <EmbeddingModelProviderCandidateBuildItem > embeddingCandidateItems ,
7479 List <ModerationModelProviderCandidateBuildItem > moderationCandidateItems ,
7580 List <ImageModelProviderCandidateBuildItem > imageCandidateItems ,
@@ -79,13 +84,15 @@ public void handleProviders(BeanDiscoveryFinishedBuildItem beanDiscoveryFinished
7984 LangChain4jBuildConfig buildConfig ,
8085 Optional <AutoCreateEmbeddingModelBuildItem > autoCreateEmbeddingModelBuildItem ,
8186 BuildProducer <SelectedChatModelProviderBuildItem > selectedChatProducer ,
87+ BuildProducer <SelectedScoringModelProviderBuildItem > selectedScoringProducer ,
8288 BuildProducer <SelectedEmbeddingModelCandidateBuildItem > selectedEmbeddingProducer ,
8389 BuildProducer <SelectedModerationModelProviderBuildItem > selectedModerationProducer ,
8490 BuildProducer <SelectedImageModelProviderBuildItem > selectedImageProducer ,
8591 List <InProcessEmbeddingBuildItem > inProcessEmbeddingBuildItems ) {
8692
8793 Set <String > requestedChatModels = new HashSet <>();
8894 Set <String > requestedStreamingChatModels = new HashSet <>();
95+ Set <String > requestScoringModels = new HashSet <>();
8996 Set <String > requestEmbeddingModels = new HashSet <>();
9097 Set <String > requestedModerationModels = new HashSet <>();
9198 Set <String > requestedImageModels = new HashSet <>();
@@ -98,6 +105,8 @@ public void handleProviders(BeanDiscoveryFinishedBuildItem beanDiscoveryFinished
98105 requestedChatModels .add (modelName );
99106 } else if (STREAMING_CHAT_MODEL .equals (requiredName )) {
100107 requestedStreamingChatModels .add (modelName );
108+ } else if (SCORING_MODEL .equals (requiredName )) {
109+ requestScoringModels .add (modelName );
101110 } else if (EMBEDDING_MODEL .equals (requiredName )) {
102111 requestEmbeddingModels .add (modelName );
103112 } else if (MODERATION_MODEL .equals (requiredName )) {
@@ -108,7 +117,9 @@ public void handleProviders(BeanDiscoveryFinishedBuildItem beanDiscoveryFinished
108117 tokenCountEstimators .add (modelName );
109118 }
110119 }
111- for (var bi : requestChatModelBeanItems ) {
120+ for (
121+
122+ var bi : requestChatModelBeanItems ) {
112123 requestedChatModels .add (bi .getConfigName ());
113124 }
114125 for (var bi : requestModerationModelBeanBuildItems ) {
@@ -150,6 +161,32 @@ public void handleProviders(BeanDiscoveryFinishedBuildItem beanDiscoveryFinished
150161
151162 }
152163
164+ for (String modelName : requestScoringModels ) {
165+ Optional <String > userSelectedProvider ;
166+ String configNamespace ;
167+ if (NamedConfigUtil .isDefault (modelName )) {
168+ userSelectedProvider = buildConfig .defaultConfig ().scoringModel ().provider ();
169+ configNamespace = "scoring-model" ;
170+ } else {
171+ if (buildConfig .namedConfig ().containsKey (modelName )) {
172+ userSelectedProvider = buildConfig .namedConfig ().get (modelName ).scoringModel ().provider ();
173+ } else {
174+ userSelectedProvider = Optional .empty ();
175+ }
176+ configNamespace = modelName + ".scoring-model" ;
177+ }
178+
179+ String provider = selectProvider (
180+ scoringCandidateItems ,
181+ beanDiscoveryFinished .beanStream ().withBeanType (ScoringModel .class ),
182+ userSelectedProvider ,
183+ "ScoringModel" ,
184+ configNamespace );
185+ if (provider != null ) {
186+ selectedScoringProducer .produce (new SelectedScoringModelProviderBuildItem (provider , modelName ));
187+ }
188+ }
189+
153190 for (String modelName : requestEmbeddingModels ) {
154191 Optional <String > userSelectedProvider ;
155192 String configNamespace ;
0 commit comments