char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
cef1d23c5
char/aliceai-t5-moe
1#pragma once 2 3#include "llama.h" 4 5#include <map> 6#include <regex> 7#include <string> 8#include <vector> 9 10struct llama_vocab ; 11 12// grammar element type 13enum llama_gretype { 14// end of rule definition 15LLAMA_GRETYPE_END = 0 , 16 17// start of alternate definition for rule 18LLAMA_GRETYPE_ALT = 1 , 19 20// non-terminal element: reference to rule 21LLAMA_GRETYPE_RULE_REF = 2 , 22 23// terminal element: character (code point) 24LLAMA_GRETYPE_CHAR = 3 , 25 26// inverse char(s) ([^a], [^a-b] [^abc]) 27LLAMA_GRETYPE_CHAR_NOT = 4 , 28 29// modifies a preceding LLAMA_GRETYPE_CHAR or LLAMA_GRETYPE_CHAR_ALT to 30// be an inclusive range ([a-z]) 31LLAMA_GRETYPE_CHAR_RNG_UPPER = 5 , 32 33// modifies a preceding LLAMA_GRETYPE_CHAR or 34// LLAMA_GRETYPE_CHAR_RNG_UPPER to add an alternate char to match ([ab], [a-zA]) 35LLAMA_GRETYPE_CHAR_ALT = 6 , 36 37// any character (.) 38LLAMA_GRETYPE_CHAR_ANY = 7 , 39 40// terminal element: token (<[token-id]>) 41LLAMA_GRETYPE_TOKEN = 8 , 42 43// inverse token (!<[token-id]>) 44LLAMA_GRETYPE_TOKEN_NOT = 9 , 45}; 46 47typedef struct llama_grammar_element { 48enum llama_gretype type ; 49uint32_t value ;// Unicode code point, rule ID, or token ID 50}llama_grammar_element ; 51 52struct llama_partial_utf8 { 53uint32_t value ;// bit value so far (unshifted) 54int n_remain ;// num bytes remaining; -1 indicates invalid sequence 55}; 56 57struct llama_grammar_candidate { 58size_t index ; 59const uint32_t * code_points ; 60llama_partial_utf8 partial_utf8 ; 61llama_token id ; 62}; 63 64using llama_grammar_rule = std ::vector < llama_grammar_element > ; 65using llama_grammar_stack = std ::vector < const llama_grammar_element *> ; 66 67using llama_grammar_rules = std ::vector < llama_grammar_rule > ; 68using llama_grammar_stacks = std ::vector < llama_grammar_stack > ; 69using llama_grammar_candidates = std ::vector < llama_grammar_candidate > ; 70 71// TODO: remove, needed for tests atm 72const llama_grammar_rules & llama_grammar_get_rules (const struct llama_grammar * grammar ); 73llama_grammar_stacks & llama_grammar_get_stacks (struct llama_grammar * grammar ); 74 75// takes a set of possible pushdown stacks on a grammar, which are required to 76// be positioned at a character range (see `llama_grammar_advance_stack`), and 77// produces the N possible stacks if the given char is accepted at those 78// positions 79void llama_grammar_accept ( struct llama_grammar * grammar , uint32_t chr ); 80 81std :: vector < llama_grammar_candidate > llama_grammar_reject_candidates_for_stack ( 82const llama_grammar_rules & rules , 83const llama_grammar_stack & stack , 84const llama_grammar_candidates & candidates ); 85 86struct llama_grammar_parser { 87const llama_vocab * vocab ; 88std :: map < std :: string , uint32_t > symbol_ids ; 89 90llama_grammar_rules rules ; 91 92llama_grammar_parser ( const struct llama_vocab * vocab = nullptr) : vocab ( vocab ) {} 93 94llama_grammar_stack c_rules () const ; 95 96uint32_t get_symbol_id ( const char * src , size_t len ); 97uint32_t generate_symbol_id ( const std :: string & base_name ); 98 99void add_rule ( uint32_t rule_id , const llama_grammar_rule & rule ); 100 101const char * parse_alternates ( 102const char * src , 103const std :: string & rule_name , 104uint32_t rule_id , 105bool is_nested ); 106 107const char * parse_sequence ( 108const char * src , 109const std :: string & rule_name , 110llama_grammar_rule & rule , 111bool is_nested ); 112 113const char * parse_rule ( const char * src ); 114 115bool parse ( const char * src ); 116void ( FILE * file ); 117}; 118 119struct llama_grammar_trigger_pattern { 120std :: string pattern ; 121std :: regex regex ; 122 123size_t find ( const std :: string & input ) const ; 124}; 125 126struct llama_grammar { 127// maintain a list of llama_tokens and their positions in the trigger_buffer 128using token_pos = std :: pair < llama_token , std :: pair < size_t , size_t >>; 129 130// note: allow null vocab for testing (not great) 131const llama_vocab * vocab ; 132 133const llama_grammar_rules rules ; // TODO: shared ptr 134llama_grammar_stacks stacks ; 135 136// buffer for partially generated UTF-8 sequence from accepted tokens 137llama_partial_utf8 partial_utf8 ; 138 139// lazy grammars wait for trigger words or tokens before constraining the sampling. 140// we still have trigger_tokens for non-lazy grammars to force printing of special trigger tokens. 141// (useful e.g. for tool_choice=required) 142bool lazy = false; 143bool awaiting_trigger = false; // Initialized to true for lazy grammars only 144std :: string trigger_buffer ; // Output buffered by lazy grammar. Will be cleared once trigger is found. 145std :: vector < token_pos > trigger_buffer_positions ; // Tokens buffered by lazy grammar. Used to replay when a trigger is found. 146std :: vector < llama_token > trigger_tokens ; // Tokens that trigger a lazy grammar, or tokens to force printing of (even if special). 147std :: vector < llama_grammar_trigger_pattern > 148trigger_patterns ; // Regular expressions that trigger a lazy grammar. Must be a full match of the entire generated 149// string, and the grammar will be given the string from the first match group onwards. 150 151}; 152 153// 154// internal API 155// 156 157// note: needed for tests (not great) 158struct llama_grammar * llama_grammar_init_impl ( 159const struct llama_vocab * vocab , 160const llama_grammar_element ** rules , 161size_t n_rules , 162size_t start_rule_index ); 163 164struct llama_grammar * llama_grammar_init_impl ( 165const struct llama_vocab * vocab , 166const char * grammar_str , 167const char * grammar_root , 168bool lazy , 169const char ** trigger_patterns , 170size_t num_trigger_patterns , 171const llama_token * trigger_tokens , 172size_t num_trigger_tokens ); 173 174void llama_grammar_free_impl ( struct llama_grammar * grammar ); 175 176struct llama_grammar * llama_grammar_clone_impl ( const struct llama_grammar & grammar ); 177 178// TODO: move the API below as member functions of llama_grammar 179void llama_grammar_apply_impl ( 180const struct llama_grammar & grammar , 181llama_token_data_array * cur_p ); 182 183void llama_grammar_accept_impl ( 184struct llama_grammar & grammar , 185llama_token token ); 186 187void llama_grammar_accept_str ( 188struct llama_grammar & grammar , 189const std :: string & piece ); 190 191void llama_grammar_accept_token ( 192struct llama_grammar & grammar , 193llama_token token , 194const std :: string & piece );