├── .github ├── CODEOWNERS ├── dependabot.yml ├── project.yml ├── quarkus-ecosystem-test ├── quarkus-github-bot.yml ├── updateReadme.java └── workflows │ ├── build-nightly.yml │ ├── build-pull-request.yml │ ├── build-push.yml │ ├── hooks │ └── pre-prepare-release.sh │ ├── pre-release.yml │ ├── quarkus-snapshot.yaml │ ├── release-perform.yml │ └── release-prepare.yml ├── .gitignore ├── .idea └── icon.png ├── .mvn └── wrapper │ └── maven-wrapper.properties ├── .sdkmanrc ├── LICENSE ├── README.md ├── codestarts ├── chatbot │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── chatbot │ │ │ └── deployment │ │ │ └── Langchain4jChatbotProcessor.java │ ├── integration-tests │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── chatbot │ │ │ │ │ └── it │ │ │ │ │ └── Langchain4jChatbotResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── chatbot │ │ │ └── it │ │ │ └── Langchain4jChatbotCodestartTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── codestarts │ │ └── quarkus │ │ │ └── langchain4j-chatbot-codestart │ │ │ ├── base │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── resources │ │ │ │ └── META-INF │ │ │ │ └── resources │ │ │ │ ├── components │ │ │ │ ├── chatbot-chat.js │ │ │ │ └── chatbot-title.js │ │ │ │ ├── fonts │ │ │ │ └── red-hat-font.min.css │ │ │ │ ├── icons │ │ │ │ ├── font-awesome-solid.js │ │ │ │ └── font-awesome.js │ │ │ │ └── index.html │ │ │ ├── codestart.yml │ │ │ └── java │ │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ ├── ChatBotService.java │ │ │ ├── ChatBotWebSocket.java │ │ │ └── ImportmapResource.java │ │ └── resources │ │ └── META-INF │ │ └── quarkus-extension.yaml └── pom.xml ├── core ├── deployment │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── deployment │ │ │ │ ├── AiServicesProcessor.java │ │ │ │ ├── AiServicesUseAnalyzer.java │ │ │ │ ├── AsmUtil.java │ │ │ │ ├── BeansProcessor.java │ │ │ │ ├── ChatMemoryBuildConfig.java │ │ │ │ ├── ChatMemoryProcessor.java │ │ │ │ ├── DeclarativeAiServiceBuildItem.java │ │ │ │ ├── DotNames.java │ │ │ │ ├── EmbeddingStoreBuildItem.java │ │ │ │ ├── ExceptionUtil.java │ │ │ │ ├── GuardrailObservabilityProcessor.java │ │ │ │ ├── GuardrailObservabilityProcessorSupport.java │ │ │ │ ├── HashUtil.java │ │ │ │ ├── InProcessEmbeddingProcessor.java │ │ │ │ ├── JandexUtil.java │ │ │ │ ├── JarResourceUtil.java │ │ │ │ ├── LangChain4jDotNames.java │ │ │ │ ├── ListenersProcessor.java │ │ │ │ ├── MethodParameterAsTemplateVariableAllowance.java │ │ │ │ ├── MethodUtil.java │ │ │ │ ├── ObjectSubstitutionUtil.java │ │ │ │ ├── OnnxRuntimeProcessor.java │ │ │ │ ├── OpenNlpProcessor.java │ │ │ │ ├── PromptProcessor.java │ │ │ │ ├── RequestChatModelBeanBuildItem.java │ │ │ │ ├── RequestImageModelBeanBuildItem.java │ │ │ │ ├── RequestModerationModelBeanBuildItem.java │ │ │ │ ├── RequireOnnxRuntimeBuildItem.java │ │ │ │ ├── TemplateUtil.java │ │ │ │ ├── ToolProcessor.java │ │ │ │ ├── ToolProviderMetaBuildItem.java │ │ │ │ ├── ToolsMetadataBeforeRemovalBuildItem.java │ │ │ │ ├── ToolsMetadataBuildItem.java │ │ │ │ ├── TypeArgMapper.java │ │ │ │ ├── config │ │ │ │ ├── ChatModelConfig.java │ │ │ │ ├── EmbeddingModelConfig.java │ │ │ │ ├── ImageModelConfig.java │ │ │ │ ├── LangChain4jBuildConfig.java │ │ │ │ ├── ModerationModelConfig.java │ │ │ │ └── ScoringModelConfig.java │ │ │ │ ├── devservice │ │ │ │ ├── DevServicesOllamaProcessor.java │ │ │ │ ├── JdkOllamaClient.java │ │ │ │ ├── Langchain4jDevServicesEnabled.java │ │ │ │ └── OllamaClient.java │ │ │ │ ├── devui │ │ │ │ ├── AdditionalDevUiCardBuildItem.java │ │ │ │ ├── AiServiceInfo.java │ │ │ │ ├── LangChain4jDevUIProcessor.java │ │ │ │ ├── OpenWebUIDevUIProcessor.java │ │ │ │ ├── ToolMethodInfo.java │ │ │ │ └── ToolProviderInfo.java │ │ │ │ └── items │ │ │ │ ├── AiServicesMethodBuildItem.java │ │ │ │ ├── AutoCreateEmbeddingModelBuildItem.java │ │ │ │ ├── ChatModelProviderCandidateBuildItem.java │ │ │ │ ├── DevServicesChatModelRequiredBuildItem.java │ │ │ │ ├── DevServicesEmbeddingModelRequiredBuildItem.java │ │ │ │ ├── DevServicesModelRequired.java │ │ │ │ ├── DevServicesOllamaConfigBuildItem.java │ │ │ │ ├── EmbeddingModelProviderCandidateBuildItem.java │ │ │ │ ├── ImageModelProviderCandidateBuildItem.java │ │ │ │ ├── ImplicitlyUserConfiguredChatProviderBuildItem.java │ │ │ │ ├── InMemoryEmbeddingStoreBuildItem.java │ │ │ │ ├── InProcessEmbeddingBuildItem.java │ │ │ │ ├── MethodParameterAllowedAnnotationsBuildItem.java │ │ │ │ ├── MethodParameterIgnoredAnnotationsBuildItem.java │ │ │ │ ├── ModerationModelProviderCandidateBuildItem.java │ │ │ │ ├── ProviderHolder.java │ │ │ │ ├── ScoringModelProviderCandidateBuildItem.java │ │ │ │ ├── SelectedChatModelProviderBuildItem.java │ │ │ │ ├── SelectedEmbeddingModelCandidateBuildItem.java │ │ │ │ ├── SelectedImageModelProviderBuildItem.java │ │ │ │ ├── SelectedModerationModelProviderBuildItem.java │ │ │ │ ├── SelectedScoringModelProviderBuildItem.java │ │ │ │ ├── ToolMethodBuildItem.java │ │ │ │ └── ToolQualifierProvider.java │ │ └── resources │ │ │ └── dev-ui │ │ │ ├── qwc-aiservices.js │ │ │ ├── qwc-chat.js │ │ │ ├── qwc-embedding-store.js │ │ │ ├── qwc-open-webui.js │ │ │ └── qwc-tools.js │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ ├── deployment │ │ ├── GuardrailObservabilityProcessorSupportTest.java │ │ ├── MethodUtilTest.java │ │ └── devservice │ │ │ └── OllamaClientTest.java │ │ └── test │ │ ├── AiServiceMethodParametersAnnotationsTest.java │ │ ├── BlockingChatLanguageModelSupplierTest.java │ │ ├── ChatMessageSerializerTest.java │ │ ├── InMemoryEmbeddingStoreTest.java │ │ ├── JsonTest.java │ │ ├── LangChain4jDevModeTest.java │ │ ├── ListenersProcessorNoOpentelemetryTest.java │ │ ├── Lists.java │ │ ├── NamedAiServicesAreResolvableByNameTest.java │ │ ├── NoChatLanguageProviderButCustomBeanTest.java │ │ ├── NoChatLanguageProviderTest.java │ │ ├── ProgrammaticServiceConfigurationTest.java │ │ ├── PromptTemplateTestInfo.java │ │ ├── StreamingAndBlockingChatLanguageModelSupplierTest.java │ │ ├── StreamingChatLanguageModelSupplierTest.java │ │ ├── StructuredPromptProcessorTest.java │ │ ├── SystemMessageNonExistingResourceTest.java │ │ ├── ToolExecutorTest.java │ │ ├── auth │ │ ├── AllModelAuthProvidersTest.java │ │ ├── GeminiModelAuthProvider.java │ │ ├── GlobalModelAuthProvider.java │ │ ├── GlobalModelAuthProviderTest.java │ │ ├── NamedModelAuthProvidersTest.java │ │ └── OpenaiModelAuthProvider.java │ │ ├── guardrails │ │ ├── GuardrailWithAugmentationTest.java │ │ ├── InputAndOutputGuardrailsTest.java │ │ ├── InputGuardrailChainTest.java │ │ ├── InputGuardrailNotFoundTest.java │ │ ├── InputGuardrailOnClassAndMethodTest.java │ │ ├── InputGuardrailOnClassTest.java │ │ ├── InputGuardrailPromptTemplateTest.java │ │ ├── InputGuardrailRewritingTest.java │ │ ├── InputGuardrailTest.java │ │ ├── InputGuardrailValidationTest.java │ │ ├── InvalidOutputGuardrailAccumulatorTest.java │ │ ├── JsonGuardrailsUtilsTest.java │ │ ├── OutputGuardrailAccumulatorNotFoundTest.java │ │ ├── OutputGuardrailAccumulatorTest.java │ │ ├── OutputGuardrailAccumulatorWithoutGuardrailTest.java │ │ ├── OutputGuardrailChainOnStreamedResponseTest.java │ │ ├── OutputGuardrailChainTest.java │ │ ├── OutputGuardrailNotFoundTest.java │ │ ├── OutputGuardrailOnClassAndMethodTest.java │ │ ├── OutputGuardrailOnClassTest.java │ │ ├── OutputGuardrailOnStreamedResponseTest.java │ │ ├── OutputGuardrailOnStreamedResponseValidationTest.java │ │ ├── OutputGuardrailPromptTemplateTest.java │ │ ├── OutputGuardrailRepromptingRetryDisabledTest.java │ │ ├── OutputGuardrailRepromptingTest.java │ │ ├── OutputGuardrailTest.java │ │ ├── OutputGuardrailValidationTest.java │ │ └── ValidationException.java │ │ ├── response │ │ ├── CDIScopeResponseAugmenterTest.java │ │ ├── FailingResponseAugmenterTest.java │ │ ├── ImperativeResponseAugmenterTest.java │ │ ├── ImperativeResponseAugmenterWithOutputGuardrailTest.java │ │ ├── MissingResponseAugmenterTest.java │ │ ├── PassThroughResponseAugmenterTest.java │ │ ├── ResponseAugmenterOnClassTest.java │ │ ├── ResponseAugmenterTestUtils.java │ │ ├── ResponseAugmenterUsingPojoTest.java │ │ ├── ResponseAugmenterWithAugmentationResultTest.java │ │ ├── StreamingResponseAugmenterTest.java │ │ ├── StreamingResponseAugmenterWithOutputGuardrailTest.java │ │ └── StreamingResponseAugmenterWithWrongTypeTest.java │ │ ├── streaming │ │ ├── BlockingMemoryStoreOnStreamedResponseTest.java │ │ └── StreamTestUtils.java │ │ ├── toolresolution │ │ ├── AutomaticToolProviderTest.java │ │ ├── ExplicitToolBoxAndProviderSupplierTest.java │ │ ├── ExplicitToolProviderSupplierTest.java │ │ ├── ExplicitToolsAndNoBeanToolProviderTest.java │ │ ├── ExplicitToolsAndProviderSupplierTest.java │ │ ├── ExplicitToolsWhenBeanToolProviderExistsTest.java │ │ ├── MyCustomToolProvider.java │ │ ├── MyCustomToolProviderSupplier.java │ │ ├── NoExplicitToolsAndNoToolProviderTest.java │ │ ├── TestAiModel.java │ │ ├── TestAiSupplier.java │ │ └── ToolsClass.java │ │ └── tools │ │ ├── ToolBoxWithNoMemoryTest.java │ │ ├── ToolExecutionModelTest.java │ │ ├── ToolExecutionModelWithStreamingAndRequestScopePropagationTest.java │ │ ├── ToolExecutionModelWithStreamingTest.java │ │ ├── ToolExecutionModelWithStreamingUnsupportedTest.java │ │ └── ToolWithNoMemoryTest.java ├── opentelemetry-tests │ ├── pom.xml │ └── src │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── opentelemetry │ │ └── test │ │ ├── ListenersProcessorAbstractSpanChatModelListenerTest.java │ │ ├── ListenersProcessorOnlySpanChatModelListenerTest.java │ │ ├── ListenersProcessorSingleChatModelSpanContributorTest.java │ │ └── ListenersProcessorTwoChatModelSpanContributorsTest.java ├── pom.xml ├── runtime-spi │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── spi │ │ └── DefaultMemoryIdProvider.java └── runtime │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ ├── ChatMemoryRemover.java │ │ ├── CreatedAware.java │ │ ├── ImageUrl.java │ │ ├── ModelName.java │ │ ├── PdfUrl.java │ │ ├── QuarkusAiServicesFactory.java │ │ ├── QuarkusChatMessageJsonCodecFactory.java │ │ ├── QuarkusInMemoryEmbeddingJsonCodecFactory.java │ │ ├── QuarkusJsonCodecFactory.java │ │ ├── QuarkusPromptTemplateFactory.java │ │ ├── QuarkusStructuredPromptFactory.java │ │ ├── RegisterAiService.java │ │ ├── SeedMemory.java │ │ ├── ToolBox.java │ │ ├── audit │ │ ├── AuditSourceInfo.java │ │ ├── GuardrailExecutedEvent.java │ │ ├── InitialMessagesCreatedEvent.java │ │ ├── InputGuardrailExecutedEvent.java │ │ ├── LLMInteractionCompleteEvent.java │ │ ├── LLMInteractionEvent.java │ │ ├── LLMInteractionFailureEvent.java │ │ ├── OutputGuardrailExecutedEvent.java │ │ ├── ResponseFromLLMReceivedEvent.java │ │ ├── ToolExecutedEvent.java │ │ └── internal │ │ │ ├── DefaultInitialMessagesCreatedEvent.java │ │ │ ├── DefaultInputGuardrailExecutedEvent.java │ │ │ ├── DefaultLLMInteractionCompleteEvent.java │ │ │ ├── DefaultLLMInteractionFailureEvent.java │ │ │ ├── DefaultOutputGuardrailExecutedEvent.java │ │ │ ├── DefaultResponseFromLLMReceivedEvent.java │ │ │ └── DefaultToolExecutedEvent.java │ │ ├── auth │ │ └── ModelAuthProvider.java │ │ ├── cost │ │ ├── Cost.java │ │ ├── CostEstimator.java │ │ └── CostEstimatorService.java │ │ ├── guardrails │ │ ├── AbstractJsonExtractorOutputGuardrail.java │ │ ├── Guardrail.java │ │ ├── GuardrailParams.java │ │ ├── GuardrailResult.java │ │ ├── InputGuardrail.java │ │ ├── InputGuardrailParams.java │ │ ├── InputGuardrailResult.java │ │ ├── InputGuardrails.java │ │ ├── JsonGuardrailsUtils.java │ │ ├── OutputGuardrail.java │ │ ├── OutputGuardrailAccumulator.java │ │ ├── OutputGuardrailParams.java │ │ ├── OutputGuardrailResult.java │ │ ├── OutputGuardrails.java │ │ └── OutputTokenAccumulator.java │ │ ├── response │ │ ├── AiResponseAugmenter.java │ │ ├── ResponseAugmenter.java │ │ └── ResponseAugmenterParams.java │ │ └── runtime │ │ ├── AiServicesRecorder.java │ │ ├── ChatMemoryRecorder.java │ │ ├── ContextLocals.java │ │ ├── InProcessEmbeddingRecorder.java │ │ ├── LangChain4jRecorder.java │ │ ├── LangChain4jUtil.java │ │ ├── NamedConfigUtil.java │ │ ├── OptionalUtil.java │ │ ├── QuarkusServiceOutputParser.java │ │ ├── RequestScopeStateDefaultMemoryIdProvider.java │ │ ├── ResponseSchemaUtil.java │ │ ├── StructuredPromptsRecorder.java │ │ ├── ToolsRecorder.java │ │ ├── VertxUtil.java │ │ ├── aiservice │ │ ├── AiServiceClassCreateInfo.java │ │ ├── AiServiceConstants.java │ │ ├── AiServiceMethodCreateInfo.java │ │ ├── AiServiceMethodImplementationSupport.java │ │ ├── AuditSourceInfoImpl.java │ │ ├── ChatMemoryConfig.java │ │ ├── ChatMemoryRemovable.java │ │ ├── ChatMemorySeeder.java │ │ ├── CommittableChatMemory.java │ │ ├── DeclarativeAiServiceBeanDestroyer.java │ │ ├── DeclarativeAiServiceCreateInfo.java │ │ ├── DefaultCommittableChatMemory.java │ │ ├── EmptyUserMessage.java │ │ ├── GuardrailException.java │ │ ├── GuardrailsSupport.java │ │ ├── InMemoryChatMemoryStoreProducer.java │ │ ├── MethodImplementationSupportProducer.java │ │ ├── MetricsCountedWrapper.java │ │ ├── MetricsTimedWrapper.java │ │ ├── NoopChatMemory.java │ │ ├── QuarkusAiServiceContext.java │ │ ├── QuarkusAiServiceContextQualifier.java │ │ ├── QuarkusAiServiceStreamingResponseHandler.java │ │ ├── QuarkusAiServiceTokenStream.java │ │ ├── QuarkusToolProviderRequest.java │ │ ├── ResponseAugmenterSupport.java │ │ └── SpanWrapper.java │ │ ├── config │ │ ├── GuardrailsConfig.java │ │ ├── LangChain4jConfig.java │ │ └── TracingConfig.java │ │ ├── devui │ │ ├── ChatJsonRPCService.java │ │ ├── EmbeddingStoreJsonRPCService.java │ │ ├── OpenWebUIJsonRPCService.java │ │ └── json │ │ │ ├── ChatMessagePojo.java │ │ │ ├── ChatResultPojo.java │ │ │ ├── MessageType.java │ │ │ ├── ToolExecutionRequestPojo.java │ │ │ └── ToolExecutionResultPojo.java │ │ ├── graalvm │ │ └── Substitutions.java │ │ ├── jackson │ │ ├── AiMessageDeserializer.java │ │ ├── AiMessageMixin.java │ │ ├── ChatMessageMixin.java │ │ ├── ContextMixin.java │ │ ├── CustomLocalDateDeserializer.java │ │ ├── CustomLocalDateTimeDeserializer.java │ │ ├── CustomLocalTimeDeserializer.java │ │ ├── EmbeddingMixin.java │ │ ├── ImageBuilderMixin.java │ │ ├── ImageContentMixin.java │ │ ├── ImageMixin.java │ │ ├── InMemoryEmbeddingStoreDeserializer.java │ │ ├── InMemoryEmbeddingStoreMixin.java │ │ ├── MetadataMixin.java │ │ ├── SystemMessageMixin.java │ │ ├── TextContentDeserializer.java │ │ ├── TextContentMixin.java │ │ ├── TextSegmentMixin.java │ │ ├── ToolExecutionRequestBuilderMixin.java │ │ ├── ToolExecutionRequestMixin.java │ │ ├── ToolExecutionResultMessageMixin.java │ │ ├── UserMessageDeserializer.java │ │ └── UserMessageMixin.java │ │ ├── listeners │ │ ├── ChatModelSpanContributor.java │ │ ├── CompletionTextSpanContributor.java │ │ ├── MetricsChatModelListener.java │ │ ├── PromptTextSpanContributor.java │ │ └── SpanChatModelListener.java │ │ ├── prompt │ │ └── Mappable.java │ │ ├── substitution │ │ ├── JsonArraySchemaObjectSubstitution.java │ │ ├── JsonBooleanSchemaObjectSubstitution.java │ │ ├── JsonEnumSchemaObjectSubstitution.java │ │ ├── JsonIntegerSchemaObjectSubstitution.java │ │ ├── JsonNumberSchemaObjectSubstitution.java │ │ ├── JsonObjectSchemaObjectSubstitution.java │ │ ├── JsonReferenceSchemaObjectSubstitution.java │ │ ├── JsonSchemaObjectSubstitution.java │ │ └── JsonStringSchemaObjectSubstitution.java │ │ ├── template │ │ └── ChatMessageTemplateExtension.java │ │ ├── tool │ │ ├── QuarkusToolExecutor.java │ │ ├── QuarkusToolExecutorFactory.java │ │ ├── ToolClassCreateInfo.java │ │ ├── ToolInvoker.java │ │ ├── ToolMethodCreateInfo.java │ │ ├── ToolSpanWrapper.java │ │ └── ToolSpecificationObjectSubstitution.java │ │ └── types │ │ ├── GenericArrayTypeImpl.java │ │ ├── ParameterizedTypeImpl.java │ │ ├── TypeSignatureParser.java │ │ ├── TypeUtil.java │ │ └── WildcardTypeImpl.java │ └── resources │ └── META-INF │ ├── beans.xml │ ├── native-image │ └── io.quarkiverse.langchain4j │ │ └── quarkus-langchain4j-core │ │ └── jni-config.json │ ├── quarkus-extension.yaml │ └── services │ ├── dev.langchain4j.spi.data.message.ChatMessageJsonCodecFactory │ ├── dev.langchain4j.spi.json.JsonCodecFactory │ ├── dev.langchain4j.spi.prompt.PromptTemplateFactory │ ├── dev.langchain4j.spi.prompt.structured.StructuredPromptFactory │ ├── dev.langchain4j.spi.services.AiServicesFactory │ ├── dev.langchain4j.spi.store.embedding.inmemory.InMemoryEmbeddingStoreJsonCodecFactory │ └── io.quarkiverse.langchain4j.spi.DefaultMemoryIdProvider ├── docs ├── README.adoc ├── antora-playbook.yml ├── antora.yml ├── modules │ └── ROOT │ │ ├── assets │ │ └── images │ │ │ ├── chatbot-architecture.png │ │ │ ├── easy-rag-reuse-embeddings.png │ │ │ ├── guardrails.png │ │ │ ├── llms-big-picture.png │ │ │ └── trace.png │ │ ├── examples │ │ ├── .keepme │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── samples │ │ │ ├── AiServiceWithFaultTolerance.java │ │ │ ├── AiServiceWithFaultToleranceAndOnDisabledIntegration.java │ │ │ ├── AiServiceWithFaultToleranceOnlyOnDisabledIntegration.java │ │ │ ├── CustomChatMemoryProvider.java │ │ │ ├── CustomProvider.java │ │ │ ├── DocumentCreationExample.java │ │ │ ├── DocumentFromTextCreationExample.java │ │ │ ├── EmailService.java │ │ │ ├── IngestorExampleWithChroma.java │ │ │ ├── IngestorExampleWithInfinispan.java │ │ │ ├── IngestorExampleWithMilvus.java │ │ │ ├── IngestorExampleWithPgvector.java │ │ │ ├── IngestorExampleWithPinecone.java │ │ │ ├── IngestorExampleWithRedis.java │ │ │ ├── IngestorExampleWithWeaviate.java │ │ │ ├── MyAiService.java │ │ │ └── RetrievalAugmentorExample.java │ │ ├── nav.adoc │ │ └── pages │ │ ├── agent-and-tools.adoc │ │ ├── ai-gemini.adoc │ │ ├── ai-services.adoc │ │ ├── anthropic.adoc │ │ ├── chroma-store.adoc │ │ ├── csv.adoc │ │ ├── dev-ui.adoc │ │ ├── easy-rag.adoc │ │ ├── enable-disable-integrations.adoc │ │ ├── fault-tolerance.adoc │ │ ├── guardrails.adoc │ │ ├── huggingface.adoc │ │ ├── in-process-embedding.adoc │ │ ├── includes │ │ ├── attributes.adoc │ │ ├── quarkus-langchain4j-ai-gemini.adoc │ │ ├── quarkus-langchain4j-ai-gemini_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-anthropic.adoc │ │ ├── quarkus-langchain4j-anthropic_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-azure-openai.adoc │ │ ├── quarkus-langchain4j-azure-openai_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-bedrock.adoc │ │ ├── quarkus-langchain4j-bedrock_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-chroma.adoc │ │ ├── quarkus-langchain4j-chroma_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-cohere.adoc │ │ ├── quarkus-langchain4j-cohere_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-core.adoc │ │ ├── quarkus-langchain4j-core_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-easy-rag.adoc │ │ ├── quarkus-langchain4j-easy-rag_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-hugging-face.adoc │ │ ├── quarkus-langchain4j-hugging-face_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-huggingface.adoc │ │ ├── quarkus-langchain4j-infinispan.adoc │ │ ├── quarkus-langchain4j-infinispan_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-jlama.adoc │ │ ├── quarkus-langchain4j-jlama_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-llama3-java.adoc │ │ ├── quarkus-langchain4j-llama3-java_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-mcp.adoc │ │ ├── quarkus-langchain4j-mcp_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-memory-store-redis.adoc │ │ ├── quarkus-langchain4j-memory-store-redis_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-milvus.adoc │ │ ├── quarkus-langchain4j-milvus_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-mistral-ai.adoc │ │ ├── quarkus-langchain4j-mistral-ai_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-mistralai.adoc │ │ ├── quarkus-langchain4j-neo4j.adoc │ │ ├── quarkus-langchain4j-neo4j_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-oidc-mcp-auth-provider.adoc │ │ ├── quarkus-langchain4j-oidc-mcp-auth-provider_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-oidc-model-auth-provider.adoc │ │ ├── quarkus-langchain4j-oidc-model-auth-provider_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-ollama-devservices.adoc │ │ ├── quarkus-langchain4j-ollama-devservices_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-ollama.adoc │ │ ├── quarkus-langchain4j-ollama_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-openai.adoc │ │ ├── quarkus-langchain4j-openai_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-openshift-ai.adoc │ │ ├── quarkus-langchain4j-openshift-ai_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-pgvector.adoc │ │ ├── quarkus-langchain4j-pgvector_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-pinecone.adoc │ │ ├── quarkus-langchain4j-pinecone_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-qdrant.adoc │ │ ├── quarkus-langchain4j-qdrant_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-redis.adoc │ │ ├── quarkus-langchain4j-redis_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-tavily.adoc │ │ ├── quarkus-langchain4j-tavily_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-vertex-ai-gemini.adoc │ │ ├── quarkus-langchain4j-vertex-ai-gemini_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-vertex-ai.adoc │ │ ├── quarkus-langchain4j-vertex-ai_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-watsonx.adoc │ │ ├── quarkus-langchain4j-watsonx_quarkus.langchain4j.adoc │ │ ├── quarkus-langchain4j-weaviate.adoc │ │ ├── quarkus-langchain4j-weaviate_quarkus.langchain4j.adoc │ │ └── quarkus-langchain4j.adoc │ │ ├── index.adoc │ │ ├── infinispan-store.adoc │ │ ├── jlama.adoc │ │ ├── llama3.adoc │ │ ├── llms.adoc │ │ ├── mcp.adoc │ │ ├── milvus-store.adoc │ │ ├── mistral.adoc │ │ ├── neo4j.adoc │ │ ├── observability.adoc │ │ ├── ollama.adoc │ │ ├── openai.adoc │ │ ├── pgvector-store.adoc │ │ ├── pinecone-store.adoc │ │ ├── podman.adoc │ │ ├── prompt-engineering.adoc │ │ ├── prompt-generation.adoc │ │ ├── qdrant-store.adoc │ │ ├── redis-store.adoc │ │ ├── reranking.adoc │ │ ├── response-augmenter.adoc │ │ ├── retrievers.adoc │ │ ├── testing.adoc │ │ ├── watsonx.adoc │ │ ├── weaviate.adoc │ │ ├── web-search.adoc │ │ └── websockets.adoc ├── pom.xml ├── src │ ├── main │ │ └── resources │ │ │ └── application.properties │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── docs │ │ └── it │ │ └── AntoraTest.java └── templates │ └── includes │ └── attributes.adoc ├── embedding-stores ├── chroma │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── chroma │ │ │ │ └── deployment │ │ │ │ ├── ChromaBuildConfig.java │ │ │ │ ├── ChromaDevServicesProcessor.java │ │ │ │ └── ChromaProcessor.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── chroma │ │ │ └── deployment │ │ │ ├── ChromaEmbeddingStoreCDITest.java │ │ │ └── ChromaEmbeddingStoreTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── chroma │ │ │ ├── ChromaEmbeddingStore.java │ │ │ └── runtime │ │ │ ├── AddEmbeddingsRequest.java │ │ │ ├── ChromaCollectionsRestApi.java │ │ │ ├── ChromaConfig.java │ │ │ ├── ChromaRecorder.java │ │ │ ├── Collection.java │ │ │ ├── CreateCollectionRequest.java │ │ │ ├── DeleteEmbeddingsRequest.java │ │ │ ├── QueryRequest.java │ │ │ └── QueryResponse.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml ├── infinispan │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── infinispan │ │ │ │ │ ├── DevServicesConfigBuilderCustomizer.java │ │ │ │ │ ├── InfinispanEmbeddingStoreBuildTimeConfig.java │ │ │ │ │ └── InfinispanEmbeddingStoreProcessor.java │ │ │ └── resources │ │ │ │ └── META-INF │ │ │ │ └── services │ │ │ │ └── io.smallrye.config.SmallRyeConfigBuilderCustomizer │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── infinispan │ │ │ └── deployment │ │ │ └── InfinispanEmbeddingStoreTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── infinispan │ │ │ ├── InfinispanEmbeddingStore.java │ │ │ ├── SchemaAndMarshallerProducer.java │ │ │ └── runtime │ │ │ ├── InfinispanEmbeddingStoreConfig.java │ │ │ ├── InfinispanEmbeddingStoreRecorder.java │ │ │ ├── InfinispanSchema.java │ │ │ ├── LangchainInfinispanItem.java │ │ │ └── LangchainItemMarshaller.java │ │ └── resources │ │ └── META-INF │ │ └── quarkus-extension.yaml ├── milvus │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── milvus │ │ │ │ ├── MilvusBuildConfig.java │ │ │ │ ├── MilvusDevServicesProcessor.java │ │ │ │ └── MilvusProcessor.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── milvus │ │ │ └── deployment │ │ │ ├── MilvusEmbeddingStoreTest.java │ │ │ └── MilvusMetadataFilteringTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── milvus │ │ │ └── runtime │ │ │ ├── MilvusRecorder.java │ │ │ └── MilvusRuntimeConfig.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml ├── neo4j │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── neo4j │ │ │ │ └── Neo4jEmbeddingStoreProcessor.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── neo4j │ │ │ └── Neo4jEmbeddingStoreTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── neo4j │ │ │ └── runtime │ │ │ ├── Neo4jEmbeddingStoreRecorder.java │ │ │ └── Neo4jRuntimeConfig.java │ │ └── resources │ │ └── META-INF │ │ └── quarkus-extension.yaml ├── pgvector │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── pgvector │ │ │ │ │ └── deployment │ │ │ │ │ ├── DevServicesConfigBuilderCustomizer.java │ │ │ │ │ ├── PgVectorEmbeddingStoreBuildTimeConfig.java │ │ │ │ │ └── PgVectorEmbeddingStoreProcessor.java │ │ │ └── resources │ │ │ │ └── META-INF │ │ │ │ └── services │ │ │ │ └── io.smallrye.config.SmallRyeConfigBuilderCustomizer │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── pgvector │ │ │ └── test │ │ │ ├── ColumnsTest.java │ │ │ ├── JSONBMultiIndexTest.java │ │ │ ├── JSONBTest.java │ │ │ ├── JSONTest.java │ │ │ ├── LangChain4jPgVectorBaseTest.java │ │ │ └── PgVectorDataSourceTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── pgvector │ │ │ ├── PgVectorAgroalPoolInterceptor.java │ │ │ ├── PgVectorEmbeddingStore.java │ │ │ └── runtime │ │ │ ├── PgVectorEmbeddingStoreConfig.java │ │ │ └── PgVectorEmbeddingStoreRecorder.java │ │ └── resources │ │ └── META-INF │ │ └── quarkus-extension.yaml ├── pinecone │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── pinecone │ │ │ │ └── PineconeProcessor.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── pinecone │ │ │ └── deployment │ │ │ └── PineconeEmbeddingStoreTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── pinecone │ │ │ ├── PineconeEmbeddingStore.java │ │ │ └── runtime │ │ │ ├── CreateIndexPodSpec.java │ │ │ ├── CreateIndexRequest.java │ │ │ ├── CreateIndexSpec.java │ │ │ ├── DeleteRequest.java │ │ │ ├── DescribeIndexResponse.java │ │ │ ├── DistanceMetric.java │ │ │ ├── IndexStatus.java │ │ │ ├── ListIndexesResponse.java │ │ │ ├── PineconeConfig.java │ │ │ ├── PineconeExceptionMapper.java │ │ │ ├── PineconeIndexOperationsApi.java │ │ │ ├── PineconeRecorder.java │ │ │ ├── PineconeVectorOperationsApi.java │ │ │ ├── QueryRequest.java │ │ │ ├── QueryResponse.java │ │ │ ├── UpsertRequest.java │ │ │ ├── UpsertResponse.java │ │ │ ├── UpsertVector.java │ │ │ └── VectorMatch.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml ├── pom.xml ├── qdrant │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── qdrant │ │ │ │ ├── Distance.java │ │ │ │ ├── QdrantBuildConfig.java │ │ │ │ ├── QdrantContainer.java │ │ │ │ ├── QdrantDevServiceCfg.java │ │ │ │ ├── QdrantDevServices.java │ │ │ │ ├── QdrantDevServicesProcessor.java │ │ │ │ ├── QdrantProcessor.java │ │ │ │ └── QdrantVectorCfg.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── qdrant │ │ │ └── QdrantEmbeddingStoreTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── qdrant │ │ │ └── runtime │ │ │ ├── QdrantRecorder.java │ │ │ └── QdrantRuntimeConfig.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml ├── redis │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── redis │ │ │ │ │ ├── DevServicesConfigBuilderCustomizer.java │ │ │ │ │ ├── RedisEmbeddingStoreBuildTimeConfig.java │ │ │ │ │ └── RedisEmbeddingStoreProcessor.java │ │ │ └── resources │ │ │ │ └── META-INF │ │ │ │ └── services │ │ │ │ └── io.smallrye.config.SmallRyeConfigBuilderCustomizer │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── redis │ │ │ └── deployment │ │ │ ├── RedisEmbeddingStoreTest.java │ │ │ ├── RedisFilterMapperTest.java │ │ │ └── RedisMetadataFilteringTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── redis │ │ │ ├── RedisEmbeddingStore.java │ │ │ └── runtime │ │ │ ├── RedisEmbeddingStoreConfig.java │ │ │ ├── RedisEmbeddingStoreRecorder.java │ │ │ ├── RedisFilterMapper.java │ │ │ └── RedisSchema.java │ │ └── resources │ │ └── META-INF │ │ └── quarkus-extension.yaml └── weaviate │ ├── deployment │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── weaviate │ │ │ └── deployment │ │ │ ├── WeaviateBuildConfig.java │ │ │ ├── WeaviateContainer.java │ │ │ ├── WeaviateDevServicesProcessor.java │ │ │ └── WeaviateProcessor.java │ │ └── test │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── weaviate │ │ │ └── deployment │ │ │ ├── Constants.java │ │ │ ├── WeaviateEmbeddingStoreCDITest.java │ │ │ └── WeaviateEmbeddingStoreTest.java │ │ └── resources │ │ └── application.properties │ ├── pom.xml │ └── runtime │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── weaviate │ │ └── runtime │ │ ├── WeaviateRecorder.java │ │ └── WeaviateRuntimeConfig.java │ └── resources │ └── META-INF │ ├── beans.xml │ └── quarkus-extension.yaml ├── integration-tests ├── ai-gemini │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── org │ │ │ │ └── acme │ │ │ │ └── example │ │ │ │ └── gemini │ │ │ │ └── aiservices │ │ │ │ ├── AssistantWithToolsResource.java │ │ │ │ ├── GeminiResource.java │ │ │ │ └── TestChatModelListener.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── org │ │ └── acme │ │ └── example │ │ └── gemini │ │ └── aiservices │ │ └── AssistantResourceWithToolsTest.java ├── anthropic │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── anthropic │ │ │ └── chat │ │ │ └── ChatLanguageModelResource.java │ │ └── resources │ │ └── application.properties ├── azure-openai │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── azure │ │ │ └── openai │ │ │ └── chat │ │ │ └── ChatLanguageModelResource.java │ │ └── resources │ │ └── application.properties ├── devui-multiple-embedding-models │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── test │ │ │ └── devui │ │ │ └── Dummy.java │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── test │ │ └── devui │ │ └── MultipleEmbeddingModelsDevUITest.java ├── devui │ ├── pom.xml │ └── src │ │ └── test │ │ └── java │ │ └── devui │ │ └── LangChain4jDevUIJsonRpcTest.java ├── easy-rag │ ├── pom.xml │ └── src │ │ └── test │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── EasyRagCodestartTest.java │ │ └── resources │ │ └── __snapshots__ │ │ └── EasyRagCodestartTest │ │ └── testContent │ │ ├── dir-tree.snapshot │ │ └── src_main_java_ilove_quark_us_Bot.java ├── hugging-face │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── openai │ │ │ └── chat │ │ │ └── huggingface │ │ │ ├── ChatLanguageModelResource.java │ │ │ └── EmbeddingModelResource.java │ │ └── resources │ │ └── application.properties ├── in-process-embedding-models │ ├── embed-all-minilm-l6-v2-q │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── test │ │ │ │ │ └── InProcessEmbeddingResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── test │ │ │ ├── InProcessEmbeddingResourceIT.java │ │ │ └── InProcessEmbeddingResourceTest.java │ ├── embed-all-minilm-l6-v2 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── test │ │ │ │ │ └── InProcessEmbeddingResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── test │ │ │ ├── InProcessEmbeddingResourceIT.java │ │ │ └── InProcessEmbeddingResourceTest.java │ ├── embed-bge-small-en-q │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── test │ │ │ │ │ └── InProcessEmbeddingResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── test │ │ │ ├── InProcessEmbeddingResourceIT.java │ │ │ └── InProcessEmbeddingResourceTest.java │ ├── embed-bge-small-en-v15-q │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── test │ │ │ │ │ └── InProcessEmbeddingResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── test │ │ │ ├── InProcessEmbeddingResourceIT.java │ │ │ └── InProcessEmbeddingResourceTest.java │ ├── embed-bge-small-en-v15 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── test │ │ │ │ │ └── InProcessEmbeddingResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── test │ │ │ ├── InProcessEmbeddingResourceIT.java │ │ │ └── InProcessEmbeddingResourceTest.java │ ├── embed-bge-small-en │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── test │ │ │ │ │ └── InProcessEmbeddingResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── test │ │ │ ├── InProcessEmbeddingResourceIT.java │ │ │ └── InProcessEmbeddingResourceTest.java │ ├── embed-e5-small-v2-q │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── test │ │ │ │ │ └── InProcessEmbeddingResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── test │ │ │ ├── InProcessEmbeddingResourceIT.java │ │ │ └── InProcessEmbeddingResourceTest.java │ ├── embed-e5-small-v2 │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── test │ │ │ │ │ └── InProcessEmbeddingResource.java │ │ │ └── resources │ │ │ │ └── application.properties │ │ │ └── test │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── test │ │ │ ├── InProcessEmbeddingResourceIT.java │ │ │ └── InProcessEmbeddingResourceTest.java │ └── pom.xml ├── jlama │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── jlama │ │ │ └── chat │ │ │ ├── ChatLanguageModelResource.java │ │ │ └── EmbeddingModelResource.java │ │ └── resources │ │ └── application.properties ├── llama3-java │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── jlama │ │ │ └── chat │ │ │ └── ChatLanguageModelResource.java │ │ └── resources │ │ └── application.properties ├── mistralai │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── mistralai │ │ │ └── chat │ │ │ ├── ChatLanguageModelResource.java │ │ │ └── EmbeddingModelResource.java │ │ └── resources │ │ └── application.properties ├── multiple-providers │ ├── pom.xml │ └── src │ │ ├── main │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── org │ │ └── acme │ │ └── example │ │ └── multiple │ │ ├── MultipleChatProvidersTest.java │ │ ├── MultipleEmbeddingModelsTest.java │ │ ├── MultipleModerationProvidersTest.java │ │ ├── MultipleScoringModelsTest.java │ │ └── MultipleTokenCountEstimatorProvidersTest.java ├── ollama │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── openai │ │ │ └── chat │ │ │ └── ollama │ │ │ ├── ChatLanguageModelResource.java │ │ │ └── EmbeddingModelResource.java │ │ └── resources │ │ └── application.properties ├── openai │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── org │ │ │ │ └── acme │ │ │ │ └── example │ │ │ │ └── openai │ │ │ │ ├── MessageUtil.java │ │ │ │ ├── QuarkusRestApiResource.java │ │ │ │ ├── aiservices │ │ │ │ ├── AssistantResource.java │ │ │ │ ├── AssistantResourceWithFallback.java │ │ │ │ ├── AssistantResourceWithGuardrailsAndObservability.java │ │ │ │ ├── AssistantResourceWithMetrics.java │ │ │ │ ├── AssistantWithToolsResource.java │ │ │ │ ├── DescribeImageResource.java │ │ │ │ └── GenerateImageResource.java │ │ │ │ ├── chat │ │ │ │ ├── ChatLanguageModelResource.java │ │ │ │ └── QuarkusOpenAiClientChatResource.java │ │ │ │ ├── embedding │ │ │ │ └── EmbeddingModelResource.java │ │ │ │ ├── images │ │ │ │ └── ImageResource.java │ │ │ │ └── moderation │ │ │ │ └── ModerationModelResource.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── org │ │ └── acme │ │ └── example │ │ └── openai │ │ ├── OpenAiRestApiResourceTest.java │ │ ├── aiservices │ │ ├── AssistantResourceIT.java │ │ ├── AssistantResourceTest.java │ │ ├── AssistantResourceWithFallbackTest.java │ │ ├── AssistantResourceWithGuardrailsAndObservabilityTest.java │ │ ├── AssistantResourceWithMetricsTest.java │ │ └── AssistantResourceWithToolsTest.java │ │ ├── chat │ │ ├── ChatLanguageModelResourceIT.java │ │ ├── ChatLanguageModelResourceTest.java │ │ └── QuarkusOpenAiServerClientChatResourceTest.java │ │ ├── embedding │ │ └── EmbeddingModelResourceTest.java │ │ └── moderation │ │ └── ModerationModelResourceTest.java ├── pom.xml ├── rag-pgvector-flyway │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── org │ │ │ │ └── acme │ │ │ │ └── example │ │ │ │ ├── AiWithUserFilterService.java │ │ │ │ └── EmbeddingStoreIngestor.java │ │ └── resources │ │ │ ├── application.properties │ │ │ └── db │ │ │ └── migration │ │ │ └── V1.0.0__rag_db_init.sql │ │ └── test │ │ └── java │ │ └── org │ │ └── acme │ │ └── example │ │ └── openai │ │ └── RAGWithMetadataFilterTest.java ├── rag-pgvector │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── org │ │ │ │ └── acme │ │ │ │ └── example │ │ │ │ ├── AiWithUserFilterService.java │ │ │ │ └── EmbeddingStoreIngestor.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── org │ │ └── acme │ │ └── example │ │ └── openai │ │ └── RAGWithMetadataFilterTest.java ├── rag │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── org │ │ │ │ └── acme │ │ │ │ └── example │ │ │ │ ├── AiServiceWithAutoDiscoveredRetrievalAugmentor.java │ │ │ │ ├── AiServiceWithNoRetrievalAugmentor.java │ │ │ │ ├── AiServiceWithQueryTransformer.java │ │ │ │ ├── AiServiceWithReranking.java │ │ │ │ ├── AiServiceWithSpecifiedRetrievalAugmentor.java │ │ │ │ └── InMemoryEmbeddingStoreProducer.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── org │ │ └── acme │ │ └── example │ │ └── openai │ │ ├── NaiveRAGTest.java │ │ ├── RAGWithQueryTransformerTest.java │ │ └── RAGWithReRankingTest.java ├── simple-ollama │ ├── pom.xml │ └── src │ │ └── main │ │ ├── docker │ │ ├── Dockerfile.jvm │ │ ├── Dockerfile.legacy-jar │ │ ├── Dockerfile.native │ │ └── Dockerfile.native-micro │ │ ├── java │ │ └── org │ │ │ └── acme │ │ │ ├── Assistant.java │ │ │ └── ExistencialQuestionResource.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ └── index.html │ │ └── application.properties ├── tools │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── org │ │ │ │ └── acme │ │ │ │ └── tools │ │ │ │ ├── AiService.java │ │ │ │ └── Calculator.java │ │ └── resources │ │ │ └── application.properties │ │ └── test │ │ └── java │ │ └── org │ │ └── acme │ │ └── tools │ │ └── ToolsTest.java └── vertex-ai-gemini │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── org │ │ │ └── acme │ │ │ └── example │ │ │ └── gemini │ │ │ └── aiservices │ │ │ ├── AssistantWithToolsResource.java │ │ │ ├── DummyAuthProvider.java │ │ │ ├── GeminiResource.java │ │ │ └── TestChatModelListener.java │ └── resources │ │ └── application.properties │ └── test │ └── java │ └── org │ └── acme │ └── example │ └── gemini │ └── aiservices │ └── AssistantResourceWithToolsTest.java ├── mcp-auth-providers ├── oidc-mcp-auth-provider │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── oidc │ │ │ └── mcp │ │ │ └── deployment │ │ │ ├── OidcMcpAuthProviderBuildConfig.java │ │ │ └── OidcMcpAuthProviderProcessor.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── oidc │ │ │ └── mcp │ │ │ └── runtime │ │ │ └── OidcMcpAuthProvider.java │ │ └── resources │ │ └── META-INF │ │ └── quarkus-extension.yaml └── pom.xml ├── mcp ├── deployment │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── mcp │ │ │ └── deployment │ │ │ ├── McpConfigFileContentsBuildItem.java │ │ │ └── McpProcessor.java │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── mcp │ │ └── test │ │ ├── AbstractMockHttpMcpServer.java │ │ ├── McpAccessTokenTest.java │ │ ├── McpClaudeConfigTest.java │ │ ├── McpClientAndToolProviderCDITest.java │ │ ├── McpHealthCheckTest.java │ │ ├── McpOverHttpTransportTest.java │ │ ├── Mock2HttpMcpServer.java │ │ ├── Mock3HttpMcpServer.java │ │ ├── MockHttpMcpAccessTokenServer.java │ │ ├── MockHttpMcpServer.java │ │ ├── MultipleMcpClientsTest.java │ │ └── NoAutomaticToolProviderTest.java ├── pom.xml └── runtime │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── mcp │ │ ├── auth │ │ └── McpClientAuthProvider.java │ │ └── runtime │ │ ├── McpClientHealthCheck.java │ │ ├── McpClientName.java │ │ ├── McpRecorder.java │ │ ├── McpToolBox.java │ │ ├── QuarkusDefaultMcpLogHandler.java │ │ ├── QuarkusMcpToolProvider.java │ │ ├── config │ │ ├── ClaudeDesktopConfigSourceProvider.java │ │ ├── LocalLaunchParams.java │ │ ├── McpBuildTimeConfiguration.java │ │ ├── McpClientBuildTimeConfig.java │ │ ├── McpClientRuntimeConfig.java │ │ ├── McpRuntimeConfiguration.java │ │ └── McpTransportType.java │ │ └── http │ │ ├── McpClientAuthFilter.java │ │ ├── McpHttpClientLogger.java │ │ ├── McpPostEndpoint.java │ │ ├── McpSseEndpoint.java │ │ ├── QuarkusHttpMcpTransport.java │ │ └── SseSubscriber.java │ └── resources │ └── META-INF │ ├── beans.xml │ ├── quarkus-extension.yaml │ └── services │ └── org.eclipse.microprofile.config.spi.ConfigSourceProvider ├── memory-stores ├── memory-store-redis │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── memorystore │ │ │ │ └── redis │ │ │ │ └── deployment │ │ │ │ ├── RedisMemoryStoreBuildTimeConfig.java │ │ │ │ └── RedisMemoryStoreProcessor.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── memorystore │ │ │ └── redis │ │ │ └── test │ │ │ ├── RedisChatMemoryStoreTest.java │ │ │ └── RedisMemoryToolBoxTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── memorystore │ │ │ ├── RedisChatMemoryStore.java │ │ │ └── redis │ │ │ └── runtime │ │ │ └── RedisMemoryStoreRecorder.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml └── pom.xml ├── model-auth-providers ├── oidc-model-auth-provider │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── oidc │ │ │ └── deployment │ │ │ ├── OidcModelAuthProviderBuildConfig.java │ │ │ └── OidcModelAuthProviderProcessor.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── oidc │ │ │ └── runtime │ │ │ └── OidcModelAuthProvider.java │ │ └── resources │ │ └── META-INF │ │ └── quarkus-extension.yaml └── pom.xml ├── model-providers ├── anthropic │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── anthropic │ │ │ │ └── deployment │ │ │ │ ├── AnthropicProcessor.java │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ └── LangChain4jAnthropicBuildConfig.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── anthropic │ │ │ └── deployment │ │ │ ├── AnthropicChatLanguageModelSmokeTest.java │ │ │ ├── AnthropicDisabledLanguageModelSmokeTest.java │ │ │ ├── AnthropicSmokeTest.java │ │ │ └── AnthropicStreamingChatLanguageModelSmokeTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── anthropic │ │ │ ├── AnthropicRestApi.java │ │ │ ├── QuarkusAnthropicClient.java │ │ │ └── runtime │ │ │ ├── AnthropicRecorder.java │ │ │ ├── config │ │ │ ├── ChatModelConfig.java │ │ │ └── LangChain4jAnthropicConfig.java │ │ │ └── graalvm │ │ │ └── Substitutions.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ ├── quarkus-extension.yaml │ │ └── services │ │ └── dev.langchain4j.model.anthropic.internal.client.AnthropicClientBuilderFactory ├── bedrock │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── bedrock │ │ │ │ └── deployment │ │ │ │ ├── BedrockProcessor.java │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ ├── EmbeddingModelBuildConfig.java │ │ │ │ └── LangChain4jBedrockBuildConfig.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── bedrock │ │ │ └── deployment │ │ │ ├── BedrockAntrophicStreamingChatModelTest.java │ │ │ ├── BedrockChatModelDisabledTest.java │ │ │ ├── BedrockChatModelTest.java │ │ │ ├── BedrockEmbeddingModelCohereTest.java │ │ │ ├── BedrockEmbeddingModelTitanTest.java │ │ │ ├── BedrockStreamHelper.java │ │ │ ├── BedrockStreamingChatModelTest.java │ │ │ ├── BedrockTestBase.java │ │ │ └── TestCredentialsProvider.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── bedrock │ │ │ └── runtime │ │ │ ├── AwsLoggingInterceptor.java │ │ │ ├── BedrockConverseStreamingChatModel.java │ │ │ ├── BedrockRecorder.java │ │ │ ├── JaxRsSdkHttpClientFactory.java │ │ │ ├── config │ │ │ ├── AwsClientConfig.java │ │ │ ├── AwsConfig.java │ │ │ ├── ChatModelConfig.java │ │ │ ├── EmbeddingModelConfig.java │ │ │ ├── HttpClientConfig.java │ │ │ └── LangChain4jBedrockConfig.java │ │ │ └── jaxrsclient │ │ │ ├── DefaultJaxRsSdkClientBuilder.java │ │ │ ├── JaxRsSdkClientBuilder.java │ │ │ ├── JaxRsSdkHttpClient.java │ │ │ ├── JaxRsSdkHttpClientExecutable.java │ │ │ ├── JaxRsSdkHttpClientHelper.java │ │ │ └── async │ │ │ ├── JaxRsSdkAsyncHttpClient.java │ │ │ └── JaxRsSdkAsyncHttpClientSubscriber.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml ├── cohere │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── cohere │ │ │ │ ├── CohereProcessor.java │ │ │ │ ├── LangChain4jCohereBuildConfig.java │ │ │ │ └── ScoringModelBuildConfig.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── cohere │ │ │ └── CohereScoringModelTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── cohere │ │ │ └── runtime │ │ │ ├── CohereRecorder.java │ │ │ ├── QuarkusCohereScoringModel.java │ │ │ ├── api │ │ │ ├── BilledUnits.java │ │ │ ├── CohereApi.java │ │ │ ├── Meta.java │ │ │ ├── RerankRequest.java │ │ │ ├── RerankResponse.java │ │ │ └── RerankResult.java │ │ │ └── config │ │ │ ├── Langchain4jCohereConfig.java │ │ │ └── ScoringModelConfig.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml ├── google │ ├── gemini │ │ ├── ai-gemini │ │ │ ├── deployment │ │ │ │ ├── pom.xml │ │ │ │ └── src │ │ │ │ │ ├── main │ │ │ │ │ └── java │ │ │ │ │ │ └── io │ │ │ │ │ │ └── quarkiverse │ │ │ │ │ │ └── langchain4j │ │ │ │ │ │ └── ai │ │ │ │ │ │ └── gemini │ │ │ │ │ │ └── deployment │ │ │ │ │ │ ├── AiGeminiProcessor.java │ │ │ │ │ │ ├── GeminiBuildConfig.java │ │ │ │ │ │ └── LangChain4jAiEmbeddingConfig.java │ │ │ │ │ └── test │ │ │ │ │ └── java │ │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── ai │ │ │ │ │ └── gemini │ │ │ │ │ └── deployment │ │ │ │ │ ├── AiGeminiChatLanguageModelAuthProviderSmokeTest.java │ │ │ │ │ ├── AiGeminiChatLanguageModelSmokeTest.java │ │ │ │ │ ├── AiGeminiEmbeddingModelAuthProviderSmokeTest.java │ │ │ │ │ └── AiGeminiEmbeddingModelSmokeTest.java │ │ │ ├── pom.xml │ │ │ └── runtime │ │ │ │ ├── pom.xml │ │ │ │ └── src │ │ │ │ └── main │ │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── ai │ │ │ │ │ └── runtime │ │ │ │ │ └── gemini │ │ │ │ │ ├── AiGeminiChatLanguageModel.java │ │ │ │ │ ├── AiGeminiEmbeddingModel.java │ │ │ │ │ ├── AiGeminiRecorder.java │ │ │ │ │ ├── AiGeminiRestApi.java │ │ │ │ │ ├── ErrorResponse.java │ │ │ │ │ └── config │ │ │ │ │ ├── ChatModelConfig.java │ │ │ │ │ ├── LangChain4jAiGeminiConfig.java │ │ │ │ │ └── LangChain4jAiGeminiEmbeddingConfig.java │ │ │ │ └── resources │ │ │ │ └── META-INF │ │ │ │ ├── beans.xml │ │ │ │ └── quarkus-extension.yaml │ │ └── gemini-common │ │ │ ├── deployment │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── gemini │ │ │ │ └── common │ │ │ │ └── ChatModelBuildConfig.java │ │ │ ├── pom.xml │ │ │ └── runtime │ │ │ ├── pom.xml │ │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── gemini │ │ │ │ └── common │ │ │ │ ├── Blob.java │ │ │ │ ├── Content.java │ │ │ │ ├── ContentMapper.java │ │ │ │ ├── EmbedContentRequest.java │ │ │ │ ├── EmbedContentRequests.java │ │ │ │ ├── EmbedContentResponse.java │ │ │ │ ├── EmbedContentResponses.java │ │ │ │ ├── FileData.java │ │ │ │ ├── FinishReasonMapper.java │ │ │ │ ├── FunctionCall.java │ │ │ │ ├── FunctionDeclaration.java │ │ │ │ ├── FunctionResponse.java │ │ │ │ ├── GeminiChatLanguageModel.java │ │ │ │ ├── GeminiEmbeddingModel.java │ │ │ │ ├── GenerateContentRequest.java │ │ │ │ ├── GenerateContentResponse.java │ │ │ │ ├── GenerateContentResponseHandler.java │ │ │ │ ├── GenerationConfig.java │ │ │ │ ├── ModelAuthProviderFilter.java │ │ │ │ ├── RoleMapper.java │ │ │ │ ├── Schema.java │ │ │ │ ├── SchemaMapper.java │ │ │ │ └── Type.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ └── beans.xml │ ├── vertex-ai-gemini │ │ ├── deployment │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ └── java │ │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── vertexai │ │ │ │ │ └── gemini │ │ │ │ │ └── deployment │ │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ │ ├── LangChain4jVertexAiBuildConfig.java │ │ │ │ │ ├── LangChain4jVertexAiEmbeddingConfig.java │ │ │ │ │ └── VertexAiGeminiProcessor.java │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── vertexai │ │ │ │ └── gemini │ │ │ │ └── deployment │ │ │ │ ├── VertexAiGeminiChatLanguageModelSmokeTest.java │ │ │ │ └── VertexAiGeminiEmbeddingModelSmokeTest.java │ │ ├── pom.xml │ │ └── runtime │ │ │ ├── pom.xml │ │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── vertexai │ │ │ │ └── runtime │ │ │ │ └── gemini │ │ │ │ ├── VertexAiGeminiChatLanguageModel.java │ │ │ │ ├── VertexAiGeminiEmbeddingModel.java │ │ │ │ ├── VertexAiGeminiRecorder.java │ │ │ │ ├── VertxAiGeminiRestApi.java │ │ │ │ └── config │ │ │ │ ├── ChatModelConfig.java │ │ │ │ ├── LangChain4jVertexAiGeminiConfig.java │ │ │ │ └── LangChain4jVertexAiGeminiEmbeddingConfig.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ ├── beans.xml │ │ │ └── quarkus-extension.yaml │ └── vertex-ai │ │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── vertexai │ │ │ │ └── deployment │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ ├── LangChain4jVertexAiBuildConfig.java │ │ │ │ └── VertexAiProcessor.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── vertexai │ │ │ └── deployment │ │ │ └── VertexAiChatLanguageModelSmokeTest.java │ │ ├── pom.xml │ │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── vertexai │ │ │ └── runtime │ │ │ ├── Parameters.java │ │ │ ├── PredictRequest.java │ │ │ ├── PredictResponse.java │ │ │ ├── VertexAiChatLanguageModel.java │ │ │ ├── VertexAiRecorder.java │ │ │ ├── VertxAiRestApi.java │ │ │ └── config │ │ │ ├── ChatModelConfig.java │ │ │ └── LangChain4jVertexAiConfig.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml ├── hugging-face │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── huggingface │ │ │ │ └── deployment │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ ├── EmbeddingModelBuildConfig.java │ │ │ │ ├── HuggingFaceProcessor.java │ │ │ │ ├── LangChain4jHuggingFaceBuildConfig.java │ │ │ │ └── ModerationModelBuildConfig.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── huggingface │ │ │ └── deployment │ │ │ └── QuarkusHuggingFaceClientTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── huggingface │ │ │ │ ├── HuggingFaceRestApi.java │ │ │ │ ├── QuarkusHuggingFaceChatModel.java │ │ │ │ ├── QuarkusHuggingFaceClientFactory.java │ │ │ │ ├── QuarkusHuggingFaceEmbeddingModel.java │ │ │ │ └── runtime │ │ │ │ ├── HuggingFaceRecorder.java │ │ │ │ ├── config │ │ │ │ ├── ChatModelConfig.java │ │ │ │ ├── EmbeddingModelConfig.java │ │ │ │ └── LangChain4jHuggingFaceConfig.java │ │ │ │ └── jackson │ │ │ │ ├── OptionsMixin.java │ │ │ │ ├── ParametersMixin.java │ │ │ │ ├── TextGenerationRequestMixin.java │ │ │ │ └── TextGenerationResponseMixin.java │ │ └── resources │ │ │ └── META-INF │ │ │ ├── beans.xml │ │ │ ├── quarkus-extension.yaml │ │ │ └── services │ │ │ └── dev.langchain4j.model.huggingface.spi.HuggingFaceClientFactory │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── huggingface │ │ └── runtime │ │ └── DisabledModelsHuggingFaceRecorderTest.java ├── jaxrs-client │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── jaxrsclient │ │ │ ├── JaxRsHttpClient.java │ │ │ ├── JaxRsHttpClientBuilder.java │ │ │ └── JaxRsHttpClientBuilderFactory.java │ │ └── resources │ │ └── META-INF │ │ └── services │ │ └── dev.langchain4j.http.client.HttpClientBuilderFactory ├── jlama │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── jlama │ │ │ └── deployment │ │ │ ├── ChatModelBuildConfig.java │ │ │ ├── EmbeddingModelBuildConfig.java │ │ │ ├── JlamaProcessor.java │ │ │ └── LangChain4jJlamaBuildTimeConfig.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── jlama │ │ │ ├── JlamaChatModel.java │ │ │ ├── JlamaEmbeddingModel.java │ │ │ ├── JlamaModel.java │ │ │ ├── JlamaModelRegistry.java │ │ │ ├── JlamaStreamingChatModel.java │ │ │ ├── JlamaUtil.java │ │ │ └── runtime │ │ │ ├── JlamaAiRecorder.java │ │ │ └── config │ │ │ ├── ChatModelConfig.java │ │ │ ├── ChatModelFixedRuntimeConfig.java │ │ │ ├── EmbeddingModelFixedRuntimeConfig.java │ │ │ ├── LangChain4jJlamaConfig.java │ │ │ ├── LangChain4jJlamaFixedRuntimeConfig.java │ │ │ └── ModelsPathConfigSource.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ ├── quarkus-extension.yaml │ │ └── services │ │ └── org.eclipse.microprofile.config.spi.ConfigSource ├── llama3-java │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── llama3 │ │ │ └── deployment │ │ │ ├── ChatModelBuildConfig.java │ │ │ ├── LangChain4jLlama3BuildTimeConfig.java │ │ │ └── Llama3Processor.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── llama3 │ │ │ ├── Consts.java │ │ │ ├── Llama3ChatModel.java │ │ │ ├── Llama3ModelRegistry.java │ │ │ ├── Llama3StreamingChatModel.java │ │ │ ├── MessageMapper.java │ │ │ ├── ProgressReporter.java │ │ │ ├── copy │ │ │ ├── AOT.java │ │ │ ├── ChatFormat.java │ │ │ ├── GGMLTensorEntry.java │ │ │ ├── GGMLType.java │ │ │ ├── GGUF.java │ │ │ ├── Llama.java │ │ │ ├── Llama3.java │ │ │ ├── ModelLoader.java │ │ │ ├── Pair.java │ │ │ ├── Sampler.java │ │ │ ├── Timer.java │ │ │ ├── Tokenizer.java │ │ │ └── Vocabulary.java │ │ │ └── runtime │ │ │ ├── Llama3PreloadRecorder.java │ │ │ ├── Llama3Recorder.java │ │ │ ├── NameAndQuantization.java │ │ │ ├── config │ │ │ ├── ChatModelConfig.java │ │ │ ├── ChatModelFixedRuntimeConfig.java │ │ │ ├── LangChain4jLlama3FixedRuntimeConfig.java │ │ │ ├── LangChain4jLlama3RuntimeConfig.java │ │ │ └── ModelsPathConfigSource.java │ │ │ └── graal │ │ │ └── Llama3Feature.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ ├── native-image │ │ └── io.quarkiverse.langchain4j │ │ │ └── quarkus-langchain4j-llama3-java │ │ │ └── native-image.properties │ │ ├── quarkus-extension.yaml │ │ └── services │ │ └── org.eclipse.microprofile.config.spi.ConfigSource ├── mistral │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── mistralai │ │ │ │ └── deployment │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ ├── EmbeddingModelBuildConfig.java │ │ │ │ ├── LangChain4jMistralAiBuildConfig.java │ │ │ │ ├── MistralAiProcessor.java │ │ │ │ └── ModerationModelBuildConfig.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── mistralai │ │ │ └── deployment │ │ │ ├── MistralAiChatLanguageModelSmokeTest.java │ │ │ └── MistralAiModerationModelSmokeTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── mistralai │ │ │ ├── MistralAiRestApi.java │ │ │ ├── QuarkusMistralAiClient.java │ │ │ └── runtime │ │ │ ├── MistralAiRecorder.java │ │ │ ├── config │ │ │ ├── ChatModelConfig.java │ │ │ ├── EmbeddingModelConfig.java │ │ │ ├── LangChain4jMistralAiConfig.java │ │ │ └── ModerationModelConfig.java │ │ │ └── graalvm │ │ │ └── Substitutions.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ ├── quarkus-extension.yaml │ │ └── services │ │ └── dev.langchain4j.model.mistralai.internal.client.MistralAiClientBuilderFactory ├── ollama │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── ollama │ │ │ │ └── deployment │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ ├── EmbeddingModelBuildConfig.java │ │ │ │ ├── LangChain4jOllamaOpenAiBuildConfig.java │ │ │ │ ├── OllamaProcessor.java │ │ │ │ ├── devservices │ │ │ │ ├── OllamaContainer.java │ │ │ │ ├── OllamaDevServicesBuildConfig.java │ │ │ │ └── OllamaDevServicesProcessor.java │ │ │ │ └── devui │ │ │ │ └── OllamaDevUiProcessor.java │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── ollama │ │ │ └── deployment │ │ │ ├── OllamaChatLanguageModelModelIdTest.java │ │ │ ├── OllamaChatLanguageModelModelNameTest.java │ │ │ ├── OllamaChatLanguageModelSmokeTest.java │ │ │ ├── OllamaChatLanguageModelToolTest.java │ │ │ ├── OllamaCustomMessageTest.java │ │ │ ├── OllamaJsonOutputTest.java │ │ │ ├── OllamaModelAuthProviderTest.java │ │ │ ├── OllamaStreamingChatLanguageModelSmokeTest.java │ │ │ ├── OllamaStructuredOutputTest.java │ │ │ └── OllamaTextOutputTest.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── ollama │ │ │ │ ├── ChatRequest.java │ │ │ │ ├── ChatResponse.java │ │ │ │ ├── EmbeddingRequest.java │ │ │ │ ├── EmbeddingResponse.java │ │ │ │ ├── FormatJsonSerializer.java │ │ │ │ ├── ImageUtils.java │ │ │ │ ├── Message.java │ │ │ │ ├── MessageMapper.java │ │ │ │ ├── OllamaClient.java │ │ │ │ ├── OllamaEmbeddingModel.java │ │ │ │ ├── OllamaModelAuthProviderFilter.java │ │ │ │ ├── OllamaRestApi.java │ │ │ │ ├── OllamaStreamingChatLanguageModel.java │ │ │ │ ├── Options.java │ │ │ │ ├── Role.java │ │ │ │ ├── Tool.java │ │ │ │ ├── ToolCall.java │ │ │ │ └── runtime │ │ │ │ ├── OllamaRecorder.java │ │ │ │ ├── config │ │ │ │ ├── ChatModelConfig.java │ │ │ │ ├── ChatModelFixedRuntimeConfig.java │ │ │ │ ├── EmbeddingModelConfig.java │ │ │ │ ├── EmbeddingModelFixedRuntimeConfig.java │ │ │ │ ├── LangChain4jOllamaConfig.java │ │ │ │ ├── LangChain4jOllamaFixedRuntimeConfig.java │ │ │ │ ├── ModelIdConfigFallbackInterceptor.java │ │ │ │ └── ModelIdConfigRelocateInterceptor.java │ │ │ │ └── jackson │ │ │ │ ├── RoleDeserializer.java │ │ │ │ ├── RoleSerializer.java │ │ │ │ ├── ToolTypeDeserializer.java │ │ │ │ └── ToolTypeSerializer.java │ │ └── resources │ │ │ └── META-INF │ │ │ ├── beans.xml │ │ │ ├── quarkus-extension.yaml │ │ │ └── services │ │ │ └── io.smallrye.config.ConfigSourceInterceptor │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── ollama │ │ ├── OllamaRestApiFilterTest.java │ │ └── runtime │ │ └── DisabledModelsOllamaRecorderTest.java ├── openai │ ├── azure-openai │ │ ├── deployment │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ └── java │ │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── azure │ │ │ │ │ └── openai │ │ │ │ │ └── deployment │ │ │ │ │ ├── AzureOpenAiProcessor.java │ │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ │ ├── EmbeddingModelBuildConfig.java │ │ │ │ │ ├── ImageModelBuildConfig.java │ │ │ │ │ ├── LangChain4jAzureOpenAiBuildConfig.java │ │ │ │ │ └── ModerationModelBuildConfig.java │ │ │ │ └── test │ │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── azure │ │ │ │ └── openai │ │ │ │ └── test │ │ │ │ ├── AzureOpenAiChatLanguageModelSmokeTest.java │ │ │ │ ├── ModelAuthProviderSmokeTest.java │ │ │ │ ├── MultipleChatModesTest.java │ │ │ │ ├── MultipleChatModesWithoutDefaultTest.java │ │ │ │ └── TokenCountEstimatorTest.java │ │ ├── pom.xml │ │ └── runtime │ │ │ ├── pom.xml │ │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── azure │ │ │ │ │ └── openai │ │ │ │ │ ├── AzureOpenAiChatModel.java │ │ │ │ │ ├── AzureOpenAiEmbeddingModel.java │ │ │ │ │ ├── AzureOpenAiImageModel.java │ │ │ │ │ ├── AzureOpenAiStreamingChatModel.java │ │ │ │ │ ├── Consts.java │ │ │ │ │ └── runtime │ │ │ │ │ ├── AzureOpenAiRecorder.java │ │ │ │ │ └── config │ │ │ │ │ ├── ChatModelConfig.java │ │ │ │ │ ├── ConfigConstants.java │ │ │ │ │ ├── EmbeddingModelConfig.java │ │ │ │ │ ├── ImageModelConfig.java │ │ │ │ │ └── LangChain4jAzureOpenAiConfig.java │ │ │ └── resources │ │ │ │ └── META-INF │ │ │ │ └── quarkus-extension.yaml │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── azure │ │ │ └── openai │ │ │ └── runtime │ │ │ ├── AzureOpenAiRecorderEndpointTests.java │ │ │ └── DisabledModelsAzureOpenAiRecorderTest.java │ ├── openai-common │ │ ├── deployment │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── openai │ │ │ │ └── common │ │ │ │ ├── OpenAiCommonProcessor.java │ │ │ │ └── devui │ │ │ │ └── OpenAiCommonDevUIProcessor.java │ │ ├── pom.xml │ │ └── runtime │ │ │ ├── pom.xml │ │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── openai │ │ │ │ └── common │ │ │ │ ├── OpenAiApiException.java │ │ │ │ ├── OpenAiRestApi.java │ │ │ │ ├── QuarkusOpenAiClient.java │ │ │ │ └── runtime │ │ │ │ ├── AdditionalPropertiesHack.java │ │ │ │ └── graalvm │ │ │ │ └── Substitutions.java │ │ │ └── resources │ │ │ └── META-INF │ │ │ ├── beans.xml │ │ │ ├── quarkus-extension.yaml │ │ │ └── services │ │ │ └── dev.langchain4j.model.openai.internal.spi.OpenAiClientBuilderFactory │ ├── openai-vanilla │ │ ├── deployment │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ ├── main │ │ │ │ ├── java │ │ │ │ │ └── io │ │ │ │ │ │ └── quarkiverse │ │ │ │ │ │ └── langchain4j │ │ │ │ │ │ └── openai │ │ │ │ │ │ └── deployment │ │ │ │ │ │ ├── ChatModelBuildConfig.java │ │ │ │ │ │ ├── EmbeddingModelBuildConfig.java │ │ │ │ │ │ ├── ImageModelBuildConfig.java │ │ │ │ │ │ ├── LangChain4jOpenAiBuildConfig.java │ │ │ │ │ │ ├── ModerationModelBuildConfig.java │ │ │ │ │ │ ├── OpenAiProcessor.java │ │ │ │ │ │ └── devui │ │ │ │ │ │ └── OpenAiDevUIProcessor.java │ │ │ │ └── resources │ │ │ │ │ └── dev-ui │ │ │ │ │ ├── qwc-images.js │ │ │ │ │ └── qwc-moderation.js │ │ │ │ └── test │ │ │ │ ├── java │ │ │ │ ├── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ │ └── langchain4j │ │ │ │ │ │ └── openai │ │ │ │ │ │ └── test │ │ │ │ │ │ ├── DisabledChatModelTest.java │ │ │ │ │ │ ├── JsonParsingTest.java │ │ │ │ │ │ ├── OpenAiChatLanguageModelSmokeTest.java │ │ │ │ │ │ ├── OpenAiChatLanguageModelTlsConfigurationTest.java │ │ │ │ │ │ └── OpenAiRestApiSmokeTest.java │ │ │ │ └── org │ │ │ │ │ └── acme │ │ │ │ │ └── examples │ │ │ │ │ └── aiservices │ │ │ │ │ ├── AiServiceAsToolBoxTest.java │ │ │ │ │ ├── AiServiceAsToolTest.java │ │ │ │ │ ├── AiServicesTest.java │ │ │ │ │ ├── AuditingTests.java │ │ │ │ │ ├── ChatMemorySeederTest.java │ │ │ │ │ ├── CustomChatMemoryProviderTest.java │ │ │ │ │ ├── CustomChatMemoryStoreTest.java │ │ │ │ │ ├── DeclarativeAiServicesTest.java │ │ │ │ │ ├── ImageModelTest.java │ │ │ │ │ ├── ModerationModelTest.java │ │ │ │ │ ├── MultipleChatModelsDeclarativeServiceTest.java │ │ │ │ │ ├── MultipleChatModesTest.java │ │ │ │ │ ├── MultipleChatModesWithoutDefaultTest.java │ │ │ │ │ ├── NoAiServicesTest.java │ │ │ │ │ ├── NoModelProvidedTest.java │ │ │ │ │ ├── NoModerationProvidedTest.java │ │ │ │ │ ├── RemovableChatMemoryTest.java │ │ │ │ │ ├── RestClientToolTest.java │ │ │ │ │ ├── RestClientToolboxTest.java │ │ │ │ │ ├── StructuredOutputResponseTest.java │ │ │ │ │ ├── ToolBoxTest.java │ │ │ │ │ ├── ToolBoxWithStructuredOutputResponseTest.java │ │ │ │ │ ├── ToolHallucinationStrategyTest.java │ │ │ │ │ ├── ToolValidationTest.java │ │ │ │ │ ├── ToolWithToolMemoryIdTest.java │ │ │ │ │ ├── ToolsApplicationScopedTest.java │ │ │ │ │ ├── ToolsApplicationScopedWithInterceptorTest.java │ │ │ │ │ ├── ToolsDependentTest.java │ │ │ │ │ ├── ToolsRequestScopeTest.java │ │ │ │ │ ├── ToolsScopeTestBase.java │ │ │ │ │ └── ToolsSingletonTest.java │ │ │ │ └── resources │ │ │ │ └── messages │ │ │ │ ├── recipe-user.txt │ │ │ │ ├── translate-system │ │ │ │ └── translate-user.txt │ │ ├── devmode-tests │ │ │ ├── pom.xml │ │ │ └── src │ │ │ │ └── test │ │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── openai │ │ │ │ │ └── test │ │ │ │ │ ├── Configuration.java │ │ │ │ │ ├── ConfigurationKey.java │ │ │ │ │ ├── PromptDevModeTest.java │ │ │ │ │ ├── Resource.java │ │ │ │ │ ├── Service.java │ │ │ │ │ └── ServiceWithResource.java │ │ │ │ └── resources │ │ │ │ └── cs-organizer.txt │ │ ├── pom.xml │ │ └── runtime │ │ │ ├── pom.xml │ │ │ └── src │ │ │ ├── main │ │ │ ├── java │ │ │ │ └── io │ │ │ │ │ └── quarkiverse │ │ │ │ │ └── langchain4j │ │ │ │ │ └── openai │ │ │ │ │ ├── QuarkusOpenAiChatModelBuilderFactory.java │ │ │ │ │ ├── QuarkusOpenAiEmbeddingModelBuilderFactory.java │ │ │ │ │ ├── QuarkusOpenAiImageModel.java │ │ │ │ │ ├── QuarkusOpenAiModerationModelBuilderFactory.java │ │ │ │ │ ├── QuarkusOpenAiStreamingChatModelBuilderFactory.java │ │ │ │ │ └── runtime │ │ │ │ │ ├── OpenAiRecorder.java │ │ │ │ │ ├── config │ │ │ │ │ ├── ChatModelConfig.java │ │ │ │ │ ├── EmbeddingModelConfig.java │ │ │ │ │ ├── ImageModelConfig.java │ │ │ │ │ ├── LangChain4jOpenAiConfig.java │ │ │ │ │ └── ModerationModelConfig.java │ │ │ │ │ ├── cost │ │ │ │ │ ├── BasicE3BigCostEstimator.java │ │ │ │ │ ├── BasicE3SmallCostEstimator.java │ │ │ │ │ ├── BasicGpt4oCostEstimator.java │ │ │ │ │ ├── BasicGpt4oMiniCostEstimator.java │ │ │ │ │ ├── BasicO1MiniCostEstimator.java │ │ │ │ │ └── BasicO1PreviewCostEstimator.java │ │ │ │ │ └── devui │ │ │ │ │ ├── OpenAiImagesJsonRPCService.java │ │ │ │ │ └── OpenAiModerationModelsJsonRPCService.java │ │ │ └── resources │ │ │ │ └── META-INF │ │ │ │ ├── beans.xml │ │ │ │ ├── quarkus-extension.yaml │ │ │ │ └── services │ │ │ │ ├── dev.langchain4j.model.openai.spi.OpenAiChatModelBuilderFactory │ │ │ │ ├── dev.langchain4j.model.openai.spi.OpenAiEmbeddingModelBuilderFactory │ │ │ │ ├── dev.langchain4j.model.openai.spi.OpenAiModerationModelBuilderFactory │ │ │ │ └── dev.langchain4j.model.openai.spi.OpenAiStreamingChatModelBuilderFactory │ │ │ └── test │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── openai │ │ │ └── runtime │ │ │ └── DisabledModelsOpenAiRecorderTest.java │ └── testing-internal │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── openai │ │ │ └── testing │ │ │ └── internal │ │ │ ├── ChatCompletionTransformer.java │ │ │ ├── OpenAiBaseTest.java │ │ │ └── WiremockConfigBuilderCustomizer.java │ │ └── resources │ │ ├── META-INF │ │ └── services │ │ │ ├── com.github.tomakehurst.wiremock.extension.Extension │ │ │ └── io.smallrye.config.SmallRyeConfigBuilderCustomizer │ │ └── openai │ │ └── mappings │ │ └── completions.json ├── openshift-ai │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── openshift │ │ │ └── ai │ │ │ └── deployment │ │ │ ├── ChatModelBuildConfig.java │ │ │ ├── LangChain4jOpenshiftAiBuildConfig.java │ │ │ └── OpenshiftAiProcessor.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ ├── main │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── openshiftai │ │ │ │ ├── OpenshiftAiChatModel.java │ │ │ │ ├── OpenshiftAiRestApi.java │ │ │ │ ├── TextGenerationRequest.java │ │ │ │ ├── TextGenerationResponse.java │ │ │ │ └── runtime │ │ │ │ ├── OpenshiftAiRecorder.java │ │ │ │ └── config │ │ │ │ ├── ChatModelConfig.java │ │ │ │ └── LangChain4jOpenshiftAiConfig.java │ │ └── resources │ │ │ └── META-INF │ │ │ ├── beans.xml │ │ │ └── quarkus-extension.yaml │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── openshiftai │ │ └── runtime │ │ └── DisabledModelsOpenshiftAiRecorderTest.java ├── pom.xml └── watsonx │ ├── deployment │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── watsonx │ │ │ └── deployment │ │ │ ├── ChatModelBuildConfig.java │ │ │ ├── EmbeddingModelBuildConfig.java │ │ │ ├── LangChain4jWatsonBuildConfig.java │ │ │ ├── ScoringModelBuildConfig.java │ │ │ ├── WatsonxDotNames.java │ │ │ ├── WatsonxProcessor.java │ │ │ └── items │ │ │ ├── BuiltinServiceBuildItem.java │ │ │ └── TextExtractionClassBuildItem.java │ │ └── test │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── watsonx │ │ │ └── deployment │ │ │ ├── AiChatCacheTokenTest.java │ │ │ ├── AiChatServiceTest.java │ │ │ ├── AiEmbeddingTest.java │ │ │ ├── AiGenerationCacheTokenTest.java │ │ │ ├── AiGenerationServiceTest.java │ │ │ ├── AiServiceToolChoiceNameTest.java │ │ │ ├── AiServiceToolChoiceTest.java │ │ │ ├── BuiltinServiceBaseUrlExceptionTest.java │ │ │ ├── BuiltinServiceCacheTokenTest.java │ │ │ ├── BuiltinServiceInjectTest.java │ │ │ ├── ChatAllPropertiesTest.java │ │ │ ├── ChatDefaultPropertiesTest.java │ │ │ ├── ChatMemoryPlaceholderTest.java │ │ │ ├── GenerationAllPropertiesTest.java │ │ │ ├── GenerationDefaultPropertiesTest.java │ │ │ ├── HttpErrorTest.java │ │ │ ├── ResponseSchemaExceptionTest.java │ │ │ ├── ResponseSchemaOffTest.java │ │ │ ├── ResponseSchemaOnTest.java │ │ │ ├── TextExtractionInjectTest.java │ │ │ ├── TextExtractionTest.java │ │ │ ├── ToolChoiceNameToolNotFoundTest.java │ │ │ ├── ToolChoiceToolNotFoundTest.java │ │ │ ├── UnsupportedResponseFormatTest.java │ │ │ ├── WireMockAbstract.java │ │ │ └── WireMockUtil.java │ │ └── resources │ │ ├── application.properties │ │ ├── messages │ │ ├── system.txt │ │ └── user.txt │ │ └── test.pdf │ ├── pom.xml │ └── runtime │ ├── pom.xml │ └── src │ ├── main │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── watsonx │ │ │ ├── Watsonx.java │ │ │ ├── WatsonxChatModel.java │ │ │ ├── WatsonxChatRequestParameters.java │ │ │ ├── WatsonxEmbeddingModel.java │ │ │ ├── WatsonxGenerationModel.java │ │ │ ├── WatsonxGenerationRequestParameters.java │ │ │ ├── WatsonxGenerationStreamingModel.java │ │ │ ├── WatsonxScoringModel.java │ │ │ ├── WatsonxStreamingChatModel.java │ │ │ ├── WatsonxUtils.java │ │ │ ├── bean │ │ │ ├── CosError.java │ │ │ ├── EmbeddingParameters.java │ │ │ ├── EmbeddingRequest.java │ │ │ ├── EmbeddingResponse.java │ │ │ ├── GoogleSearchResult.java │ │ │ ├── IAMError.java │ │ │ ├── IdentityTokenRequest.java │ │ │ ├── IdentityTokenResponse.java │ │ │ ├── ScoringParameters.java │ │ │ ├── ScoringRequest.java │ │ │ ├── ScoringResponse.java │ │ │ ├── TextChatMessage.java │ │ │ ├── TextChatParameters.java │ │ │ ├── TextChatRequest.java │ │ │ ├── TextChatResponse.java │ │ │ ├── TextExtractionRequest.java │ │ │ ├── TextExtractionResponse.java │ │ │ ├── TextGenerationParameters.java │ │ │ ├── TextGenerationRequest.java │ │ │ ├── TextGenerationResponse.java │ │ │ ├── TextStreamingChatResponse.java │ │ │ ├── TokenizationRequest.java │ │ │ ├── TokenizationResponse.java │ │ │ ├── UtilityAgentToolsRequest.java │ │ │ ├── UtilityAgentToolsResponse.java │ │ │ ├── WatsonxError.java │ │ │ └── WebCrawlerResult.java │ │ │ ├── client │ │ │ ├── COSRestApi.java │ │ │ ├── IAMRestApi.java │ │ │ ├── UtilityAgentToolsRestApi.java │ │ │ ├── WatsonxClientLogger.java │ │ │ ├── WatsonxRestApi.java │ │ │ └── filter │ │ │ │ └── BearerTokenHeaderFactory.java │ │ │ ├── exception │ │ │ ├── BuiltinServiceException.java │ │ │ ├── COSException.java │ │ │ ├── TextExtractionException.java │ │ │ └── WatsonxException.java │ │ │ ├── runtime │ │ │ ├── BuiltinServiceRecorder.java │ │ │ ├── TextExtraction.java │ │ │ ├── TokenGenerationCache.java │ │ │ ├── TokenGenerator.java │ │ │ ├── WatsonxRecorder.java │ │ │ └── config │ │ │ │ ├── BuiltinServiceConfig.java │ │ │ │ ├── ChatModelConfig.java │ │ │ │ ├── EmbeddingModelConfig.java │ │ │ │ ├── GenerationModelConfig.java │ │ │ │ ├── IAMConfig.java │ │ │ │ ├── LangChain4jWatsonxConfig.java │ │ │ │ ├── LangChain4jWatsonxFixedRuntimeConfig.java │ │ │ │ ├── ScoringModelConfig.java │ │ │ │ └── TextExtractionConfig.java │ │ │ └── services │ │ │ ├── GoogleSearchService.java │ │ │ ├── WeatherService.java │ │ │ └── WebCrawlerService.java │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml │ └── test │ └── java │ └── io │ └── quarkiverse │ └── langchain4j │ └── watsonx │ └── runtime │ └── DisabledModelsWatsonRecorderTest.java ├── mvnw ├── mvnw.cmd ├── pom.xml ├── quarkus-integrations ├── pom.xml └── websockets-next │ ├── deployment │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── websockets │ │ └── next │ │ └── deployment │ │ └── WebSocketsNextProcessor.java │ ├── pom.xml │ ├── runtime │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── websockets │ │ │ └── next │ │ │ └── runtime │ │ │ └── WebSocketConnectionDefaultMemoryIdProvider.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ ├── quarkus-extension.yaml │ │ └── services │ │ └── io.quarkiverse.langchain4j.spi.DefaultMemoryIdProvider │ └── tests │ ├── pom.xml │ └── src │ └── test │ └── java │ └── io │ └── quarkiverse │ └── langchain4j │ └── websockets │ └── next │ └── tests │ └── WebSocketsNextTest.java ├── rag ├── easy-rag │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ ├── main │ │ │ └── java │ │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── deployment │ │ │ │ └── EasyRagProcessor.java │ │ │ └── test │ │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── test │ │ │ │ ├── EasyRagManualTriggerTest.java │ │ │ │ ├── EasyRagNotRecursiveTest.java │ │ │ │ ├── EasyRagPathMatcherTest.java │ │ │ │ ├── EasyRagReuseEmbeddingsAlreadyExistTest.java │ │ │ │ ├── EasyRagReuseEmbeddingsDontAlreadyExistBaseTest.java │ │ │ │ ├── EasyRagReuseEmbeddingsDontAlreadyExistTest.java │ │ │ │ ├── EasyRagReuseEmbeddingsFileNotSetTest.java │ │ │ │ ├── EasyRagTest.java │ │ │ │ └── EasyRagWithExplicitAugmentorTest.java │ │ │ └── resources │ │ │ ├── embeddings │ │ │ └── embeddings.json │ │ │ └── ragdocuments │ │ │ ├── charlie.pdf │ │ │ └── subdirectory │ │ │ └── david.odt │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── codestarts │ │ └── quarkus │ │ │ └── langchain4j-easyrag-codestart │ │ │ ├── base │ │ │ ├── README.tpl.qute.md │ │ │ ├── easy-rag-catalog │ │ │ │ ├── elite-money-market-account.odt │ │ │ │ ├── retirement-money-market.txt │ │ │ │ ├── smart-checking-account.pdf │ │ │ │ └── standard-saving-account.txt │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── resources │ │ │ │ └── application.yml │ │ │ ├── codestart.yml │ │ │ └── java │ │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── org │ │ │ └── acme │ │ │ └── Bot.java │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── easyrag │ │ │ ├── EasyRagManualIngestion.java │ │ │ └── runtime │ │ │ ├── EasyRagConfig.java │ │ │ ├── EasyRagIngestor.java │ │ │ ├── EasyRagRecorder.java │ │ │ ├── EasyRetrievalAugmentor.java │ │ │ └── IngestionStrategy.java │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml ├── parsers-base │ ├── deployment │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── deployment │ │ │ └── parsers │ │ │ └── base │ │ │ └── DocumentSupportProcessor.java │ ├── pom.xml │ └── runtime │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ └── resources │ │ └── META-INF │ │ ├── beans.xml │ │ └── quarkus-extension.yaml └── pom.xml ├── samples ├── analyze-pdf-document │ ├── README.md │ ├── pom.xml │ └── src │ │ ├── main │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── sample │ │ │ │ ├── PdfDocumentAnalyzer.java │ │ │ │ ├── PdfDocumentAnalyzerResource.java │ │ │ │ └── RentalReport.java │ │ └── resources │ │ │ ├── META-INF │ │ │ └── resources │ │ │ │ └── index.html │ │ │ ├── application.properties │ │ │ └── rental.pdf │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── sample │ │ └── PdfDocumentAnalyzerResourceTest.java ├── chatbot-easy-rag-kotlin │ ├── .editorconfig │ ├── .gitignore │ ├── .mvn │ │ ├── jvm.config │ │ └── maven.config │ ├── LINKS.md │ ├── README.md │ ├── catalog │ │ ├── easytrade-starter-portfolio.md │ │ ├── elite-money-market-account.odt │ │ ├── horizon-financial-brochure.html │ │ ├── retirement-money-market.txt │ │ ├── smart-checking-account.pdf │ │ └── standard-saving-account.txt │ ├── pom.xml │ ├── renovate.json │ └── src │ │ ├── main │ │ ├── kotlin │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── sample │ │ │ │ └── chatbot │ │ │ │ ├── Assistant.kt │ │ │ │ ├── AssistantExtensions.kt │ │ │ │ ├── AssistantService.kt │ │ │ │ ├── ChatBotWebSocket.kt │ │ │ │ ├── ImportmapResource.kt │ │ │ │ ├── Models.kt │ │ │ │ ├── internal │ │ │ │ └── MailerExtensions.kt │ │ │ │ ├── processing │ │ │ │ └── QuestionProcessor.kt │ │ │ │ ├── sentiment │ │ │ │ ├── Sentiment.kt │ │ │ │ └── SentimentAnalyzer.kt │ │ │ │ └── tools │ │ │ │ ├── CustomerCallbackScheduler.kt │ │ │ │ ├── MarketData.kt │ │ │ │ └── McpToolProviderSupplier.kt │ │ └── resources │ │ │ ├── META-INF │ │ │ └── resources │ │ │ │ ├── components │ │ │ │ ├── demo-chat.js │ │ │ │ └── demo-title.js │ │ │ │ ├── fonts │ │ │ │ └── red-hat-font.min.css │ │ │ │ ├── images │ │ │ │ └── app-architecture.png │ │ │ │ └── index.html │ │ │ ├── application-dev.properties │ │ │ ├── application.properties │ │ │ └── prompts │ │ │ └── assistant-system-prompt.md │ │ └── test │ │ └── kotlin │ │ └── io │ │ └── quarkiverse │ │ └── sample │ │ └── chatbot │ │ └── SentimentAnalyzerTest.kt ├── chatbot-easy-rag │ ├── README.md │ ├── catalog │ │ ├── elite-money-market-account.odt │ │ ├── retirement-money-market.txt │ │ ├── smart-checking-account.pdf │ │ └── standard-saving-account.txt │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ └── chatbot │ │ │ ├── Bot.java │ │ │ ├── ChatBotWebSocket.java │ │ │ └── ImportmapResource.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ ├── components │ │ │ ├── demo-chat.js │ │ │ └── demo-title.js │ │ │ ├── fonts │ │ │ └── red-hat-font.min.css │ │ │ ├── images │ │ │ └── chatbot-architecture.png │ │ │ └── index.html │ │ └── application.properties ├── chatbot-web-search │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ └── chatbot │ │ │ ├── AdditionalTools.java │ │ │ ├── Bot.java │ │ │ ├── ChatBotWebSocket.java │ │ │ ├── ImportmapResource.java │ │ │ └── WebSearchRetrievalAugmentor.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ ├── components │ │ │ ├── demo-chat.js │ │ │ └── demo-title.js │ │ │ ├── fonts │ │ │ └── red-hat-font.min.css │ │ │ └── index.html │ │ └── application.properties ├── chatbot │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ └── chatbot │ │ │ ├── AugmentorExample.java │ │ │ ├── Bot.java │ │ │ ├── ChatBotWebSocket.java │ │ │ ├── ImportmapResource.java │ │ │ └── IngestorExample.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ ├── components │ │ │ ├── demo-chat.js │ │ │ └── demo-title.js │ │ │ ├── fonts │ │ │ └── red-hat-font.min.css │ │ │ ├── images │ │ │ └── chatbot-architecture.png │ │ │ └── index.html │ │ ├── application.properties │ │ └── catalog │ │ ├── elite-money-market-account.txt │ │ ├── retirement-money-market.txt │ │ ├── smart-checking-account.txt │ │ └── standard-saving-account.txt ├── cli-translator │ ├── README.md │ ├── examples │ │ ├── english.txt │ │ ├── french.txt │ │ ├── german.txt │ │ ├── greek.txt │ │ ├── translate.jvm │ │ └── translate.native │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ └── translator │ │ │ ├── TranslateCommand.java │ │ │ └── TranslatorAiService.java │ │ └── resources │ │ └── application.properties ├── email-a-poem-kotlin │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── kotlin │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ ├── EmailMeAPoemResource.kt │ │ │ ├── EmailService.kt │ │ │ └── MyAiService.kt │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ └── index.html │ │ ├── application-dev.properties │ │ └── application.properties ├── email-a-poem │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ ├── EmailMeAPoemResource.java │ │ │ ├── EmailService.java │ │ │ └── MyAiService.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ └── index.html │ │ └── application.properties ├── fraud-detection │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ ├── ChatMemoryBean.java │ │ │ ├── Customer.java │ │ │ ├── CustomerRepository.java │ │ │ ├── FraudDetectionAi.java │ │ │ ├── FraudDetectionResource.java │ │ │ ├── Setup.java │ │ │ ├── Transaction.java │ │ │ └── TransactionRepository.java │ │ └── resources │ │ └── application.properties ├── image-to-plantuml │ ├── README.md │ ├── examples │ │ ├── image-to-plantuml.jvm │ │ ├── image-to-plantuml.native │ │ ├── qia-1-5.webp │ │ ├── qia-1-6.webp │ │ └── qia-1-7.webp │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ └── plantuml │ │ │ ├── ImageToPlantUMLCommand.java │ │ │ ├── ImageToPlantUMLService.java │ │ │ ├── Images.java │ │ │ └── PlantUMLValidator.java │ │ └── resources │ │ └── application.properties ├── jbang-joke-bot │ ├── README.md │ └── jokes.java ├── mcp-sse-client-server │ ├── README.md │ ├── mcp-client │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── sample │ │ │ │ └── chatbot │ │ │ │ ├── AiWeatherService.java │ │ │ │ ├── ChatBotWebSocket.java │ │ │ │ ├── ImportmapResource.java │ │ │ │ └── MyWeatherResource.java │ │ │ └── resources │ │ │ ├── META-INF │ │ │ └── resources │ │ │ │ ├── components │ │ │ │ ├── demo-chat.js │ │ │ │ └── demo-title.js │ │ │ │ ├── fonts │ │ │ │ └── red-hat-font.min.css │ │ │ │ └── index.html │ │ │ └── application.properties │ ├── mcp-server │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── sample │ │ │ │ └── Weather.java │ │ │ └── resources │ │ │ └── application.properties │ └── pom.xml ├── mcp-tools │ ├── README.md │ ├── playground │ │ └── hello.txt │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ └── chatbot │ │ │ ├── Bot.java │ │ │ ├── ChatBotWebSocket.java │ │ │ ├── FilesystemToolProvider.java │ │ │ └── ImportmapResource.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ ├── components │ │ │ ├── demo-chat.js │ │ │ └── demo-title.js │ │ │ ├── fonts │ │ │ └── red-hat-font.min.css │ │ │ ├── images │ │ │ └── chatbot-architecture.png │ │ │ └── index.html │ │ └── application.properties ├── movie-similarity-search │ ├── .mvn │ │ └── wrapper │ │ │ └── maven-wrapper.properties │ ├── pom.xml │ └── src │ │ └── main │ │ ├── docker │ │ ├── Dockerfile.jvm │ │ ├── Dockerfile.legacy-jar │ │ ├── Dockerfile.native │ │ └── Dockerfile.native-micro │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ ├── Movie.java │ │ │ ├── MovieLoader.java │ │ │ ├── MovieRecommendationService.java │ │ │ └── MovieResource.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ └── index.html │ │ ├── application.properties │ │ └── movies.csv ├── pom.xml ├── react-chatbot │ ├── README.md │ ├── pom.xml │ ├── rest.http │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── react │ │ │ └── chatbot │ │ │ ├── ChatBotResource.java │ │ │ ├── QutePlaceholder.java │ │ │ ├── ReActAgent.java │ │ │ └── Tools.java │ │ └── resources │ │ └── application.properties ├── review-triage │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ ├── Evaluation.java │ │ │ ├── ImportmapResource.java │ │ │ ├── ReviewResource.java │ │ │ ├── TriageService.java │ │ │ └── TriagedReview.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ ├── components │ │ │ ├── demo-review.js │ │ │ └── demo-title.js │ │ │ ├── fonts │ │ │ └── red-hat-font.min.css │ │ │ └── index.html │ │ └── application.properties ├── secure-fraud-detection │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ ├── Customer.java │ │ │ ├── CustomerConfig.java │ │ │ ├── CustomerRepository.java │ │ │ ├── FraudDetectionAi.java │ │ │ ├── FraudDetectionContentRetriever.java │ │ │ ├── FraudDetectionResource.java │ │ │ ├── FraudDetectionRetrievalAugmentor.java │ │ │ ├── LoginResource.java │ │ │ ├── LogoutResource.java │ │ │ ├── MissingCustomerException.java │ │ │ ├── MissingCustomerExceptionMapper.java │ │ │ ├── MissingCustomerResource.java │ │ │ ├── Setup.java │ │ │ ├── Transaction.java │ │ │ └── TransactionRepository.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ ├── images │ │ │ └── google.png │ │ │ └── index.html │ │ ├── application.properties │ │ └── templates │ │ ├── fraudDetection.html │ │ └── missingCustomer.html ├── secure-mcp-sse-client-server │ ├── README.md │ ├── pom.xml │ ├── secure-mcp-client │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ │ └── main │ │ │ ├── java │ │ │ └── io │ │ │ │ └── quarkiverse │ │ │ │ └── langchain4j │ │ │ │ └── sample │ │ │ │ ├── LoginResource.java │ │ │ │ └── PoemResource.java │ │ │ └── resources │ │ │ ├── META-INF │ │ │ └── resources │ │ │ │ └── index.html │ │ │ ├── application.properties │ │ │ └── templates │ │ │ └── poem.html │ └── secure-mcp-server │ │ ├── README.md │ │ ├── pom.xml │ │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ ├── Identity.java │ │ │ ├── SecurityIdentityPermissionAugmentor.java │ │ │ └── UserNameProvider.java │ │ └── resources │ │ ├── application.properties │ │ └── import.sql ├── secure-poem-multiple-models │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ ├── LoginResource.java │ │ │ ├── LogoutResource.java │ │ │ └── PoemResource.java │ │ └── resources │ │ ├── META-INF │ │ └── resources │ │ │ ├── images │ │ │ ├── entraId.svg │ │ │ └── google.png │ │ │ └── index.html │ │ ├── application.properties │ │ └── templates │ │ └── poem.html ├── secure-sql-chatbot │ ├── README.md │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ └── chatbot │ │ │ ├── ChatBotWebSocket.java │ │ │ ├── CsvIngestorExample.java │ │ │ ├── ImportmapResource.java │ │ │ ├── LoginResource.java │ │ │ ├── LogoutResource.java │ │ │ ├── MissingMovieWatcherException.java │ │ │ ├── Movie.java │ │ │ ├── MovieDatabaseContentRetriever.java │ │ │ ├── MovieMuse.java │ │ │ ├── MovieMuseRetrievalAugmentor.java │ │ │ ├── MovieMuseSupport.java │ │ │ ├── MovieSchemaSupport.java │ │ │ ├── MovieTableIntegrator.java │ │ │ ├── MovieWatcher.java │ │ │ ├── MovieWatcherConfig.java │ │ │ ├── MovieWatcherRepository.java │ │ │ ├── Setup.java │ │ │ ├── TicketHttpUpgradeCheck.java │ │ │ └── WebSocketTickets.java │ │ └── resources │ │ ├── META-INF │ │ ├── resources │ │ │ ├── components │ │ │ │ ├── demo-title.js │ │ │ │ └── demo-welcome.js │ │ │ ├── fonts │ │ │ │ └── red-hat-font.min.css │ │ │ ├── images │ │ │ │ ├── chatbot-architecture.png │ │ │ │ └── google.png │ │ │ └── index.html │ │ └── services │ │ │ └── org.hibernate.integrator.spi.Integrator │ │ ├── application.properties │ │ ├── data │ │ └── movies.csv │ │ ├── server-keystore.p12 │ │ └── templates │ │ └── movieMuse.html ├── sql-chatbot │ ├── README.md │ ├── moviemuse.png │ ├── pom.xml │ └── src │ │ └── main │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── sample │ │ │ └── chatbot │ │ │ ├── ChatBotWebSocket.java │ │ │ ├── CsvIngestorExample.java │ │ │ ├── ImportmapResource.java │ │ │ ├── Movie.java │ │ │ ├── MovieDatabaseContentRetriever.java │ │ │ ├── MovieMuse.java │ │ │ ├── MovieMuseRetrievalAugmentor.java │ │ │ ├── MovieMuseSupport.java │ │ │ ├── MovieSchemaSupport.java │ │ │ └── MovieTableIntegrator.java │ │ └── resources │ │ ├── META-INF │ │ ├── resources │ │ │ ├── components │ │ │ │ ├── demo-chat.js │ │ │ │ └── demo-title.js │ │ │ ├── fonts │ │ │ │ └── red-hat-font.min.css │ │ │ ├── images │ │ │ │ └── chatbot-architecture.png │ │ │ └── index.html │ │ └── services │ │ │ └── org.hibernate.integrator.spi.Integrator │ │ ├── application.properties │ │ └── data │ │ └── movies.csv └── weather-agent │ ├── README.md │ ├── pom.xml │ └── src │ └── main │ ├── java │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── weather │ │ └── agent │ │ ├── CityExtractorAgent.java │ │ ├── WeatherForecastAgent.java │ │ ├── WeatherResource.java │ │ ├── geo │ │ ├── GeoCodingService.java │ │ ├── GeoResult.java │ │ └── GeoResults.java │ │ └── weather │ │ ├── Daily.java │ │ ├── DailyUnits.java │ │ ├── DailyWeatherData.java │ │ ├── WeatherForecast.java │ │ ├── WeatherForecastService.java │ │ └── WmoCode.java │ └── resources │ └── application.properties ├── testing-internal ├── pom.xml └── src │ └── main │ └── java │ └── io │ └── quarkiverse │ └── langchain4j │ └── testing │ └── internal │ └── WiremockAware.java ├── testing ├── core │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── guardrails │ │ │ ├── GuardrailAssertions.java │ │ │ ├── GuardrailResultAssert.java │ │ │ ├── InputGuardrailResultAssert.java │ │ │ └── OutputGuardrailResultAssert.java │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── guardrails │ │ ├── ClaimInfo.java │ │ ├── EmailContainsRequiredInformationOutputGuardrail.java │ │ ├── EmailContainsRequiredInformationOutputGuardrailTests.java │ │ ├── EmailEndsAppropriatelyOutputGuardrail.java │ │ ├── EmailEndsAppropriatelyOutputGuardrailTests.java │ │ ├── EmailStartsAppropriatelyOutputGuardrail.java │ │ └── EmailStartsAppropriatelyOutputGuardrailTests.java ├── pom.xml └── scorer │ ├── pom.xml │ ├── scorer-core │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── testing │ │ │ └── scorer │ │ │ ├── EvaluationReport.java │ │ │ ├── EvaluationSample.java │ │ │ ├── EvaluationStrategy.java │ │ │ ├── Parameter.java │ │ │ ├── Parameters.java │ │ │ ├── Samples.java │ │ │ ├── Scorer.java │ │ │ └── YamlLoader.java │ │ └── test │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── testing │ │ └── scorer │ │ ├── EvaluationReportTest.java │ │ ├── EvaluationSampleTest.java │ │ ├── ParameterTest.java │ │ ├── ParametersTest.java │ │ ├── SamplesTest.java │ │ ├── ScorerTest.java │ │ └── YamlLoaderTest.java │ ├── scorer-junit5 │ ├── pom.xml │ └── src │ │ ├── main │ │ └── java │ │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── scorer │ │ │ └── junit5 │ │ │ ├── AiScorer.java │ │ │ ├── SampleLocation.java │ │ │ ├── ScorerConfiguration.java │ │ │ └── ScorerExtension.java │ │ └── test │ │ ├── java │ │ └── io │ │ │ └── quarkiverse │ │ │ └── langchain4j │ │ │ └── scorer │ │ │ └── junit5 │ │ │ └── test │ │ │ └── ScorerExtensionTest.java │ │ └── resources │ │ └── test-samples.yaml │ └── scorer-strategies │ ├── ai-judge │ ├── pom.xml │ └── src │ │ └── main │ │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── testing │ │ └── scorer │ │ └── judge │ │ └── AiJudgeStrategy.java │ └── semantic-similarity │ ├── pom.xml │ └── src │ └── main │ └── java │ └── io │ └── quarkiverse │ └── langchain4j │ └── testing │ └── scorer │ └── similarity │ └── SemanticSimilarityStrategy.java └── tools ├── pom.xml └── tavily ├── deployment ├── pom.xml └── src │ ├── main │ └── java │ │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── tavily │ │ └── deployment │ │ └── TavilyProcessor.java │ └── test │ └── java │ └── io │ └── quarkiverse │ └── langchain4j │ └── tavily │ └── test │ └── TavilyTest.java ├── pom.xml └── runtime ├── pom.xml └── src ├── main ├── java │ └── io │ │ └── quarkiverse │ │ └── langchain4j │ │ └── tavily │ │ ├── QuarkusTavilyWebSearchEngine.java │ │ ├── SearchDepth.java │ │ ├── ShadowSensitiveData.java │ │ └── runtime │ │ ├── TavilyClient.java │ │ ├── TavilyConfig.java │ │ ├── TavilyRecorder.java │ │ ├── TavilyResponse.java │ │ ├── TavilySearchRequest.java │ │ └── TavilySearchResult.java └── resources │ └── META-INF │ ├── beans.xml │ └── quarkus-extension.yaml └── test └── java └── io └── quarkiverse └── langchain4j └── tavily └── ShadowSensitiveDataTest.java /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | # Lines starting with '#' are comments. 2 | # Each line is a file pattern followed by one or more owners. 3 | 4 | # More details are here: https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners 5 | 6 | # The '*' pattern is global owners. 7 | 8 | # Order is important. The last matching pattern has the most precedence. 9 | # The folders are ordered as follows: 10 | 11 | # In each subsection folders are ordered first by depth, then alphabetically. 12 | # This should make it easy to add new rules without breaking existing ones. 13 | 14 | * @quarkiverse/quarkiverse-langchain4j 15 | -------------------------------------------------------------------------------- /.github/project.yml: -------------------------------------------------------------------------------- 1 | release: 2 | current-version: "1.0.0" 3 | next-version: "999-SNAPSHOT" 4 | 5 | -------------------------------------------------------------------------------- /.github/quarkus-ecosystem-test: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | set -e 3 | 4 | # update the versions 5 | mvn --settings .github/quarkus-ecosystem-maven-settings.xml -B versions:set-property -Dproperty=quarkus.version -DnewVersion=${QUARKUS_VERSION} -DgenerateBackupPoms=false 6 | mvn --settings .github/quarkus-ecosystem-maven-settings.xml -B versions:set-property -Dproperty=version.io.quarkus -DnewVersion=${QUARKUS_VERSION} -DgenerateBackupPoms=false 7 | 8 | # run the tests while skipping docs 9 | mvn --settings .github/quarkus-ecosystem-maven-settings.xml -B clean install -Dnative -Dquarkus.native.container-build=true --projects '!io.quarkiverse.langchain4j:quarkus-langchain4j-docs' --fail-at-end -e 10 | -------------------------------------------------------------------------------- /.github/quarkus-github-bot.yml: -------------------------------------------------------------------------------- 1 | --- 2 | # The format of this file is documented here: 3 | # https://github.com/quarkusio/quarkus-github-bot#triage-issues 4 | features: [ANALYZE_WORKFLOW_RUN_RESULTS] 5 | workflowRunAnalysis: 6 | workflows: ["Build (on pull request)"] 7 | -------------------------------------------------------------------------------- /.github/workflows/hooks/pre-prepare-release.sh: -------------------------------------------------------------------------------- 1 | while IFS= read -r -d '' pom 2 | do 3 | ./mvnw org.codehaus.mojo:versions-maven-plugin:2.16.2:set-property -Dproperty=quarkus-langchain4j.version -DnewVersion=${CURRENT_VERSION} -f "$(dirname "$pom")"; 4 | done < <(find samples/ -name pom.xml -print0) 5 | git commit -a -m "Update dependencies in samples" 6 | 7 | jbang .github/updateReadme.java "${CURRENT_VERSION}" 8 | git commit -a -m "Update README to ${CURRENT_VERSION}" 9 | -------------------------------------------------------------------------------- /.github/workflows/pre-release.yml: -------------------------------------------------------------------------------- 1 | name: Quarkiverse Pre Release 2 | 3 | on: 4 | pull_request: 5 | paths: 6 | - '.github/project.yml' 7 | 8 | concurrency: 9 | group: ${{ github.workflow }}-${{ github.ref }} 10 | cancel-in-progress: true 11 | 12 | jobs: 13 | pre-release: 14 | name: Pre-Release 15 | uses: quarkiverse/.github/.github/workflows/pre-release.yml@main 16 | secrets: inherit 17 | -------------------------------------------------------------------------------- /.github/workflows/release-prepare.yml: -------------------------------------------------------------------------------- 1 | name: Quarkiverse Prepare Release 2 | 3 | on: 4 | pull_request: 5 | types: [ closed ] 6 | paths: 7 | - '.github/project.yml' 8 | 9 | concurrency: 10 | group: ${{ github.workflow }}-${{ github.ref }} 11 | cancel-in-progress: true 12 | 13 | jobs: 14 | prepare-release: 15 | name: Prepare Release 16 | if: ${{ github.event.pull_request.merged == true}} 17 | uses: quarkiverse/.github/.github/workflows/prepare-release.yml@main 18 | with: 19 | java_version: 23 # use 23 so we can support running the Llama3 module on anything 21+ 20 | secrets: inherit 21 | -------------------------------------------------------------------------------- /.idea/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/.idea/icon.png -------------------------------------------------------------------------------- /.sdkmanrc: -------------------------------------------------------------------------------- 1 | # Enable auto-env through the sdkman_auto_env config 2 | # Add key=value pairs of SDKs to use below 3 | java=17.0.15-tem 4 | -------------------------------------------------------------------------------- /codestarts/chatbot/deployment/src/main/java/io/quarkiverse/langchain4j/chatbot/deployment/Langchain4jChatbotProcessor.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.chatbot.deployment; 2 | 3 | import io.quarkus.deployment.annotations.BuildStep; 4 | import io.quarkus.deployment.builditem.FeatureBuildItem; 5 | 6 | class Langchain4jChatbotProcessor { 7 | 8 | private static final String FEATURE = "langchain4j-chatbot"; 9 | 10 | @BuildStep 11 | FeatureBuildItem feature() { 12 | return new FeatureBuildItem(FEATURE); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /codestarts/chatbot/integration-tests/src/main/resources/application.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/codestarts/chatbot/integration-tests/src/main/resources/application.properties -------------------------------------------------------------------------------- /codestarts/chatbot/runtime/src/main/codestarts/quarkus/langchain4j-chatbot-codestart/base/src/main/resources/META-INF/resources/icons/font-awesome.js: -------------------------------------------------------------------------------- 1 | // import './font-awesome-brands.js'; 2 | // import './font-awesome-regular.js'; 3 | import './font-awesome-solid.js'; 4 | 5 | // export * from './font-awesome-brands.js'; 6 | // export * from './font-awesome-regular.js'; 7 | export * from './font-awesome-solid.js'; 8 | -------------------------------------------------------------------------------- /codestarts/chatbot/runtime/src/main/codestarts/quarkus/langchain4j-chatbot-codestart/java/src/main/java/org/acme/ChatBotService.java: -------------------------------------------------------------------------------- 1 | package org.acme; 2 | 3 | import io.quarkiverse.langchain4j.RegisterAiService; 4 | import io.smallrye.mutiny.Multi; 5 | import jakarta.enterprise.context.SessionScoped; 6 | 7 | @SessionScoped 8 | @RegisterAiService 9 | public interface ChatBotService { 10 | 11 | Multi chat(String userMessage); 12 | } 13 | -------------------------------------------------------------------------------- /codestarts/chatbot/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: Langchain4j - Codestarts - Chatbot 2 | #description: Do something useful. 3 | metadata: 4 | # keywords: 5 | # - langchain4j-chatbot 6 | # guide: https://quarkiverse.github.io/quarkiverse-docs/langchain4j-chatbot/dev/ # To create and publish this guide, see https://github.com/quarkiverse/quarkiverse/wiki#documenting-your-extension 7 | # categories: 8 | # - "miscellaneous" 9 | # status: "preview" 10 | codestart: 11 | name: langchain4j-chatbot 12 | languages: 13 | - "java" 14 | artifact: "io.quarkiverse.langchain4j:quarkus-langchain4j-chatbot:codestarts:jar:${project.version}" 15 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/AsmUtil.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment; 2 | 3 | import java.util.function.Function; 4 | 5 | import org.jboss.jandex.GenericSignature; 6 | import org.jboss.jandex.Type; 7 | 8 | class AsmUtil { 9 | 10 | static String getSignature(Type type, Function typeVariableSubstitution) { 11 | StringBuilder result = new StringBuilder(); 12 | GenericSignature.forType(type, typeVariableSubstitution, result); 13 | return result.toString(); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/EmbeddingStoreBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment; 2 | 3 | import io.quarkus.builder.item.MultiBuildItem; 4 | 5 | /** 6 | * Marker that an embedding store was registered in the CDI container. 7 | */ 8 | public final class EmbeddingStoreBuildItem extends MultiBuildItem { 9 | } 10 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/RequireOnnxRuntimeBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment; 2 | 3 | import io.quarkus.builder.item.SimpleBuildItem; 4 | 5 | /** 6 | * A build item that is used to require the OnnxRuntime to be built into the native image. 7 | */ 8 | public final class RequireOnnxRuntimeBuildItem extends SimpleBuildItem { 9 | } 10 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/config/ChatModelConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.config; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigGroup; 6 | 7 | @ConfigGroup 8 | public interface ChatModelConfig { 9 | 10 | /** 11 | * The model provider to use 12 | */ 13 | Optional provider(); 14 | } 15 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/config/EmbeddingModelConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.config; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigGroup; 6 | 7 | @ConfigGroup 8 | public interface EmbeddingModelConfig { 9 | /** 10 | * The model provider to use 11 | */ 12 | Optional provider(); 13 | } 14 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/config/ImageModelConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.config; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigGroup; 6 | 7 | @ConfigGroup 8 | public interface ImageModelConfig { 9 | 10 | /** 11 | * The model provider to use 12 | */ 13 | Optional provider(); 14 | } 15 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/config/ModerationModelConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.config; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigGroup; 6 | 7 | @ConfigGroup 8 | public interface ModerationModelConfig { 9 | 10 | /** 11 | * The model provider to use 12 | */ 13 | Optional provider(); 14 | } 15 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/config/ScoringModelConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.config; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigGroup; 6 | 7 | @ConfigGroup 8 | public interface ScoringModelConfig { 9 | /** 10 | * The model provider to use 11 | */ 12 | Optional provider(); 13 | } 14 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/devui/AiServiceInfo.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.devui; 2 | 3 | import java.util.List; 4 | 5 | public class AiServiceInfo { 6 | 7 | private String clazz; 8 | private List tools; 9 | 10 | public AiServiceInfo(String clazz, List tools) { 11 | this.clazz = clazz; 12 | this.tools = tools; 13 | } 14 | 15 | public List getTools() { 16 | return tools; 17 | } 18 | 19 | public String getClazz() { 20 | return clazz; 21 | } 22 | 23 | } 24 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/AutoCreateEmbeddingModelBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | import io.quarkus.builder.item.SimpleBuildItem; 4 | 5 | /** 6 | * Request to generate an embedding model even if there are no 7 | * non-synthetic injection points for it. This is used by the Easy RAG 8 | * extension to have an embedding model created automatically. 9 | */ 10 | public final class AutoCreateEmbeddingModelBuildItem extends SimpleBuildItem { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/ChatModelProviderCandidateBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | import io.quarkus.builder.item.MultiBuildItem; 4 | 5 | public final class ChatModelProviderCandidateBuildItem extends MultiBuildItem implements ProviderHolder { 6 | 7 | private final String provider; 8 | 9 | public ChatModelProviderCandidateBuildItem(String provider) { 10 | this.provider = provider; 11 | } 12 | 13 | public String getProvider() { 14 | return provider; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/DevServicesModelRequired.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | public interface DevServicesModelRequired { 4 | 5 | String getProvider(); 6 | 7 | String getModelName(); 8 | 9 | String getBaseUrlProperty(); 10 | } 11 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/DevServicesOllamaConfigBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | import java.util.Map; 4 | 5 | import io.quarkus.builder.item.SimpleBuildItem; 6 | 7 | /** 8 | * Build item used to carry running values to Dev UI. 9 | */ 10 | public final class DevServicesOllamaConfigBuildItem extends SimpleBuildItem { 11 | 12 | private final Map config; 13 | 14 | public DevServicesOllamaConfigBuildItem(Map config) { 15 | this.config = config; 16 | } 17 | 18 | public Map getConfig() { 19 | return config; 20 | } 21 | 22 | } -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/EmbeddingModelProviderCandidateBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | import io.quarkus.builder.item.MultiBuildItem; 4 | 5 | public final class EmbeddingModelProviderCandidateBuildItem extends MultiBuildItem implements ProviderHolder { 6 | 7 | private final String provider; 8 | 9 | public EmbeddingModelProviderCandidateBuildItem(String provider) { 10 | this.provider = provider; 11 | } 12 | 13 | public String getProvider() { 14 | return provider; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/ImageModelProviderCandidateBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | import io.quarkus.builder.item.MultiBuildItem; 4 | 5 | public final class ImageModelProviderCandidateBuildItem extends MultiBuildItem implements ProviderHolder { 6 | 7 | private final String provider; 8 | 9 | public ImageModelProviderCandidateBuildItem(String provider) { 10 | this.provider = provider; 11 | } 12 | 13 | public String getProvider() { 14 | return provider; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/InMemoryEmbeddingStoreBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | import io.quarkus.builder.item.SimpleBuildItem; 4 | 5 | /** 6 | * Marker that an in-memory embedding store was registered in the CDI container (by the Easy RAG extension). 7 | */ 8 | public final class InMemoryEmbeddingStoreBuildItem extends SimpleBuildItem { 9 | } 10 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/ModerationModelProviderCandidateBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | import io.quarkus.builder.item.MultiBuildItem; 4 | 5 | public final class ModerationModelProviderCandidateBuildItem extends MultiBuildItem implements ProviderHolder { 6 | 7 | private final String provider; 8 | 9 | public ModerationModelProviderCandidateBuildItem(String provider) { 10 | this.provider = provider; 11 | } 12 | 13 | public String getProvider() { 14 | return provider; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/ProviderHolder.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | public interface ProviderHolder { 4 | 5 | String getProvider(); 6 | } 7 | -------------------------------------------------------------------------------- /core/deployment/src/main/java/io/quarkiverse/langchain4j/deployment/items/ScoringModelProviderCandidateBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.deployment.items; 2 | 3 | import io.quarkus.builder.item.MultiBuildItem; 4 | 5 | public final class ScoringModelProviderCandidateBuildItem extends MultiBuildItem implements ProviderHolder { 6 | 7 | private final String provider; 8 | 9 | public ScoringModelProviderCandidateBuildItem(String provider) { 10 | this.provider = provider; 11 | } 12 | 13 | public String getProvider() { 14 | return provider; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core/deployment/src/test/java/io/quarkiverse/langchain4j/test/Lists.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test; 2 | 3 | import java.util.List; 4 | 5 | public class Lists { 6 | 7 | public static T last(List list) { 8 | if (list.isEmpty()) { 9 | return null; 10 | } 11 | return list.get(list.size() - 1); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /core/deployment/src/test/java/io/quarkiverse/langchain4j/test/auth/GeminiModelAuthProvider.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test.auth; 2 | 3 | import jakarta.enterprise.context.ApplicationScoped; 4 | 5 | import io.quarkiverse.langchain4j.ModelName; 6 | import io.quarkiverse.langchain4j.auth.ModelAuthProvider; 7 | 8 | @ModelName("gemini") 9 | @ApplicationScoped 10 | public class GeminiModelAuthProvider implements ModelAuthProvider { 11 | 12 | @Override 13 | public String getAuthorization(Input input) { 14 | return null; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /core/deployment/src/test/java/io/quarkiverse/langchain4j/test/auth/GlobalModelAuthProvider.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test.auth; 2 | 3 | import jakarta.enterprise.context.ApplicationScoped; 4 | 5 | import io.quarkiverse.langchain4j.auth.ModelAuthProvider; 6 | 7 | @ApplicationScoped 8 | public class GlobalModelAuthProvider implements ModelAuthProvider { 9 | 10 | @Override 11 | public String getAuthorization(Input input) { 12 | return null; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /core/deployment/src/test/java/io/quarkiverse/langchain4j/test/auth/OpenaiModelAuthProvider.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test.auth; 2 | 3 | import jakarta.enterprise.context.ApplicationScoped; 4 | 5 | import io.quarkiverse.langchain4j.ModelName; 6 | import io.quarkiverse.langchain4j.auth.ModelAuthProvider; 7 | 8 | @ModelName("openai") 9 | @ApplicationScoped 10 | public class OpenaiModelAuthProvider implements ModelAuthProvider { 11 | 12 | @Override 13 | public String getAuthorization(Input input) { 14 | return null; 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /core/deployment/src/test/java/io/quarkiverse/langchain4j/test/guardrails/ValidationException.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test.guardrails; 2 | 3 | public class ValidationException extends RuntimeException { 4 | public ValidationException(String message) { 5 | super(message); 6 | } 7 | } -------------------------------------------------------------------------------- /core/deployment/src/test/java/io/quarkiverse/langchain4j/test/toolresolution/MyCustomToolProviderSupplier.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test.toolresolution; 2 | 3 | import java.util.function.Supplier; 4 | 5 | import jakarta.enterprise.context.ApplicationScoped; 6 | import jakarta.inject.Inject; 7 | 8 | import dev.langchain4j.service.tool.ToolProvider; 9 | 10 | @ApplicationScoped 11 | public class MyCustomToolProviderSupplier implements Supplier { 12 | @Inject 13 | MyCustomToolProvider myCustomToolProvider; 14 | 15 | @Override 16 | public ToolProvider get() { 17 | return myCustomToolProvider; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /core/deployment/src/test/java/io/quarkiverse/langchain4j/test/toolresolution/TestAiSupplier.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test.toolresolution; 2 | 3 | import java.util.function.Supplier; 4 | 5 | import dev.langchain4j.model.chat.ChatModel; 6 | 7 | public class TestAiSupplier implements Supplier { 8 | @Override 9 | public ChatModel get() { 10 | return new TestAiModel(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /core/deployment/src/test/java/io/quarkiverse/langchain4j/test/toolresolution/ToolsClass.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test.toolresolution; 2 | 3 | import jakarta.enterprise.context.ApplicationScoped; 4 | 5 | import dev.langchain4j.agent.tool.Tool; 6 | 7 | @ApplicationScoped 8 | public class ToolsClass { 9 | 10 | @Tool 11 | public String hello() { 12 | return "EXPLICIT TOOL"; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /core/runtime-spi/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | 5 | io.quarkiverse.langchain4j 6 | quarkus-langchain4j-core-parent 7 | 999-SNAPSHOT 8 | 9 | 10 | 11 | quarkus-langchain4j-core-runtime-spi 12 | Quarkus LangChain4j - Core - Runtime - SPI 13 | 14 | 15 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/CreatedAware.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j; 2 | 3 | import static java.lang.annotation.RetentionPolicy.RUNTIME; 4 | 5 | import java.lang.annotation.ElementType; 6 | import java.lang.annotation.Retention; 7 | import java.lang.annotation.Target; 8 | 9 | /** 10 | * Used to make Quarkus aware of classes being used in {@link dev.langchain4j.service.AiServices#create} 11 | */ 12 | @Retention(RUNTIME) 13 | @Target(ElementType.TYPE) 14 | public @interface CreatedAware { 15 | } 16 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/InitialMessagesCreatedEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit; 2 | 3 | import java.util.Optional; 4 | 5 | import dev.langchain4j.data.message.SystemMessage; 6 | import dev.langchain4j.data.message.UserMessage; 7 | 8 | /** 9 | * Invoked when the original user and system messages have been created 10 | */ 11 | public interface InitialMessagesCreatedEvent extends LLMInteractionEvent { 12 | 13 | /** 14 | * @return the optional system message 15 | */ 16 | Optional systemMessage(); 17 | 18 | /** 19 | * @return the user message 20 | */ 21 | UserMessage userMessage(); 22 | } -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/LLMInteractionCompleteEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit; 2 | 3 | /** 4 | * Invoked when the final result of the AiService method has been computed 5 | */ 6 | public interface LLMInteractionCompleteEvent extends LLMInteractionEvent { 7 | /** 8 | * @return the result of the AiService method 9 | */ 10 | Object result(); 11 | } 12 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/LLMInteractionEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit; 2 | 3 | public interface LLMInteractionEvent { 4 | AuditSourceInfo sourceInfo(); 5 | } 6 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/LLMInteractionFailureEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit; 2 | 3 | /** 4 | * Invoked when there was an exception computing the result of the AiService method 5 | */ 6 | public interface LLMInteractionFailureEvent extends LLMInteractionEvent { 7 | /** 8 | * @return the error that occurred 9 | */ 10 | Exception error(); 11 | } 12 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/OutputGuardrailExecutedEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit; 2 | 3 | import io.quarkiverse.langchain4j.guardrails.OutputGuardrail; 4 | import io.quarkiverse.langchain4j.guardrails.OutputGuardrailParams; 5 | import io.quarkiverse.langchain4j.guardrails.OutputGuardrailResult; 6 | 7 | public interface OutputGuardrailExecutedEvent 8 | extends GuardrailExecutedEvent { 9 | } 10 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/ResponseFromLLMReceivedEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit; 2 | 3 | import dev.langchain4j.model.chat.response.ChatResponse; 4 | 5 | /** 6 | * Invoked with a response from an LLM. It is important to note that this can be invoked multiple times 7 | * when tools exist. 8 | */ 9 | public interface ResponseFromLLMReceivedEvent extends LLMInteractionEvent { 10 | /** 11 | * @return the chat response 12 | */ 13 | ChatResponse response(); 14 | } -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/ToolExecutedEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit; 2 | 3 | import dev.langchain4j.agent.tool.ToolExecutionRequest; 4 | 5 | /** 6 | * Invoked with a tool response from an LLM. It is important to note that this can be invoked multiple times 7 | * when tools exist. 8 | */ 9 | public interface ToolExecutedEvent extends LLMInteractionEvent { 10 | 11 | /** 12 | * @return the tool execution request 13 | */ 14 | ToolExecutionRequest request(); 15 | 16 | /** 17 | * @return the result of the tool execution 18 | */ 19 | String result(); 20 | } -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/internal/DefaultInitialMessagesCreatedEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit.internal; 2 | 3 | import java.util.Optional; 4 | 5 | import dev.langchain4j.data.message.SystemMessage; 6 | import dev.langchain4j.data.message.UserMessage; 7 | import io.quarkiverse.langchain4j.audit.AuditSourceInfo; 8 | import io.quarkiverse.langchain4j.audit.InitialMessagesCreatedEvent; 9 | 10 | public record DefaultInitialMessagesCreatedEvent(AuditSourceInfo sourceInfo, Optional systemMessage, 11 | UserMessage userMessage) implements InitialMessagesCreatedEvent { 12 | } -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/internal/DefaultLLMInteractionCompleteEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit.internal; 2 | 3 | import io.quarkiverse.langchain4j.audit.AuditSourceInfo; 4 | import io.quarkiverse.langchain4j.audit.LLMInteractionCompleteEvent; 5 | 6 | public record DefaultLLMInteractionCompleteEvent(AuditSourceInfo sourceInfo, 7 | Object result) implements LLMInteractionCompleteEvent { 8 | } -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/internal/DefaultLLMInteractionFailureEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit.internal; 2 | 3 | import io.quarkiverse.langchain4j.audit.AuditSourceInfo; 4 | import io.quarkiverse.langchain4j.audit.LLMInteractionFailureEvent; 5 | 6 | public record DefaultLLMInteractionFailureEvent(AuditSourceInfo sourceInfo, 7 | Exception error) implements LLMInteractionFailureEvent { 8 | } -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/internal/DefaultResponseFromLLMReceivedEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit.internal; 2 | 3 | import dev.langchain4j.model.chat.response.ChatResponse; 4 | import io.quarkiverse.langchain4j.audit.AuditSourceInfo; 5 | import io.quarkiverse.langchain4j.audit.ResponseFromLLMReceivedEvent; 6 | 7 | public record DefaultResponseFromLLMReceivedEvent(AuditSourceInfo sourceInfo, 8 | ChatResponse response) implements ResponseFromLLMReceivedEvent { 9 | } -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/audit/internal/DefaultToolExecutedEvent.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.audit.internal; 2 | 3 | import dev.langchain4j.agent.tool.ToolExecutionRequest; 4 | import io.quarkiverse.langchain4j.audit.AuditSourceInfo; 5 | import io.quarkiverse.langchain4j.audit.ToolExecutedEvent; 6 | 7 | public record DefaultToolExecutedEvent(AuditSourceInfo sourceInfo, ToolExecutionRequest request, 8 | String result) implements ToolExecutedEvent { 9 | } -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/cost/Cost.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.cost; 2 | 3 | import java.math.BigDecimal; 4 | 5 | public record Cost(BigDecimal number, String currencyCode) { 6 | 7 | public static Cost of(BigDecimal number, String currencyCode) { 8 | return new Cost(number == null ? BigDecimal.ZERO : number, currencyCode == null ? "UNKNOWN" : currencyCode); 9 | } 10 | 11 | @Override 12 | public String toString() { 13 | return number.toPlainString() + currencyCode; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/NamedConfigUtil.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime; 2 | 3 | public class NamedConfigUtil { 4 | 5 | public static final String DEFAULT_NAME = ""; 6 | 7 | public static boolean isDefault(String configName) { 8 | return DEFAULT_NAME.equals(configName); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/OptionalUtil.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime; 2 | 3 | import java.util.Optional; 4 | 5 | public class OptionalUtil { 6 | 7 | @SafeVarargs 8 | public static T firstOrDefault(T defaultValue, Optional... values) { 9 | for (Optional o : values) { 10 | if (o != null && o.isPresent()) { 11 | return o.get(); 12 | } 13 | } 14 | return defaultValue; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/aiservice/AiServiceClassCreateInfo.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.aiservice; 2 | 3 | import java.util.Map; 4 | 5 | /** 6 | * @param methodMap the key is a methodId generated at build time 7 | */ 8 | public record AiServiceClassCreateInfo(Map methodMap, String implClassName) { 9 | } 10 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/aiservice/AiServiceConstants.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.aiservice; 2 | 3 | public final class AiServiceConstants { 4 | 5 | private AiServiceConstants() { 6 | } 7 | 8 | public static final String AI_SERVICE_CLASS_NAME = "aiservice.classname"; 9 | public static final String AI_SERVICE_METHODNAME = "aiservice.methodname"; 10 | } 11 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/aiservice/ChatMemoryRemovable.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.aiservice; 2 | 3 | /** 4 | * Interface implemented by each AiService that allows the removal of chat memories from an AiService 5 | */ 6 | public interface ChatMemoryRemovable { 7 | 8 | void remove(Object... ids); 9 | } 10 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/aiservice/CommittableChatMemory.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.aiservice; 2 | 3 | import dev.langchain4j.memory.ChatMemory; 4 | 5 | /** 6 | * This is needed in order to make it possible defer updating {@link ChatMemory} until the implementation has completed 7 | * successfully. 8 | */ 9 | interface CommittableChatMemory extends ChatMemory { 10 | 11 | /** 12 | * Should be called to actually update the chat memory 13 | */ 14 | void commit(); 15 | } 16 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/aiservice/EmptyUserMessage.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.aiservice; 2 | 3 | import dev.langchain4j.data.message.UserMessage; 4 | 5 | public class EmptyUserMessage extends UserMessage { 6 | 7 | public static final EmptyUserMessage INSTANCE = new EmptyUserMessage(); 8 | 9 | private EmptyUserMessage() { 10 | super("Continue output. DO NOT look at this line. ONLY look at the content before this line and system instruction."); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/aiservice/GuardrailException.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.aiservice; 2 | 3 | /** 4 | * Exception thrown when an input or output guardrail validation fails. 5 | *

