Skip to content

Commit b62cda1

Browse files
authored
Upgrade Jinja package to version 2.0.0 (#240)
* Add github.com/huggingface/swift-jinja as a dependency * Add Jinja package dependency to Hub target * Integrate Jinja package * Fix expectation for testQwen2_5WithTools
1 parent 52a6f59 commit b62cda1

File tree

5 files changed

+29
-25
lines changed

5 files changed

+29
-25
lines changed

Package.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,15 @@ let package = Package(
1515
.library(name: "Transformers", targets: ["Tokenizers", "Generation", "Models"])
1616
],
1717
dependencies: [
18-
.package(url: "https://github.com/johnmai-dev/Jinja", .upToNextMinor(from: "1.3.0"))
18+
.package(url: "https://github.com/huggingface/swift-jinja.git", from: "2.0.0")
1919
],
2020
targets: [
2121
.target(name: "Generation", dependencies: ["Tokenizers"]),
22-
.target(name: "Hub", resources: [.process("Resources")], swiftSettings: swiftSettings),
22+
.target(name: "Hub", dependencies: [.product(name: "Jinja", package: "swift-jinja")], resources: [.process("Resources")], swiftSettings: swiftSettings),
2323
.target(name: "Models", dependencies: ["Tokenizers", "Generation"]),
24-
.target(name: "Tokenizers", dependencies: ["Hub", .product(name: "Jinja", package: "Jinja")]),
24+
.target(name: "Tokenizers", dependencies: ["Hub", .product(name: "Jinja", package: "swift-jinja")]),
2525
.testTarget(name: "GenerationTests", dependencies: ["Generation"]),
26-
.testTarget(name: "HubTests", dependencies: ["Hub", .product(name: "Jinja", package: "Jinja")], swiftSettings: swiftSettings),
26+
.testTarget(name: "HubTests", dependencies: ["Hub", .product(name: "Jinja", package: "swift-jinja")], swiftSettings: swiftSettings),
2727
.testTarget(name: "ModelsTests", dependencies: ["Models", "Hub"], resources: [.process("Resources")]),
2828
.testTarget(name: "TokenizersTests", dependencies: ["Tokenizers", "Models", "Hub"], resources: [.process("Resources")]),
2929
]

Sources/Hub/Config.swift

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Created by Piotr Kowalczuk on 06.03.25.
66

77
import Foundation
8+
import Jinja
89

910
// MARK: - Configuration files with dynamic lookup
1011

@@ -433,28 +434,28 @@ public struct Config: Hashable, Sendable,
433434
self.dictionary(or: or)
434435
}
435436

436-
public func toJinjaCompatible() -> Any? {
437+
public func jinjaValue() -> Jinja.Value {
437438
switch self.value {
438439
case let .array(val):
439-
return val.map { $0.toJinjaCompatible() }
440+
return .array(val.map { $0.jinjaValue() })
440441
case let .dictionary(val):
441-
var result: [String: Any?] = [:]
442+
var result: [String: Jinja.Value] = [:]
442443
for (key, config) in val {
443-
result[key.string] = config.toJinjaCompatible()
444+
result[key.string] = config.jinjaValue()
444445
}
445-
return result
446+
return .object(.init(uniqueKeysWithValues: result))
446447
case let .boolean(val):
447-
return val
448+
return .boolean(val)
448449
case let .floating(val):
449-
return val
450+
return .double(Double(String(val)) ?? Double(val))
450451
case let .integer(val):
451-
return val
452+
return .int(val)
452453
case let .string(val):
453-
return val.string
454+
return .string(val.string)
454455
case let .token(val):
455-
return [String(val.0): val.1.string] as [String: String]
456+
return [String(val.0): .string(val.1.string)]
456457
case .null:
457-
return nil
458+
return .null
458459
}
459460
}
460461

Sources/Tokenizers/Tokenizer.swift

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -769,32 +769,34 @@ public class PreTrainedTokenizer: Tokenizer {
769769
}
770770

771771
let template = try compiledTemplate(for: selectedChatTemplate)
772-
var context: [String: Any] = [
773-
"messages": messages,
774-
"add_generation_prompt": addGenerationPrompt,
772+
var context: [String: Jinja.Value] = try [
773+
"messages": .array(messages.map { try Value(any: $0) }),
774+
"add_generation_prompt": .boolean(addGenerationPrompt),
775775
]
776776
if let tools {
777-
context["tools"] = tools
777+
context["tools"] = try .array(tools.map { try Value(any: $0) })
778778
}
779779
if let additionalContext {
780780
// Additional keys and values to be added to the context provided to the prompt templating engine.
781781
// For example, the app could set "tools_in_user_message" to false for Llama 3.1 and 3.2 if a system message is provided.
782782
// The default value is true in the Llama 3.1 and 3.2 chat templates, but these models will perform better if the tools are included in a system message.
783783
for (key, value) in additionalContext {
784-
context[key] = value
784+
context[key] = try Value(any: value)
785785
}
786786
}
787787

788788
for (key, value) in tokenizerConfig.dictionary(or: [:]) {
789789
if specialTokenAttributes.contains(key.string), !value.isNull() {
790790
if let stringValue = value.string() {
791-
context[key.string] = stringValue
791+
context[key.string] = .string(stringValue)
792792
} else if let dictionary = value.dictionary() {
793-
context[key.string] = addedTokenAsString(Config(dictionary))
793+
if let addedTokenString = addedTokenAsString(Config(dictionary)) {
794+
context[key.string] = .string(addedTokenString)
795+
}
794796
} else if let array: [String] = value.get() {
795-
context[key.string] = array
797+
context[key.string] = .array(array.map { .string($0) })
796798
} else {
797-
context[key.string] = value
799+
context[key.string] = try Value(any: value)
798800
}
799801
}
800802
}

Tests/HubTests/ConfigTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,7 @@ struct ConfigTests {
435435
"""
436436

437437
let got = try Template(template).render([
438-
"config": cfg.toJinjaCompatible()
438+
"config": cfg.jinjaValue()
439439
])
440440

441441
#expect(got == exp)

Tests/TokenizersTests/ChatTemplateTests.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ struct ChatTemplateTests {
257257
What is the weather in Paris today?<|im_end|>
258258
<|im_start|>assistant
259259
260+
260261
"""
261262

262263
#expect(

0 commit comments

Comments
 (0)