char-fork/llama.cpp

git clone https://git.t4t.associates/char-fork/llama.cpp

Georgi Gerganovchat : avoid including json in chat.h (#21306)57ace0d61

char/aliceai-t5-moe
4.4 KiB74 linesraw
1#pragma once
2
3#include "chat-auto-parser.h"
4
5#include <functional>
6#include <optional>
7#include <string>
8
9std::string trim_whitespace(const std::string & str);
10std::string trim_leading_whitespace(const std::string & str);
11std::string trim_trailing_whitespace(const std::string & str);
12std::string trim_trailing_newlines(const std::string & str);
13
14// calculate a diff split (longest common prefix, longest common suffix excluding prefix,
15// mismatched part on the left, mismatched part on the right) between two strings
16// account for markers - align prefix and suffix endings so that they end on markers
17// * eg.:
18// calculate_diff_split("<html><body><div></div></body></html>", "<html><body><p>Something</p></body><html>") ->
19//  { "prefix": "<html><body>" (not: "<html><body><"), "suffix": "</body></html>", "left": "<div></div>", "right": "<p>Something</p>" }
20// calculate_diff_split("<html><body>Something</body></html>", "<html><body></body><html>") ->
21//  { "prefix": "<html><body>", "suffix": "</body></html>", "left": "Something", "right": "" }
22diff_split calculate_diff_split(const std::string & left, const std::string & right);
23
24// Returns the prefix of `full` up until the first occurrence of the common prefix of `left` and `right`
25// Returns empty string if there's no common prefix
26// * eg.:
27// until_common_prefix("really want a FUNCTION call", "FUNCTION alpha", "FUNCTION beta") -> "really want a "
28// until_common_prefix("<tool_call>", "<something>", "<something_else>") -> ""
29// until_common_prefix("some text", "1234", "abcd") -> ""
30// until_common_prefix("one arg two args three args four", "argument alpha", "argument beta") -> "one ""
31std::string until_common_prefix(const std::string & full, const std::string & left, const std::string & right);
32
33// Returns the suffix of `full` after the last occurrence of the common suffix of `left` and `right`
34// Returns empty string if there's no common suffix
35// Mirror function of `until_common_prefix`
36// * eg.:
37// after_common_suffix("really want a FUNCTION call", "first FUNCTION", "second FUNCTION") -> " call"
38// after_common_suffix("one arg two-args three args four", "alpha-args", "beta-args") -> " three args four"
39std::string after_common_suffix(const std::string & full, const std::string & left, const std::string & right);
40
41// Segmentize text into markers and non-marker fragments
42// * eg.:
43// segmentize_markers("<html><head><title>The site title</title><body><div>Here's some <b>content</b></div></body></html>" ->
44//  [ (MARKER, "<html>"), (MARKER, "<head>"), (MARKER, "<title>"), (TEXT, "The site title"), (MARKER, "</title>"),
45//    (MARKER, "<body>"), (MARKER, "<div>"), (TEXT, "Here's some "), (MARKER, "<b>"), (TEXT, "content"), (MARKER, "</b>"),
46//    (MARKER, "</div>"), (MARKER, "</body>"), (MARKER, "</html>")
47//  ]
48// segmentize_markers("<|tool_call|>[args]{ are here }[/args]<|tool_call_end|>") ->
49//  [ (MARKER, "<|tool_call|>"), (MARKER, "[args]"), (TEXT, "{ are here }"), (MARKER, "[/args]"), (MARKER, "<|tool_call_end|>") ]
50std::vector<segment> segmentize_markers(const std::string & text);
51
52// Prune whitespace-only segments from a vector of segments
53// * eg.:
54// segmentize_markers("<tool_call>\n<function=foo>\n<arg=bar>\n   \n</arg>\n</function>\n</tool_call>") ->
55//  X = [ (MARKER, "<tool_call>"), (TEXT, "\n"), (MARKER, "<function=foo>"), (TEXT, "\n"), (MARKER, "<arg=bar>"), (TEXT, "\n   \n"),
56//        (MARKER, "</arg>"), (TEXT, "\n"), (MARKER, "</function>"), (TEXT, "\n"), (MARKER, "</tool_call>") ]
57// prune_whitespace_segments(X) -> [ (MARKER, "<tool_call>"), (MARKER, "<function=foo>"), (MARKER, "<arg=bar>"), (MARKER, "</arg>"),
58//                                   (MARKER, "</function>"), (MARKER, "</tool_call>") ]
59std::vector<segment> prune_whitespace_segments(const std::vector<segment> & segments);
60
61namespace autoparser {
62
63// Apply a template with the given parameters, returning the rendered string (empty on failure)
64std::string apply_template(const common_chat_template & tmpl, const template_params & params);
65
66// Factorized differential comparison function
67// Takes base params and a single modifier lambda to create variant B
68// Returns compare_variants_result containing diff and both outputs, or std::nullopt on failure
69std::optional<compare_variants_result> compare_variants(
70    const common_chat_template &                   tmpl,
71    const template_params &                        params_A,
72    const std::function<void(template_params &)> & params_modifier);
73
74}  // namespace autoparser