11package dev .braintrust .prompt ;
22
3+ import com .github .mustachejava .DefaultMustacheFactory ;
4+ import com .github .mustachejava .Mustache ;
5+ import com .github .mustachejava .MustacheException ;
36import dev .braintrust .api .BraintrustApiClient ;
7+ import java .io .StringReader ;
8+ import java .io .StringWriter ;
49import java .util .ArrayList ;
510import java .util .HashMap ;
6- import java .util .HashSet ;
711import java .util .List ;
812import java .util .Map ;
9- import java .util .Set ;
10- import java .util .regex .Matcher ;
11- import java .util .regex .Pattern ;
1213
1314public class BraintrustPrompt {
14- private static final Pattern MUSTACHE_PATTERN = Pattern .compile ("\\ {\\ {([^}]+)\\ }\\ }" );
15-
1615 private final BraintrustApiClient .Prompt apiPrompt ;
1716 private final Map <String , String > defaults ;
1817
@@ -25,7 +24,7 @@ public BraintrustPrompt(BraintrustApiClient.Prompt apiPrompt, Map<String, String
2524 this .defaults = defaults ;
2625 }
2726
28- public List <Map <String , Object >> renderMessages (Map <String , String > parameters ) {
27+ public List <Map <String , Object >> renderMessages (Map <String , Object > parameters ) {
2928 // get promptData->prompt->messages
3029 Map <String , Object > promptData = (Map <String , Object >) apiPrompt .promptData ().prompt ();
3130 List <Map <String , Object >> messages = (List <Map <String , Object >>) promptData .get ("messages" );
@@ -34,28 +33,20 @@ public List<Map<String, Object>> renderMessages(Map<String, String> parameters)
3433 throw new RuntimeException ("No messages found in prompt data" );
3534 }
3635
37- Set <String > usedParameters = new HashSet <>();
3836 List <Map <String , Object >> renderedMessages = new ArrayList <>();
3937
4038 for (Map <String , Object > message : messages ) {
4139 Map <String , Object > renderedMessage = new HashMap <>(message );
4240 String content = (String ) message .get ("content" );
4341
4442 if (content != null ) {
45- String renderedContent = renderTemplate (content , parameters , usedParameters );
43+ String renderedContent = renderTemplate (content , parameters );
4644 renderedMessage .put ("content" , renderedContent );
4745 }
4846
4947 renderedMessages .add (renderedMessage );
5048 }
5149
52- // Check if all parameters were used
53- Set <String > unusedParameters = new HashSet <>(parameters .keySet ());
54- unusedParameters .removeAll (usedParameters );
55- if (!unusedParameters .isEmpty ()) {
56- throw new RuntimeException ("Unused parameters: " + unusedParameters );
57- }
58-
5950 return renderedMessages ;
6051 }
6152
@@ -92,24 +83,22 @@ public Map<String, Object> getOptions() {
9283 return result ;
9384 }
9485
95- private String renderTemplate (
96- String template , Map <String , String > parameters , Set <String > usedParameters ) {
97- Matcher matcher = MUSTACHE_PATTERN .matcher (template );
98- StringBuffer result = new StringBuffer ();
99-
100- while (matcher .find ()) {
101- String paramName = matcher .group (1 );
102- String paramValue = parameters .get (paramName );
103-
104- if (paramValue == null ) {
105- throw new RuntimeException ("Missing parameter: " + paramName );
86+ private String renderTemplate (String template , Map <String , Object > parameters ) {
87+ try {
88+ DefaultMustacheFactory factory = new DefaultMustacheFactory ();
89+ Mustache mustache = factory .compile (new StringReader (template ), "template" );
90+ StringWriter writer = new StringWriter ();
91+ mustache .execute (writer , parameters );
92+ writer .flush ();
93+ return writer .toString ();
94+ } catch (MustacheException e ) {
95+ // If the template is malformed, just return it as-is
96+ return template ;
97+ } catch (Exception e ) {
98+ if (e instanceof RuntimeException ) {
99+ throw (RuntimeException ) e ;
106100 }
107-
108- usedParameters .add (paramName );
109- matcher .appendReplacement (result , Matcher .quoteReplacement (paramValue ));
101+ throw new RuntimeException ("Failed to render template" , e );
110102 }
111-
112- matcher .appendTail (result );
113- return result .toString ();
114103 }
115104}
0 commit comments