@@ -16,6 +16,7 @@ import FirebaseAppCheckInterop
1616import FirebaseAuthInterop
1717import FirebaseCore
1818import Foundation
19+ import os. log
1920
2021@available ( iOS 15 . 0 , macOS 11 . 0 , macCatalyst 15 . 0 , tvOS 15 . 0 , watchOS 8 . 0 , * )
2122struct GenerativeAIService {
@@ -60,9 +61,17 @@ struct GenerativeAIService {
6061
6162 // Verify the status code is 200
6263 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+ )
6469 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+ )
6675 }
6776
6877 throw parseError ( responseData: data)
@@ -108,14 +117,21 @@ struct GenerativeAIService {
108117
109118 // Verify the status code is 200
110119 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+ )
113125 var responseBody = " "
114126 for try await line in stream. lines {
115127 responseBody += line + " \n "
116128 }
117129
118- Logging . default. error ( " [FirebaseVertexAI] Response payload: \( responseBody) " )
130+ Logging . logEvent (
131+ level: . error,
132+ message: " Response payload: \( responseBody) " ,
133+ messageCode: . loadRequestStreamResponseErrorPayload
134+ )
119135 continuation. finish ( throwing: parseError ( responseBody: responseBody) )
120136
121137 return
@@ -127,7 +143,11 @@ struct GenerativeAIService {
127143 let decoder = JSONDecoder ( )
128144 decoder. keyDecodingStrategy = . convertFromSnakeCase
129145 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+ )
131151
132152 if line. hasPrefix ( " data: " ) {
133153 // We can assume 5 characters since it's utf-8 encoded, removing `data:`.
@@ -179,8 +199,11 @@ struct GenerativeAIService {
179199 let tokenResult = await appCheck. getToken ( forcingRefresh: false )
180200 urlRequest. setValue ( tokenResult. token, forHTTPHeaderField: " X-Firebase-AppCheck " )
181201 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+ )
184207 }
185208 }
186209
@@ -202,10 +225,11 @@ struct GenerativeAIService {
202225 private func httpResponse( urlResponse: URLResponse) throws -> HTTPURLResponse {
203226 // Verify the status code is 200
204227 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+ )
209233 throw NSError (
210234 domain: " com.google.generative-ai " ,
211235 code: - 1 ,
@@ -253,14 +277,14 @@ struct GenerativeAIService {
253277 // These errors do not produce specific GenerateContentError or CountTokensError cases.
254278 private func logRPCError( _ error: RPCError) {
255279 if error. isFirebaseMLServiceDisabledError ( ) {
256- Logging . default . error ( """
280+ Logging . logEvent ( level : . error, message : """
257281 The Vertex AI for Firebase SDK requires the Firebase ML API `firebaseml.googleapis.com` to \
258282 be enabled for your project. Get started in the Firebase Console \
259283 (https://console.firebase.google.com/project/ \( projectID) /genai/vertex) or verify that the \
260284 API is enabled in the Google Cloud Console \
261285 (https://console.developers.google.com/apis/api/firebaseml.googleapis.com/overview?project= \
262286 \( projectID) ).
263- """ )
287+ """ , messageCode : . firebaseMLAPIDisabled )
264288 }
265289 }
266290
@@ -269,9 +293,17 @@ struct GenerativeAIService {
269293 return try JSONDecoder ( ) . decode ( type, from: data)
270294 } catch {
271295 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+ )
273301 }
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+ )
275307 throw error
276308 }
277309 }
@@ -297,9 +329,12 @@ struct GenerativeAIService {
297329 }
298330
299331 private func printCURLCommand( from request: URLRequest ) {
332+ guard Logging . additionalLoggingEnabled ( ) else {
333+ return
334+ }
300335 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:
303338 ----- cURL command -----
304339 \( command, privacy: . private)
305340 ------------------------
0 commit comments