Felipe97/llama-cpp-compiled
01.1k
1#pragma once2 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 strings16// account for markers - align prefix and suffix endings so that they end on markers17// * 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 prefix26// * 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 suffix35// 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 fragments42// * 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 segments53// * 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 function67// Takes base params and a single modifier lambda to create variant B68// Returns compare_variants_result containing diff and both outputs, or std::nullopt on failure69std::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 autoparser75 