3131import org .elasticsearch .inference .InferenceServiceRegistry ;
3232import org .elasticsearch .license .License ;
3333import org .elasticsearch .license .LicensedFeature ;
34+ import org .elasticsearch .license .XPackLicenseState ;
3435import org .elasticsearch .node .PluginComponentBinding ;
3536import org .elasticsearch .plugins .ActionPlugin ;
3637import org .elasticsearch .plugins .ExtensiblePlugin ;
4950import org .elasticsearch .threadpool .ThreadPool ;
5051import org .elasticsearch .xcontent .ParseField ;
5152import org .elasticsearch .xpack .core .ClientHelper ;
53+ import org .elasticsearch .xpack .core .XPackPlugin ;
5254import org .elasticsearch .xpack .core .action .XPackUsageFeatureAction ;
5355import org .elasticsearch .xpack .core .inference .action .DeleteInferenceEndpointAction ;
5456import org .elasticsearch .xpack .core .inference .action .GetInferenceDiagnosticsAction ;
5860import org .elasticsearch .xpack .core .inference .action .PutInferenceModelAction ;
5961import org .elasticsearch .xpack .core .inference .action .UnifiedCompletionAction ;
6062import org .elasticsearch .xpack .core .inference .action .UpdateInferenceModelAction ;
63+ import org .elasticsearch .xpack .core .ssl .SSLService ;
6164import org .elasticsearch .xpack .inference .action .TransportDeleteInferenceEndpointAction ;
6265import org .elasticsearch .xpack .inference .action .TransportGetInferenceDiagnosticsAction ;
6366import org .elasticsearch .xpack .inference .action .TransportGetInferenceModelAction ;
126129import java .util .Map ;
127130import java .util .function .Predicate ;
128131import java .util .function .Supplier ;
129- import java .util .stream .Collectors ;
130132import java .util .stream .Stream ;
131133
132134import static java .util .Collections .singletonList ;
@@ -166,6 +168,7 @@ public class InferencePlugin extends Plugin implements ActionPlugin, ExtensibleP
166168 private final Settings settings ;
167169 private final SetOnce <HttpRequestSender .Factory > httpFactory = new SetOnce <>();
168170 private final SetOnce <AmazonBedrockRequestSender .Factory > amazonBedrockFactory = new SetOnce <>();
171+ private final SetOnce <HttpRequestSender .Factory > elasicInferenceServiceFactory = new SetOnce <>();
169172 private final SetOnce <ServiceComponents > serviceComponents = new SetOnce <>();
170173 // This is mainly so that the rest handlers can access the ThreadPool in a way that avoids potential null pointers from it
171174 // not being initialized yet
@@ -252,31 +255,31 @@ public Collection<?> createComponents(PluginServices services) {
252255 var inferenceServices = new ArrayList <>(inferenceServiceExtensions );
253256 inferenceServices .add (this ::getInferenceServiceFactories );
254257
255- // Set elasticInferenceUrl based on feature flags to support transitioning to the new Elastic Inference Service URL without exposing
256- // internal names like "eis" or "gateway".
257- ElasticInferenceServiceSettings inferenceServiceSettings = new ElasticInferenceServiceSettings (settings );
258-
259- String elasticInferenceUrl = null ;
258+ if (isElasticInferenceServiceEnabled ()) {
259+ // Create a separate instance of HTTPClientManager with its own SSL configuration (`xpack.inference.elastic.http.ssl.*`).
260+ var elasticInferenceServiceHttpClientManager = HttpClientManager .create (
261+ settings ,
262+ services .threadPool (),
263+ services .clusterService (),
264+ throttlerManager ,
265+ getSslService ()
266+ );
260267
261- if (ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG .isEnabled ()) {
262- elasticInferenceUrl = inferenceServiceSettings .getElasticInferenceServiceUrl ();
263- } else if (DEPRECATED_ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG .isEnabled ()) {
264- log .warn (
265- "Deprecated flag {} detected for enabling {}. Please use {}." ,
266- ELASTIC_INFERENCE_SERVICE_IDENTIFIER ,
267- DEPRECATED_ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG ,
268- ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG
268+ var elasticInferenceServiceRequestSenderFactory = new HttpRequestSender .Factory (
269+ serviceComponents .get (),
270+ elasticInferenceServiceHttpClientManager ,
271+ services .clusterService ()
269272 );
270- elasticInferenceUrl = inferenceServiceSettings .getEisGatewayUrl ();
271- }
273+ elasicInferenceServiceFactory .set (elasticInferenceServiceRequestSenderFactory );
272274
273- if (elasticInferenceUrl != null ) {
275+ ElasticInferenceServiceSettings inferenceServiceSettings = new ElasticInferenceServiceSettings (settings );
276+ String elasticInferenceUrl = this .getElasticInferenceServiceUrl (inferenceServiceSettings );
274277 elasticInferenceServiceComponents .set (new ElasticInferenceServiceComponents (elasticInferenceUrl ));
275278
276279 inferenceServices .add (
277280 () -> List .of (
278281 context -> new ElasticInferenceService (
279- httpFactory .get (),
282+ elasicInferenceServiceFactory .get (),
280283 serviceComponents .get (),
281284 elasticInferenceServiceComponents .get ()
282285 )
@@ -400,16 +403,21 @@ public static ExecutorBuilder<?> inferenceUtilityExecutor(Settings settings) {
400403
401404 @ Override
402405 public List <Setting <?>> getSettings () {
403- return Stream .of (
404- HttpSettings .getSettingsDefinitions (),
405- HttpClientManager .getSettingsDefinitions (),
406- ThrottlerManager .getSettingsDefinitions (),
407- RetrySettings .getSettingsDefinitions (),
408- ElasticInferenceServiceSettings .getSettingsDefinitions (),
409- Truncator .getSettingsDefinitions (),
410- RequestExecutorServiceSettings .getSettingsDefinitions (),
411- List .of (SKIP_VALIDATE_AND_START )
412- ).flatMap (Collection ::stream ).collect (Collectors .toList ());
406+ ArrayList <Setting <?>> settings = new ArrayList <>();
407+ settings .addAll (HttpSettings .getSettingsDefinitions ());
408+ settings .addAll (HttpClientManager .getSettingsDefinitions ());
409+ settings .addAll (ThrottlerManager .getSettingsDefinitions ());
410+ settings .addAll (RetrySettings .getSettingsDefinitions ());
411+ settings .addAll (Truncator .getSettingsDefinitions ());
412+ settings .addAll (RequestExecutorServiceSettings .getSettingsDefinitions ());
413+ settings .add (SKIP_VALIDATE_AND_START );
414+
415+ // Register Elastic Inference Service settings definitions if the corresponding feature flag is enabled.
416+ if (isElasticInferenceServiceEnabled ()) {
417+ settings .addAll (ElasticInferenceServiceSettings .getSettingsDefinitions ());
418+ }
419+
420+ return settings ;
413421 }
414422
415423 @ Override
@@ -466,7 +474,10 @@ public List<QueryRewriteInterceptor> getQueryRewriteInterceptors() {
466474 @ Override
467475 public List <RetrieverSpec <?>> getRetrievers () {
468476 return List .of (
469- new RetrieverSpec <>(new ParseField (TextSimilarityRankBuilder .NAME ), TextSimilarityRankRetrieverBuilder ::fromXContent ),
477+ new RetrieverSpec <>(
478+ new ParseField (TextSimilarityRankBuilder .NAME ),
479+ (parser , context ) -> TextSimilarityRankRetrieverBuilder .fromXContent (parser , context , getLicenseState ())
480+ ),
470481 new RetrieverSpec <>(new ParseField (RandomRankBuilder .NAME ), RandomRankRetrieverBuilder ::fromXContent )
471482 );
472483 }
@@ -475,4 +486,36 @@ public List<RetrieverSpec<?>> getRetrievers() {
475486 public Map <String , Highlighter > getHighlighters () {
476487 return Map .of (SemanticTextHighlighter .NAME , new SemanticTextHighlighter ());
477488 }
489+
490+ // Get Elastic Inference service URL based on feature flags to support transitioning
491+ // to the new Elastic Inference Service URL.
492+ private String getElasticInferenceServiceUrl (ElasticInferenceServiceSettings settings ) {
493+ String elasticInferenceUrl = null ;
494+
495+ if (ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG .isEnabled ()) {
496+ elasticInferenceUrl = settings .getElasticInferenceServiceUrl ();
497+ } else if (DEPRECATED_ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG .isEnabled ()) {
498+ log .warn (
499+ "Deprecated flag {} detected for enabling {}. Please use {}." ,
500+ ELASTIC_INFERENCE_SERVICE_IDENTIFIER ,
501+ DEPRECATED_ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG ,
502+ ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG
503+ );
504+ elasticInferenceUrl = settings .getEisGatewayUrl ();
505+ }
506+
507+ return elasticInferenceUrl ;
508+ }
509+
510+ protected Boolean isElasticInferenceServiceEnabled () {
511+ return (ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG .isEnabled () || DEPRECATED_ELASTIC_INFERENCE_SERVICE_FEATURE_FLAG .isEnabled ());
512+ }
513+
514+ protected SSLService getSslService () {
515+ return XPackPlugin .getSharedSslService ();
516+ }
517+
518+ protected XPackLicenseState getLicenseState () {
519+ return XPackPlugin .getSharedLicenseState ();
520+ }
478521}
0 commit comments