|
28 | 28 | MDBOOK_DIRECTIVE_RE = re.compile(r"\{\{#[^{}]*\}\}") |
29 | 29 | MDBOOK_TAB_OPEN_RE = re.compile(r"\{\{#tab\b([^{}]*)\}\}") |
30 | 30 |
|
31 | | -TOKENIZER_FALLBACKS = [ |
| 31 | +MODEL_PREFIX_ENCODINGS = [ |
32 | 32 | ("gpt-5", "o200k_base"), |
33 | 33 | ("gpt-4o", "o200k_base"), |
34 | 34 | ("gpt-4.1", "o200k_base"), |
@@ -116,16 +116,19 @@ def _sanitize(text: str) -> str: |
116 | 116 |
|
117 | 117 | def _get_encoding_for_model(model: str): |
118 | 118 | """ |
119 | | - Return a tokenizer for the requested model, with fallbacks for newer |
120 | | - model names that tiktoken may not recognize yet. |
| 119 | + Return a tokenizer for the requested model. |
| 120 | +
|
| 121 | + Tiktoken does not necessarily know custom or newly released model names, |
| 122 | + so resolve known model families by prefix before treating a model as |
| 123 | + unknown. For example, ``gpt-5.6-luna`` uses the GPT-5 tokenizer even if |
| 124 | + that exact name is absent from tiktoken's model registry. |
121 | 125 | """ |
122 | 126 | try: |
123 | 127 | return tiktoken.encoding_for_model(model) |
124 | 128 | except KeyError: |
125 | 129 | lowered_model = model.lower() |
126 | | - for prefix, encoding_name in TOKENIZER_FALLBACKS: |
| 130 | + for prefix, encoding_name in MODEL_PREFIX_ENCODINGS: |
127 | 131 | if lowered_model.startswith(prefix): |
128 | | - print(f"Tokenizer for model {model} not found. Falling back to {encoding_name}.") |
129 | 132 | return tiktoken.get_encoding(encoding_name) |
130 | 133 | print(f"Tokenizer for model {model} not found. Falling back to {FINAL_TOKENIZER_FALLBACK}.") |
131 | 134 | return tiktoken.get_encoding(FINAL_TOKENIZER_FALLBACK) |
|
0 commit comments