11package com .sap .ai .sdk .foundationmodels .openai .spring ;
22
33import com .sap .ai .sdk .foundationmodels .openai .OpenAiClient ;
4- import com .sap .ai .sdk .foundationmodels .openai .OpenAiEmbeddingRequest ;
5- import com .sap .ai .sdk .foundationmodels .openai .OpenAiEmbeddingResponse ;
64import com .sap .ai .sdk .foundationmodels .openai .OpenAiModel ;
5+ import com .sap .ai .sdk .foundationmodels .openai .generated .model .EmbeddingsCreate200Response ;
6+ import com .sap .ai .sdk .foundationmodels .openai .generated .model .EmbeddingsCreateRequest ;
7+ import com .sap .ai .sdk .foundationmodels .openai .generated .model .EmbeddingsCreateRequestInput ;
8+ import java .util .Objects ;
79import java .util .stream .IntStream ;
810import javax .annotation .Nonnull ;
11+ import lombok .NoArgsConstructor ;
912import org .springframework .ai .chat .metadata .DefaultUsage ;
1013import org .springframework .ai .document .Document ;
1114import org .springframework .ai .embedding .Embedding ;
1417import org .springframework .ai .embedding .EmbeddingResponse ;
1518import org .springframework .ai .embedding .EmbeddingResponseMetadata ;
1619
20+ @ NoArgsConstructor
1721public class OpenAiSpringEmbeddingModel implements EmbeddingModel {
1822
1923 @ Override
2024 public EmbeddingResponse call (@ Nonnull final EmbeddingRequest request ) {
21-
22- var modelName = request .getOptions ().getModel ();
25+ var modelName =
26+ Objects .requireNonNull (
27+ request .getOptions ().getModel (), "Model name is required if client is not set" );
2328 var client = OpenAiClient .forModel (new OpenAiModel (modelName , null ));
24- var openAiRequest = createOpenAiEmbeddingRequest (request );
29+
30+ var openAiRequest = createEmbeddingCreateRequest (request );
2531 var openAiResponse = client .embedding (openAiRequest );
2632
2733 return createSpringAiEmbeddingResponse (openAiResponse );
@@ -36,20 +42,22 @@ public float[] embed(@Nonnull final Document document) {
3642 "Only text type document supported. Metadata contains " + document .getMetadata ());
3743 }
3844
39- private OpenAiEmbeddingRequest createOpenAiEmbeddingRequest (
45+ private EmbeddingsCreateRequest createEmbeddingCreateRequest (
4046 @ Nonnull final EmbeddingRequest request ) {
41- return new OpenAiEmbeddingRequest (request .getInstructions ())
42- .withDimensions (request .getOptions ().getDimensions ());
47+ return new EmbeddingsCreateRequest ()
48+ .dimensions (request .getOptions ().getDimensions ())
49+ .input (EmbeddingsCreateRequestInput .create (request .getInstructions ()));
4350 }
4451
45- private EmbeddingResponse createSpringAiEmbeddingResponse (OpenAiEmbeddingResponse response ) {
46- var vectors = response .getEmbeddingVectors ();
52+ private EmbeddingResponse createSpringAiEmbeddingResponse (EmbeddingsCreate200Response response ) {
4753 var embeddings =
48- IntStream .range (0 , vectors .size ()).mapToObj (i -> new Embedding (vectors .get (i ), i )).toList ();
54+ IntStream .range (0 , response .getData ().size ())
55+ .mapToObj (i -> new Embedding (response .getData ().get (i ).getEmbedding (), i ))
56+ .toList ();
4957
50- var openAiUsage = response .getOriginalResponse (). getUsage ();
58+ var openAiUsage = response .getUsage ();
5159 var usage = new DefaultUsage (openAiUsage .getPromptTokens (), null , openAiUsage .getTotalTokens ());
52- var metadata = new EmbeddingResponseMetadata (response .getOriginalResponse (). getModel (), usage );
60+ var metadata = new EmbeddingResponseMetadata (response .getModel (), usage );
5361
5462 return new EmbeddingResponse (embeddings , metadata );
5563 }
0 commit comments