Skip to content

Commit 36516e0

Browse files
leehautilayaperumalg
authored andcommitted
PromptTemplate: Parameterized render(Map) fails to handle Resource in this.variables (inconsistent with no-arg render)
Signed-off-by: lance <leehaut@gmail.com>
1 parent 9d9d539 commit 36516e0

File tree

2 files changed

+25
-6
lines changed

2 files changed

+25
-6
lines changed

spring-ai-model/src/main/java/org/springframework/ai/chat/prompt/PromptTemplate.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -111,8 +111,8 @@ public String render() {
111111
// Process internal variables to handle Resources before rendering
112112
Map<String, Object> processedVariables = new HashMap<>();
113113
for (Entry<String, Object> entry : this.variables.entrySet()) {
114-
if (entry.getValue() instanceof Resource) {
115-
processedVariables.put(entry.getKey(), renderResource((Resource) entry.getValue()));
114+
if (entry.getValue() instanceof Resource resource) {
115+
processedVariables.put(entry.getKey(), renderResource(resource));
116116
}
117117
else {
118118
processedVariables.put(entry.getKey(), entry.getValue());
@@ -123,11 +123,16 @@ public String render() {
123123

124124
@Override
125125
public String render(Map<String, Object> additionalVariables) {
126-
Map<String, Object> combinedVariables = new HashMap<>(this.variables);
126+
Map<String, Object> combinedVariables = new HashMap<>();
127+
Map<String, Object> mergedVariables = new HashMap<>(this.variables);
128+
// variables + additionalVariables => mergedVariables
129+
if (additionalVariables != null && !additionalVariables.isEmpty()) {
130+
mergedVariables.putAll(additionalVariables);
131+
}
127132

128-
for (Entry<String, Object> entry : additionalVariables.entrySet()) {
129-
if (entry.getValue() instanceof Resource) {
130-
combinedVariables.put(entry.getKey(), renderResource((Resource) entry.getValue()));
133+
for (Entry<String, Object> entry : mergedVariables.entrySet()) {
134+
if (entry.getValue() instanceof Resource resource) {
135+
combinedVariables.put(entry.getKey(), renderResource(resource));
131136
}
132137
else {
133138
combinedVariables.put(entry.getKey(), entry.getValue());

spring-ai-model/src/test/java/org/springframework/ai/chat/prompt/PromptTemplateTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.springframework.ai.template.NoOpTemplateRenderer;
2727
import org.springframework.ai.template.TemplateRenderer;
2828
import org.springframework.core.io.ByteArrayResource;
29+
import org.springframework.core.io.ClassPathResource;
2930
import org.springframework.core.io.Resource;
3031

3132
import static org.assertj.core.api.Assertions.assertThat;
@@ -306,6 +307,19 @@ void resource_Builder() {
306307
assertThat(promptTemplate.render()).isEqualTo("Hello Builder from Resource!");
307308
}
308309

310+
@Test
311+
void renderWithResourceFile() {
312+
Resource resource = new ClassPathResource("prompt-user.txt");
313+
314+
// Build PromptTemplate: bind the Resource to "name" in this.variables
315+
PromptTemplate promptTemplate = PromptTemplate.builder()
316+
.template("How {name}")
317+
.variables(Map.of("name", resource))
318+
.build();
319+
320+
assertThat(promptTemplate.render(Map.of())).isEqualTo("How Hello, world!");
321+
}
322+
309323
// Helper Custom Renderer for testing
310324
private static class CustomTestRenderer implements TemplateRenderer {
311325

0 commit comments

Comments
 (0)