Skip to content

Commit 6209bee

Browse files
authored
Merge pull request #1117 from jmartisk/issue-1095
Integrate Mistral AI moderation models
2 parents 173990e + 1386b01 commit 6209bee

File tree

9 files changed

+447
-4
lines changed

9 files changed

+447
-4
lines changed

docs/modules/ROOT/pages/includes/quarkus-langchain4j-mistral-ai.adoc

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,23 @@ endif::add-copy-button-to-env-var[]
4242
|boolean
4343
|`true`
4444

45+
a|icon:lock[title=Fixed at build time] [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-enabled]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-enabled[`quarkus.langchain4j.mistralai.moderation-model.enabled`]##
46+
47+
[.description]
48+
--
49+
Whether the model should be enabled
50+
51+
52+
ifdef::add-copy-button-to-env-var[]
53+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_ENABLED+++[]
54+
endif::add-copy-button-to-env-var[]
55+
ifndef::add-copy-button-to-env-var[]
56+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_ENABLED+++`
57+
endif::add-copy-button-to-env-var[]
58+
--
59+
|boolean
60+
|`true`
61+
4562
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-base-url]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-base-url[`quarkus.langchain4j.mistralai.base-url`]##
4663

4764
[.description]
@@ -286,6 +303,57 @@ endif::add-copy-button-to-env-var[]
286303
|boolean
287304
|`false`
288305

306+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-model-name]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-model-name[`quarkus.langchain4j.mistralai.moderation-model.model-name`]##
307+
308+
[.description]
309+
--
310+
Model name to use
311+
312+
313+
ifdef::add-copy-button-to-env-var[]
314+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_MODEL_NAME+++[]
315+
endif::add-copy-button-to-env-var[]
316+
ifndef::add-copy-button-to-env-var[]
317+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_MODEL_NAME+++`
318+
endif::add-copy-button-to-env-var[]
319+
--
320+
|string
321+
|`mistral-moderation-latest`
322+
323+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-log-requests]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-log-requests[`quarkus.langchain4j.mistralai.moderation-model.log-requests`]##
324+
325+
[.description]
326+
--
327+
Whether moderation model requests should be logged
328+
329+
330+
ifdef::add-copy-button-to-env-var[]
331+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_LOG_REQUESTS+++[]
332+
endif::add-copy-button-to-env-var[]
333+
ifndef::add-copy-button-to-env-var[]
334+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_LOG_REQUESTS+++`
335+
endif::add-copy-button-to-env-var[]
336+
--
337+
|boolean
338+
|`false`
339+
340+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-log-responses]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-log-responses[`quarkus.langchain4j.mistralai.moderation-model.log-responses`]##
341+
342+
[.description]
343+
--
344+
Whether moderation model responses should be logged
345+
346+
347+
ifdef::add-copy-button-to-env-var[]
348+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_LOG_RESPONSES+++[]
349+
endif::add-copy-button-to-env-var[]
350+
ifndef::add-copy-button-to-env-var[]
351+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_LOG_RESPONSES+++`
352+
endif::add-copy-button-to-env-var[]
353+
--
354+
|boolean
355+
|`false`
356+
289357
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-log-requests]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-log-requests[`quarkus.langchain4j.mistralai.log-requests`]##
290358

291359
[.description]
@@ -585,6 +653,57 @@ endif::add-copy-button-to-env-var[]
585653
|boolean
586654
|`false`
587655

