|
31 | 31 | import org.springframework.ai.embedding.Embedding;
|
32 | 32 | import org.springframework.ai.embedding.EmbeddingModel;
|
33 | 33 | import org.springframework.ai.embedding.EmbeddingOptions;
|
34 |
| -import org.springframework.ai.embedding.EmbeddingOptionsBuilder; |
35 | 34 | import org.springframework.ai.embedding.EmbeddingRequest;
|
36 | 35 | import org.springframework.ai.embedding.EmbeddingResponse;
|
37 | 36 | import org.springframework.ai.embedding.EmbeddingResponseMetadata;
|
@@ -105,13 +104,16 @@ public float[] embed(Document document) {
|
105 | 104 | public EmbeddingResponse call(EmbeddingRequest request) {
|
106 | 105 | Assert.notEmpty(request.getInstructions(), "At least one text is required!");
|
107 | 106 |
|
108 |
| - OllamaApi.EmbeddingsRequest ollamaEmbeddingRequest = ollamaEmbeddingRequest(request.getInstructions(), |
109 |
| - request.getOptions()); |
| 107 | + // Before moving any further, build the final request EmbeddingRequest, |
| 108 | + // merging runtime and default options. |
| 109 | + EmbeddingRequest embeddingRequest = buildEmbeddingRequest(request); |
| 110 | + |
| 111 | + OllamaApi.EmbeddingsRequest ollamaEmbeddingRequest = ollamaEmbeddingRequest(embeddingRequest); |
110 | 112 |
|
111 | 113 | var observationContext = EmbeddingModelObservationContext.builder()
|
112 | 114 | .embeddingRequest(request)
|
113 | 115 | .provider(OllamaApi.PROVIDER_NAME)
|
114 |
| - .requestOptions(buildRequestOptions(ollamaEmbeddingRequest)) |
| 116 | + .requestOptions(embeddingRequest.getOptions()) |
115 | 117 | .build();
|
116 | 118 |
|
117 | 119 | return EmbeddingModelObservationDocumentation.EMBEDDING_MODEL_OPERATION
|
@@ -142,31 +144,34 @@ private DefaultUsage getDefaultUsage(OllamaApi.EmbeddingsResponse response) {
|
142 | 144 | return new DefaultUsage(Optional.ofNullable(response.promptEvalCount()).orElse(0), 0);
|
143 | 145 | }
|
144 | 146 |
|
145 |
| - /** |
146 |
| - * Package access for testing. |
147 |
| - */ |
148 |
| - OllamaApi.EmbeddingsRequest ollamaEmbeddingRequest(List<String> inputContent, EmbeddingOptions options) { |
149 |
| - |
150 |
| - // runtime options |
| 147 | + EmbeddingRequest buildEmbeddingRequest(EmbeddingRequest embeddingRequest) { |
| 148 | + // Process runtime options |
151 | 149 | OllamaOptions runtimeOptions = null;
|
152 |
| - if (options != null && options instanceof OllamaOptions ollamaOptions) { |
153 |
| - runtimeOptions = ollamaOptions; |
| 150 | + if (embeddingRequest.getOptions() != null) { |
| 151 | + runtimeOptions = ModelOptionsUtils.copyToTarget(embeddingRequest.getOptions(), EmbeddingOptions.class, |
| 152 | + OllamaOptions.class); |
154 | 153 | }
|
155 | 154 |
|
156 |
| - OllamaOptions mergedOptions = ModelOptionsUtils.merge(runtimeOptions, this.defaultOptions, OllamaOptions.class); |
| 155 | + // Define request options by merging runtime options and default options |
| 156 | + OllamaOptions requestOptions = ModelOptionsUtils.merge(runtimeOptions, this.defaultOptions, |
| 157 | + OllamaOptions.class); |
157 | 158 |
|
158 |
| - // Override the model. |
159 |
| - if (!StringUtils.hasText(mergedOptions.getModel())) { |
160 |
| - throw new IllegalArgumentException("Model is not set!"); |
| 159 | + // Validate request options |
| 160 | + if (!StringUtils.hasText(requestOptions.getModel())) { |
| 161 | + throw new IllegalArgumentException("model cannot be null or empty"); |
161 | 162 | }
|
162 |
| - String model = mergedOptions.getModel(); |
163 | 163 |
|
164 |
| - return new OllamaApi.EmbeddingsRequest(model, inputContent, DurationParser.parse(mergedOptions.getKeepAlive()), |
165 |
| - OllamaOptions.filterNonSupportedFields(mergedOptions.toMap()), mergedOptions.getTruncate()); |
| 164 | + return new EmbeddingRequest(embeddingRequest.getInstructions(), requestOptions); |
166 | 165 | }
|
167 | 166 |
|
168 |
| - private EmbeddingOptions buildRequestOptions(OllamaApi.EmbeddingsRequest request) { |
169 |
| - return EmbeddingOptionsBuilder.builder().withModel(request.model()).build(); |
| 167 | + /** |
| 168 | + * Package access for testing. |
| 169 | + */ |
| 170 | + OllamaApi.EmbeddingsRequest ollamaEmbeddingRequest(EmbeddingRequest embeddingRequest) { |
| 171 | + OllamaOptions requestOptions = (OllamaOptions) embeddingRequest.getOptions(); |
| 172 | + return new OllamaApi.EmbeddingsRequest(requestOptions.getModel(), embeddingRequest.getInstructions(), |
| 173 | + DurationParser.parse(requestOptions.getKeepAlive()), |
| 174 | + OllamaOptions.filterNonSupportedFields(requestOptions.toMap()), requestOptions.getTruncate()); |
170 | 175 | }
|
171 | 176 |
|
172 | 177 | /**
|
|
0 commit comments