Skip to content

Commit 102f832

Browse files
authored
Polish a few APIs, method names, and remove unnecessarily vending public extension (#122)
Co-authored-by: Tao Jia <tjia1818@users.noreply.github.com>
1 parent aff0bb2 commit 102f832

8 files changed

Lines changed: 34 additions & 34 deletions

File tree

swift/Sources/CoreAILanguageModels/DecodingStrategies/VanillaDecodingStrategy.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ extension VanillaDecodingStrategy.VanillaDecodedSequence {
164164
if !flushed {
165165
let count = generatedTokenCount
166166
// Metrics recording is async; fire-and-forget on the abandon path.
167-
Task { await PerformanceMetrics.shared.setGeneratedTokenCount(count) }
167+
Task { await PerformanceMetrics.shared.recordGeneratedTokens(count) }
168168
}
169169
}
170170

@@ -283,7 +283,7 @@ extension VanillaDecodingStrategy.VanillaDecodedSequence {
283283
trailing = nil
284284
}
285285

286-
await PerformanceMetrics.shared.setGeneratedTokenCount(generatedTokenCount)
286+
await PerformanceMetrics.shared.recordGeneratedTokens(generatedTokenCount)
287287
return trailing
288288
}
289289
}

swift/Sources/CoreAILanguageModels/LanguageModel/CoreAIRunner.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ public struct CoreAIRunner {
3232
kvCacheStrategy: KVCacheStrategy = .auto
3333
) throws {
3434
self.init(
35-
from: try LanguageBundle(at: url),
35+
bundle: try LanguageBundle(at: url),
3636
variant: variant,
3737
kvCacheStrategy: kvCacheStrategy
3838
)
3939
}
4040