6 | * This exception is not intended to be used in guardrail implementation. 7 | */ 8 | public class GuardrailException extends RuntimeException { 9 | public GuardrailException(String message) { 10 | super(message); 11 | } 12 | 13 | public GuardrailException(String message, Throwable cause) { 14 | super(message, cause); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/config/GuardrailsConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.config; 2 | 3 | import io.smallrye.config.WithDefault; 4 | 5 | public interface GuardrailsConfig { 6 | 7 | int MAX_RETRIES_DEFAULT = 3; 8 | 9 | /** 10 | * Configures the maximum number of retries for the guardrail. 11 | * Sets it to 0 to disable retries. 12 | */ 13 | @WithDefault("" + MAX_RETRIES_DEFAULT) 14 | int maxRetries(); 15 | 16 | } 17 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/config/TracingConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.config; 2 | 3 | import io.smallrye.config.WithDefault; 4 | 5 | public interface TracingConfig { 6 | 7 | /** 8 | * If enabled, the prompt is included on the generated spans 9 | */ 10 | @WithDefault("false") 11 | Boolean includePrompt(); 12 | 13 | /** 14 | * If enabled, the completion is included on the generated spans 15 | */ 16 | @WithDefault("false") 17 | Boolean includeCompletion(); 18 | } 19 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/devui/OpenWebUIJsonRPCService.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.devui; 2 | 3 | import jakarta.enterprise.context.control.ActivateRequestContext; 4 | 5 | import org.eclipse.microprofile.config.ConfigProvider; 6 | 7 | @ActivateRequestContext 8 | public class OpenWebUIJsonRPCService { 9 | 10 | public String getConfigValue(String key) { 11 | try { 12 | return ConfigProvider.getConfig().getValue(key, String.class); 13 | } catch (Exception e) { 14 | return null; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/devui/json/MessageType.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.devui.json; 2 | 3 | public enum MessageType { 4 | SYSTEM, 5 | USER, 6 | TOOL_EXECUTION_RESULT, 7 | AI 8 | } 9 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/EmbeddingMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.annotation.JsonCreator; 4 | import com.fasterxml.jackson.annotation.JsonProperty; 5 | 6 | import dev.langchain4j.data.embedding.Embedding; 7 | import io.quarkus.jackson.JacksonMixin; 8 | 9 | @JacksonMixin(Embedding.class) 10 | public abstract class EmbeddingMixin { 11 | 12 | @JsonCreator 13 | public EmbeddingMixin(@JsonProperty("vector") float[] vector) { 14 | 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/ImageBuilderMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; 4 | 5 | import dev.langchain4j.data.image.Image; 6 | import io.quarkus.jackson.JacksonMixin; 7 | 8 | @JacksonMixin(Image.Builder.class) 9 | @JsonPOJOBuilder(withPrefix = "") 10 | public abstract class ImageBuilderMixin { 11 | } 12 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/ImageMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 5 | 6 | import dev.langchain4j.data.image.Image; 7 | import io.quarkus.jackson.JacksonMixin; 8 | 9 | @JacksonMixin(Image.class) 10 | @JsonInclude(JsonInclude.Include.NON_NULL) 11 | @JsonDeserialize(builder = Image.Builder.class) 12 | public abstract class ImageMixin { 13 | 14 | } 15 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/InMemoryEmbeddingStoreMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 4 | 5 | import dev.langchain4j.store.embedding.inmemory.InMemoryEmbeddingStore; 6 | import io.quarkus.jackson.JacksonMixin; 7 | 8 | @JacksonMixin(InMemoryEmbeddingStore.class) 9 | @JsonDeserialize(using = InMemoryEmbeddingStoreDeserializer.class) 10 | public abstract class InMemoryEmbeddingStoreMixin { 11 | } 12 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/MetadataMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import java.util.Map; 4 | 5 | import com.fasterxml.jackson.annotation.JsonCreator; 6 | import com.fasterxml.jackson.annotation.JsonProperty; 7 | 8 | import dev.langchain4j.data.document.Metadata; 9 | import io.quarkus.jackson.JacksonMixin; 10 | 11 | @JacksonMixin(Metadata.class) 12 | public abstract class MetadataMixin { 13 | 14 | @JsonCreator 15 | public MetadataMixin(@JsonProperty("metadata") Map metadata) { 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/TextContentMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 4 | 5 | import dev.langchain4j.data.message.TextContent; 6 | import io.quarkus.jackson.JacksonMixin; 7 | 8 | @JacksonMixin(TextContent.class) 9 | @JsonDeserialize(using = TextContentDeserializer.class) 10 | public abstract class TextContentMixin { 11 | 12 | } 13 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/TextSegmentMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.annotation.JsonCreator; 4 | import com.fasterxml.jackson.annotation.JsonProperty; 5 | 6 | import dev.langchain4j.data.document.Metadata; 7 | import dev.langchain4j.data.segment.TextSegment; 8 | import io.quarkus.jackson.JacksonMixin; 9 | 10 | @JacksonMixin(TextSegment.class) 11 | public abstract class TextSegmentMixin { 12 | 13 | @JsonCreator 14 | public TextSegmentMixin(@JsonProperty("text") String text, @JsonProperty("metadata") Metadata metadata) { 15 | 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/ToolExecutionRequestBuilderMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder; 4 | 5 | import dev.langchain4j.agent.tool.ToolExecutionRequest; 6 | import io.quarkus.jackson.JacksonMixin; 7 | 8 | @JacksonMixin(ToolExecutionRequest.Builder.class) 9 | @JsonPOJOBuilder(withPrefix = "") 10 | public abstract class ToolExecutionRequestBuilderMixin { 11 | } 12 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/jackson/ToolExecutionRequestMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.annotation.JsonInclude; 4 | import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 5 | 6 | import dev.langchain4j.agent.tool.ToolExecutionRequest; 7 | import io.quarkus.jackson.JacksonMixin; 8 | 9 | @JacksonMixin(ToolExecutionRequest.class) 10 | @JsonDeserialize(builder = ToolExecutionRequest.Builder.class) 11 | @JsonInclude(JsonInclude.Include.NON_NULL) 12 | public abstract class ToolExecutionRequestMixin { 13 | } 14 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/prompt/Mappable.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.prompt; 2 | 3 | import java.util.Map; 4 | 5 | public interface Mappable { 6 | 7 | Map obtainFieldValuesMap(); 8 | } 9 | -------------------------------------------------------------------------------- /core/runtime/src/main/java/io/quarkiverse/langchain4j/runtime/tool/ToolMethodCreateInfo.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.runtime.tool; 2 | 3 | import dev.langchain4j.agent.tool.ToolSpecification; 4 | 5 | public record ToolMethodCreateInfo(String methodName, 6 | String invokerClassName, 7 | ToolSpecification toolSpecification, 8 | String argumentMapperClassName, 9 | ExecutionModel executionModel) { 10 | 11 | public enum ExecutionModel { 12 | BLOCKING, 13 | NON_BLOCKING, 14 | VIRTUAL_THREAD 15 | } 16 | 17 | } 18 | -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/core/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Core 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the basic integration with LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 9 | categories: 10 | - "ai" 11 | status: "experimental" 12 | -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/services/dev.langchain4j.spi.data.message.ChatMessageJsonCodecFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.QuarkusChatMessageJsonCodecFactory 2 | -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/services/dev.langchain4j.spi.json.JsonCodecFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.QuarkusJsonCodecFactory 2 | -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/services/dev.langchain4j.spi.prompt.PromptTemplateFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.QuarkusPromptTemplateFactory 2 | -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/services/dev.langchain4j.spi.prompt.structured.StructuredPromptFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.QuarkusStructuredPromptFactory 2 | -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/services/dev.langchain4j.spi.services.AiServicesFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.QuarkusAiServicesFactory 2 | -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/services/dev.langchain4j.spi.store.embedding.inmemory.InMemoryEmbeddingStoreJsonCodecFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.QuarkusInMemoryEmbeddingJsonCodecFactory 2 | -------------------------------------------------------------------------------- /core/runtime/src/main/resources/META-INF/services/io.quarkiverse.langchain4j.spi.DefaultMemoryIdProvider: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.runtime.RequestScopeStateDefaultMemoryIdProvider 2 | -------------------------------------------------------------------------------- /docs/README.adoc: -------------------------------------------------------------------------------- 1 | = Antora documentation site for Quarkus LangChain4j 2 | 3 | To edit the documentation with live-reload, start Quarkus in dev mode 4 | 5 | [source,shell] 6 | ---- 7 | $ cd docs 8 | $ mvn quarkus:dev 9 | ---- 10 | 11 | Once the application has started, hit `w` to open the freshly generated site in browser. 12 | 13 | See https://docs.quarkiverse.io/quarkus-antora/dev/index.html[Quarkus Antora] documentation for more details. 14 | -------------------------------------------------------------------------------- /docs/antora-playbook.yml: -------------------------------------------------------------------------------- 1 | site: 2 | title: LangChain4j for Quarkus 3 | start_page: quarkus-langchain4j:ROOT:index.adoc 4 | content: 5 | sources: 6 | - url: ./../ 7 | branches: HEAD 8 | start_path: docs 9 | ui: 10 | bundle: 11 | url: https://github.com/quarkiverse/antora-ui-quarkiverse/releases/latest/download/ui-bundle.zip 12 | snapshot: true 13 | 14 | asciidoc: 15 | attributes: 16 | kroki-fetch-diagram: true 17 | 18 | output: 19 | dir: ./target/site -------------------------------------------------------------------------------- /docs/antora.yml: -------------------------------------------------------------------------------- 1 | name: quarkus-langchain4j 2 | title: LangChain4j 3 | version: dev 4 | nav: 5 | - modules/ROOT/nav.adoc 6 | -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/chatbot-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/docs/modules/ROOT/assets/images/chatbot-architecture.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/easy-rag-reuse-embeddings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/docs/modules/ROOT/assets/images/easy-rag-reuse-embeddings.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/guardrails.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/docs/modules/ROOT/assets/images/guardrails.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/llms-big-picture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/docs/modules/ROOT/assets/images/llms-big-picture.png -------------------------------------------------------------------------------- /docs/modules/ROOT/assets/images/trace.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/docs/modules/ROOT/assets/images/trace.png -------------------------------------------------------------------------------- /docs/modules/ROOT/examples/.keepme: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/docs/modules/ROOT/examples/.keepme -------------------------------------------------------------------------------- /docs/modules/ROOT/examples/io/quarkiverse/langchain4j/samples/DocumentFromTextCreationExample.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.samples; 2 | 3 | import static dev.langchain4j.data.document.loader.FileSystemDocumentLoader.loadDocument; 4 | 5 | import java.io.File; 6 | 7 | import dev.langchain4j.data.document.Document; 8 | import dev.langchain4j.data.document.parser.TextDocumentParser; 9 | 10 | public class DocumentFromTextCreationExample { 11 | 12 | Document createDocument(File file) { 13 | return loadDocument(file.toPath(), new TextDocumentParser()); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /docs/modules/ROOT/examples/io/quarkiverse/langchain4j/samples/EmailService.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.samples; 2 | 3 | import jakarta.enterprise.context.ApplicationScoped; 4 | 5 | @ApplicationScoped 6 | public class EmailService { 7 | 8 | // Nothing on purpose 9 | 10 | } 11 | -------------------------------------------------------------------------------- /docs/modules/ROOT/pages/includes/attributes.adoc: -------------------------------------------------------------------------------- 1 | :project-version: 1.0.0 2 | :langchain4j-version: 1.0.0 3 | :examples-dir: ./../examples/ -------------------------------------------------------------------------------- /docs/templates/includes/attributes.adoc: -------------------------------------------------------------------------------- 1 | :project-version: ${release.current-version} 2 | :langchain4j-version: ${langchain4j.version} 3 | :examples-dir: ./../examples/ -------------------------------------------------------------------------------- /embedding-stores/chroma/runtime/src/main/java/io/quarkiverse/langchain4j/chroma/runtime/DeleteEmbeddingsRequest.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.chroma.runtime; 2 | 3 | import java.util.List; 4 | 5 | import io.quarkus.runtime.annotations.RegisterForReflection; 6 | 7 | @RegisterForReflection 8 | public class DeleteEmbeddingsRequest { 9 | 10 | private List ids; 11 | 12 | public DeleteEmbeddingsRequest(List ids) { 13 | this.ids = ids; 14 | } 15 | 16 | public List getIds() { 17 | return ids; 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /embedding-stores/chroma/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/embedding-stores/chroma/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /embedding-stores/chroma/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Chroma 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with the Chroma vector database 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - chroma 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /embedding-stores/infinispan/deployment/src/main/resources/META-INF/services/io.smallrye.config.SmallRyeConfigBuilderCustomizer: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.infinispan.DevServicesConfigBuilderCustomizer 2 | -------------------------------------------------------------------------------- /embedding-stores/infinispan/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Infinispan embedding store 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Infinispan Embedding store for LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | - infinispan 10 | - embedding 11 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 12 | categories: 13 | - "ai" 14 | status: "experimental" 15 | -------------------------------------------------------------------------------- /embedding-stores/milvus/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/embedding-stores/milvus/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /embedding-stores/milvus/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Milvus embedding store 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Milvus Embedding store for LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | - milvus 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "ai" 13 | status: "experimental" 14 | -------------------------------------------------------------------------------- /embedding-stores/neo4j/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Neo4j embedding store 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Neo4j embedding store for Quarkus LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - neo4j 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /embedding-stores/pgvector/deployment/src/main/resources/META-INF/services/io.smallrye.config.SmallRyeConfigBuilderCustomizer: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.pgvector.deployment.DevServicesConfigBuilderCustomizer -------------------------------------------------------------------------------- /embedding-stores/pgvector/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j pgvector embedding store 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the pgvector Embedding store for Quarkus LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | - pgvector 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "ai" 13 | status: "experimental" 14 | -------------------------------------------------------------------------------- /embedding-stores/pinecone/runtime/src/main/java/io/quarkiverse/langchain4j/pinecone/runtime/CreateIndexSpec.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.pinecone.runtime; 2 | 3 | import io.quarkus.runtime.annotations.RegisterForReflection; 4 | 5 | @RegisterForReflection 6 | public class CreateIndexSpec { 7 | 8 | private final CreateIndexPodSpec pod; 9 | 10 | public CreateIndexSpec(CreateIndexPodSpec pod) { 11 | this.pod = pod; 12 | } 13 | 14 | public CreateIndexPodSpec getPod() { 15 | return pod; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /embedding-stores/pinecone/runtime/src/main/java/io/quarkiverse/langchain4j/pinecone/runtime/DistanceMetric.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.pinecone.runtime; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | public enum DistanceMetric { 6 | 7 | @JsonProperty("euclidean") 8 | EUCLIDEAN, 9 | @JsonProperty("cosine") 10 | COSINE, 11 | @JsonProperty("dotproduct") 12 | DOTPRODUCT 13 | 14 | } 15 | -------------------------------------------------------------------------------- /embedding-stores/pinecone/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/embedding-stores/pinecone/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /embedding-stores/pinecone/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Pinecone embedding store 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Pinecone Embedding store for LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | - pinecone 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "ai" 13 | status: "experimental" 14 | -------------------------------------------------------------------------------- /embedding-stores/qdrant/deployment/src/main/java/io/quarkiverse/langchain4j/qdrant/Distance.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.qdrant; 2 | 3 | public enum Distance { 4 | UnknownDistance, 5 | Cosine, 6 | Euclid, 7 | Dot, 8 | Manhattan, 9 | } 10 | -------------------------------------------------------------------------------- /embedding-stores/qdrant/deployment/src/main/java/io/quarkiverse/langchain4j/qdrant/QdrantDevServiceCfg.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.qdrant; 2 | 3 | import java.util.OptionalInt; 4 | 5 | record QdrantDevServiceCfg( 6 | boolean devServicesEnabled, 7 | OptionalInt fixedPort, 8 | String imageName, 9 | String serviceName, 10 | boolean shared, 11 | QdrantVectorCfg vectorCfg) { 12 | } -------------------------------------------------------------------------------- /embedding-stores/qdrant/deployment/src/main/java/io/quarkiverse/langchain4j/qdrant/QdrantVectorCfg.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.qdrant; 2 | 3 | import io.qdrant.client.grpc.Collections; 4 | 5 | public record QdrantVectorCfg( 6 | Collections.Distance distance, 7 | long size) { 8 | } 9 | -------------------------------------------------------------------------------- /embedding-stores/qdrant/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/embedding-stores/qdrant/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /embedding-stores/qdrant/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Qdrant embedding store 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Qdrant Embedding store for LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | - qdrant 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "ai" 13 | status: "experimental" 14 | -------------------------------------------------------------------------------- /embedding-stores/redis/deployment/src/main/resources/META-INF/services/io.smallrye.config.SmallRyeConfigBuilderCustomizer: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.redis.DevServicesConfigBuilderCustomizer 2 | -------------------------------------------------------------------------------- /embedding-stores/redis/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Redis embedding store 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Redis Embedding store for LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | - redis 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "ai" 13 | status: "experimental" 14 | -------------------------------------------------------------------------------- /embedding-stores/weaviate/deployment/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.weaviate.metadata.keys=string_empty,string_space,string_abc,uuid,integer_min,integer_minus_1,integer_0,integer_1,integer_max,long_min,long_minus_1,long_0,long_1,long_1746714878034235396,long_max,float_min,float_minus_1,float_0,float_1,float_123,float_max,double_minus_1,double_0,double_1,double_123 2 | 3 | -------------------------------------------------------------------------------- /embedding-stores/weaviate/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/embedding-stores/weaviate/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /embedding-stores/weaviate/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Weaviate 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with the Weaviate vector database 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - weaviate 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /integration-tests/ai-gemini/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.ai.gemini.base-url=http://localhost:8081/gemini 2 | quarkus.langchain4j.ai.gemini.api-key=dummy 3 | quarkus.langchain4j.ai.gemini.log-requests=true 4 | quarkus.langchain4j.ai.gemini.log-responses=true 5 | -------------------------------------------------------------------------------- /integration-tests/anthropic/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.anthropic.log-requests=true 2 | quarkus.langchain4j.anthropic.log-responses=true 3 | -------------------------------------------------------------------------------- /integration-tests/azure-openai/src/main/java/org/acme/example/azure/openai/chat/ChatLanguageModelResource.java: -------------------------------------------------------------------------------- 1 | package org.acme.example.azure.openai.chat; 2 | 3 | import jakarta.ws.rs.GET; 4 | import jakarta.ws.rs.Path; 5 | 6 | import dev.langchain4j.model.chat.ChatModel; 7 | 8 | @Path("chat") 9 | public class ChatLanguageModelResource { 10 | 11 | private final ChatModel chatModel; 12 | 13 | public ChatLanguageModelResource(ChatModel chatModel) { 14 | this.chatModel = chatModel; 15 | } 16 | 17 | @GET 18 | @Path("basic") 19 | public String basic() { 20 | return chatModel.chat("When was the nobel prize for economics first awarded?"); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /integration-tests/azure-openai/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.azure-openai.log-requests=true 2 | quarkus.langchain4j.azure-openai.log-responses=true 3 | -------------------------------------------------------------------------------- /integration-tests/devui-multiple-embedding-models/src/main/java/io/quarkiverse/langchain4j/test/devui/Dummy.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.test.devui; 2 | 3 | import jakarta.inject.Inject; 4 | import jakarta.inject.Singleton; 5 | 6 | import dev.langchain4j.model.embedding.EmbeddingModel; 7 | import io.quarkiverse.langchain4j.ModelName; 8 | 9 | @Singleton 10 | public class Dummy { 11 | 12 | @Inject 13 | @ModelName("model1") 14 | EmbeddingModel embeddingModel1; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /integration-tests/easy-rag/src/test/resources/__snapshots__/EasyRagCodestartTest/testContent/dir-tree.snapshot: -------------------------------------------------------------------------------- 1 | / 2 | elite-money-market-account.odt 3 | retirement-money-market.txt 4 | smart-checking-account.pdf 5 | standard-saving-account.txt -------------------------------------------------------------------------------- /integration-tests/hugging-face/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | huggingface.key=ADD_A_TOKEN 2 | %test.huggingface.key=ADD_A_TOKEN 3 | quarkus.langchain4j.huggingface.api-key=${huggingface.key} 4 | quarkus.langchain4j.huggingface.timeout=60s 5 | quarkus.langchain4j.huggingface.chat-model.max-new-tokens=2048 6 | -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #quarkus.native.additional-build-args=--trace-class-initialization=ai.onnxruntime.OnnxRuntime -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.test; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | class InProcessEmbeddingResourceIT extends InProcessEmbeddingResourceTest { 7 | 8 | } -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #quarkus.native.additional-build-args=--trace-class-initialization=ai.onnxruntime.OnnxRuntime -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-all-minilm-l6-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.test; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | class InProcessEmbeddingResourceIT extends InProcessEmbeddingResourceTest { 7 | 8 | } -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #quarkus.native.additional-build-args=--trace-class-initialization=ai.onnxruntime.OnnxRuntime -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-bge-small-en-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.test; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | class InProcessEmbeddingResourceIT extends InProcessEmbeddingResourceTest { 7 | 8 | } -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-bge-small-en-v15-q/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #quarkus.native.additional-build-args=--trace-class-initialization=ai.onnxruntime.OnnxRuntime -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-bge-small-en-v15-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.test; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | class InProcessEmbeddingResourceIT extends InProcessEmbeddingResourceTest { 7 | 8 | } -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-bge-small-en-v15/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #quarkus.native.additional-build-args=--trace-class-initialization=ai.onnxruntime.OnnxRuntime -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-bge-small-en-v15/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.test; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | class InProcessEmbeddingResourceIT extends InProcessEmbeddingResourceTest { 7 | 8 | } -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-bge-small-en/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #quarkus.native.additional-build-args=--trace-class-initialization=ai.onnxruntime.OnnxRuntime -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-bge-small-en/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.test; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | class InProcessEmbeddingResourceIT extends InProcessEmbeddingResourceTest { 7 | 8 | } -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #quarkus.native.additional-build-args=--trace-class-initialization=ai.onnxruntime.OnnxRuntime -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-e5-small-v2-q/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.test; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | class InProcessEmbeddingResourceIT extends InProcessEmbeddingResourceTest { 7 | 8 | } -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-e5-small-v2/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #quarkus.native.additional-build-args=--trace-class-initialization=ai.onnxruntime.OnnxRuntime -------------------------------------------------------------------------------- /integration-tests/in-process-embedding-models/embed-e5-small-v2/src/test/java/org/acme/test/InProcessEmbeddingResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.test; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | class InProcessEmbeddingResourceIT extends InProcessEmbeddingResourceTest { 7 | 8 | } -------------------------------------------------------------------------------- /integration-tests/jlama/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.jlama.include-models-in-artifact=false 2 | -------------------------------------------------------------------------------- /integration-tests/llama3-java/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.llama3.include-models-in-artifact=false 2 | -------------------------------------------------------------------------------- /integration-tests/mistralai/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.mistralai.log-requests=true 2 | quarkus.langchain4j.mistralai.log-responses=true 3 | -------------------------------------------------------------------------------- /integration-tests/ollama/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.timeout=60s 2 | quarkus.langchain4j.log-requests=true 3 | -------------------------------------------------------------------------------- /integration-tests/openai/src/test/java/org/acme/example/openai/aiservices/AssistantResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.example.openai.aiservices; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | public class AssistantResourceIT extends AssistantResourceTest { 7 | } 8 | -------------------------------------------------------------------------------- /integration-tests/openai/src/test/java/org/acme/example/openai/chat/ChatLanguageModelResourceIT.java: -------------------------------------------------------------------------------- 1 | package org.acme.example.openai.chat; 2 | 3 | import io.quarkus.test.junit.QuarkusIntegrationTest; 4 | 5 | @QuarkusIntegrationTest 6 | public class ChatLanguageModelResourceIT extends ChatLanguageModelResourceTest { 7 | } 8 | -------------------------------------------------------------------------------- /integration-tests/rag-pgvector-flyway/src/main/resources/db/migration/V1.0.0__rag_db_init.sql: -------------------------------------------------------------------------------- 1 | CREATE EXTENSION IF NOT EXISTS "vector"; 2 | 3 | CREATE TABLE IF NOT EXISTS embeddings ( 4 | embedding_id UUID PRIMARY KEY, 5 | embedding vector(384), 6 | text TEXT NULL, 7 | metadata JSON NULL 8 | ); 9 | 10 | -------------------------------------------------------------------------------- /integration-tests/rag-pgvector/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.embedding-model.provider=dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModel 2 | # we replace the chat model with a mock, but the extension still requires an api key to exist 3 | quarkus.langchain4j.openai.api-key=blabla 4 | 5 | quarkus.langchain4j.pgvector.dimension=384 6 | quarkus.langchain4j.pgvector.drop-table-first=true 7 | -------------------------------------------------------------------------------- /integration-tests/rag/src/main/java/org/acme/example/AiServiceWithNoRetrievalAugmentor.java: -------------------------------------------------------------------------------- 1 | package org.acme.example; 2 | 3 | import io.quarkiverse.langchain4j.RegisterAiService; 4 | 5 | @RegisterAiService(retrievalAugmentor = RegisterAiService.NoRetrievalAugmentorSupplier.class) 6 | public interface AiServiceWithNoRetrievalAugmentor { 7 | 8 | String chat(String message); 9 | 10 | } 11 | -------------------------------------------------------------------------------- /integration-tests/rag/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.embedding-model.provider=dev.langchain4j.model.embedding.onnx.allminilml6v2.AllMiniLmL6V2EmbeddingModel 2 | # we replace the chat model with a mock, but the extension still requires an api key to exist 3 | quarkus.langchain4j.openai.api-key=blabla 4 | -------------------------------------------------------------------------------- /integration-tests/simple-ollama/src/main/java/org/acme/Assistant.java: -------------------------------------------------------------------------------- 1 | package org.acme; 2 | 3 | import io.quarkiverse.langchain4j.RegisterAiService; 4 | 5 | @RegisterAiService 6 | public interface Assistant { 7 | String chat(String message); 8 | } 9 | -------------------------------------------------------------------------------- /integration-tests/simple-ollama/src/main/java/org/acme/ExistencialQuestionResource.java: -------------------------------------------------------------------------------- 1 | package org.acme; 2 | 3 | import jakarta.inject.Inject; 4 | import jakarta.ws.rs.GET; 5 | import jakarta.ws.rs.Path; 6 | import jakarta.ws.rs.Produces; 7 | import jakarta.ws.rs.core.MediaType; 8 | 9 | @Path("/earth") 10 | public class ExistencialQuestionResource { 11 | 12 | @Inject 13 | Assistant assistant; 14 | 15 | @GET 16 | @Path("/flat") 17 | @Produces(MediaType.TEXT_PLAIN) 18 | public String isEarthFlat() { 19 | return assistant.chat("Can you explain me why earth is flat?"); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /integration-tests/simple-ollama/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.ollama.chat-model.model-id=orca-mini 2 | 3 | quarkus.langchain4j.ollama.timeout=120s -------------------------------------------------------------------------------- /integration-tests/tools/src/main/java/org/acme/tools/AiService.java: -------------------------------------------------------------------------------- 1 | package org.acme.tools; 2 | 3 | import dev.langchain4j.service.UserMessage; 4 | import io.quarkiverse.langchain4j.RegisterAiService; 5 | import io.quarkiverse.langchain4j.ToolBox; 6 | 7 | @RegisterAiService 8 | public interface AiService { 9 | @ToolBox(Calculator.class) 10 | public String chat(@UserMessage String message); 11 | } 12 | -------------------------------------------------------------------------------- /integration-tests/tools/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.watsonx.base-url=https://toolstest.com 2 | quarkus.langchain4j.watsonx.api-key=api-key 3 | quarkus.langchain4j.watsonx.project-id=project-id 4 | quarkus.langchain4j.watsonx.version=yyyy-mm-dd -------------------------------------------------------------------------------- /integration-tests/vertex-ai-gemini/src/main/java/org/acme/example/gemini/aiservices/DummyAuthProvider.java: -------------------------------------------------------------------------------- 1 | package org.acme.example.gemini.aiservices; 2 | 3 | import jakarta.inject.Singleton; 4 | 5 | import io.quarkiverse.langchain4j.auth.ModelAuthProvider; 6 | 7 | @Singleton 8 | public class DummyAuthProvider implements ModelAuthProvider { 9 | 10 | @Override 11 | public String getAuthorization(Input input) { 12 | return "Bearer token"; 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /integration-tests/vertex-ai-gemini/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.vertexai.gemini.base-url=http://localhost:8081/gemini 2 | quarkus.langchain4j.vertexai.gemini.location=west-europe 3 | quarkus.langchain4j.vertexai.gemini.project-id=my_google_project_id 4 | quarkus.langchain4j.vertexai.gemini.log-requests=true 5 | quarkus.langchain4j.vertexai.gemini.log-responses=true 6 | -------------------------------------------------------------------------------- /mcp-auth-providers/oidc-mcp-auth-provider/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j OpenId Connect (OIDC) ModelAuthProvider 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides McpClientAuthProvider which uses OIDC bearer or authorization code flow access tokens 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - oidc 9 | - mcp 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "security" 13 | status: "experimental" 14 | 15 | -------------------------------------------------------------------------------- /mcp/runtime/src/main/java/io/quarkiverse/langchain4j/mcp/runtime/config/LocalLaunchParams.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.mcp.runtime.config; 2 | 3 | import java.util.List; 4 | import java.util.Map; 5 | 6 | public record LocalLaunchParams(List command, Map envVars) { 7 | } 8 | -------------------------------------------------------------------------------- /mcp/runtime/src/main/java/io/quarkiverse/langchain4j/mcp/runtime/config/McpClientBuildTimeConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.mcp.runtime.config; 2 | 3 | import io.quarkus.runtime.annotations.ConfigGroup; 4 | import io.smallrye.config.WithDefault; 5 | 6 | @ConfigGroup 7 | public interface McpClientBuildTimeConfig { 8 | 9 | /** 10 | * Transport type 11 | */ 12 | @WithDefault("stdio") 13 | McpTransportType transportType(); 14 | } 15 | -------------------------------------------------------------------------------- /mcp/runtime/src/main/java/io/quarkiverse/langchain4j/mcp/runtime/config/McpTransportType.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.mcp.runtime.config; 2 | 3 | public enum McpTransportType { 4 | STDIO, 5 | HTTP 6 | } 7 | -------------------------------------------------------------------------------- /mcp/runtime/src/main/java/io/quarkiverse/langchain4j/mcp/runtime/http/McpPostEndpoint.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.mcp.runtime.http; 2 | 3 | import jakarta.ws.rs.Consumes; 4 | import jakarta.ws.rs.POST; 5 | import jakarta.ws.rs.Produces; 6 | import jakarta.ws.rs.core.MediaType; 7 | import jakarta.ws.rs.core.Response; 8 | 9 | import dev.langchain4j.mcp.client.protocol.McpClientMessage; 10 | import io.smallrye.mutiny.Uni; 11 | 12 | public interface McpPostEndpoint { 13 | 14 | @POST 15 | @Consumes(MediaType.APPLICATION_JSON) 16 | @Produces(MediaType.APPLICATION_JSON) 17 | Uni post(McpClientMessage message); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /mcp/runtime/src/main/java/io/quarkiverse/langchain4j/mcp/runtime/http/McpSseEndpoint.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.mcp.runtime.http; 2 | 3 | import jakarta.ws.rs.GET; 4 | import jakarta.ws.rs.Produces; 5 | import jakarta.ws.rs.core.MediaType; 6 | 7 | import org.jboss.resteasy.reactive.client.SseEvent; 8 | 9 | import io.smallrye.mutiny.Multi; 10 | 11 | public interface McpSseEndpoint { 12 | 13 | @GET 14 | @Produces(MediaType.SERVER_SENT_EVENTS) 15 | Multi> get(); 16 | } 17 | -------------------------------------------------------------------------------- /mcp/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/mcp/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /mcp/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Model Context Protocol client 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Model Context Protocol client-side implementation for LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 9 | categories: 10 | - "ai" 11 | status: "experimental" 12 | 13 | -------------------------------------------------------------------------------- /mcp/runtime/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSourceProvider: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.mcp.runtime.config.ClaudeDesktopConfigSourceProvider 2 | -------------------------------------------------------------------------------- /memory-stores/memory-store-redis/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/memory-stores/memory-store-redis/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /memory-stores/memory-store-redis/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: Quarkus Langchain4j - Memory Store - Redis 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides a Redis Chat Memory Store 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - redis 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-auth-providers/oidc-model-auth-provider/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j OpenId Connect (OIDC) ModelAuthProvider 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides ModelAuthProvider which uses OIDC bearer or authorization code flow access tokens 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - oidc 9 | - security 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "security" 13 | status: "experimental" 14 | 15 | -------------------------------------------------------------------------------- /model-providers/anthropic/deployment/src/main/java/io/quarkiverse/langchain4j/anthropic/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.anthropic.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/anthropic/deployment/src/main/java/io/quarkiverse/langchain4j/anthropic/deployment/LangChain4jAnthropicBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.anthropic.deployment; 2 | 3 | import static io.quarkus.runtime.annotations.ConfigPhase.BUILD_TIME; 4 | 5 | import io.quarkus.runtime.annotations.ConfigRoot; 6 | import io.smallrye.config.ConfigMapping; 7 | 8 | @ConfigRoot(phase = BUILD_TIME) 9 | @ConfigMapping(prefix = "quarkus.langchain4j.anthropic") 10 | public interface LangChain4jAnthropicBuildConfig { 11 | /** 12 | * Chat model related settings 13 | */ 14 | ChatModelBuildConfig chatModel(); 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/anthropic/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/anthropic/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/anthropic/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Anthropic 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with Anthropic 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - anthropic 9 | - claude 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "ai" 13 | status: "experimental" 14 | -------------------------------------------------------------------------------- /model-providers/anthropic/runtime/src/main/resources/META-INF/services/dev.langchain4j.model.anthropic.internal.client.AnthropicClientBuilderFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.anthropic.QuarkusAnthropicClient$QuarkusAnthropicClientBuilderFactory 2 | -------------------------------------------------------------------------------- /model-providers/bedrock/deployment/src/main/java/io/quarkiverse/langchain4j/bedrock/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.bedrock.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/bedrock/deployment/src/main/java/io/quarkiverse/langchain4j/bedrock/deployment/EmbeddingModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.bedrock.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface EmbeddingModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/bedrock/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/bedrock/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/bedrock/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Bedrock 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with Amazon Bedrock 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - bedrock 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/cohere/deployment/src/main/java/io/quarkiverse/langchain4j/cohere/LangChain4jCohereBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.cohere; 2 | 3 | import static io.quarkus.runtime.annotations.ConfigPhase.BUILD_TIME; 4 | 5 | import io.quarkus.runtime.annotations.ConfigRoot; 6 | import io.smallrye.config.ConfigMapping; 7 | 8 | @ConfigRoot(phase = BUILD_TIME) 9 | @ConfigMapping(prefix = "quarkus.langchain4j.cohere") 10 | public interface LangChain4jCohereBuildConfig { 11 | 12 | /** 13 | * Scoring model related settings. 14 | */ 15 | ScoringModelBuildConfig scoringModel(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/cohere/deployment/src/main/java/io/quarkiverse/langchain4j/cohere/ScoringModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.cohere; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ScoringModelBuildConfig { 10 | 11 | /** 12 | * Whether the scoring model should be enabled. 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/cohere/runtime/src/main/java/io/quarkiverse/langchain4j/cohere/runtime/api/CohereApi.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.cohere.runtime.api; 2 | 3 | import jakarta.ws.rs.Consumes; 4 | import jakarta.ws.rs.POST; 5 | import jakarta.ws.rs.Path; 6 | import jakarta.ws.rs.Produces; 7 | import jakarta.ws.rs.core.MediaType; 8 | 9 | @Path("/v2") 10 | @Consumes(MediaType.APPLICATION_JSON) 11 | @Produces(MediaType.APPLICATION_JSON) 12 | public interface CohereApi { 13 | 14 | @Path("/rerank") 15 | @POST 16 | RerankResponse rerank(RerankRequest rerankRequest); 17 | 18 | } 19 | -------------------------------------------------------------------------------- /model-providers/cohere/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/cohere/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/cohere/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: Quarkus LangChain4j Cohere 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with the Cohere API 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - cohere 9 | - search 10 | - reranking 11 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 12 | categories: 13 | - "ai" 14 | status: "preview" 15 | -------------------------------------------------------------------------------- /model-providers/google/gemini/ai-gemini/deployment/src/main/java/io/quarkiverse/langchain4j/ai/gemini/deployment/LangChain4jAiEmbeddingConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.ai.gemini.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface LangChain4jAiEmbeddingConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /model-providers/google/gemini/ai-gemini/runtime/src/main/java/io/quarkiverse/langchain4j/ai/runtime/gemini/ErrorResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.ai.runtime.gemini; 2 | 3 | /** 4 | * 5 | * Error information. 6 | */ 7 | public record ErrorResponse(ErrorInfo error) { 8 | public record ErrorInfo(Integer code, String message, String status) { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /model-providers/google/gemini/ai-gemini/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/google/gemini/ai-gemini/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/google/gemini/ai-gemini/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j AI Gemini 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with AI Gemini 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - gemini 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/deployment/src/main/java/io/quarkiverse/langchain4j/gemini/common/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/java/io/quarkiverse/langchain4j/gemini/common/Blob.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | public record Blob(String mimeType, String data) { 4 | } 5 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/java/io/quarkiverse/langchain4j/gemini/common/EmbedContentRequests.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Used for batch embedding request 7 | */ 8 | public record EmbedContentRequests(List requests) { 9 | } 10 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/java/io/quarkiverse/langchain4j/gemini/common/EmbedContentResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | /** 4 | * The response body contains data. 5 | * 6 | * @param embedding The embedding generated from the input content. 7 | * 8 | * @see EmbedContentResponse 9 | */ 10 | public record EmbedContentResponse(Embedding embedding) { 11 | public record Embedding(float[] values) { 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/java/io/quarkiverse/langchain4j/gemini/common/EmbedContentResponses.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * Used for batch embeddings response. 7 | */ 8 | public record EmbedContentResponses(List embeddings) { 9 | } 10 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/java/io/quarkiverse/langchain4j/gemini/common/FileData.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | public record FileData(String mimeType, String fileUri) { 4 | } 5 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/java/io/quarkiverse/langchain4j/gemini/common/FunctionResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | public record FunctionResponse(String name, Response response) { 4 | 5 | public record Response(String name, Object content) { 6 | 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/java/io/quarkiverse/langchain4j/gemini/common/RoleMapper.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | import dev.langchain4j.data.message.ChatMessageType; 4 | 5 | final class RoleMapper { 6 | 7 | private RoleMapper() { 8 | } 9 | 10 | static String map(ChatMessageType type) { 11 | return switch (type) { 12 | case USER -> "user"; 13 | case AI -> "model"; 14 | case TOOL_EXECUTION_RESULT -> "user"; 15 | default -> throw new IllegalArgumentException(type + " is not allowed."); 16 | }; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/java/io/quarkiverse/langchain4j/gemini/common/Type.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.gemini.common; 2 | 3 | public enum Type { 4 | STRING, 5 | NUMBER, 6 | INTEGER, 7 | BOOLEAN, 8 | ARRAY, 9 | OBJECT; 10 | 11 | @Override 12 | public String toString() { 13 | return this.name().toLowerCase(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/google/gemini/gemini-common/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/google/gemini/gemini-common/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/google/vertex-ai-gemini/deployment/src/main/java/io/quarkiverse/langchain4j/vertexai/gemini/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.vertexai.gemini.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/google/vertex-ai-gemini/deployment/src/main/java/io/quarkiverse/langchain4j/vertexai/gemini/deployment/LangChain4jVertexAiEmbeddingConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.vertexai.gemini.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface LangChain4jVertexAiEmbeddingConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | 17 | } 18 | -------------------------------------------------------------------------------- /model-providers/google/vertex-ai-gemini/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/google/vertex-ai-gemini/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/google/vertex-ai-gemini/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Vertex AI Gemini 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with Vertex AI Gemini 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - vertex 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/google/vertex-ai/deployment/src/main/java/io/quarkiverse/langchain4j/vertexai/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.vertexai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/google/vertex-ai/deployment/src/main/java/io/quarkiverse/langchain4j/vertexai/deployment/LangChain4jVertexAiBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.vertexai.deployment; 2 | 3 | import static io.quarkus.runtime.annotations.ConfigPhase.BUILD_TIME; 4 | 5 | import io.quarkus.runtime.annotations.ConfigRoot; 6 | import io.smallrye.config.ConfigMapping; 7 | 8 | @ConfigRoot(phase = BUILD_TIME) 9 | @ConfigMapping(prefix = "quarkus.langchain4j.vertexai") 10 | public interface LangChain4jVertexAiBuildConfig { 11 | /** 12 | * Chat model related settings 13 | */ 14 | ChatModelBuildConfig chatModel(); 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/google/vertex-ai/runtime/src/main/java/io/quarkiverse/langchain4j/vertexai/runtime/PredictRequest.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.vertexai.runtime; 2 | 3 | import java.util.List; 4 | 5 | public record PredictRequest(List instances, Parameters parameters) { 6 | 7 | public record ChatInstance(String context, List messages) { 8 | 9 | } 10 | 11 | public record Message(String author, String content) { 12 | 13 | } 14 | 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/google/vertex-ai/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/google/vertex-ai/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/google/vertex-ai/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Vertex AI 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with Vertex AI 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - vertex 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/hugging-face/deployment/src/main/java/io/quarkiverse/langchain4j/huggingface/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.huggingface.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/hugging-face/deployment/src/main/java/io/quarkiverse/langchain4j/huggingface/deployment/EmbeddingModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.huggingface.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface EmbeddingModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/hugging-face/deployment/src/main/java/io/quarkiverse/langchain4j/huggingface/deployment/ModerationModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.huggingface.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ModerationModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/hugging-face/runtime/src/main/java/io/quarkiverse/langchain4j/huggingface/runtime/jackson/OptionsMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.huggingface.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.annotation.JsonAutoDetect; 4 | 5 | import dev.langchain4j.model.huggingface.client.Options; 6 | import io.quarkus.jackson.JacksonMixin; 7 | 8 | @JacksonMixin(Options.class) 9 | @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE) 10 | public abstract class OptionsMixin { 11 | } 12 | -------------------------------------------------------------------------------- /model-providers/hugging-face/runtime/src/main/java/io/quarkiverse/langchain4j/huggingface/runtime/jackson/ParametersMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.huggingface.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.annotation.JsonAutoDetect; 4 | 5 | import dev.langchain4j.model.huggingface.client.Parameters; 6 | import io.quarkus.jackson.JacksonMixin; 7 | 8 | @JacksonMixin(Parameters.class) 9 | @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE) 10 | public abstract class ParametersMixin { 11 | } 12 | -------------------------------------------------------------------------------- /model-providers/hugging-face/runtime/src/main/java/io/quarkiverse/langchain4j/huggingface/runtime/jackson/TextGenerationRequestMixin.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.huggingface.runtime.jackson; 2 | 3 | import com.fasterxml.jackson.annotation.JsonAutoDetect; 4 | 5 | import dev.langchain4j.model.huggingface.client.TextGenerationRequest; 6 | import io.quarkus.jackson.JacksonMixin; 7 | 8 | @JacksonMixin(TextGenerationRequest.class) 9 | @JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, setterVisibility = JsonAutoDetect.Visibility.NONE) 10 | public abstract class TextGenerationRequestMixin { 11 | } 12 | -------------------------------------------------------------------------------- /model-providers/hugging-face/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/hugging-face/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/hugging-face/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Hugging Face 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with the Hugging Face API 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - chroma 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/hugging-face/runtime/src/main/resources/META-INF/services/dev.langchain4j.model.huggingface.spi.HuggingFaceClientFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.huggingface.QuarkusHuggingFaceClientFactory 2 | -------------------------------------------------------------------------------- /model-providers/jaxrs-client/src/main/java/io/quarkiverse/langchain4j/jaxrsclient/JaxRsHttpClientBuilderFactory.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.jaxrsclient; 2 | 3 | import dev.langchain4j.http.client.HttpClientBuilder; 4 | import dev.langchain4j.http.client.HttpClientBuilderFactory; 5 | 6 | public class JaxRsHttpClientBuilderFactory implements HttpClientBuilderFactory { 7 | 8 | @Override 9 | public HttpClientBuilder create() { 10 | return JaxRsHttpClient.builder(); 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /model-providers/jaxrs-client/src/main/resources/META-INF/services/dev.langchain4j.http.client.HttpClientBuilderFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.jaxrsclient.JaxRsHttpClientBuilderFactory 2 | -------------------------------------------------------------------------------- /model-providers/jlama/deployment/src/main/java/io/quarkiverse/langchain4j/jlama/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.jlama.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/jlama/deployment/src/main/java/io/quarkiverse/langchain4j/jlama/deployment/EmbeddingModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.jlama.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface EmbeddingModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/jlama/runtime/src/main/java/io/quarkiverse/langchain4j/jlama/JlamaUtil.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.jlama; 2 | 3 | final class JlamaUtil { 4 | 5 | private JlamaUtil() { 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /model-providers/jlama/runtime/src/main/java/io/quarkiverse/langchain4j/jlama/runtime/config/ChatModelFixedRuntimeConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.jlama.runtime.config; 2 | 3 | import io.quarkus.runtime.annotations.ConfigGroup; 4 | import io.smallrye.config.WithDefault; 5 | 6 | @ConfigGroup 7 | public interface ChatModelFixedRuntimeConfig { 8 | 9 | /** 10 | * Model name to use 11 | */ 12 | @WithDefault("tjake/TinyLlama-1.1B-Chat-v1.0-Jlama-Q4") 13 | String modelName(); 14 | } 15 | -------------------------------------------------------------------------------- /model-providers/jlama/runtime/src/main/java/io/quarkiverse/langchain4j/jlama/runtime/config/EmbeddingModelFixedRuntimeConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.jlama.runtime.config; 2 | 3 | import io.quarkus.runtime.annotations.ConfigGroup; 4 | import io.smallrye.config.WithDefault; 5 | 6 | @ConfigGroup 7 | public interface EmbeddingModelFixedRuntimeConfig { 8 | 9 | /** 10 | * Model name to use 11 | */ 12 | @WithDefault("intfloat/e5-small-v2") 13 | String modelName(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/jlama/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/jlama/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/jlama/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Jlama 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with Jlama 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - jlama 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/jlama/runtime/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.jlama.runtime.config.ModelsPathConfigSource 2 | -------------------------------------------------------------------------------- /model-providers/llama3-java/deployment/src/main/java/io/quarkiverse/langchain4j/llama3/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.llama3.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/java/io/quarkiverse/langchain4j/llama3/Consts.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.llama3; 2 | 3 | public final class Consts { 4 | 5 | private Consts() { 6 | } 7 | 8 | public static final String DEFAULT_CHAT_MODEL_NAME = "mukel/Llama-3.2-1B-Instruct-GGUF"; 9 | public static final String DEFAULT_CHAT_MODEL_QUANTIZATION = "Q4_0"; 10 | } 11 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/java/io/quarkiverse/langchain4j/llama3/ProgressReporter.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.llama3; 2 | 3 | public interface ProgressReporter { 4 | 5 | void update(String filename, long sizeDownloaded, long totalSize); 6 | } 7 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/java/io/quarkiverse/langchain4j/llama3/copy/GGMLTensorEntry.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.llama3.copy; 2 | 3 | import java.lang.foreign.MemorySegment; 4 | 5 | public record GGMLTensorEntry(MemorySegment mappedFile, String name, GGMLType ggmlType, int[] shape, 6 | MemorySegment memorySegment) { 7 | } 8 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/java/io/quarkiverse/langchain4j/llama3/copy/Pair.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.llama3.copy; 2 | 3 | public record Pair(First first, Second second) { 4 | } 5 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/java/io/quarkiverse/langchain4j/llama3/copy/Sampler.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.llama3.copy; 2 | 3 | @FunctionalInterface 4 | public interface Sampler { 5 | int sampleToken(FloatTensor logits); 6 | 7 | Sampler ARGMAX = FloatTensor::argmax; 8 | } 9 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/java/io/quarkiverse/langchain4j/llama3/runtime/NameAndQuantization.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.llama3.runtime; 2 | 3 | public record NameAndQuantization(String name, String quantization) { 4 | } 5 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/llama3-java/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/resources/META-INF/native-image/io.quarkiverse.langchain4j/quarkus-langchain4j-llama3-java/native-image.properties: -------------------------------------------------------------------------------- 1 | Args = -H:+UnlockExperimentalVMOptions -H:+VectorAPISupport -H:+ForeignAPISupport -H:-UnlockExperimentalVMOptions --enable-preview -Djdk.incubator.vector.VECTOR_ACCESS_OOB_CHECK=0 2 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Llama3 Java 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with Llama3 Java 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - llama3-java 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/llama3-java/runtime/src/main/resources/META-INF/services/org.eclipse.microprofile.config.spi.ConfigSource: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.llama3.runtime.config.ModelsPathConfigSource 2 | -------------------------------------------------------------------------------- /model-providers/mistral/deployment/src/main/java/io/quarkiverse/langchain4j/mistralai/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.mistralai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/mistral/deployment/src/main/java/io/quarkiverse/langchain4j/mistralai/deployment/EmbeddingModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.mistralai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface EmbeddingModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/mistral/deployment/src/main/java/io/quarkiverse/langchain4j/mistralai/deployment/ModerationModelBuildConfig.java: -------------------------------------------------------------------------------- 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 enabled(); 14 | 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/mistral/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/mistral/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/mistral/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Mistral AI 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with Mistral AI 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - mistral 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/mistral/runtime/src/main/resources/META-INF/services/dev.langchain4j.model.mistralai.internal.client.MistralAiClientBuilderFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.mistralai.QuarkusMistralAiClient$QuarkusMistralAiClientBuilderFactory 2 | -------------------------------------------------------------------------------- /model-providers/ollama/deployment/src/main/java/io/quarkiverse/langchain4j/ollama/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.ollama.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/ollama/deployment/src/main/java/io/quarkiverse/langchain4j/ollama/deployment/EmbeddingModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.ollama.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface EmbeddingModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/ollama/runtime/src/main/java/io/quarkiverse/langchain4j/ollama/ChatResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.ollama; 2 | 3 | import java.util.Collections; 4 | 5 | public record ChatResponse(String model, String createdAt, Message message, Boolean done, Integer promptEvalCount, 6 | Integer evalCount) { 7 | 8 | public static ChatResponse emptyNotDone() { 9 | return new ChatResponse(null, null, 10 | new Message(Role.ASSISTANT, "", Collections.emptyList(), Collections.emptyList(), null), 11 | true, null, null); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /model-providers/ollama/runtime/src/main/java/io/quarkiverse/langchain4j/ollama/Role.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.ollama; 2 | 3 | import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 4 | import com.fasterxml.jackson.databind.annotation.JsonSerialize; 5 | 6 | import io.quarkiverse.langchain4j.ollama.runtime.jackson.RoleDeserializer; 7 | import io.quarkiverse.langchain4j.ollama.runtime.jackson.RoleSerializer; 8 | 9 | @JsonDeserialize(using = RoleDeserializer.class) 10 | @JsonSerialize(using = RoleSerializer.class) 11 | public enum Role { 12 | 13 | SYSTEM, 14 | USER, 15 | ASSISTANT, 16 | TOOL 17 | } 18 | -------------------------------------------------------------------------------- /model-providers/ollama/runtime/src/main/java/io/quarkiverse/langchain4j/ollama/runtime/config/ChatModelFixedRuntimeConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.ollama.runtime.config; 2 | 3 | import io.quarkus.runtime.annotations.ConfigGroup; 4 | import io.smallrye.config.WithDefault; 5 | 6 | @ConfigGroup 7 | public interface ChatModelFixedRuntimeConfig { 8 | 9 | /** 10 | * Model to use 11 | */ 12 | @WithDefault("llama3.2") 13 | String modelId(); 14 | } 15 | -------------------------------------------------------------------------------- /model-providers/ollama/runtime/src/main/java/io/quarkiverse/langchain4j/ollama/runtime/config/EmbeddingModelFixedRuntimeConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.ollama.runtime.config; 2 | 3 | import io.quarkus.runtime.annotations.ConfigGroup; 4 | import io.smallrye.config.WithDefault; 5 | 6 | @ConfigGroup 7 | public interface EmbeddingModelFixedRuntimeConfig { 8 | 9 | /** 10 | * Model to use. According to Ollama 11 | * docs, the default value is {@code nomic-embed-text} 12 | */ 13 | @WithDefault("nomic-embed-text") 14 | String modelId(); 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/ollama/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/ollama/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/ollama/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Ollama 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the basic integration of Ollama with LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/ollama/runtime/src/main/resources/META-INF/services/io.smallrye.config.ConfigSourceInterceptor: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.ollama.runtime.config.ModelIdConfigRelocateInterceptor 2 | io.quarkiverse.langchain4j.ollama.runtime.config.ModelIdConfigFallbackInterceptor 3 | -------------------------------------------------------------------------------- /model-providers/openai/azure-openai/deployment/src/main/java/io/quarkiverse/langchain4j/azure/openai/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.azure.openai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openai/azure-openai/deployment/src/main/java/io/quarkiverse/langchain4j/azure/openai/deployment/EmbeddingModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.azure.openai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface EmbeddingModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openai/azure-openai/deployment/src/main/java/io/quarkiverse/langchain4j/azure/openai/deployment/ImageModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.azure.openai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ImageModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openai/azure-openai/deployment/src/main/java/io/quarkiverse/langchain4j/azure/openai/deployment/ModerationModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.azure.openai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ModerationModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openai/azure-openai/runtime/src/main/java/io/quarkiverse/langchain4j/azure/openai/Consts.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.azure.openai; 2 | 3 | final class Consts { 4 | 5 | static final String DEFAULT_USER_AGENT = "langchain4j-quarkus-azure-openai"; 6 | static final String DUMMY_VALUE = ""; 7 | 8 | private Consts() { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /model-providers/openai/azure-openai/runtime/src/main/java/io/quarkiverse/langchain4j/azure/openai/runtime/config/ConfigConstants.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.azure.openai.runtime.config; 2 | 3 | final class ConfigConstants { 4 | static final String DUMMY_VALUE = ""; 5 | 6 | private ConfigConstants() { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /model-providers/openai/azure-openai/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Azure OpenAI 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the basic integration of Azure OpenAi with LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/openai/openai-common/runtime/src/main/java/io/quarkiverse/langchain4j/openai/common/OpenAiApiException.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openai.common; 2 | 3 | public class OpenAiApiException extends RuntimeException { 4 | 5 | public OpenAiApiException(Class responseClass) { 6 | super("OpenAI REST API return an error object as a response so no conversion to '" + responseClass.getSimpleName() 7 | + "' was possible"); 8 | } 9 | 10 | } 11 | -------------------------------------------------------------------------------- /model-providers/openai/openai-common/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/openai/openai-common/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/openai/openai-common/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j OpenAI Common 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | metadata: 4 | unlisted: true 5 | -------------------------------------------------------------------------------- /model-providers/openai/openai-common/runtime/src/main/resources/META-INF/services/dev.langchain4j.model.openai.internal.spi.OpenAiClientBuilderFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.openai.common.QuarkusOpenAiClient$QuarkusOpenAiClientBuilderFactory 2 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/deployment/src/main/java/io/quarkiverse/langchain4j/openai/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/deployment/src/main/java/io/quarkiverse/langchain4j/openai/deployment/EmbeddingModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface EmbeddingModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/deployment/src/main/java/io/quarkiverse/langchain4j/openai/deployment/ImageModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ImageModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/deployment/src/main/java/io/quarkiverse/langchain4j/openai/deployment/ModerationModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ModerationModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/deployment/src/test/resources/messages/recipe-user.txt: -------------------------------------------------------------------------------- 1 | Create recipe using only {{it}} -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/deployment/src/test/resources/messages/translate-system: -------------------------------------------------------------------------------- 1 | You are a professional translator into {{lang}} -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/deployment/src/test/resources/messages/translate-user.txt: -------------------------------------------------------------------------------- 1 | Translate the following text: {{text}} -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/devmode-tests/src/test/java/io/quarkiverse/langchain4j/openai/test/ConfigurationKey.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openai.test; 2 | 3 | public enum ConfigurationKey { 4 | DISPLAY_NEW_SPEAKERS, 5 | } 6 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/devmode-tests/src/test/java/io/quarkiverse/langchain4j/openai/test/Service.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openai.test; 2 | 3 | import dev.langchain4j.service.SystemMessage; 4 | import dev.langchain4j.service.UserMessage; 5 | import io.quarkiverse.langchain4j.RegisterAiService; 6 | 7 | @RegisterAiService 8 | public interface Service { 9 | 10 | @SystemMessage("You are a computer science conference organiser") 11 | @UserMessage(""" 12 | Help me select talks that match my favorite topics: {topics}. Give me the list of talks. 13 | """) 14 | String findTalks(String topics); 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/devmode-tests/src/test/java/io/quarkiverse/langchain4j/openai/test/ServiceWithResource.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openai.test; 2 | 3 | import dev.langchain4j.service.SystemMessage; 4 | import dev.langchain4j.service.UserMessage; 5 | import io.quarkiverse.langchain4j.RegisterAiService; 6 | 7 | @RegisterAiService 8 | public interface ServiceWithResource { 9 | 10 | @SystemMessage(fromResource = "cs-organizer.txt") 11 | @UserMessage(""" 12 | Help me select talks that match my favorite topics: {topics}. Give me the list of talks. 13 | """) 14 | String findTalks(String topics); 15 | } 16 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/devmode-tests/src/test/resources/cs-organizer.txt: -------------------------------------------------------------------------------- 1 | You are a computer science conference organiser 2 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/openai/openai-vanilla/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j OpenAI 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the basic integration with LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openai 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/runtime/src/main/resources/META-INF/services/dev.langchain4j.model.openai.spi.OpenAiChatModelBuilderFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.openai.QuarkusOpenAiChatModelBuilderFactory 2 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/runtime/src/main/resources/META-INF/services/dev.langchain4j.model.openai.spi.OpenAiEmbeddingModelBuilderFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.openai.QuarkusOpenAiEmbeddingModelBuilderFactory 2 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/runtime/src/main/resources/META-INF/services/dev.langchain4j.model.openai.spi.OpenAiModerationModelBuilderFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.openai.QuarkusOpenAiModerationModelBuilderFactory 2 | -------------------------------------------------------------------------------- /model-providers/openai/openai-vanilla/runtime/src/main/resources/META-INF/services/dev.langchain4j.model.openai.spi.OpenAiStreamingChatModelBuilderFactory: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.openai.QuarkusOpenAiStreamingChatModelBuilderFactory 2 | -------------------------------------------------------------------------------- /model-providers/openai/testing-internal/src/main/resources/META-INF/services/com.github.tomakehurst.wiremock.extension.Extension: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.openai.testing.internal.ChatCompletionTransformer 2 | -------------------------------------------------------------------------------- /model-providers/openai/testing-internal/src/main/resources/META-INF/services/io.smallrye.config.SmallRyeConfigBuilderCustomizer: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.openai.testing.internal.WiremockConfigBuilderCustomizer 2 | -------------------------------------------------------------------------------- /model-providers/openshift-ai/deployment/src/main/java/io/quarkiverse/langchain4j/openshift/ai/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openshift.ai.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openshift-ai/deployment/src/main/java/io/quarkiverse/langchain4j/openshift/ai/deployment/LangChain4jOpenshiftAiBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openshift.ai.deployment; 2 | 3 | import static io.quarkus.runtime.annotations.ConfigPhase.BUILD_TIME; 4 | 5 | import io.quarkus.runtime.annotations.ConfigRoot; 6 | import io.smallrye.config.ConfigMapping; 7 | 8 | @ConfigRoot(phase = BUILD_TIME) 9 | @ConfigMapping(prefix = "quarkus.langchain4j.openshift-ai") 10 | public interface LangChain4jOpenshiftAiBuildConfig { 11 | 12 | /** 13 | * Chat model related settings 14 | */ 15 | ChatModelBuildConfig chatModel(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/openshift-ai/runtime/src/main/java/io/quarkiverse/langchain4j/openshiftai/TextGenerationRequest.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openshiftai; 2 | 3 | public record TextGenerationRequest(String modelId, String inputs) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /model-providers/openshift-ai/runtime/src/main/java/io/quarkiverse/langchain4j/openshiftai/TextGenerationResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.openshiftai; 2 | 3 | public record TextGenerationResponse(String generatedText) { 4 | } 5 | -------------------------------------------------------------------------------- /model-providers/openshift-ai/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/openshift-ai/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/openshift-ai/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: Quarkus LangChain4j OpenShift AI 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with the OpenShift AI 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - openshift 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "preview" 13 | -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/main/java/io/quarkiverse/langchain4j/watsonx/deployment/ChatModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ChatModelBuildConfig { 10 | 11 | /** 12 | * Whether the model should be enabled. 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/main/java/io/quarkiverse/langchain4j/watsonx/deployment/EmbeddingModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface EmbeddingModelBuildConfig { 10 | 11 | /** 12 | * Whether the embedding model should be enabled. 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/main/java/io/quarkiverse/langchain4j/watsonx/deployment/ScoringModelBuildConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.deployment; 2 | 3 | import java.util.Optional; 4 | 5 | import io.quarkus.runtime.annotations.ConfigDocDefault; 6 | import io.quarkus.runtime.annotations.ConfigGroup; 7 | 8 | @ConfigGroup 9 | public interface ScoringModelBuildConfig { 10 | 11 | /** 12 | * Whether the scoring model should be enabled. 13 | */ 14 | @ConfigDocDefault("true") 15 | Optional enabled(); 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/main/java/io/quarkiverse/langchain4j/watsonx/deployment/items/BuiltinServiceBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.deployment.items; 2 | 3 | import org.jboss.jandex.DotName; 4 | 5 | import io.quarkus.builder.item.MultiBuildItem; 6 | 7 | public final class BuiltinServiceBuildItem extends MultiBuildItem { 8 | 9 | private DotName dotName; 10 | 11 | public BuiltinServiceBuildItem(DotName dotName) { 12 | this.dotName = dotName; 13 | } 14 | 15 | public DotName getDotName() { 16 | return dotName; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/main/java/io/quarkiverse/langchain4j/watsonx/deployment/items/TextExtractionClassBuildItem.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.deployment.items; 2 | 3 | import io.quarkus.builder.item.MultiBuildItem; 4 | 5 | public final class TextExtractionClassBuildItem extends MultiBuildItem { 6 | 7 | private String qualifier; 8 | 9 | public TextExtractionClassBuildItem(String qualifier) { 10 | this.qualifier = qualifier; 11 | } 12 | 13 | public String getQualifier() { 14 | return qualifier; 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/test/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.rest-client.logging.scope=request-response 2 | quarkus.rest-client.logging.body-limit=500 3 | quarkus.log.category."org.jboss.resteasy.reactive.client.logging".level=DEBUG -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/test/resources/messages/system.txt: -------------------------------------------------------------------------------- 1 | You are a poet -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/test/resources/messages/user.txt: -------------------------------------------------------------------------------- 1 | Generate a poem about {topic} -------------------------------------------------------------------------------- /model-providers/watsonx/deployment/src/test/resources/test.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/watsonx/deployment/src/test/resources/test.pdf -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/EmbeddingParameters.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | public record EmbeddingParameters(Integer truncateInputTokens) { 4 | } 5 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/EmbeddingRequest.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import java.util.List; 4 | 5 | public record EmbeddingRequest(String modelId, String spaceId, String projectId, List inputs, 6 | EmbeddingParameters parameters) { 7 | public EmbeddingRequest of(String modelId, String spaceId, String projectId, String input, EmbeddingParameters parameters) { 8 | return new EmbeddingRequest(modelId, spaceId, projectId, List.of(input), parameters); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/EmbeddingResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import java.util.List; 4 | 5 | public record EmbeddingResponse(List results) { 6 | public record Result(List embedding) { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/GoogleSearchResult.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import dev.langchain4j.Experimental; 4 | 5 | @Experimental 6 | public record GoogleSearchResult(String title, String description, String url) { 7 | } -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/IAMError.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import com.fasterxml.jackson.annotation.JsonProperty; 4 | 5 | public record IAMError(@JsonProperty("errorCode") Code errorCode, @JsonProperty("errorMessage") String errorMessage) { 6 | 7 | public static enum Code { 8 | // Provided API key is incorrect 9 | BXNIM0415E 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/IdentityTokenRequest.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import org.jboss.resteasy.reactive.RestForm; 4 | 5 | public record IdentityTokenRequest( 6 | @RestForm(value = "grant_type") String grantType, 7 | @RestForm(value = "apikey") String apikey) { 8 | } 9 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/IdentityTokenResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | public record IdentityTokenResponse( 4 | String accessToken, 5 | String refreshToken, 6 | String tokenType, 7 | long expiresIn, 8 | long expiration, 9 | String scope) { 10 | } 11 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/ScoringParameters.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | public record ScoringParameters(Integer truncateInputTokens) { 4 | } 5 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/ScoringResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import java.util.List; 4 | 5 | public record ScoringResponse(List results, Integer inputTokenCount) { 6 | public record ScoringOutput(Integer index, Double score) { 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/TextChatRequest.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import java.util.List; 4 | 5 | import com.fasterxml.jackson.annotation.JsonUnwrapped; 6 | 7 | import io.quarkiverse.langchain4j.watsonx.bean.TextChatMessage.TextChatParameterTool; 8 | 9 | public record TextChatRequest(String modelId, String spaceId, String projectId, List messages, 10 | List tools, 11 | @JsonUnwrapped TextChatParameters parameters) { 12 | } 13 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/TextGenerationRequest.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | public record TextGenerationRequest( 4 | String modelId, 5 | String spaceId, 6 | String projectId, 7 | String input, 8 | TextGenerationParameters parameters) { 9 | } 10 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/TextGenerationResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import java.util.List; 4 | 5 | import com.fasterxml.jackson.annotation.JsonProperty; 6 | 7 | public record TextGenerationResponse(String modelId, List results) { 8 | public record Result( 9 | @JsonProperty("generated_text") String generatedText, 10 | @JsonProperty("generated_token_count") int generatedTokenCount, 11 | @JsonProperty("input_token_count") int inputTokenCount, 12 | @JsonProperty("stop_reason") String stopReason) { 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/TokenizationRequest.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | public record TokenizationRequest(String modelId, String input, String spaceId, String projectId) { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/TokenizationResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | public record TokenizationResponse(Result result) { 4 | 5 | public record Result(int tokenCount) { 6 | 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/UtilityAgentToolsResponse.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import dev.langchain4j.Experimental; 4 | 5 | @Experimental 6 | public record UtilityAgentToolsResponse(String output) { 7 | } -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/java/io/quarkiverse/langchain4j/watsonx/bean/WebCrawlerResult.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.watsonx.bean; 2 | 3 | import dev.langchain4j.Experimental; 4 | 5 | @Experimental 6 | public record WebCrawlerResult(String url, String contentType, String content) { 7 | } -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/model-providers/watsonx/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /model-providers/watsonx/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Watsonx 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with the IBM Watsonx API 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | - watsonx 9 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 10 | categories: 11 | - "ai" 12 | status: "experimental" 13 | -------------------------------------------------------------------------------- /quarkus-integrations/websockets-next/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/quarkus-integrations/websockets-next/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /quarkus-integrations/websockets-next/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: Quarkus LangChain4j WebSockets Next 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides integration of Quarkus LangChain4j with WebSockets Next 4 | metadata: 5 | unlisted: true 6 | keywords: 7 | - ai 8 | - langchain4j 9 | - websockets 10 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 11 | categories: 12 | - "ai" 13 | status: "experimental" 14 | -------------------------------------------------------------------------------- /quarkus-integrations/websockets-next/runtime/src/main/resources/META-INF/services/io.quarkiverse.langchain4j.spi.DefaultMemoryIdProvider: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.websockets.next.runtime.WebSocketConnectionDefaultMemoryIdProvider 2 | -------------------------------------------------------------------------------- /rag/easy-rag/deployment/src/test/resources/ragdocuments/charlie.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/rag/easy-rag/deployment/src/test/resources/ragdocuments/charlie.pdf -------------------------------------------------------------------------------- /rag/easy-rag/deployment/src/test/resources/ragdocuments/subdirectory/david.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/rag/easy-rag/deployment/src/test/resources/ragdocuments/subdirectory/david.odt -------------------------------------------------------------------------------- /rag/easy-rag/runtime/src/main/codestarts/quarkus/langchain4j-easyrag-codestart/base/easy-rag-catalog/elite-money-market-account.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/rag/easy-rag/runtime/src/main/codestarts/quarkus/langchain4j-easyrag-codestart/base/easy-rag-catalog/elite-money-market-account.odt -------------------------------------------------------------------------------- /rag/easy-rag/runtime/src/main/codestarts/quarkus/langchain4j-easyrag-codestart/base/easy-rag-catalog/retirement-money-market.txt: -------------------------------------------------------------------------------- 1 | The "Retirement Money Market" saving account offers individual retirement account holders tax advantages and diversification. 2 | 3 | The is no monthly maintenance fee. 4 | The minimum deposit to open an account is $100, or a 25$ automatic monthly deposit. -------------------------------------------------------------------------------- /rag/easy-rag/runtime/src/main/codestarts/quarkus/langchain4j-easyrag-codestart/base/easy-rag-catalog/smart-checking-account.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/rag/easy-rag/runtime/src/main/codestarts/quarkus/langchain4j-easyrag-codestart/base/easy-rag-catalog/smart-checking-account.pdf -------------------------------------------------------------------------------- /rag/easy-rag/runtime/src/main/codestarts/quarkus/langchain4j-easyrag-codestart/base/src/main/resources/application.yml: -------------------------------------------------------------------------------- 1 | quarkus: 2 | langchain4j: 3 | timeout: 60s 4 | easy-rag: 5 | path: easy-rag-catalog 6 | reuse-embeddings: 7 | enabled: true -------------------------------------------------------------------------------- /rag/easy-rag/runtime/src/main/codestarts/quarkus/langchain4j-easyrag-codestart/codestart.yml: -------------------------------------------------------------------------------- 1 | name: langchain4j-easyrag-codestart 2 | ref: langchain4j-easyrag 3 | type: code 4 | tags: extension-codestart 5 | metadata: 6 | title: LangChain4j Easy RAG 7 | description: This codestart provide a sample Chat Bot AI service ready to be injected. 8 | related-guide-section: https://docs.quarkiverse.io/quarkus-langchain4j/dev/easy-rag.html 9 | -------------------------------------------------------------------------------- /rag/easy-rag/runtime/src/main/java/io/quarkiverse/langchain4j/easyrag/runtime/IngestionStrategy.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.easyrag.runtime; 2 | 3 | public enum IngestionStrategy { 4 | 5 | // TODO: we'd like to also have a "if-empty" and "overwrite" strategy 6 | // but these require some enhancements to the EmbeddingStore API 7 | 8 | ON, 9 | OFF, 10 | MANUAL 11 | 12 | } 13 | -------------------------------------------------------------------------------- /rag/easy-rag/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/rag/easy-rag/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /rag/easy-rag/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Easy RAG 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Easy RAG functionality with LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 9 | categories: 10 | - "ai" 11 | status: "experimental" 12 | codestart: 13 | name: langchain4j-easyrag 14 | languages: 15 | - "java" 16 | artifact: "io.quarkiverse.langchain4j:quarkus-langchain4j-easy-rag:codestarts:jar:${project.version}" 17 | -------------------------------------------------------------------------------- /rag/parsers-base/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/rag/parsers-base/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /rag/parsers-base/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: Quarkus LangChain4j Parsers Base 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the base module for making LangChain4j parsers work in Quarkus LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 9 | categories: 10 | - "ai" 11 | status: "experimental" 12 | -------------------------------------------------------------------------------- /samples/analyze-pdf-document/src/main/java/io/quarkiverse/langchain4j/sample/PdfDocumentAnalyzer.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import dev.langchain4j.data.pdf.PdfFile; 4 | import dev.langchain4j.service.UserMessage; 5 | import io.quarkiverse.langchain4j.PdfUrl; 6 | import io.quarkiverse.langchain4j.RegisterAiService; 7 | 8 | @RegisterAiService(chatMemoryProviderSupplier = RegisterAiService.NoChatMemoryProviderSupplier.class) 9 | public interface PdfDocumentAnalyzer { 10 | 11 | @UserMessage("Analyze the given document") 12 | RentalReport analyze(@PdfUrl PdfFile pdfFile); 13 | } 14 | -------------------------------------------------------------------------------- /samples/analyze-pdf-document/src/main/java/io/quarkiverse/langchain4j/sample/RentalReport.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import java.math.BigDecimal; 4 | import java.time.LocalDate; 5 | 6 | public record RentalReport( 7 | LocalDate agreementDate, 8 | LocalDate rentalStartDate, 9 | LocalDate rentalEndDate, 10 | String landlordName, 11 | String tenantName, 12 | BigDecimal rentalPriceUSD 13 | ) { 14 | } 15 | -------------------------------------------------------------------------------- /samples/analyze-pdf-document/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.http.port=8081 2 | -------------------------------------------------------------------------------- /samples/analyze-pdf-document/src/main/resources/rental.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/analyze-pdf-document/src/main/resources/rental.pdf -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/.gitignore: -------------------------------------------------------------------------------- 1 | ### macOS template 2 | # General 3 | .DS_Store 4 | .AppleDouble 5 | .LSOverride 6 | 7 | # Icon must end with two \r 8 | Icon 9 | 10 | # Thumbnails 11 | ._* 12 | 13 | # Files that might appear in the root of a volume 14 | .DocumentRevisions-V100 15 | .fseventsd 16 | .Spotlight-V100 17 | .TemporaryItems 18 | .Trashes 19 | .VolumeIcon.icns 20 | .com.apple.timemachine.donotpresent 21 | 22 | # Directories potentially created on remote AFP share 23 | .AppleDB 24 | .AppleDesktop 25 | Network Trash Folder 26 | Temporary Items 27 | .apdisk 28 | 29 | 30 | ### dotenv template 31 | .env 32 | 33 | **/easy-rag-embeddings.json 34 | -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/.mvn/jvm.config: -------------------------------------------------------------------------------- 1 | --add-modules=jdk.incubator.vector 2 | --add-opens=java.base/java.lang=ALL-UNNAMED 3 | --add-opens=java.base/java.io=ALL-UNNAMED 4 | -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/.mvn/maven.config: -------------------------------------------------------------------------------- 1 | -T12C 2 | -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/catalog/elite-money-market-account.odt: -------------------------------------------------------------------------------- 1 | ../../chatbot-easy-rag/catalog/elite-money-market-account.odt -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/catalog/retirement-money-market.txt: -------------------------------------------------------------------------------- 1 | ../../chatbot-easy-rag/catalog/retirement-money-market.txt -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/catalog/smart-checking-account.pdf: -------------------------------------------------------------------------------- 1 | ../../chatbot-easy-rag/catalog/smart-checking-account.pdf -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/catalog/standard-saving-account.txt: -------------------------------------------------------------------------------- 1 | ../../chatbot-easy-rag/catalog/standard-saving-account.txt -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://docs.renovatebot.com/renovate-schema.json", 3 | "extends": [ 4 | "config:recommended" 5 | ] 6 | } 7 | -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/src/main/kotlin/io/quarkiverse/langchain4j/sample/chatbot/AssistantExtensions.kt: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample.chatbot 2 | 3 | import io.quarkus.logging.Log 4 | import kotlinx.coroutines.withContext 5 | 6 | suspend fun Assistant.chatAsync( 7 | memoryId: ChatMemoryId, 8 | question: Question, 9 | userInfo: Map, 10 | dispatcher: kotlinx.coroutines.CoroutineDispatcher, 11 | ): Answer { 12 | val assistant = this 13 | return withContext(dispatcher) { 14 | Log.debug("Processing question: $question") 15 | assistant.chat(memoryId, question, userInfo) 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/src/main/kotlin/io/quarkiverse/langchain4j/sample/chatbot/internal/MailerExtensions.kt: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample.chatbot.internal 2 | 3 | import io.quarkus.mailer.Mail 4 | import io.quarkus.mailer.Mailer 5 | import kotlinx.coroutines.withContext 6 | 7 | suspend fun Mailer.sendSuspending( 8 | mail: Mail, 9 | dispatcher: kotlinx.coroutines.CoroutineDispatcher, 10 | ) { 11 | val mailer = this 12 | return withContext(dispatcher) { 13 | mailer.send(mail) 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/src/main/kotlin/io/quarkiverse/langchain4j/sample/chatbot/sentiment/Sentiment.kt: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample.chatbot.sentiment 2 | 3 | enum class Sentiment { 4 | POSITIVE, 5 | NEUTRAL, 6 | NEGATIVE 7 | } 8 | -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/src/main/resources/META-INF/resources/images/app-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/chatbot-easy-rag-kotlin/src/main/resources/META-INF/resources/images/app-architecture.png -------------------------------------------------------------------------------- /samples/chatbot-easy-rag-kotlin/src/main/resources/application-dev.properties: -------------------------------------------------------------------------------- 1 | #quarkus.langchain4j.openai.chat-model.model-name=gpt-4.1-nano 2 | 3 | ## Debugging properties, should enver be set on production 4 | quarkus.langchain4j.openai.chat-model.log-responses=true 5 | quarkus.langchain4j.openai.chat-model.log-requests=true 6 | quarkus.langchain4j.mcp.time.log-requests=true 7 | quarkus.langchain4j.mcp.time.log-responses=true 8 | #quarkus.langchain4j.openai.moderation-model.log-requests=true 9 | #quarkus.langchain4j.openai.moderation-model.log-responses=true 10 | #quarkus.langchain4j.easy-rag.reuse-embeddings.enabled=true 11 | -------------------------------------------------------------------------------- /samples/chatbot-easy-rag/catalog/elite-money-market-account.odt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/chatbot-easy-rag/catalog/elite-money-market-account.odt -------------------------------------------------------------------------------- /samples/chatbot-easy-rag/catalog/retirement-money-market.txt: -------------------------------------------------------------------------------- 1 | The "Retirement Money Market" saving account offers individual retirement account holders tax advantages and diversification. 2 | 3 | The is no monthly maintenance fee. 4 | The minimum deposit to open an account is $100, or a 25$ automatic monthly deposit. -------------------------------------------------------------------------------- /samples/chatbot-easy-rag/catalog/smart-checking-account.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/chatbot-easy-rag/catalog/smart-checking-account.pdf -------------------------------------------------------------------------------- /samples/chatbot-easy-rag/src/main/resources/META-INF/resources/images/chatbot-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/chatbot-easy-rag/src/main/resources/META-INF/resources/images/chatbot-architecture.png -------------------------------------------------------------------------------- /samples/chatbot-easy-rag/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | # Path to the directory where the documents are stored 2 | quarkus.langchain4j.easy-rag.path=catalog 3 | 4 | # optional properties that control how 5 | # the documents are split into segments 6 | quarkus.langchain4j.easy-rag.max-segment-size=100 7 | quarkus.langchain4j.easy-rag.max-overlap-size=25 8 | quarkus.langchain4j.easy-rag.max-results=4 9 | -------------------------------------------------------------------------------- /samples/chatbot-web-search/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.tavily.max-results=5 -------------------------------------------------------------------------------- /samples/chatbot/src/main/resources/META-INF/resources/images/chatbot-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/chatbot/src/main/resources/META-INF/resources/images/chatbot-architecture.png -------------------------------------------------------------------------------- /samples/chatbot/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.redis.dimension=1536 2 | quarkus.langchain4j.timeout=60s -------------------------------------------------------------------------------- /samples/chatbot/src/main/resources/catalog/retirement-money-market.txt: -------------------------------------------------------------------------------- 1 | The "Retirement Money Market" saving account offers individual retirement account holders tax advantages and diversification. 2 | 3 | The is no monthly maintenance fee. 4 | The minimum deposit to open an account is $100, or a 25$ automatic monthly deposit. -------------------------------------------------------------------------------- /samples/chatbot/src/main/resources/catalog/smart-checking-account.txt: -------------------------------------------------------------------------------- 1 | The "smart checking account" is easy, fast and secure. You can apply in under five minutes with an opening deposit of $25. There are no monthly fees, no minimum balance requirements and no overdraft fees. Y 2 | 3 | No-free overdraft protection is available from a linked deposit account. $50 overdrawn available balance safety threshold and overdraft free forgiven program. 4 | 5 | No ATM transaction fees. 6 | 7 | Enroll to reap benefits such as higher interest rates on savings and discounts on mortgage closing costs. 8 | 9 | -------------------------------------------------------------------------------- /samples/cli-translator/examples/translate.jvm: -------------------------------------------------------------------------------- 1 | java -jar ../target/quarkus-app/quarkus-run.jar $* 2 | -------------------------------------------------------------------------------- /samples/cli-translator/examples/translate.native: -------------------------------------------------------------------------------- 1 | ../target/quarkus-langchain4j-sample-cli-translator-1.0-SNAPSHOT-runner $* 2 | -------------------------------------------------------------------------------- /samples/cli-translator/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.timeout=60s 2 | quarkus.langchain4j.openai.api-key=${OPENAI_API_KEY} 3 | quarkus.langchain4j.openai.chat-model.temperature=0 4 | quarkus.banner.enabled=false 5 | quarkus.log.level=WARN 6 | -------------------------------------------------------------------------------- /samples/email-a-poem-kotlin/src/main/kotlin/io/quarkiverse/langchain4j/sample/EmailMeAPoemResource.kt: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample 2 | 3 | import jakarta.ws.rs.GET 4 | import jakarta.ws.rs.Path 5 | 6 | @Path("/email-me-a-poem") 7 | class EmailMeAPoemResource(private val service: MyAiService) { 8 | @GET 9 | fun emailMeAPoem(): String { 10 | return service.writeAPoem("Quarkus", 4) 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/email-a-poem-kotlin/src/main/resources/application-dev.properties: -------------------------------------------------------------------------------- 1 | quarkus.dotenv.enabled=true 2 | -------------------------------------------------------------------------------- /samples/email-a-poem-kotlin/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.timeout=60s 2 | quarkus.langchain4j.log-requests=true 3 | quarkus.langchain4j.log-responses=true 4 | 5 | quarkus.langchain4j.openai.chat-model.model-name=gpt-4.1-nano 6 | 7 | # mailer config 8 | quarkus.mailer.from=demoer@langchain4j.ai 9 | 10 | # observability config 11 | quarkus.otel.exporter.otlp.traces.protocol=http/protobuf 12 | -------------------------------------------------------------------------------- /samples/email-a-poem/src/main/java/io/quarkiverse/langchain4j/sample/EmailMeAPoemResource.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import jakarta.ws.rs.GET; 4 | import jakarta.ws.rs.Path; 5 | 6 | @Path("/email-me-a-poem") 7 | public class EmailMeAPoemResource { 8 | 9 | private final MyAiService service; 10 | 11 | public EmailMeAPoemResource(MyAiService service) { 12 | this.service = service; 13 | } 14 | 15 | @GET 16 | public String emailMeAPoem() { 17 | return service.writeAPoem("Quarkus", 4); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /samples/email-a-poem/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.timeout=60s 2 | quarkus.langchain4j.log-requests=true 3 | quarkus.langchain4j.log-responses=true 4 | 5 | quarkus.langchain4j.openai.chat-model.model-name=gpt-4o 6 | 7 | # mailer config 8 | quarkus.mailer.from=demoer@langchain4j.ai 9 | 10 | # observability config 11 | quarkus.otel.exporter.otlp.traces.protocol=http/protobuf 12 | -------------------------------------------------------------------------------- /samples/fraud-detection/src/main/java/io/quarkiverse/langchain4j/sample/Customer.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.GeneratedValue; 5 | import jakarta.persistence.Id; 6 | 7 | @Entity 8 | public class Customer { 9 | 10 | @Id 11 | @GeneratedValue 12 | public Long id; 13 | public String name; 14 | public String email; 15 | 16 | } 17 | -------------------------------------------------------------------------------- /samples/fraud-detection/src/main/java/io/quarkiverse/langchain4j/sample/CustomerRepository.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import jakarta.enterprise.context.ApplicationScoped; 4 | 5 | import dev.langchain4j.agent.tool.Tool; 6 | import io.quarkus.hibernate.orm.panache.PanacheRepository; 7 | 8 | @ApplicationScoped 9 | public class CustomerRepository implements PanacheRepository { 10 | 11 | @Tool("get the customer name for the given customerId") 12 | public String getCustomerName(long id) { 13 | return find("id", id).firstResult().name; 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /samples/fraud-detection/src/main/java/io/quarkiverse/langchain4j/sample/Transaction.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | import jakarta.persistence.Entity; 6 | import jakarta.persistence.GeneratedValue; 7 | import jakarta.persistence.Id; 8 | 9 | @Entity 10 | public class Transaction { 11 | 12 | @Id 13 | @GeneratedValue 14 | public Long id; 15 | 16 | public double amount; 17 | 18 | public long customerId; 19 | 20 | public String city; 21 | 22 | public LocalDateTime time; 23 | 24 | } 25 | -------------------------------------------------------------------------------- /samples/fraud-detection/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.openai.chat-model.temperature=0 2 | 3 | # For distance fraud detection ChatGPT 3.5 does not work, so we use GPT-4 4 | # Also we need to increase the timeout to 120s 5 | quarkus.langchain4j.timeout=120s 6 | quarkus.langchain4j.openai.chat-model.model-name=gpt-4o 7 | 8 | #quarkus.langchain4j.openai.log-requests=true 9 | #quarkus.langchain4j.openai.log-responses=true 10 | 11 | -------------------------------------------------------------------------------- /samples/image-to-plantuml/examples/image-to-plantuml.jvm: -------------------------------------------------------------------------------- 1 | java -jar ../target/quarkus-app/quarkus-run.jar $* 2 | -------------------------------------------------------------------------------- /samples/image-to-plantuml/examples/image-to-plantuml.native: -------------------------------------------------------------------------------- 1 | ../target/quarkus-langchain4j-sample-image-to-plantuml-1.0-SNAPSHOT-runner $* 2 | -------------------------------------------------------------------------------- /samples/image-to-plantuml/examples/qia-1-5.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/image-to-plantuml/examples/qia-1-5.webp -------------------------------------------------------------------------------- /samples/image-to-plantuml/examples/qia-1-6.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/image-to-plantuml/examples/qia-1-6.webp -------------------------------------------------------------------------------- /samples/image-to-plantuml/examples/qia-1-7.webp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/image-to-plantuml/examples/qia-1-7.webp -------------------------------------------------------------------------------- /samples/image-to-plantuml/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.timeout=60s 2 | quarkus.langchain4j.openai.api-key=${OPENAI_API_KEY} 3 | quarkus.banner.enabled=false 4 | quarkus.log.level=WARN 5 | -------------------------------------------------------------------------------- /samples/jbang-joke-bot/jokes.java: -------------------------------------------------------------------------------- 1 | ///usr/bin/env jbang "$0" "$@" ; exit $? 2 | //DEPS io.quarkus.platform:quarkus-bom:3.15.4@pom 3 | //DEPS io.quarkus:quarkus-picocli 4 | //DEPS io.quarkiverse.langchain4j:quarkus-langchain4j-openai:0.21.0.CR4 5 | //Q:CONFIG quarkus.banner.enabled=false 6 | //Q:CONFIG quarkus.log.level=WARN 7 | import dev.langchain4j.model.chat.ChatModel; 8 | import jakarta.inject.Inject; 9 | import picocli.CommandLine.Command; 10 | 11 | @Command 12 | public class jokes implements Runnable { 13 | @Inject 14 | private ChatModel ai; 15 | 16 | @Override 17 | public void run() { 18 | System.out.println(ai.generate("tell me a joke")); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /samples/mcp-sse-client-server/mcp-client/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/mcp-sse-client-server/mcp-client/README.md -------------------------------------------------------------------------------- /samples/mcp-sse-client-server/mcp-client/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.log-requests=true 2 | 3 | quarkus.langchain4j.mcp.weather.transport-type=http 4 | quarkus.langchain4j.mcp.weather.url=http://localhost:8081/mcp/sse/ 5 | 6 | quarkus.http.port=8080 7 | 8 | quarkus.langchain4j.timeout=30s 9 | -------------------------------------------------------------------------------- /samples/mcp-sse-client-server/mcp-server/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/mcp-sse-client-server/mcp-server/README.md -------------------------------------------------------------------------------- /samples/mcp-sse-client-server/mcp-server/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.http.port=8081 2 | quarkus.package.jar.type=uber-jar 3 | 4 | quarkus.mcp.server.server-info.name=Weather Service 5 | quarkus.mcp.server.traffic-logging.enabled=true 6 | quarkus.mcp.server.traffic-logging.text-limit=1000 7 | 8 | quarkus.rest-client.logging.scope=request-response 9 | quarkus.rest-client.logging.body-limit=50 10 | quarkus.rest-client.follow-redirects=true 11 | 12 | #quarkus.log.category."org.jboss.resteasy.reactive.client.logging".level=INFO 13 | 14 | -------------------------------------------------------------------------------- /samples/mcp-tools/playground/hello.txt: -------------------------------------------------------------------------------- 1 | Hello world! -------------------------------------------------------------------------------- /samples/mcp-tools/src/main/resources/META-INF/resources/images/chatbot-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/mcp-tools/src/main/resources/META-INF/resources/images/chatbot-architecture.png -------------------------------------------------------------------------------- /samples/mcp-tools/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.timeout=60s 2 | quarkus.log.category.\"dev.langchain4j\".level=DEBUG 3 | quarkus.log.category.\"io.quarkiverse\".level=DEBUG 4 | 5 | quarkus.langchain4j.mcp.filesystem.transport-type=stdio 6 | quarkus.langchain4j.mcp.filesystem.command=npm,exec,@modelcontextprotocol/server-filesystem@0.6.2,playground 7 | quarkus.langchain4j.mcp.filesystem.log-requests=true 8 | quarkus.langchain4j.mcp.filesystem.log-responses=true -------------------------------------------------------------------------------- /samples/movie-similarity-search/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | movies.file=src/main/resources/movies.csv 2 | quarkus.langchain4j.pgvector.dimension=1536 3 | quarkus.langchain4j.openai.api-key=${OPENAI_API_KEY} 4 | -------------------------------------------------------------------------------- /samples/react-chatbot/rest.http: -------------------------------------------------------------------------------- 1 | POST http://localhost:8080/react/ 2 | 3 | Who is the current pope? 4 | 5 | ### 6 | 7 | POST http://localhost:8080/react/ 8 | 9 | What did the critic mean about Expedition 33? Tell me what PC Gamer and IGN magazines think. -------------------------------------------------------------------------------- /samples/react-chatbot/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.watsonx.timeout=60s 2 | quarkus.langchain4j.response-schema=false 3 | quarkus.langchain4j.watsonx.chat-model.response-format=json_object 4 | quarkus.langchain4j.chat-memory.memory-window.max-messages=20 -------------------------------------------------------------------------------- /samples/review-triage/src/main/java/io/quarkiverse/langchain4j/sample/Evaluation.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | public enum Evaluation { 4 | 5 | POSITIVE, 6 | NEGATIVE 7 | } 8 | -------------------------------------------------------------------------------- /samples/review-triage/src/main/java/io/quarkiverse/langchain4j/sample/ReviewResource.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import jakarta.inject.Inject; 4 | import jakarta.ws.rs.POST; 5 | import jakarta.ws.rs.Path; 6 | 7 | @Path("/review") 8 | public class ReviewResource { 9 | 10 | @Inject 11 | TriageService triage; 12 | 13 | record Review(String review) { 14 | } 15 | 16 | @POST 17 | public TriagedReview triage(Review review) { 18 | return triage.triage(review.review()); 19 | } 20 | 21 | } 22 | -------------------------------------------------------------------------------- /samples/review-triage/src/main/java/io/quarkiverse/langchain4j/sample/TriagedReview.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import com.fasterxml.jackson.annotation.JsonCreator; 4 | 5 | public record TriagedReview(Evaluation evaluation, String message) { 6 | 7 | @JsonCreator 8 | public TriagedReview { 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /samples/review-triage/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.openai.chat-model.temperature=0.5 2 | quarkus.langchain4j.timeout=60s 3 | 4 | quarkus.langchain4j.log-requests=true 5 | quarkus.langchain4j.log-responses=true 6 | -------------------------------------------------------------------------------- /samples/secure-fraud-detection/src/main/java/io/quarkiverse/langchain4j/sample/Customer.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.GeneratedValue; 5 | import jakarta.persistence.Id; 6 | 7 | @Entity 8 | public class Customer { 9 | 10 | @Id 11 | @GeneratedValue 12 | public Long id; 13 | public String name; 14 | public String email; 15 | public int transactionLimit; 16 | } 17 | -------------------------------------------------------------------------------- /samples/secure-fraud-detection/src/main/java/io/quarkiverse/langchain4j/sample/CustomerConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import io.smallrye.config.ConfigMapping; 4 | 5 | @ConfigMapping(prefix = "customer") 6 | public interface CustomerConfig { 7 | 8 | String name(); 9 | 10 | String email(); 11 | } 12 | -------------------------------------------------------------------------------- /samples/secure-fraud-detection/src/main/java/io/quarkiverse/langchain4j/sample/MissingCustomerException.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | public class MissingCustomerException extends RuntimeException { 4 | } 5 | -------------------------------------------------------------------------------- /samples/secure-fraud-detection/src/main/java/io/quarkiverse/langchain4j/sample/Transaction.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import java.time.LocalDateTime; 4 | 5 | import jakarta.persistence.Entity; 6 | import jakarta.persistence.GeneratedValue; 7 | import jakarta.persistence.Id; 8 | 9 | @Entity 10 | public class Transaction { 11 | 12 | @Id 13 | @GeneratedValue 14 | public Long id; 15 | 16 | public double amount; 17 | 18 | public String customerName; 19 | 20 | public String customerEmail; 21 | 22 | public String city; 23 | 24 | public LocalDateTime time; 25 | 26 | } 27 | -------------------------------------------------------------------------------- /samples/secure-fraud-detection/src/main/resources/META-INF/resources/images/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/secure-fraud-detection/src/main/resources/META-INF/resources/images/google.png -------------------------------------------------------------------------------- /samples/secure-fraud-detection/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.openai.timeout=60s 2 | quarkus.langchain4j.openai.chat-model.temperature=0 3 | quarkus.langchain4j.openai.api-key=${OPENAI_API_KEY} 4 | 5 | quarkus.oidc.provider=google 6 | quarkus.oidc.client-id=${GOOGLE_CLIENT_ID} 7 | quarkus.oidc.credentials.secret=${GOOGLE_CLIENT_SECRET} 8 | quarkus.oidc.authentication.redirect-path=/login 9 | 10 | quarkus.langchain4j.openai.log-requests=true 11 | quarkus.langchain4j.openai.log-responses=true 12 | 13 | customer.name=${name} 14 | customer.email=${email} 15 | -------------------------------------------------------------------------------- /samples/secure-fraud-detection/src/main/resources/templates/fraudDetection.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Secure Fraud Detection 6 | 7 | 8 |

Hello {name}, please check fraud occurrences by amount:

9 | 10 | 11 | 14 | 15 |
12 | Detect fraud 13 |
16 | Logout 17 | 18 | 19 | -------------------------------------------------------------------------------- /samples/secure-fraud-detection/src/main/resources/templates/missingCustomer.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Missing Customer 6 | 7 | 8 | {given_name}, please make sure your Google account's full name and email are correctly registered at the startup using -Dname="{name}" and -Demail={email} system properties 9 |

10 | 11 | 12 | 15 | 16 |
13 | Back to the main page 14 |
17 | 18 | 19 | -------------------------------------------------------------------------------- /samples/secure-mcp-sse-client-server/secure-mcp-client/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/secure-mcp-sse-client-server/secure-mcp-client/README.md -------------------------------------------------------------------------------- /samples/secure-mcp-sse-client-server/secure-mcp-client/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.mcp.user-name.transport-type=http 2 | quarkus.langchain4j.mcp.user-name.url=http://localhost:8081/mcp/sse/ 3 | 4 | quarkus.oidc.provider=github 5 | quarkus.oidc.client-id=${github_client_id} 6 | quarkus.oidc.credentials.secret=${github_client_secret} 7 | 8 | quarkus.langchain4j.ai.gemini.log-requests=true 9 | quarkus.langchain4j.ai.gemini.log-responses=true 10 | quarkus.langchain4j.ai.gemini.api-key=${ai_gemini_api_key} 11 | 12 | quarkus.http.port=8080 13 | quarkus.langchain4j.timeout=30s 14 | quarkus.langchain4j.log-requests=true 15 | 16 | -------------------------------------------------------------------------------- /samples/secure-mcp-sse-client-server/secure-mcp-client/src/main/resources/templates/poem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Secure Poem Resource 6 | 7 | 8 |

Hello {name} !

9 | 10 | 11 | 14 | 15 |
12 | Read a poem 13 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /samples/secure-mcp-sse-client-server/secure-mcp-server/README.md: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/secure-mcp-sse-client-server/secure-mcp-server/README.md -------------------------------------------------------------------------------- /samples/secure-mcp-sse-client-server/secure-mcp-server/src/main/java/io/quarkiverse/langchain4j/sample/Identity.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample; 2 | 3 | import io.quarkus.hibernate.orm.panache.PanacheEntity; 4 | import jakarta.persistence.Column; 5 | import jakarta.persistence.Entity; 6 | 7 | @Entity 8 | public class Identity extends PanacheEntity { 9 | @Column(unique = true) 10 | public String name; 11 | public String permission; 12 | public static Identity findByName(String name) { 13 | return find("name", name).firstResult(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /samples/secure-mcp-sse-client-server/secure-mcp-server/src/main/resources/import.sql: -------------------------------------------------------------------------------- 1 | INSERT INTO identity(id, name, permission) VALUES (1, '${user.name}', 'read:name'); 2 | -------------------------------------------------------------------------------- /samples/secure-poem-multiple-models/src/main/resources/META-INF/resources/images/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/secure-poem-multiple-models/src/main/resources/META-INF/resources/images/google.png -------------------------------------------------------------------------------- /samples/secure-poem-multiple-models/src/main/resources/templates/poem.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Secure Poem Resource 6 | 7 | 8 |

Hello {name} !

9 | 10 | 11 | 14 | 15 |
12 | Read a poem 13 |
16 | Logout 17 | 18 | 19 | -------------------------------------------------------------------------------- /samples/secure-sql-chatbot/src/main/java/io/quarkiverse/langchain4j/sample/chatbot/MissingMovieWatcherException.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample.chatbot; 2 | 3 | public class MissingMovieWatcherException extends RuntimeException { 4 | } 5 | -------------------------------------------------------------------------------- /samples/secure-sql-chatbot/src/main/java/io/quarkiverse/langchain4j/sample/chatbot/MovieSchemaSupport.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample.chatbot; 2 | 3 | public class MovieSchemaSupport { 4 | 5 | public static String getSchemaString() { 6 | String columnsStr = MovieTableIntegrator.schemaStr; 7 | if (columnsStr.isEmpty()) { 8 | throw new IllegalStateException("MovieSchemaSupport#getSchemaString called too early"); 9 | } 10 | return columnsStr; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/secure-sql-chatbot/src/main/java/io/quarkiverse/langchain4j/sample/chatbot/MovieWatcher.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample.chatbot; 2 | 3 | import jakarta.persistence.Entity; 4 | import jakarta.persistence.GeneratedValue; 5 | import jakarta.persistence.Id; 6 | 7 | @Entity 8 | public class MovieWatcher { 9 | 10 | @Id 11 | @GeneratedValue 12 | public Long id; 13 | public String name; 14 | public String email; 15 | public String preferredGenre; 16 | } 17 | -------------------------------------------------------------------------------- /samples/secure-sql-chatbot/src/main/java/io/quarkiverse/langchain4j/sample/chatbot/MovieWatcherConfig.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample.chatbot; 2 | 3 | import io.smallrye.config.ConfigMapping; 4 | 5 | @ConfigMapping(prefix = "movie.watcher") 6 | public interface MovieWatcherConfig { 7 | 8 | String name(); 9 | 10 | String email(); 11 | } 12 | -------------------------------------------------------------------------------- /samples/secure-sql-chatbot/src/main/resources/META-INF/resources/images/chatbot-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/secure-sql-chatbot/src/main/resources/META-INF/resources/images/chatbot-architecture.png -------------------------------------------------------------------------------- /samples/secure-sql-chatbot/src/main/resources/META-INF/resources/images/google.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/secure-sql-chatbot/src/main/resources/META-INF/resources/images/google.png -------------------------------------------------------------------------------- /samples/secure-sql-chatbot/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.sample.chatbot.MovieTableIntegrator 2 | -------------------------------------------------------------------------------- /samples/secure-sql-chatbot/src/main/resources/server-keystore.p12: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/secure-sql-chatbot/src/main/resources/server-keystore.p12 -------------------------------------------------------------------------------- /samples/sql-chatbot/moviemuse.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/sql-chatbot/moviemuse.png -------------------------------------------------------------------------------- /samples/sql-chatbot/src/main/java/io/quarkiverse/langchain4j/sample/chatbot/MovieSchemaSupport.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.sample.chatbot; 2 | 3 | public class MovieSchemaSupport { 4 | 5 | public static String getSchemaString() { 6 | String columnsStr = MovieTableIntegrator.schemaStr; 7 | if (columnsStr.isEmpty()) { 8 | throw new IllegalStateException("MovieSchemaSupport#getSchemaString called too early"); 9 | } 10 | return columnsStr; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /samples/sql-chatbot/src/main/resources/META-INF/resources/images/chatbot-architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/samples/sql-chatbot/src/main/resources/META-INF/resources/images/chatbot-architecture.png -------------------------------------------------------------------------------- /samples/sql-chatbot/src/main/resources/META-INF/services/org.hibernate.integrator.spi.Integrator: -------------------------------------------------------------------------------- 1 | io.quarkiverse.langchain4j.sample.chatbot.MovieTableIntegrator 2 | -------------------------------------------------------------------------------- /samples/sql-chatbot/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.timeout=60s 2 | csv.file=src/main/resources/data/movies.csv 3 | 4 | quarkus.hibernate-orm.database.generation=drop-and-create 5 | 6 | # if you want to log the requests and responses that go to OpenAI: 7 | #quarkus.langchain4j.openai.log-requests=true 8 | #quarkus.langchain4j.openai.log-responses=true 9 | -------------------------------------------------------------------------------- /samples/weather-agent/src/main/java/io/quarkiverse/langchain4j/weather/agent/geo/GeoResult.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.weather.agent.geo; 2 | 3 | public record GeoResult(double latitude, double longitude) { 4 | } 5 | -------------------------------------------------------------------------------- /samples/weather-agent/src/main/java/io/quarkiverse/langchain4j/weather/agent/geo/GeoResults.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.weather.agent.geo; 2 | 3 | import java.util.List; 4 | 5 | public record GeoResults(List results) { 6 | 7 | public GeoResult getFirst() { 8 | return results.get(0); 9 | } 10 | 11 | } 12 | -------------------------------------------------------------------------------- /samples/weather-agent/src/main/java/io/quarkiverse/langchain4j/weather/agent/weather/DailyUnits.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.weather.agent.weather; 2 | 3 | public record DailyUnits(String time, 4 | String temperature_2m_max, 5 | String precipitation_sum, 6 | String wind_speed_10m_max) { 7 | } 8 | -------------------------------------------------------------------------------- /samples/weather-agent/src/main/java/io/quarkiverse/langchain4j/weather/agent/weather/WeatherForecast.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.weather.agent.weather; 2 | 3 | public record WeatherForecast(DailyUnits daily_units, Daily daily) { 4 | 5 | 6 | } 7 | -------------------------------------------------------------------------------- /samples/weather-agent/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | quarkus.langchain4j.log-requests=true 2 | quarkus.langchain4j.log-responses=true 3 | 4 | quarkus.rest-client.geocoding.url=https://geocoding-api.open-meteo.com 5 | quarkus.rest-client.openmeteo.url=https://api.open-meteo.com 6 | -------------------------------------------------------------------------------- /testing/core/src/test/java/io/quarkiverse/langchain4j/guardrails/ClaimInfo.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.guardrails; 2 | 3 | public record ClaimInfo(String clientName, String claimNumber, String claimStatus) { 4 | } 5 | -------------------------------------------------------------------------------- /testing/scorer/scorer-core/src/main/java/io/quarkiverse/langchain4j/testing/scorer/EvaluationStrategy.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.testing.scorer; 2 | 3 | /** 4 | * A strategy to evaluate the output of a model. 5 | * 6 | * @param the type of the output. 7 | */ 8 | public interface EvaluationStrategy { 9 | 10 | /** 11 | * Evaluate the output of a model. 12 | * 13 | * @param sample the sample to evaluate. 14 | * @param output the output of the model. 15 | * @return {@code true} if the output is correct, {@code false} otherwise. 16 | */ 17 | boolean evaluate(EvaluationSample sample, T output); 18 | 19 | } 20 | -------------------------------------------------------------------------------- /tools/tavily/runtime/src/main/java/io/quarkiverse/langchain4j/tavily/SearchDepth.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.tavily; 2 | 3 | public enum SearchDepth { 4 | BASIC, 5 | ADVANCED 6 | } 7 | -------------------------------------------------------------------------------- /tools/tavily/runtime/src/main/java/io/quarkiverse/langchain4j/tavily/runtime/TavilyClient.java: -------------------------------------------------------------------------------- 1 | package io.quarkiverse.langchain4j.tavily.runtime; 2 | 3 | import jakarta.ws.rs.Consumes; 4 | import jakarta.ws.rs.POST; 5 | import jakarta.ws.rs.Path; 6 | import jakarta.ws.rs.Produces; 7 | import jakarta.ws.rs.core.MediaType; 8 | 9 | @Path("/") 10 | @Consumes(MediaType.APPLICATION_JSON) 11 | @Produces(MediaType.APPLICATION_JSON) 12 | public interface TavilyClient { 13 | 14 | @POST 15 | @Path("/search") 16 | TavilyResponse search(TavilySearchRequest request); 17 | } 18 | -------------------------------------------------------------------------------- /tools/tavily/runtime/src/main/resources/META-INF/beans.xml: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/quarkiverse/quarkus-langchain4j/26e9819978be33fbb41e565d7ca898be255c5cab/tools/tavily/runtime/src/main/resources/META-INF/beans.xml -------------------------------------------------------------------------------- /tools/tavily/runtime/src/main/resources/META-INF/quarkus-extension.yaml: -------------------------------------------------------------------------------- 1 | name: LangChain4j Tavily Web Search Engine 2 | artifact: ${project.groupId}:${project.artifactId}:${project.version} 3 | description: Provides the Tavily Web search engine for LangChain4j 4 | metadata: 5 | keywords: 6 | - ai 7 | - langchain4j 8 | guide: "https://docs.quarkiverse.io/quarkus-langchain4j/dev/index.html" 9 | categories: 10 | - "ai" 11 | status: "experimental" 12 | 13 | --------------------------------------------------------------------------------