Skip to content

Commit 7082c40

Browse files
committed
feat(render): FR-010 OutputFormatRenderer inline style
1 parent b15e9eb commit 7082c40

2 files changed

Lines changed: 86 additions & 2 deletions

File tree

server/java/render/src/main/java/com/metaobjects/render/prompt/OutputFormatRenderer.java

Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,65 @@ public static String render(OutputFormatSpec spec, PromptOverrides overrides) {
2020
return switch (effectiveStyle) {
2121
case EXAMPLE_ONLY -> renderExampleOnly(spec, overrides);
2222
case GUIDE -> renderGuide(spec, overrides);
23-
case INLINE -> throw new UnsupportedOperationException(
24-
"Style not yet implemented: " + effectiveStyle);
23+
case INLINE -> renderInline(spec, overrides);
2524
};
2625
}
2726

27+
private static String renderInline(OutputFormatSpec spec, PromptOverrides overrides) {
28+
return switch (spec.format()) {
29+
case XML -> renderXmlInline(spec, overrides);
30+
case JSON -> renderJsonInline(spec, overrides);
31+
};
32+
}
33+
34+
private static String renderXmlInline(OutputFormatSpec spec, PromptOverrides overrides) {
35+
StringBuilder sb = new StringBuilder();
36+
sb.append("<").append(spec.rootName()).append(">\n");
37+
for (PromptField field : spec.fields()) {
38+
String content = inlineContent(field, overrides);
39+
String escaped = Escapers.escape(Escapers.FORMAT_XML, content);
40+
sb.append(" <").append(field.name()).append(">")
41+
.append(escaped)
42+
.append("</").append(field.name()).append(">\n");
43+
}
44+
sb.append("</").append(spec.rootName()).append(">");
45+
return sb.toString();
46+
}
47+
48+
private static String renderJsonInline(OutputFormatSpec spec, PromptOverrides overrides) {
49+
StringBuilder sb = new StringBuilder();
50+
sb.append("{\n");
51+
List<PromptField> fields = spec.fields();
52+
for (int i = 0; i < fields.size(); i++) {
53+
PromptField field = fields.get(i);
54+
String content = inlineContent(field, overrides);
55+
boolean isLast = i == fields.size() - 1;
56+
sb.append(" \"").append(field.name()).append("\": ");
57+
sb.append("\"").append(Escapers.escape(Escapers.FORMAT_JSON, content)).append("\"");
58+
if (!isLast) sb.append(",");
59+
sb.append("\n");
60+
}
61+
sb.append("}");
62+
return sb.toString();
63+
}
64+
65+
private static String inlineContent(PromptField field, PromptOverrides overrides) {
66+
if (field.kind() == FieldKind.ENUM
67+
&& field.enumValues() != null
68+
&& !field.enumValues().isEmpty()) {
69+
return String.join(" | ", field.enumValues());
70+
}
71+
if (field.kind() == FieldKind.BOOLEAN) {
72+
return "true | false";
73+
}
74+
String instruction = overrides.instructions().get(field.name());
75+
if (instruction == null) instruction = field.instruction();
76+
if (instruction != null) {
77+
return "{" + instruction + "}";
78+
}
79+
return "{" + field.name() + "}";
80+
}
81+
2882
private static String renderGuide(OutputFormatSpec spec, PromptOverrides overrides) {
2983
StringBuilder sb = new StringBuilder();
3084
sb.append("Fill in each field as described below:\n");
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.metaobjects.render.prompt;
2+
3+
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import com.metaobjects.render.recover.Format;
5+
import com.metaobjects.render.recover.FieldKind;
6+
import org.junit.Test;
7+
import java.util.List;
8+
import static org.junit.Assert.*;
9+
10+
public class OutputFormatRendererInlineTest {
11+
private static final ObjectMapper JSON = new ObjectMapper();
12+
private OutputFormatSpec spec(Format f) {
13+
return new OutputFormatSpec(f, "Answer", PromptStyle.INLINE, List.of(
14+
new PromptField("text", FieldKind.STRING, true, false, null, null, null, "one sentence", null),
15+
new PromptField("confidence", FieldKind.ENUM, true, false, List.of("HIGH","OK","LOW"), null, null, null, null)));
16+
}
17+
@Test public void xmlInlineChoicesNoComments() {
18+
String out = OutputFormatRenderer.render(spec(Format.XML), PromptOverrides.none());
19+
assertFalse(out.contains("<!--"));
20+
assertTrue(out.contains("<confidence>HIGH | OK | LOW</confidence>"));
21+
assertTrue(out.contains("<text>"));
22+
assertTrue(out.contains("</Answer>"));
23+
}
24+
@Test public void jsonInlineStillValid() throws Exception {
25+
String out = OutputFormatRenderer.render(spec(Format.JSON), PromptOverrides.none());
26+
assertFalse(out.contains("//"));
27+
String json = out.substring(out.indexOf('{'), out.lastIndexOf('}') + 1);
28+
assertEquals("HIGH | OK | LOW", JSON.readTree(json).get("confidence").asText());
29+
}
30+
}

0 commit comments

Comments
 (0)