1717import org .elasticsearch .core .Strings ;
1818import org .elasticsearch .core .TimeValue ;
1919import org .elasticsearch .inference .ChunkedInference ;
20+ import org .elasticsearch .inference .ChunkingSettings ;
2021import org .elasticsearch .inference .InferenceServiceConfiguration ;
2122import org .elasticsearch .inference .InferenceServiceResults ;
2223import org .elasticsearch .inference .InputType ;
2728import org .elasticsearch .inference .SimilarityMeasure ;
2829import org .elasticsearch .inference .TaskType ;
2930import org .elasticsearch .rest .RestStatus ;
31+ import org .elasticsearch .xpack .inference .chunking .ChunkingSettingsBuilder ;
32+ import org .elasticsearch .xpack .inference .chunking .EmbeddingRequestChunker ;
3033import org .elasticsearch .xpack .inference .external .action .SenderExecutableAction ;
3134import org .elasticsearch .xpack .inference .external .http .sender .EmbeddingsInput ;
3235import org .elasticsearch .xpack .inference .external .http .sender .HttpRequestSender ;
4548import static org .elasticsearch .inference .TaskType .unsupportedTaskTypeErrorMsg ;
4649import static org .elasticsearch .xpack .inference .external .action .ActionUtils .constructFailedToSendRequestMessage ;
4750import static org .elasticsearch .xpack .inference .services .ServiceUtils .createInvalidModelException ;
51+ import static org .elasticsearch .xpack .inference .services .ServiceUtils .removeFromMap ;
4852import static org .elasticsearch .xpack .inference .services .ServiceUtils .removeFromMapOrDefaultEmpty ;
4953import static org .elasticsearch .xpack .inference .services .ServiceUtils .removeFromMapOrThrowIfNull ;
5054import static org .elasticsearch .xpack .inference .services .ServiceUtils .throwIfNotEmptyMap ;
@@ -81,12 +85,15 @@ public void parseRequestConfig(
8185 Map <String , Object > serviceSettingsMap = removeFromMapOrThrowIfNull (config , ModelConfigurations .SERVICE_SETTINGS );
8286 Map <String , Object > taskSettingsMap = removeFromMapOrDefaultEmpty (config , ModelConfigurations .TASK_SETTINGS );
8387
88+ var chunkingSettings = extractChunkingSettings (config , taskType );
89+
8490 CustomModel model = createModel (
8591 inferenceEntityId ,
8692 taskType ,
8793 serviceSettingsMap ,
8894 taskSettingsMap ,
8995 serviceSettingsMap ,
96+ chunkingSettings ,
9097 ConfigurationParseContext .REQUEST
9198 );
9299
@@ -100,6 +107,14 @@ public void parseRequestConfig(
100107 }
101108 }
102109
110+ private static ChunkingSettings extractChunkingSettings (Map <String , Object > config , TaskType taskType ) {
111+ if (TaskType .TEXT_EMBEDDING .equals (taskType )) {
112+ return ChunkingSettingsBuilder .fromMap (removeFromMap (config , ModelConfigurations .CHUNKING_SETTINGS ));
113+ }
114+
115+ return null ;
116+ }
117+
103118 @ Override
104119 public InferenceServiceConfiguration getConfiguration () {
105120 return Configuration .get ();
@@ -125,14 +140,16 @@ private static CustomModel createModelWithoutLoggingDeprecations(
125140 TaskType taskType ,
126141 Map <String , Object > serviceSettings ,
127142 Map <String , Object > taskSettings ,
128- @ Nullable Map <String , Object > secretSettings
143+ @ Nullable Map <String , Object > secretSettings ,
144+ @ Nullable ChunkingSettings chunkingSettings
129145 ) {
130146 return createModel (
131147 inferenceEntityId ,
132148 taskType ,
133149 serviceSettings ,
134150 taskSettings ,
135151 secretSettings ,
152+ chunkingSettings ,
136153 ConfigurationParseContext .PERSISTENT
137154 );
138155 }
@@ -143,12 +160,13 @@ private static CustomModel createModel(
143160 Map <String , Object > serviceSettings ,
144161 Map <String , Object > taskSettings ,
145162 @ Nullable Map <String , Object > secretSettings ,
163+ @ Nullable ChunkingSettings chunkingSettings ,
146164 ConfigurationParseContext context
147165 ) {
148166 if (supportedTaskTypes .contains (taskType ) == false ) {
149167 throw new ElasticsearchStatusException (unsupportedTaskTypeErrorMsg (taskType , NAME ), RestStatus .BAD_REQUEST );
150168 }
151- return new CustomModel (inferenceEntityId , taskType , NAME , serviceSettings , taskSettings , secretSettings , context );
169+ return new CustomModel (inferenceEntityId , taskType , NAME , serviceSettings , taskSettings , secretSettings , chunkingSettings , context );
152170 }
153171
154172 @ Override
@@ -162,15 +180,33 @@ public CustomModel parsePersistedConfigWithSecrets(
162180 Map <String , Object > taskSettingsMap = removeFromMapOrThrowIfNull (config , ModelConfigurations .TASK_SETTINGS );
163181 Map <String , Object > secretSettingsMap = removeFromMapOrThrowIfNull (secrets , ModelSecrets .SECRET_SETTINGS );
164182
165- return createModelWithoutLoggingDeprecations (inferenceEntityId , taskType , serviceSettingsMap , taskSettingsMap , secretSettingsMap );
183+ var chunkingSettings = extractChunkingSettings (config , taskType );
184+
185+ return createModelWithoutLoggingDeprecations (
186+ inferenceEntityId ,
187+ taskType ,
188+ serviceSettingsMap ,
189+ taskSettingsMap ,
190+ secretSettingsMap ,
191+ chunkingSettings
192+ );
166193 }
167194
168195 @ Override
169196 public CustomModel parsePersistedConfig (String inferenceEntityId , TaskType taskType , Map <String , Object > config ) {
170197 Map <String , Object > serviceSettingsMap = removeFromMapOrThrowIfNull (config , ModelConfigurations .SERVICE_SETTINGS );
171198 Map <String , Object > taskSettingsMap = removeFromMapOrThrowIfNull (config , ModelConfigurations .TASK_SETTINGS );
172199
173- return createModelWithoutLoggingDeprecations (inferenceEntityId , taskType , serviceSettingsMap , taskSettingsMap , null );
200+ var chunkingSettings = extractChunkingSettings (config , taskType );
201+
202+ return createModelWithoutLoggingDeprecations (
203+ inferenceEntityId ,
204+ taskType ,
205+ serviceSettingsMap ,
206+ taskSettingsMap ,
207+ null ,
208+ chunkingSettings
209+ );
174210 }
175211
176212 @ Override
@@ -211,7 +247,27 @@ protected void doChunkedInfer(
211247 TimeValue timeout ,
212248 ActionListener <List <ChunkedInference >> listener
213249 ) {
214- listener .onFailure (new ElasticsearchStatusException ("Chunking not supported by the {} service" , RestStatus .BAD_REQUEST , NAME ));
250+ if (model instanceof CustomModel == false ) {
251+ listener .onFailure (createInvalidModelException (model ));
252+ return ;
253+ }
254+
255+ var customModel = (CustomModel ) model ;
256+ var overriddenModel = CustomModel .of (customModel , taskSettings );
257+
258+ var failedToSendRequestErrorMessage = constructFailedToSendRequestMessage (SERVICE_NAME );
259+ var manager = CustomRequestManager .of (overriddenModel , getServiceComponents ().threadPool ());
260+
261+ List <EmbeddingRequestChunker .BatchRequestAndListener > batchedRequests = new EmbeddingRequestChunker <>(
262+ inputs .getInputs (),
263+ customModel .getServiceSettings ().getBatchSize (),
264+ customModel .getConfigurations ().getChunkingSettings ()
265+ ).batchRequestsWithListeners (listener );
266+
267+ for (var request : batchedRequests ) {
268+ var action = new SenderExecutableAction (getSender (), manager , failedToSendRequestErrorMessage );
269+ action .execute (EmbeddingsInput .fromStrings (request .batch ().inputs ().get (), inputType ), timeout , request .listener ());
270+ }
215271 }
216272
217273 @ Override
0 commit comments