Skip to content

PromptTemplate Validation fails on valid StTemplate Templates #4496

@arlaneenalra

Description

@arlaneenalra

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 working

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions