@@ -16,6 +16,7 @@ import FirebaseAppCheckInterop
16
16
import FirebaseAuthInterop
17
17
import FirebaseCore
18
18
import Foundation
19
+ import os. log
19
20
20
21
@available ( iOS 15 . 0 , macOS 11 . 0 , macCatalyst 15 . 0 , tvOS 15 . 0 , watchOS 8 . 0 , * )
21
22
struct GenerativeAIService {
@@ -60,9 +61,17 @@ struct GenerativeAIService {
60
61
61
62
// Verify the status code is 200
62
63
guard response. statusCode == 200 else {
63
- Logging . network. error ( " [FirebaseVertexAI] The server responded with an error: \( response) " )
64
+ Logging . logEvent (
65
+ level: . error,
66
+ message: " The server responded with an error: \( response) " ,
67
+ messageCode: . loadRequestResponseError
68
+ )
64
69
if let responseString = String ( data: data, encoding: . utf8) {
65
- Logging . default. error ( " [FirebaseVertexAI] Response payload: \( responseString) " )
70
+ Logging . logEvent (
71
+ level: . error,
72
+ message: " Response payload: \( responseString) " ,
73
+ messageCode: . loadRequestResponseErrorPayload
74
+ )
66
75
}
67
76
68
77
throw parseError ( responseData: data)
@@ -108,14 +117,21 @@ struct GenerativeAIService {
108
117
109
118
// Verify the status code is 200
110
119
guard response. statusCode == 200 else {
111
- Logging . network
112
- . error ( " [FirebaseVertexAI] The server responded with an error: \( response) " )
120
+ Logging . logEvent (
121
+ level: . error,
122
+ message: " The server responded with an error: \( response) " ,
123
+ messageCode: . loadRequestStreamResponseError
124
+ )
113
125
var responseBody = " "
114
126
for try await line in stream. lines {
115
127
responseBody += line + " \n "
116
128
}
117
129
118
- Logging . default. error ( " [FirebaseVertexAI] Response payload: \( responseBody) " )
130
+ Logging . logEvent (
131
+ level: . error,
132
+ message: " Response payload: \( responseBody) " ,
133
+ messageCode: . loadRequestStreamResponseErrorPayload
134
+ )
119
135
continuation. finish ( throwing: parseError ( responseBody: responseBody) )
120
136
121
137
return
@@ -127,7 +143,11 @@ struct GenerativeAIService {
127
143
let decoder = JSONDecoder ( )
128
144
decoder. keyDecodingStrategy = . convertFromSnakeCase
129
145
for try await line in stream. lines {
130
- Logging . network. debug ( " [FirebaseVertexAI] Stream response: \( line) " )
146
+ Logging . logEvent (
147
+ level: . debug,
148
+ message: " Stream response: \( line) " ,
149
+ messageCode: . loadRequestStreamResponseLine
150
+ )
131
151
132
152
if line. hasPrefix ( " data: " ) {
133
153
// We can assume 5 characters since it's utf-8 encoded, removing `data:`.
@@ -179,8 +199,11 @@ struct GenerativeAIService {
179
199
let tokenResult = await appCheck. getToken ( forcingRefresh: false )
180
200
urlRequest. setValue ( tokenResult. token, forHTTPHeaderField: " X-Firebase-AppCheck " )
181
201
if let error = tokenResult. error {
182
- Logging . default
183
- . debug ( " [FirebaseVertexAI] Failed to fetch AppCheck token. Error: \( error) " )
202
+ Logging . logEvent (
203
+ level: . error,
204
+ message: " Failed to fetch AppCheck token. Error: \( error) " ,
205
+ messageCode: . appCheckTokenFetchFailed
206
+ )
184
207
}
185
208
}
186
209
@@ -202,10 +225,11 @@ struct GenerativeAIService {
202
225
private func httpResponse( urlResponse: URLResponse) throws -> HTTPURLResponse {
203
226
// Verify the status code is 200
204
227
guard let response = urlResponse as? HTTPURLResponse else {
205
- Logging . default
206
- . error (
207
- " [FirebaseVertexAI] Response wasn't an HTTP response, internal error \( urlResponse) "
208
- )
228
+ Logging . logEvent (
229
+ level: . error,
230
+ message: " Response wasn't an HTTP response, internal error \( urlResponse) " ,
231
+ messageCode: . generativeAIServiceNonHTTPResponse
232
+ )
209
233
throw NSError (
210
234
domain: " com.google.generative-ai " ,
211
235
code: - 1 ,
@@ -253,14 +277,14 @@ struct GenerativeAIService {
253
277
// These errors do not produce specific GenerateContentError or CountTokensError cases.
254
278
private func logRPCError( _ error: RPCError) {
255
279
if error. isFirebaseMLServiceDisabledError ( ) {
256
- Logging . default . error ( """
280
+ Logging . logEvent ( level : . error, message : """
257
281
The Vertex AI for Firebase SDK requires the Firebase ML API `firebaseml.googleapis.com` to \
258
282
be enabled for your project. Get started in the Firebase Console \
259
283
(https://console.firebase.google.com/project/ \( projectID) /genai/vertex) or verify that the \
260
284
API is enabled in the Google Cloud Console \
261
285
(https://console.developers.google.com/apis/api/firebaseml.googleapis.com/overview?project= \
262
286
\( projectID) ).
263
- """ )
287
+ """ , messageCode : . firebaseMLAPIDisabled )
264
288
}
265
289
}
266
290
@@ -269,9 +293,17 @@ struct GenerativeAIService {
269
293
return try JSONDecoder ( ) . decode ( type, from: data)
270
294
} catch {
271
295
if let json = String ( data: data, encoding: . utf8) {
272
- Logging . network. error ( " [FirebaseVertexAI] JSON response: \( json) " )
296
+ Logging . logEvent (
297
+ level: . error,
298
+ message: " JSON response: \( json) " ,
299
+ messageCode: . loadRequestParseResponseFailedJSON
300
+ )
273
301
}
274
- Logging . default. error ( " [FirebaseVertexAI] Error decoding server JSON: \( error) " )
302
+ Logging . logEvent (
303
+ level: . error,
304
+ message: " Error decoding server JSON: \( error) " ,
305
+ messageCode: . loadRequestParseResponseFailedJSONError
306
+ )
275
307
throw error
276
308
}
277
309
}
@@ -297,9 +329,12 @@ struct GenerativeAIService {
297
329
}
298
330
299
331
private func printCURLCommand( from request: URLRequest ) {
332
+ guard Logging . additionalLoggingEnabled ( ) else {
333
+ return
334
+ }
300
335
let command = cURLCommand ( from: request)
301
- Logging . verbose . debug ( """
302
- [FirebaseVertexAI] Creating request with the equivalent cURL command:
336
+ os_log ( . debug, log : Logging . logObject , """
337
+ \( Logging . service ) Creating request with the equivalent cURL command:
303
338
----- cURL command -----
304
339
\( command, privacy: . private)
305
340
------------------------
0 commit comments