A pure MoonBit prompt template engine for LLM applications
Dependencies
let vars : @moonprompt.Vars = [
("user", Object([("name", String("Ada"))])),
("examples", Array([String("one"), String("two")])),
]
let template = @moonprompt.compile(
"Hello {{ user.name | capitalize }}!{% for x in examples %} {{ x }}{% endfor %}",
).unwrap()
let result = template.render(vars).unwrap()moon run src/main -- render prompt.md data.json| Feature | Example |
|---|---|
| variable / field / index | {{ user.name }}, {{ items[0] }} |
| filter chain | {{ name \| trim \| upper }} |
| loop metadata | {% for x in xs %}{{ loop.index }}{% endfor %} |
| conditional | {% if ok %}yes{% elif retry %}later{% else %}no{% endif %} |
| comment | {# invisible #} |
| escaping | {{ untrusted \| e }} |
| filters | upper, lower, trim, capitalize, default, join, length, replace, truncate |
let source = #|[system]
#|You are concise.
#|[user]
#|Summarize {{ topic }}.
let rendered = @moonprompt.render(source, [("topic", String("MoonBit"))]).unwrap()
let messages = @moonprompt.split_roles(rendered).unwrap()
// messages[i].role/content map directly to OpenAI-compatible chat messages.
// moonllm, mizchi/llm and tonyfettes/openai adapters only need this two-field map.flowchart LR
Text --> Lexer --> Parser --> AST --> Renderer --> Prompt --> RoleSplitter
Variables --> Renderermoon check src/lib --target wasm-gc
moon test src/lib --target wasm-gc
moon check src/lib --target js
moon test src/lib --target js
moon check --target native
moon test --target nativemoon login
moon package --list
moon publishA pure MoonBit prompt template engine for LLM applications
Dependencies