diff --git a/common/jinja/jinja-vm.cpp b/common/jinja/jinja-vm.cpp index bd1017f5db..5ad2cd2826 100644 --- a/common/jinja/jinja-vm.cpp +++ b/common/jinja/jinja-vm.cpp @@ -203,4 +203,24 @@ value filter_expression::execute(context & ctx) { } } +value if_statement::execute(context & ctx) { + throw std::runtime_error("if_statement::execute not implemented"); +} + +value for_statement::execute(context & ctx) { + throw std::runtime_error("for_statement::execute not implemented"); +} + +value break_statement::execute(context & ctx) { + throw std::runtime_error("break_statement::execute not implemented"); +} + +value continue_statement::execute(context & ctx) { + throw std::runtime_error("continue_statement::execute not implemented"); +} + +value set_statement::execute(context & ctx) { + throw std::runtime_error("set_statement::execute not implemented"); +} + } // namespace jinja diff --git a/common/jinja/jinja-vm.h b/common/jinja/jinja-vm.h index ac5d679e88..5b620026a2 100644 --- a/common/jinja/jinja-vm.h +++ b/common/jinja/jinja-vm.h @@ -13,8 +13,17 @@ namespace jinja { struct context { - std::ostringstream out; std::map var; + + context() = default; + ~context() = default; + + context(const context & parent) { + // inherit variables (for example, when entering a new scope) + for (const auto & pair : parent.var) { + var[pair.first] = pair.second->clone(); + } + } }; /** @@ -59,7 +68,9 @@ struct program : public statement { explicit program(statements && body) : body(std::move(body)) {} std::string type() const override { return "Program"; } - value execute(context & ctx) override {} + value execute(context & ctx) override { + throw std::runtime_error("Cannot execute program directly, use jinja::vm instead"); + } }; struct if_statement : public statement { @@ -73,7 +84,7 @@ struct if_statement : public statement { } std::string type() const override { return "If"; } - value execute(context & ctx) override {} + value execute(context & ctx) override; }; struct identifier; @@ -97,17 +108,17 @@ struct for_statement : public statement { } std::string type() const override { return "For"; } - value execute(context & ctx) override {} + value execute(context & ctx) override; }; struct break_statement : public statement { std::string type() const override { return "Break"; } - value execute(context & ctx) override {} + value execute(context & ctx) override; }; struct continue_statement : public statement { std::string type() const override { return "Continue"; } - value execute(context & ctx) override {} + value execute(context & ctx) override; }; struct set_statement : public statement { @@ -122,7 +133,7 @@ struct set_statement : public statement { } std::string type() const override { return "Set"; } - value execute(context & ctx) override {} + value execute(context & ctx) override; }; struct macro_statement : public statement { diff --git a/tests/test-chat-jinja.cpp b/tests/test-chat-jinja.cpp index 3a8fc0cd87..e923da4481 100644 --- a/tests/test-chat-jinja.cpp +++ b/tests/test-chat-jinja.cpp @@ -11,9 +11,9 @@ #include "jinja/jinja-lexer.h" int main(void) { - //std::string contents = "{% 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 %}"; + std::string contents = "{% 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 %}"; - std::string contents = "{{ ('hi' + 'fi') | upper }}"; + //std::string contents = "{{ ('hi' + 'fi') | upper }}"; std::cout << "=== INPUT ===\n" << contents << "\n\n";