656+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-model-name]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-model-name[`quarkus.langchain4j.mistralai."model-name".moderation-model.model-name`]##
657+
658+
[.description]
659+
--
660+
Model name to use
661+
662+
663+
ifdef::add-copy-button-to-env-var[]
664+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_MODEL_NAME+++[]
665+
endif::add-copy-button-to-env-var[]
666+
ifndef::add-copy-button-to-env-var[]
667+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_MODEL_NAME+++`
668+
endif::add-copy-button-to-env-var[]
669+
--
670+
|string
671+
|`mistral-moderation-latest`
672+
673+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-log-requests]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-log-requests[`quarkus.langchain4j.mistralai."model-name".moderation-model.log-requests`]##
674+
675+
[.description]
676+
--
677+
Whether moderation model requests should be logged
678+
679+
680+
ifdef::add-copy-button-to-env-var[]
681+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_LOG_REQUESTS+++[]
682+
endif::add-copy-button-to-env-var[]
683+
ifndef::add-copy-button-to-env-var[]
684+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_LOG_REQUESTS+++`
685+
endif::add-copy-button-to-env-var[]
686+
--
687+
|boolean
688+
|`false`
689+
690+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-log-responses]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-log-responses[`quarkus.langchain4j.mistralai."model-name".moderation-model.log-responses`]##
691+
692+
[.description]
693+
--
694+
Whether moderation model responses should be logged
695+
696+
697+
ifdef::add-copy-button-to-env-var[]
698+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_LOG_RESPONSES+++[]
699+
endif::add-copy-button-to-env-var[]
700+
ifndef::add-copy-button-to-env-var[]
701+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_LOG_RESPONSES+++`
702+
endif::add-copy-button-to-env-var[]
703+
--
704+
|boolean
705+
|`false`
706+
588707
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-log-requests]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-log-requests[`quarkus.langchain4j.mistralai."model-name".log-requests`]##
589708

590709
[.description]

docs/modules/ROOT/pages/includes/quarkus-langchain4j-mistral-ai_quarkus.langchain4j.adoc

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,23 @@ endif::add-copy-button-to-env-var[]
4242
|boolean
4343
|`true`
4444

45+
a|icon:lock[title=Fixed at build time] [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-enabled]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-enabled[`quarkus.langchain4j.mistralai.moderation-model.enabled`]##
46+
47+
[.description]
48+
--
49+
Whether the model should be enabled
50+
51+
52+
ifdef::add-copy-button-to-env-var[]
53+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_ENABLED+++[]
54+
endif::add-copy-button-to-env-var[]
55+
ifndef::add-copy-button-to-env-var[]
56+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_ENABLED+++`
57+
endif::add-copy-button-to-env-var[]
58+
--
59+
|boolean
60+
|`true`
61+
4562
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-base-url]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-base-url[`quarkus.langchain4j.mistralai.base-url`]##
4663

4764
[.description]
@@ -286,6 +303,57 @@ endif::add-copy-button-to-env-var[]
286303
|boolean
287304
|`false`
288305

