1818
1919import java .util .ArrayList ;
2020import java .util .List ;
21+ import java .util .Optional ;
2122import java .util .concurrent .atomic .AtomicInteger ;
2223
2324import io .micrometer .observation .Observation ;
2829import org .springframework .ai .bedrock .titan .api .TitanEmbeddingBedrockApi ;
2930import org .springframework .ai .bedrock .titan .api .TitanEmbeddingBedrockApi .TitanEmbeddingRequest ;
3031import org .springframework .ai .bedrock .titan .api .TitanEmbeddingBedrockApi .TitanEmbeddingResponse ;
32+ import org .springframework .ai .chat .metadata .DefaultUsage ;
3133import org .springframework .ai .document .Document ;
32- import org .springframework .ai .embedding .AbstractEmbeddingModel ;
33- import org .springframework .ai .embedding .Embedding ;
34- import org .springframework .ai .embedding .EmbeddingOptions ;
35- import org .springframework .ai .embedding .EmbeddingRequest ;
36- import org .springframework .ai .embedding .EmbeddingResponse ;
34+ import org .springframework .ai .embedding .*;
3735import org .springframework .util .Assert ;
3836
3937/**
@@ -89,6 +87,7 @@ public EmbeddingResponse call(EmbeddingRequest request) {
8987
9088 List <Embedding > embeddings = new ArrayList <>();
9189 var indexCounter = new AtomicInteger (0 );
90+ int tokenUsage = 0 ;
9291
9392 for (String inputContent : request .getInstructions ()) {
9493 var apiRequest = createTitanEmbeddingRequest (inputContent , request .getOptions ());
@@ -111,6 +110,10 @@ public EmbeddingResponse call(EmbeddingRequest request) {
111110 }
112111
113112 embeddings .add (new Embedding (response .embedding (), indexCounter .getAndIncrement ()));
113+
114+ if (response .inputTextTokenCount () != null ) {
115+ tokenUsage += response .inputTextTokenCount ();
116+ }
114117 }
115118 catch (Exception ex ) {
116119 logger .error ("Titan API embedding failed for input at index {}: {}" , indexCounter .get (),
@@ -120,7 +123,10 @@ public EmbeddingResponse call(EmbeddingRequest request) {
120123 }
121124 }
122125
123- return new EmbeddingResponse (embeddings );
126+ EmbeddingResponseMetadata embeddingResponseMetadata = new EmbeddingResponseMetadata ("" ,
127+ getDefaultUsage (tokenUsage ));
128+
129+ return new EmbeddingResponse (embeddings , embeddingResponseMetadata );
124130 }
125131
126132 private TitanEmbeddingRequest createTitanEmbeddingRequest (String inputContent , EmbeddingOptions requestOptions ) {
@@ -155,6 +161,10 @@ private String summarizeInput(String input) {
155161 return input .length () > 100 ? input .substring (0 , 100 ) + "..." : input ;
156162 }
157163
164+ private DefaultUsage getDefaultUsage (int tokens ) {
165+ return new DefaultUsage (tokens , 0 );
166+ }
167+
158168 public enum InputType {
159169
160170 TEXT , IMAGE
0 commit comments