jinja2cpp / jinja2cpp/Jinja2Cpp
Failure rendering a simple template
- Dominant language
- C++
- Stars
- 600
- Forks
- 114
- PR merge metrics
- No merged PRs in 30d
Description
Hi Dear Jinja2cpp developers,
i notices something unexpected when i try to apply a chatbot template.
This `"{% for message in messages %}{{ '' + message['role'] + message['content'] }}{% endfor %}{% if add_generation_prompt %}{{'model'}}{% endif %}"` fails with an error:
```
terminate called after throwing an instance of 'nonstd::expected_lite::bad_expected_access >'
what(): bad_expected_access
```
When i remove the last `{% if %}` then it's ok. Attached a minimal reproducer. Looks like a bug, but idk maybe my template is wrong. Could you please take a look?
```
#include
#include
using namespace std;
using namespace jinja2;
int main() {
TemplateEnv env;
env.GetSettings().lstripBlocks = true;
env.GetSettings().trimBlocks = true;
Template tpl(&env);
string broken_tpl = "{% for message in messages %}{{ '' + message['role'] + message['content'] }}{% endfor %}{% if add_generation_prompt %}{{'model'}}{% endif %}";
string working_tpl = "{% for message in messages %}{{ '' + message['role'] + message['content'] }}{% endfor %}";
tpl.Load(broken_tpl);
jinja2::ValuesMap params_1 {{"role", "system"}, {"content", "You are a friendly chatbot who always responds in the style of a pirate"}};
jinja2::ValuesMap params_2 {{"role", "user"}, {"content", "1+1="}};
jinja2::ValuesMap params = {
{"messages", jinja2::ValuesList({params_1, params_2})},
{"add_generation_prompt", true},
{"bos_token", ""},
{"eos_token", ""},
{"unk_token", ""},
{"pad_token", ""}
};
cout << tpl.RenderAsString(params).value() << endl;
return 0;
}
```
`broken_tpl` is an abbreviated version, just to reproduce the failure. The full template which i would loke to render is from gemma chatbot:
```
{{ bos_token }}
{% if messages[0]['role'] == 'system' %}
{{ raise_exception('System role not supported') }}
{% endif %}
{% for message in messages %}
{% if (message['role'] == 'user') != (loop.index0 % 2 == 0) %}
{{ raise_exception('Conversation roles must alternate user/assistant/user/assistant/...') }}
{% endif %}
{% if message['role'] == 'assistant' %}
{% set role = 'model' %}
{% else %}
{% set role = message['role'] %}
{% endif %}
{{ '' + role + '\n' + message['content'] | trim + '\n' }}
{% endfor %}
{% if add_generation_prompt %}
{{ 'model\n' }}
{% endif %}
```
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.