@@ -144,7 +144,7 @@ public class LanguageModelConfigurationFromHub {
144
144
revision: String,
145
145
hubApi: HubApi = . shared
146
146
) async throws -> Configurations {
147
- let filesToDownload = [ " config.json " , " tokenizer_config.json " , " chat_template.json " , " tokenizer.json " ]
147
+ let filesToDownload = [ " config.json " , " tokenizer_config.json " , " chat_template.jinja " , " chat_template. json" , " tokenizer.json " ]
148
148
let repo = Hub . Repo ( id: modelName)
149
149
150
150
do {
@@ -195,11 +195,22 @@ public class LanguageModelConfigurationFromHub {
195
195
}
196
196
197
197
// Check for chat template and merge if available
198
- let chatTemplateURL = modelFolder. appending ( path: " chat_template.json " )
199
- if FileManager . default. fileExists ( atPath: chatTemplateURL. path) ,
200
- let chatTemplateConfig = try ? hubApi. configuration ( fileURL: chatTemplateURL) ,
201
- let chatTemplate = chatTemplateConfig. chatTemplate. string ( )
198
+ // Prefer .jinja template over .json template
199
+ var chatTemplate : String ? = nil
200
+ let chatTemplateJinjaURL = modelFolder. appending ( path: " chat_template.jinja " )
201
+ let chatTemplateJsonURL = modelFolder. appending ( path: " chat_template.json " )
202
+
203
+ if FileManager . default. fileExists ( atPath: chatTemplateJinjaURL. path) {
204
+ // Try to load .jinja template as plain text
205
+ chatTemplate = try ? String ( contentsOf: chatTemplateJinjaURL, encoding: . utf8)
206
+ } else if FileManager . default. fileExists ( atPath: chatTemplateJsonURL. path) ,
207
+ let chatTemplateConfig = try ? hubApi. configuration ( fileURL: chatTemplateJsonURL)
202
208
{
209
+ // Fall back to .json template
210
+ chatTemplate = chatTemplateConfig. chatTemplate. string ( )
211
+ }
212
+
213
+ if let chatTemplate {
203
214
// Create or update tokenizer config with chat template
204
215
if var configDict = tokenizerConfig? . dictionary ( ) {
205
216
configDict [ " chat_template " ] = . init( chatTemplate)
0 commit comments