jinja2cpp / jinja2cpp/Jinja2Cpp

Failure rendering a simple template

Open
#252 2 comments 2 reactions 0 assignees View on GitHub
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.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.