-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Closed
Description
Bug description
While attempting to pass complex objects as parameters to a PromptTemplate
I discovered that the in built validation does not properly handle field references and likely other things that StTemplate natively supports.
Environment
Java Version: OpenJdk 17.0.16
Spring AI Version: 1.0.2
Steps to reproduce
With a complex test object like this:
class TestClass {
private final String name;
public TestClass(final String name) {
this.name = name;
}
public String getName() {
return name;
}
}
And a unit like:
@Test
public void testPromptTemplate() {
final PromptTemplate prompt = PromptTemplate.builder()
.template("{test.name}")
.build();
final String result = prompt.render(Map.ofEntries(Map.entry("test", new TestClass("test"))));
assertEquals("test", result);
}
You get a failing test with a result like:
Not all variables were replaced in the template. Missing variable names are: [name].
java.lang.IllegalStateException: Not all variables were replaced in the template. Missing variable names are: [name].
at org.springframework.ai.template.st.StTemplateRenderer.validate(StTemplateRenderer.java:140)
at org.springframework.ai.template.st.StTemplateRenderer.apply(StTemplateRenderer.java:108)
at org.springframework.ai.chat.prompt.PromptTemplate.render(PromptTemplate.java:137)
This seems to happen with any of the more advanced features of StTemplate.
Expected behavior
The test passes.
If you change the definition of the PromptTemplate call to:
final PromptTemplate prompt = PromptTemplate.builder()
.template("{test.name}")
.renderer(StTemplateRenderer.builder()
.validationMode(ValidationMode.NONE)
.build())
.build();
The test passes as expected.
Minimal Complete Reproducible example
See above.
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working