4141
/// Creates a runner from a LanguageBundle.
4242
public init(
43-
from bundle: LanguageBundle,
43+
bundle: LanguageBundle,
4444
variant: String? = nil,
4545
kvCacheStrategy: KVCacheStrategy = .auto
4646
) {

swift/Sources/CoreAILanguageModels/Profiling/PerformanceMetrics.swift

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@ public final class PerformanceMetrics {
2828
private var startInstant: ContinuousClock.Instant?
2929
private var endInstant: ContinuousClock.Instant?
3030

31-
private var promptTokenCount: Int = 0
32-
private var generatedTokenCount: Int = 0
33-
private var totalTokenCount: Int = 0
31+
public private(set) var promptTokenCount: Int = 0
32+
public private(set) var generatedTokenCount: Int = 0
3433

3534
/// The shared PerformanceMetrics instance for production use.
3635
public static let shared = PerformanceMetrics()
@@ -61,17 +60,19 @@ public final class PerformanceMetrics {
6160

6261
// MARK: - Token Counting
6362

64-
public func setPromptTokenCount(_ count: Int) {
65-
promptTokenCount = count
63+
/// Total number of prompt and generated tokens.
64+
public var totalTokenCount: Int {
65+
promptTokenCount + generatedTokenCount
6666
}
6767

68-
public func setGeneratedTokenCount(_ count: Int) {
69-
generatedTokenCount = count
70-
totalTokenCount = promptTokenCount + generatedTokenCount
68+
/// Records the number of tokens in the prompt.
69+
public func recordPromptTokens(_ count: Int) {
70+
promptTokenCount = count
7171
}
7272

73-
public var getGeneratedTokenCount: Int {
74-
return generatedTokenCount
73+
/// Records the number of tokens produced during generation.
74+
public func recordGeneratedTokens(_ count: Int) {
75+
generatedTokenCount = count
7576
}
7677

7778
// MARK: - Computed Metrics (from StatsStorage)
@@ -236,7 +237,6 @@ public final class PerformanceMetrics {
236237
endInstant = nil
237238
promptTokenCount = 0
238239
generatedTokenCount = 0
239-
totalTokenCount = 0
240240
// Also reset StatsStorage since this is a full reset
241241
StatsStorage.shared.reset()
242242
}

swift/Sources/CoreAILanguageModels/Profiling/Timing.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ import Foundation
99

1010
/// Extension to convert Duration to common time units.
1111
///
12+
/// - Note: This is an internal implementation detail. It is intentionally not
13+
/// `public`: vending members on a standard-library type we don't own would
14+
/// pollute `Duration`'s API surface for every client of this library.
15+
///
1216
/// Example usage:
1317
/// ```swift
1418
/// let start = ContinuousClock.now
@@ -18,13 +22,13 @@ import Foundation
1822
/// ```
1923
extension Duration {
2024
/// Duration in seconds as a Double.
21-
public var inSeconds: Double {
25+
var inSeconds: Double {
2226
let (secs, attoseconds) = self.components
2327
return Double(secs) + Double(attoseconds) / 1e18
2428
}
2529

2630
/// Duration in milliseconds as a Double.
27-
public var inMilliseconds: Double {
31+
var inMilliseconds: Double {
2832
inSeconds * 1000.0
2933
}
3034
}

swift/Sources/CoreAIShared/Logger/Logger.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Synchronization
1111
public struct CLILogger {
1212
private static let _level = Atomic<Int>(0)
1313

14-
static var level: Int {
14+
public static var level: Int {
1515
get {
1616
_level.load(ordering: .acquiring)
1717
}
@@ -21,10 +21,6 @@ public struct CLILogger {
2121
}
2222
}
2323

24-
public static func setLevel(to level: Int) {
25-
Self.level = level
26-
}
27-
2824
/// Performs logging if enabled for the requested level.
2925
/// - Parameters:
3026
/// - message: The message to log.

swift/Sources/Tools/image-segmenter/ImageSegmentationRunnerMain.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ struct ImageSegmenterCLI: AsyncParsableCommand {
157157
throw ValidationError("--image is required.")
158158
}
159159
if verbose {
160-
CLILogger.setLevel(to: 1)
160+
CLILogger.level = 1
161161
}
162162

163163
if verbose { print("Creating image segmenter...") }

swift/Sources/Tools/llm-runner/LLMRunnerMain.swift

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ struct LLMRunner: AsyncParsableCommand, Sendable {
221221

222222
func run() async throws {
223223
let verboseLevel = max(self.verboseLevel ?? 0, verbose ? 1 : 0)
224-
CLILogger.setLevel(to: verboseLevel)
224+
CLILogger.level = verboseLevel
225225

226226
let resolver = ModelPaths()
227227
let resolvedPath = try validateAndResolveModelPath(resolver: resolver)
@@ -308,7 +308,7 @@ struct LLMRunner: AsyncParsableCommand, Sendable {
308308

309309
// Set up verbose logging environment variable first
310310
let verboseLevel = max(self.verboseLevel ?? 0, verbose ? 1 : 0)
311-
CLILogger.setLevel(to: verboseLevel)
311+
CLILogger.level = verboseLevel
312312

313313
// Bridge hidden CLI overrides to environment variables read by the Core AI engine
314314
if let b = bucketSize {
@@ -530,7 +530,7 @@ struct LLMRunner: AsyncParsableCommand, Sendable {
530530
CLILogger.log("Text generator built successfully", component: "Main")
531531

532532
// Apply chat template and count tokens for metrics
533-
await PerformanceMetrics.shared.setPromptTokenCount(promptTokens.count)
533+
await PerformanceMetrics.shared.recordPromptTokens(promptTokens.count)
534534

535535
CLILogger.log("Generating text...", component: "Main")
536536
CLILogger.log("Input: \(displayPrompt)", component: "Main")
@@ -632,7 +632,7 @@ struct LLMRunner: AsyncParsableCommand, Sendable {
632632
InstrumentsProfiler.endDecoding(signpostID: decodingID)
633633

634634
// Generated token count is already set by the decoding strategy
635-
let generatedTokenCount = await PerformanceMetrics.shared.getGeneratedTokenCount
635+
let generatedTokenCount = await PerformanceMetrics.shared.generatedTokenCount
636636
InstrumentsProfiler.endInference(generatedTokens: generatedTokenCount, signpostID: inferenceID)
637637

638638
// End overall timing now that core inference is complete
@@ -924,7 +924,7 @@ struct LLMRunner: AsyncParsableCommand, Sendable {
924924
let inferenceID = InstrumentsProfiler.beginInference(
925925
promptTokens: vlmTokens.count, maxTokens: maxTokens)
926926

927-
await PerformanceMetrics.shared.setPromptTokenCount(vlmTokens.count)
927+
await PerformanceMetrics.shared.recordPromptTokens(vlmTokens.count)
928928

929929
let tokenStream = try await vlmEngine.generate(
930930
with: embeddedInput,
@@ -993,7 +993,7 @@ struct LLMRunner: AsyncParsableCommand, Sendable {
993993
// Record generation stats
994994
InstrumentsProfiler.endInference(
995995
generatedTokens: generatedTokens.count, signpostID: inferenceID)
996-
await PerformanceMetrics.shared.setGeneratedTokenCount(generatedTokens.count)
996+
await PerformanceMetrics.shared.recordGeneratedTokens(generatedTokens.count)
997997
await PerformanceMetrics.shared.endOverallTiming()
998998
await PerformanceMetrics.shared.printSummary(verbose: CLILogger.isVerbose)
999999

swift/Tests/LanguageModelsTests/PerformanceMetricsTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@ struct PerformanceMetricsTests {
3737
metrics.reset()
3838

3939
metrics.startOverallTiming()
40-
metrics.setPromptTokenCount(100)
41-
metrics.setGeneratedTokenCount(50)
40+
metrics.recordPromptTokens(100)
41+
metrics.recordGeneratedTokens(50)
4242
metrics.reset()
4343

4444
#expect(metrics.totalTime == 0)
45-
#expect(metrics.getGeneratedTokenCount == 0)
45+
#expect(metrics.generatedTokenCount == 0)
4646
#expect(metrics.modelLoadTime == 0)
4747
}
4848

@@ -51,8 +51,8 @@ struct PerformanceMetricsTests {
5151
let metrics = PerformanceMetrics.shared
5252
metrics.reset()
5353

54-
metrics.setPromptTokenCount(100)
55-
metrics.setGeneratedTokenCount(50)
54+
metrics.recordPromptTokens(100)
55+
metrics.recordGeneratedTokens(50)
5656

5757
#expect(metrics.promptThroughput == 0)
5858
#expect(metrics.generationThroughput == 0)

0 commit comments

Comments
 (0)