306+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-model-name]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-model-name[`quarkus.langchain4j.mistralai.moderation-model.model-name`]##
307+
308+
[.description]
309+
--
310+
Model name to use
311+
312+
313+
ifdef::add-copy-button-to-env-var[]
314+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_MODEL_NAME+++[]
315+
endif::add-copy-button-to-env-var[]
316+
ifndef::add-copy-button-to-env-var[]
317+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_MODEL_NAME+++`
318+
endif::add-copy-button-to-env-var[]
319+
--
320+
|string
321+
|`mistral-moderation-latest`
322+
323+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-log-requests]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-log-requests[`quarkus.langchain4j.mistralai.moderation-model.log-requests`]##
324+
325+
[.description]
326+
--
327+
Whether moderation model requests should be logged
328+
329+
330+
ifdef::add-copy-button-to-env-var[]
331+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_LOG_REQUESTS+++[]
332+
endif::add-copy-button-to-env-var[]
333+
ifndef::add-copy-button-to-env-var[]
334+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_LOG_REQUESTS+++`
335+
endif::add-copy-button-to-env-var[]
336+
--
337+
|boolean
338+
|`false`
339+
340+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-log-responses]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-moderation-model-log-responses[`quarkus.langchain4j.mistralai.moderation-model.log-responses`]##
341+
342+
[.description]
343+
--
344+
Whether moderation model responses should be logged
345+
346+
347+
ifdef::add-copy-button-to-env-var[]
348+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_LOG_RESPONSES+++[]
349+
endif::add-copy-button-to-env-var[]
350+
ifndef::add-copy-button-to-env-var[]
351+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI_MODERATION_MODEL_LOG_RESPONSES+++`
352+
endif::add-copy-button-to-env-var[]
353+
--
354+
|boolean
355+
|`false`
356+
289357
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-log-requests]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-log-requests[`quarkus.langchain4j.mistralai.log-requests`]##
290358

291359
[.description]
@@ -585,6 +653,57 @@ endif::add-copy-button-to-env-var[]
585653
|boolean
586654
|`false`
587655

656+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-model-name]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-model-name[`quarkus.langchain4j.mistralai."model-name".moderation-model.model-name`]##
657+
658+
[.description]
659+
--
660+
Model name to use
661+
662+
663+
ifdef::add-copy-button-to-env-var[]
664+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_MODEL_NAME+++[]
665+
endif::add-copy-button-to-env-var[]
666+
ifndef::add-copy-button-to-env-var[]
667+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_MODEL_NAME+++`
668+
endif::add-copy-button-to-env-var[]
669+
--
670+
|string
671+
|`mistral-moderation-latest`
672+
673+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-log-requests]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-log-requests[`quarkus.langchain4j.mistralai."model-name".moderation-model.log-requests`]##
674+
675+
[.description]
676+
--
677+
Whether moderation model requests should be logged
678+
679+
680+
ifdef::add-copy-button-to-env-var[]
681+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_LOG_REQUESTS+++[]
682+
endif::add-copy-button-to-env-var[]
683+
ifndef::add-copy-button-to-env-var[]
684+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_LOG_REQUESTS+++`
685+
endif::add-copy-button-to-env-var[]
686+
--
687+
|boolean
688+
|`false`
689+
690+
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-log-responses]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-moderation-model-log-responses[`quarkus.langchain4j.mistralai."model-name".moderation-model.log-responses`]##
691+
692+
[.description]
693+
--
694+
Whether moderation model responses should be logged
695+
696+
697+
ifdef::add-copy-button-to-env-var[]
698+
Environment variable: env_var_with_copy_button:+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_LOG_RESPONSES+++[]
699+
endif::add-copy-button-to-env-var[]
700+
ifndef::add-copy-button-to-env-var[]
701+
Environment variable: `+++QUARKUS_LANGCHAIN4J_MISTRALAI__MODEL_NAME__MODERATION_MODEL_LOG_RESPONSES+++`
702+
endif::add-copy-button-to-env-var[]
703+
--
704+
|boolean
705+
|`false`
706+
588707
a| [[quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-log-requests]] [.property-path]##link:#quarkus-langchain4j-mistral-ai_quarkus-langchain4j-mistralai-model-name-log-requests[`quarkus.langchain4j.mistralai."model-name".log-requests`]##
589708

590709
[.description]

model-providers/mistral/deployment/src/main/java/io/quarkiverse/langchain4j/mistralai/deployment/LangChain4jMistralAiBuildConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,9 @@ public interface LangChain4jMistralAiBuildConfig {
1919
*/
2020
EmbeddingModelBuildConfig embeddingModel();
2121

22+
/**
23+
* Moderation model related settings
24+
*/
25+
ModerationModelBuildConfig moderationModel();
26+
2227
}

model-providers/mistral/deployment/src/main/java/io/quarkiverse/langchain4j/mistralai/deployment/MistralAiProcessor.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import static io.quarkiverse.langchain4j.deployment.LangChain4jDotNames.CHAT_MODEL;
44
import static io.quarkiverse.langchain4j.deployment.LangChain4jDotNames.EMBEDDING_MODEL;
5+
import static io.quarkiverse.langchain4j.deployment.LangChain4jDotNames.MODERATION_MODEL;
56
import static io.quarkiverse.langchain4j.deployment.LangChain4jDotNames.STREAMING_CHAT_MODEL;
67

78
import java.util.List;
@@ -15,8 +16,10 @@
1516
import io.quarkiverse.langchain4j.ModelName;
1617
import io.quarkiverse.langchain4j.deployment.items.ChatModelProviderCandidateBuildItem;
1718
import io.quarkiverse.langchain4j.deployment.items.EmbeddingModelProviderCandidateBuildItem;
19+
import io.quarkiverse.langchain4j.deployment.items.ModerationModelProviderCandidateBuildItem;
1820
import io.quarkiverse.langchain4j.deployment.items.SelectedChatModelProviderBuildItem;
1921
import io.quarkiverse.langchain4j.deployment.items.SelectedEmbeddingModelCandidateBuildItem;
22+
import io.quarkiverse.langchain4j.deployment.items.SelectedModerationModelProviderBuildItem;
2023
import io.quarkiverse.langchain4j.mistralai.runtime.MistralAiRecorder;
2124
import io.quarkiverse.langchain4j.mistralai.runtime.config.LangChain4jMistralAiConfig;
2225
import io.quarkiverse.langchain4j.runtime.NamedConfigUtil;
@@ -52,13 +55,17 @@ void nativeSupport(BuildProducer<ReflectiveClassBuildItem> reflectiveClassProduc
5255
@BuildStep
5356
public void providerCandidates(BuildProducer<ChatModelProviderCandidateBuildItem> chatProducer,
5457
BuildProducer<EmbeddingModelProviderCandidateBuildItem> embeddingProducer,
58+
BuildProducer<ModerationModelProviderCandidateBuildItem> moderationProducer,
5559
LangChain4jMistralAiBuildConfig config) {
5660
if (config.chatModel().enabled().isEmpty() || config.chatModel().enabled().get()) {
5761
chatProducer.produce(new ChatModelProviderCandidateBuildItem(PROVIDER));
5862
}
5963
if (config.embeddingModel().enabled().isEmpty() || config.embeddingModel().enabled().get()) {
6064
embeddingProducer.produce(new EmbeddingModelProviderCandidateBuildItem(PROVIDER));
6165
}
66+
if (config.moderationModel().enabled().isEmpty() || config.moderationModel().enabled().get()) {
67+
moderationProducer.produce(new ModerationModelProviderCandidateBuildItem(PROVIDER));
68+
}
6269
}
6370

6471
@SuppressWarnings("OptionalUsedAsFieldOrParameterType")
@@ -67,6 +74,7 @@ public void providerCandidates(BuildProducer<ChatModelProviderCandidateBuildItem
6774
void generateBeans(MistralAiRecorder recorder,
6875
List<SelectedChatModelProviderBuildItem> selectedChatItem,
6976
List<SelectedEmbeddingModelCandidateBuildItem> selectedEmbedding,
77+
List<SelectedModerationModelProviderBuildItem> selectedModeration,
7078
LangChain4jMistralAiConfig config,
7179
BuildProducer<SyntheticBeanBuildItem> beanProducer) {
7280

@@ -107,6 +115,20 @@ void generateBeans(MistralAiRecorder recorder,
107115
beanProducer.produce(builder.done());
108116
}
109117
}
118+
119+
for (var selected : selectedModeration) {
120+
if (PROVIDER.equals(selected.getProvider())) {
121+
String configName = selected.getConfigName();
122+
var builder = SyntheticBeanBuildItem
123+
.configure(MODERATION_MODEL)
124+
.setRuntimeInit()
125+
.defaultBean()
126+
.scope(ApplicationScoped.class)
127+
.supplier(recorder.moderationModel(config, configName));
128+
addQualifierIfNecessary(builder, configName);
129+
beanProducer.produce(builder.done());
130+
}
131+
}
110132
}
111133

112134
private void addQualifierIfNecessary(SyntheticBeanBuildItem.ExtendedBeanConfigurator builder, String configName) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package io.quarkiverse.langchain4j.mistralai.deployment;
2+
3+
import java.util.Optional;
4+
5+
import io.quarkus.runtime.annotations.ConfigDocDefault;
6+
7+
public interface ModerationModelBuildConfig {
8+
9+
/**
10+
* Whether the model should be enabled
11+
*/
12+
@ConfigDocDefault("true")
13+
Optional<Boolean> enabled();
14+
15+
}

0 commit comments

Comments
 (0)