NLPService.process fetches tenant config from HbfCoreService.
Priority keyword pre-processing: checks query against LocalNluSettings.intents using exact match or configured similarity algorithm (Jaro-Winkler/Damerau-Levenshtein). Returns immediately if matched.
Language resolution: if detectLanguage=true, calls LlmService.languageDetectionLegacy; otherwise uses the provided language field.
Pipeline selection: looks up tenant.nlpMap[language] first; falls back to evaluating PipelineDecisionTree from tenant.nlpTreeMap[language].
NLPService.processQuery calls ResolverService to get the provider for the pipeline type (HELVIA_RAG, HELVIA_NLP, or DIALOGFLOW_NLP).
Provider delegates to its HTTP/gRPC client, returns NLPProcessResponseDto.
Per-message metadata (pipeline used, confidence, timings) is written to MySQL via MessageMetadataService.