@@ -21,6 +21,7 @@ class SpecialVocab:
21
21
add_special_token : dict [str , bool ]
22
22
special_token_ids : dict [str , int ]
23
23
chat_template : str | Sequence [Mapping [str , str ]] | None
24
+ inverse_template : str | None
24
25
25
26
def __init__ (
26
27
self , path : str | os .PathLike [str ], load_merges : bool = False ,
@@ -33,6 +34,7 @@ def __init__(
33
34
self .load_merges = load_merges
34
35
self .merges = []
35
36
self .chat_template = None
37
+ self .inverse_template = None
36
38
if special_token_types is not None :
37
39
self .special_token_types = special_token_types
38
40
else :
@@ -71,6 +73,10 @@ def add_to_gguf(self, gw: GGUFWriter, quiet: bool = False) -> None:
71
73
if not quiet :
72
74
logger .info (f'Setting chat_template to { self .chat_template } ' )
73
75
gw .add_chat_template (self .chat_template )
76
+ if self .inverse_template is not None :
77
+ if not quiet :
78
+ logger .info (f'Setting inverse_template to { self .inverse_template } ' )
79
+ gw .add_inverse_template (self .inverse_template )
74
80
75
81
def _load (self , path : Path ) -> None :
76
82
self ._try_load_from_tokenizer_json (path )
@@ -137,6 +143,11 @@ def _try_load_from_tokenizer_json(self, path: Path) -> bool:
137
143
self .chat_template = chat_template
138
144
else :
139
145
logger .warning (f'Bad type for chat_template field in { tokenizer_config_file !r} - ignoring' )
146
+ inverse_template = tokenizer_config .get ('inverse_template' )
147
+ if inverse_template is None or isinstance (inverse_template , str ):
148
+ self .inverse_template = inverse_template
149
+ else :
150
+ logger .warning (f'Bad type for inverse_template field in { tokenizer_config_file !r} - ignoring' )
140
151
for typ in self .special_token_types :
141
152
add_entry = tokenizer_config .get (f'add_{ typ } _token' )
142
153
if isinstance (add_entry , bool ):
0 commit comments