|
| 1 | +import { describe, test, expect } from "vitest"; |
| 2 | +import { compileTemplate } from "./template"; |
| 3 | + |
| 4 | +// Test data for simple templates |
| 5 | +const modelData = { |
| 6 | + preprompt: "Hello", |
| 7 | +}; |
| 8 | + |
| 9 | +const simpleTemplate = "Test: {{preprompt}} and {{foo}}"; |
| 10 | + |
| 11 | +// Additional realistic test data for Llama 70B templates |
| 12 | +const messages = [ |
| 13 | + { from: "user", content: "Hello there" }, |
| 14 | + { from: "assistant", content: "Hi, how can I help?" }, |
| 15 | +]; |
| 16 | + |
| 17 | +// Handlebars Llama 70B Template |
| 18 | +const llama70bTemplateHB = `<s>{{#if preprompt}}Source: system\n\n{{preprompt}}<step>{{/if}}{{#each messages}}{{#ifUser}}Source: user\n\n{{content}}<step>{{/ifUser}}{{#ifAssistant}}Source: assistant\n\n{{content}}<step>{{/ifAssistant}}{{/each}}Source: assistant\nDestination: user\n\n`; |
| 19 | + |
| 20 | +// Expected output for Handlebars Llama 70B Template |
| 21 | +const expectedHB = |
| 22 | + "<s>Source: system\n\nSystem Message<step>Source: user\n\nHello there<step>Source: assistant\n\nHi, how can I help?<step>Source: assistant\nDestination: user\n\n"; |
| 23 | + |
| 24 | +// Jinja Llama 70B Template |
| 25 | +const llama70bTemplateJinja = `<s>{% if preprompt %}Source: system\n\n{{ preprompt }}<step>{% endif %}{% for message in messages %}{% if message.from == 'user' %}Source: user\n\n{{ message.content }}<step>{% elif message.from == 'assistant' %}Source: assistant\n\n{{ message.content }}<step>{% endif %}{% endfor %}Source: assistant\nDestination: user\n\n`; |
| 26 | + |
| 27 | +// Expected output for Jinja Llama 70B Template |
| 28 | +const expectedJinja = |
| 29 | + "<s>Source: system\n\nSystem Message<step>Source: user\n\nHello there<step>Source: assistant\n\nHi, how can I help?<step>Source: assistant\nDestination: user\n\n"; |
| 30 | + |
| 31 | +describe("Template Engine Rendering", () => { |
| 32 | + test("should render using Handlebars fallback when no templateEngine is specified", () => { |
| 33 | + const render = compileTemplate(simpleTemplate, modelData); |
| 34 | + const result = render({ foo: "World" }); |
| 35 | + expect(result).toBe("Test: Hello and World"); |
| 36 | + }); |
| 37 | + |
| 38 | + test('should render using Jinja when templateEngine is set to "jinja"', () => { |
| 39 | + const render = compileTemplate(simpleTemplate, modelData); |
| 40 | + const result = render({ foo: "World" }); |
| 41 | + expect(result).toBe("Test: Hello and World"); |
| 42 | + }); |
| 43 | + |
| 44 | + // Realistic Llama 70B template tests |
| 45 | + test("should render realistic Llama 70B template using Handlebars", () => { |
| 46 | + const render = compileTemplate(llama70bTemplateHB, { preprompt: "System Message" }); |
| 47 | + const result = render({ messages }); |
| 48 | + expect(result).toBe(expectedHB); |
| 49 | + }); |
| 50 | + |
| 51 | + test("should render realistic Llama 70B template using Jinja", () => { |
| 52 | + const render = compileTemplate(llama70bTemplateJinja, { |
| 53 | + preprompt: "System Message", |
| 54 | + }); |
| 55 | + const result = render({ messages }); |
| 56 | + // Trim both outputs to account for whitespace differences in Jinja engine |
| 57 | + expect(result.trim()).toBe(expectedJinja.trim()); |
| 58 | + }); |
| 59 | +}); |
0 commit comments