Skip to content

Commit 1c6ff23

Browse files
committed
Add helper methods for each logging level
1 parent f8b85fe commit 1c6ff23

File tree

6 files changed

+144
-146
lines changed

6 files changed

+144
-146
lines changed

FirebaseVertexAI/Sources/GenerateContentResponse.swift

Lines changed: 12 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,9 @@ public struct GenerateContentResponse: Sendable {
4242
/// The response's content as text, if it exists.
4343
public var text: String? {
4444
guard let candidate = candidates.first else {
45-
Logging.logEvent(
46-
level: .error,
47-
message: "Could not get text from a response that had no candidates.",
48-
messageCode: .generateContentResponseNoCandidates
45+
VertexLog.error(
46+
code: .generateContentResponseNoCandidates,
47+
"Could not get text from a response that had no candidates."
4948
)
5049
return nil
5150
}
@@ -56,10 +55,9 @@ public struct GenerateContentResponse: Sendable {
5655
return text
5756
}
5857
guard textValues.count > 0 else {
59-
Logging.logEvent(
60-
level: .error,
61-
message: "Could not get a text part from the first candidate.",
62-
messageCode: .generateContentResponseNoText
58+
VertexLog.error(
59+
code: .generateContentResponseNoText,
60+
"Could not get a text part from the first candidate."
6361
)
6462
return nil
6563
}
@@ -336,10 +334,9 @@ extension FinishReason: Decodable {
336334
public init(from decoder: Decoder) throws {
337335
let value = try decoder.singleValueContainer().decode(String.self)
338336
guard let decodedFinishReason = FinishReason(rawValue: value) else {
339-
Logging.logEvent(
340-
level: .error,
341-
message: "Unrecognized FinishReason with value \"\(value)\".",
342-
messageCode: .generateContentResponseUnrecognizedFinishReason
337+
VertexLog.error(
338+
code: .generateContentResponseUnrecognizedFinishReason,
339+
"Unrecognized FinishReason with value \"\(value)\"."
343340
)
344341
self = .unknown
345342
return
@@ -354,10 +351,9 @@ extension PromptFeedback.BlockReason: Decodable {
354351
public init(from decoder: Decoder) throws {
355352
let value = try decoder.singleValueContainer().decode(String.self)
356353
guard let decodedBlockReason = PromptFeedback.BlockReason(rawValue: value) else {
357-
Logging.logEvent(
358-
level: .error,
359-
message: "Unrecognized BlockReason with value \"\(value)\".",
360-
messageCode: .generateContentResponseUnrecognizedBlockReason
354+
VertexLog.error(
355+
code: .generateContentResponseUnrecognizedBlockReason,
356+
"Unrecognized BlockReason with value \"\(value)\"."
361357
)
362358
self = .unknown
363359
return

FirebaseVertexAI/Sources/GenerativeAIService.swift

Lines changed: 28 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,14 @@ struct GenerativeAIService {
6161

6262
// Verify the status code is 200
6363
guard response.statusCode == 200 else {
64-
Logging.logEvent(
65-
level: .error,
66-
message: "The server responded with an error: \(response)",
67-
messageCode: .loadRequestResponseError
64+
VertexLog.error(
65+
code: .loadRequestResponseError,
66+
"The server responded with an error: \(response)"
6867
)
6968
if let responseString = String(data: data, encoding: .utf8) {
70-
Logging.logEvent(
71-
level: .error,
72-
message: "Response payload: \(responseString)",
73-
messageCode: .loadRequestResponseErrorPayload
69+
VertexLog.error(
70+
code: .loadRequestResponseErrorPayload,
71+
"Response payload: \(responseString)"
7472
)
7573
}
7674

@@ -117,20 +115,18 @@ struct GenerativeAIService {
117115

118116
// Verify the status code is 200
119117
guard response.statusCode == 200 else {
120-
Logging.logEvent(
121-
level: .error,
122-
message: "The server responded with an error: \(response)",
123-
messageCode: .loadRequestStreamResponseError
118+
VertexLog.error(
119+
code: .loadRequestStreamResponseError,
120+
"The server responded with an error: \(response)"
124121
)
125122
var responseBody = ""
126123
for try await line in stream.lines {
127124
responseBody += line + "\n"
128125
}
129126

130-
Logging.logEvent(
131-
level: .error,
132-
message: "Response payload: \(responseBody)",
133-
messageCode: .loadRequestStreamResponseErrorPayload
127+
VertexLog.error(
128+
code: .loadRequestStreamResponseErrorPayload,
129+
"Response payload: \(responseBody)"
134130
)
135131
continuation.finish(throwing: parseError(responseBody: responseBody))
136132

@@ -143,11 +139,7 @@ struct GenerativeAIService {
143139
let decoder = JSONDecoder()
144140
decoder.keyDecodingStrategy = .convertFromSnakeCase
145141
for try await line in stream.lines {
146-
Logging.logEvent(
147-
level: .debug,
148-
message: "Stream response: \(line)",
149-
messageCode: .loadRequestStreamResponseLine
150-
)
142+
VertexLog.debug(code: .loadRequestStreamResponseLine, "Stream response: \(line)")
151143

152144
if line.hasPrefix("data:") {
153145
// We can assume 5 characters since it's utf-8 encoded, removing `data:`.
@@ -199,10 +191,9 @@ struct GenerativeAIService {
199191
let tokenResult = await appCheck.getToken(forcingRefresh: false)
200192
urlRequest.setValue(tokenResult.token, forHTTPHeaderField: "X-Firebase-AppCheck")
201193
if let error = tokenResult.error {
202-
Logging.logEvent(
203-
level: .error,
204-
message: "Failed to fetch AppCheck token. Error: \(error)",
205-
messageCode: .appCheckTokenFetchFailed
194+
VertexLog.error(
195+
code: .appCheckTokenFetchFailed,
196+
"Failed to fetch AppCheck token. Error: \(error)"
206197
)
207198
}
208199
}
@@ -225,10 +216,9 @@ struct GenerativeAIService {
225216
private func httpResponse(urlResponse: URLResponse) throws -> HTTPURLResponse {
226217
// Verify the status code is 200
227218
guard let response = urlResponse as? HTTPURLResponse else {
228-
Logging.logEvent(
229-
level: .error,
230-
message: "Response wasn't an HTTP response, internal error \(urlResponse)",
231-
messageCode: .generativeAIServiceNonHTTPResponse
219+
VertexLog.error(
220+
code: .generativeAIServiceNonHTTPResponse,
221+
"Response wasn't an HTTP response, internal error \(urlResponse)"
232222
)
233223
throw NSError(
234224
domain: "com.google.generative-ai",
@@ -277,14 +267,14 @@ struct GenerativeAIService {
277267
// These errors do not produce specific GenerateContentError or CountTokensError cases.
278268
private func logRPCError(_ error: RPCError) {
279269
if error.isFirebaseMLServiceDisabledError() {
280-
Logging.logEvent(level: .error, message: """
270+
VertexLog.error(code: .firebaseMLAPIDisabled, """
281271
The Vertex AI for Firebase SDK requires the Firebase ML API `firebaseml.googleapis.com` to \
282272
be enabled for your project. Get started in the Firebase Console \
283273
(https://console.firebase.google.com/project/\(projectID)/genai/vertex) or verify that the \
284274
API is enabled in the Google Cloud Console \
285275
(https://console.developers.google.com/apis/api/firebaseml.googleapis.com/overview?project=\
286276
\(projectID)).
287-
""", messageCode: .firebaseMLAPIDisabled)
277+
""")
288278
}
289279
}
290280

@@ -293,16 +283,11 @@ struct GenerativeAIService {
293283
return try JSONDecoder().decode(type, from: data)
294284
} catch {
295285
if let json = String(data: data, encoding: .utf8) {
296-
Logging.logEvent(
297-
level: .error,
298-
message: "JSON response: \(json)",
299-
messageCode: .loadRequestParseResponseFailedJSON
300-
)
286+
VertexLog.error(code: .loadRequestParseResponseFailedJSON, "JSON response: \(json)")
301287
}
302-
Logging.logEvent(
303-
level: .error,
304-
message: "Error decoding server JSON: \(error)",
305-
messageCode: .loadRequestParseResponseFailedJSONError
288+
VertexLog.error(
289+
code: .loadRequestParseResponseFailedJSONError,
290+
"Error decoding server JSON: \(error)"
306291
)
307292
throw error
308293
}
@@ -329,12 +314,12 @@ struct GenerativeAIService {
329314
}
330315

331316
private func printCURLCommand(from request: URLRequest) {
332-
guard Logging.additionalLoggingEnabled() else {
317+
guard VertexLog.additionalLoggingEnabled() else {
333318
return
334319
}
335320
let command = cURLCommand(from: request)
336-
os_log(.debug, log: Logging.logObject, """
337-
\(Logging.service) Creating request with the equivalent cURL command:
321+
os_log(.debug, log: VertexLog.logObject, """
322+
\(VertexLog.service) Creating request with the equivalent cURL command:
338323
----- cURL command -----
339324
\(command, privacy: .private)
340325
------------------------

FirebaseVertexAI/Sources/GenerativeModel.swift

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -85,23 +85,15 @@ public final class GenerativeModel {
8585
self.systemInstruction = systemInstruction
8686
self.requestOptions = requestOptions
8787

88-
if Logging.additionalLoggingEnabled() {
89-
Logging.logEvent(
90-
level: .debug,
91-
message: "Verbose logging enabled.",
92-
messageCode: .verboseLoggingEnabled
93-
)
88+
if VertexLog.additionalLoggingEnabled() {
89+
VertexLog.debug(code: .verboseLoggingEnabled, "Verbose logging enabled.")
9490
} else {
95-
Logging.logEvent(level: .info, message: """
91+
VertexLog.info(code: .verboseLoggingDisabled, """
9692
[FirebaseVertexAI] To enable additional logging, add \
97-
`\(Logging.enableArgumentKey)` as a launch argument in Xcode.
98-
""", messageCode: .verboseLoggingDisabled)
93+
`\(VertexLog.enableArgumentKey)` as a launch argument in Xcode.
94+
""")
9995
}
100-
Logging.logEvent(
101-
level: .debug,
102-
message: "Model \(name) initialized.",
103-
messageCode: .generativeModelInitialized
104-
)
96+
VertexLog.debug(code: .generativeModelInitialized, "Model \(name) initialized.")
10597
}
10698

10799
/// Generates content from String and/or image inputs, given to the model as a prompt, that are

FirebaseVertexAI/Sources/Logging.swift

Lines changed: 0 additions & 67 deletions
This file was deleted.

FirebaseVertexAI/Sources/Safety.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,10 +121,9 @@ extension SafetyRating.HarmProbability: Decodable {
121121
public init(from decoder: Decoder) throws {
122122
let value = try decoder.singleValueContainer().decode(String.self)
123123
guard let decodedProbability = SafetyRating.HarmProbability(rawValue: value) else {
124-
Logging.logEvent(
125-
level: .error,
126-
message: "Unrecognized HarmProbability with value \"\(value)\".",
127-
messageCode: .generateContentResponseUnrecognizedHarmProbability
124+
VertexLog.error(
125+
code: .generateContentResponseUnrecognizedHarmProbability,
126+
"Unrecognized HarmProbability with value \"\(value)\"."
128127
)
129128
self = .unknown
130129
return
@@ -142,8 +141,10 @@ extension HarmCategory: Codable {
142141
public init(from decoder: Decoder) throws {
143142
let value = try decoder.singleValueContainer().decode(String.self)
144143
guard let decodedCategory = HarmCategory(rawValue: value) else {
145-
Logging.default
146-
.error("[FirebaseVertexAI] Unrecognized HarmCategory with value \"\(value)\".")
144+
VertexLog.error(
145+
code: .generateContentResponseUnrecognizedHarmCategory,
146+
"Unrecognized HarmCategory with value \"\(value)\"."
147+
)
147148
self = .unknown
148149
return
149150
}

0 commit comments

Comments
 (0)