generations, ChatResponseMetadata chatResponseMetadata) {
+ this(generations, chatResponseMetadata, Map.of());
}
public static Builder builder() {
@@ -75,6 +103,7 @@ public static Builder builder() {
*
* It is a {@link List} of {@link List lists} because the Prompt could request
* multiple output {@link Generation generations}.
+ *
* @return the {@link List} of {@link Generation generated outputs}.
*/
@@ -102,6 +131,7 @@ public ChatResponseMetadata getMetadata() {
return this.chatResponseMetadata;
}
+
/**
* Whether the model has requested the execution of a tool.
*/
@@ -129,7 +159,7 @@ public boolean hasFinishReasons(Set finishReasons) {
@Override
public String toString() {
- return "ChatResponse [metadata=" + this.chatResponseMetadata + ", generations=" + this.generations + "]";
+ return "ChatResponse [metadata=" + this.chatResponseMetadata + ", generations=" + this.generations + ", context=" +this.context+"]";
}
@Override
@@ -149,12 +179,17 @@ public int hashCode() {
return Objects.hash(this.chatResponseMetadata, this.generations);
}
+
+
+
public static final class Builder {
private List generations;
private ChatResponseMetadata.Builder chatResponseMetadataBuilder;
+ private Map context;
+
private Builder() {
this.chatResponseMetadataBuilder = ChatResponseMetadata.builder();
}
@@ -185,11 +220,15 @@ public Builder metadata(ChatResponseMetadata other) {
public Builder generations(List generations) {
this.generations = generations;
return this;
+ }
+ public Builder context(Map context) {
+ this.context = context != null ? new HashMap<>(context) : new HashMap<>();
+ return this;
}
public ChatResponse build() {
- return new ChatResponse(this.generations, this.chatResponseMetadataBuilder.build());
+ return new ChatResponse(this.generations, this.chatResponseMetadataBuilder.build(), this.context);
}
}
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingResponse.java b/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingResponse.java
index 2ad2afac32f..a47d6a09fb7 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingResponse.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/embedding/EmbeddingResponse.java
@@ -16,7 +16,9 @@
package org.springframework.ai.embedding;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import org.springframework.ai.model.ModelResponse;
@@ -41,8 +43,17 @@ public class EmbeddingResponse implements ModelResponse {
* Creates a new {@link EmbeddingResponse} instance with empty metadata.
* @param embeddings the embedding data.
*/
+
+ private final Map embeddingContext;
+
public EmbeddingResponse(List embeddings) {
- this(embeddings, new EmbeddingResponseMetadata());
+ this(embeddings, new EmbeddingResponseMetadata(),new HashMap<>());
+ }
+
+ public EmbeddingResponse(List embeddings, EmbeddingResponseMetadata metadata,Map embeddingContext) {
+ this.embeddings = embeddings;
+ this.metadata = metadata;
+ this.embeddingContext=embeddingContext;
}
/**
@@ -53,6 +64,7 @@ public EmbeddingResponse(List embeddings) {
public EmbeddingResponse(List embeddings, EmbeddingResponseMetadata metadata) {
this.embeddings = embeddings;
this.metadata = metadata;
+ this.embeddingContext=new HashMap<>();
}
/**
@@ -62,6 +74,11 @@ public EmbeddingResponseMetadata getMetadata() {
return this.metadata;
}
+ @Override
+ public Map getContext() {
+ return embeddingContext;
+ }
+
@Override
public Embedding getResult() {
Assert.notEmpty(this.embeddings, "No embedding data available.");
@@ -95,7 +112,10 @@ public int hashCode() {
@Override
public String toString() {
- return "EmbeddingResult{" + "data=" + this.embeddings + ", metadata=" + this.metadata + '}';
+ return "EmbeddingResponse{" +
+ "embeddings=" + embeddings +
+ ", metadata=" + metadata +
+ ", embeddingContext=" + embeddingContext +
+ '}';
}
-
}
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/image/ImageResponse.java b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageResponse.java
index c4605d81890..60734fdc648 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/image/ImageResponse.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/image/ImageResponse.java
@@ -16,7 +16,9 @@
package org.springframework.ai.image;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import org.springframework.ai.model.ModelResponse;
@@ -40,23 +42,35 @@ public class ImageResponse implements ModelResponse {
/**
* Construct a new {@link ImageResponse} instance without metadata.
+ *
* @param generations the {@link List} of {@link ImageGeneration} returned by the AI
* provider.
*/
+
+ private final Map context;
+
public ImageResponse(List generations) {
- this(generations, new ImageResponseMetadata());
+ this(generations, new ImageResponseMetadata(), new HashMap<>());
}
/**
* Construct a new {@link ImageResponse} instance.
- * @param generations the {@link List} of {@link ImageGeneration} returned by the AI
- * provider.
+ *
+ * @param generations the {@link List} of {@link ImageGeneration} returned by the AI
+ * provider.
* @param imageResponseMetadata {@link ImageResponseMetadata} containing information
- * about the use of the AI provider's API.
+ * about the use of the AI provider's API.
*/
public ImageResponse(List generations, ImageResponseMetadata imageResponseMetadata) {
this.imageResponseMetadata = imageResponseMetadata;
this.imageGenerations = List.copyOf(generations);
+ this.context = new HashMap<>();
+ }
+
+ public ImageResponse(List generations, ImageResponseMetadata imageResponseMetadata, Map context) {
+ this.imageResponseMetadata = imageResponseMetadata;
+ this.imageGenerations = List.copyOf(generations);
+ this.context = context;
}
/**
@@ -64,6 +78,7 @@ public ImageResponse(List generations, ImageResponseMetadata im
*
* It is a {@link List} of {@link List lists} because the Prompt could request
* multiple output {@link ImageGeneration generations}.
+ *
* @return the {@link List} of {@link ImageGeneration generated outputs}.
*/
@Override
@@ -91,10 +106,18 @@ public ImageResponseMetadata getMetadata() {
return this.imageResponseMetadata;
}
+ @Override
+ public Map getContext() {
+ return this.context;
+ }
+
@Override
public String toString() {
- return "ImageResponse [" + "imageResponseMetadata=" + this.imageResponseMetadata + ", imageGenerations="
- + this.imageGenerations + "]";
+ return "ImageResponse{" +
+ "imageResponseMetadata=" + imageResponseMetadata +
+ ", imageGenerations=" + imageGenerations +
+ ", context=" + context +
+ '}';
}
@Override
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/model/ModelResponse.java b/spring-ai-model/src/main/java/org/springframework/ai/model/ModelResponse.java
index 5df8b8d2a82..575e363ee33 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/model/ModelResponse.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/model/ModelResponse.java
@@ -17,6 +17,7 @@
package org.springframework.ai.model;
import java.util.List;
+import java.util.Map;
/**
* Interface representing the response received from an AI model. This interface provides
@@ -49,4 +50,10 @@ public interface ModelResponse> {
*/
ResponseMetadata getMetadata();
+ /**
+ * Retrieves the context of the response
+ * @return
+ */
+ Map getContext();
+
}
diff --git a/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResponse.java b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResponse.java
index 043104436e1..2bb1ad22862 100644
--- a/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResponse.java
+++ b/spring-ai-model/src/main/java/org/springframework/ai/moderation/ModerationResponse.java
@@ -16,7 +16,9 @@
package org.springframework.ai.moderation;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Objects;
import org.springframework.ai.model.ModelResponse;
@@ -37,6 +39,8 @@ public class ModerationResponse implements ModelResponse {
private final Generation generations;
+ private final Map context;
+
public ModerationResponse(Generation generations) {
this(generations, new ModerationResponseMetadata());
}
@@ -44,8 +48,16 @@ public ModerationResponse(Generation generations) {
public ModerationResponse(Generation generations, ModerationResponseMetadata moderationResponseMetadata) {
this.moderationResponseMetadata = moderationResponseMetadata;
this.generations = generations;
+ this.context=new HashMap<>();
+ }
+
+ public ModerationResponse(Generation generations, ModerationResponseMetadata moderationResponseMetadata,Map context) {
+ this.moderationResponseMetadata = moderationResponseMetadata;
+ this.generations = generations;
+ this.context=context;
}
+
@Override
public Generation getResult() {
return this.generations;
@@ -61,10 +73,18 @@ public ModerationResponseMetadata getMetadata() {
return this.moderationResponseMetadata;
}
+ @Override
+ public Map getContext() {
+ return this.context;
+ }
+
@Override
public String toString() {
- return "ModerationResponse{" + "moderationResponseMetadata=" + this.moderationResponseMetadata
- + ", generations=" + this.generations + '}';
+ return "ModerationResponse{" +
+ "moderationResponseMetadata=" + moderationResponseMetadata +
+ ", generations=" + generations +
+ ", context=" + context +
+ '}';
}
@Override