From 616a06387bccf35cc9299d1c432edbdd12cef924 Mon Sep 17 00:00:00 2001 From: androidlover5842 Date: Sat, 31 Jan 2026 05:08:20 +0530 Subject: [PATCH] Add logging for OpenAI fallback --- .../component/DocumentExtractionService.kt | 5 +++ .../component/OpenAIVisionClient.kt | 38 ++++++++++++------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/main/kotlin/com/android/trisolarisserver/component/DocumentExtractionService.kt b/src/main/kotlin/com/android/trisolarisserver/component/DocumentExtractionService.kt index 0cd5764..49c410a 100644 --- a/src/main/kotlin/com/android/trisolarisserver/component/DocumentExtractionService.kt +++ b/src/main/kotlin/com/android/trisolarisserver/component/DocumentExtractionService.kt @@ -8,6 +8,7 @@ import com.android.trisolarisserver.repo.GuestVehicleRepo import com.android.trisolarisserver.repo.PropertyRepo import java.time.OffsetDateTime import java.util.UUID +import org.slf4j.LoggerFactory @org.springframework.stereotype.Component class DocumentExtractionService( @@ -17,6 +18,8 @@ class DocumentExtractionService( private val guestVehicleRepo: GuestVehicleRepo, private val propertyRepo: PropertyRepo ) { + private val logger = LoggerFactory.getLogger(DocumentExtractionService::class.java) + fun extractAndApply(localImageUrl: String, publicImageUrl: String, document: GuestDocument, propertyId: UUID): ExtractionResult { val results = linkedMapOf() val detections = listOf( @@ -289,11 +292,13 @@ class DocumentExtractionService( return } + logger.info("Aadhaar retry failed; using OpenAI fallback") val fallback = openAIVisionClient.extractAadhaarNumber(publicImageUrl) ?: "" val fallbackNormalized = normalizeDigits(cleanedValue(fallback)) if (fallbackNormalized != null && isValidAadhaar(fallbackNormalized)) { results[key] = formatAadhaar(fallbackNormalized) } else { + logger.warn("OpenAI fallback failed to produce valid Aadhaar") results[key] = "NONE" } } diff --git a/src/main/kotlin/com/android/trisolarisserver/component/OpenAIVisionClient.kt b/src/main/kotlin/com/android/trisolarisserver/component/OpenAIVisionClient.kt index e9636b5..0ff1ef0 100644 --- a/src/main/kotlin/com/android/trisolarisserver/component/OpenAIVisionClient.kt +++ b/src/main/kotlin/com/android/trisolarisserver/component/OpenAIVisionClient.kt @@ -7,6 +7,7 @@ import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.stereotype.Component import org.springframework.web.client.RestTemplate +import org.slf4j.LoggerFactory @Component class OpenAIVisionClient( @@ -19,8 +20,13 @@ class OpenAIVisionClient( @Value("\${openai.model:gpt-5-mini}") private val model: String ) { + private val logger = LoggerFactory.getLogger(OpenAIVisionClient::class.java) + fun extractAadhaarNumber(imageUrl: String): String? { - if (apiKey.isBlank()) return null + if (apiKey.isBlank()) { + logger.warn("OpenAI fallback skipped: openai.apiKey is blank") + return null + } val payload = mapOf( "model" to model, @@ -45,21 +51,27 @@ class OpenAIVisionClient( headers.contentType = MediaType.APPLICATION_JSON headers.setBearerAuth(apiKey) val entity = HttpEntity(payload, headers) - val response = restTemplate.postForEntity(baseUrl, entity, String::class.java) - val body = response.body ?: return null - val node = objectMapper.readTree(body) + return try { + logger.info("OpenAI fallback request model={} url={}", model, baseUrl) + val response = restTemplate.postForEntity(baseUrl, entity, String::class.java) + val body = response.body ?: return null + val node = objectMapper.readTree(body) - val outputText = node.path("output_text").asText() - if (outputText.isNotBlank()) return outputText + val outputText = node.path("output_text").asText() + if (outputText.isNotBlank()) return outputText - val outputArray = node.path("output") - if (outputArray.isArray && outputArray.size() > 0) { - val content = outputArray[0].path("content") - if (content.isArray && content.size() > 0) { - val text = content[0].path("text").asText() - if (text.isNotBlank()) return text + val outputArray = node.path("output") + if (outputArray.isArray && outputArray.size() > 0) { + val content = outputArray[0].path("content") + if (content.isArray && content.size() > 0) { + val text = content[0].path("text").asText() + if (text.isNotBlank()) return text + } } + null + } catch (e: Exception) { + logger.warn("OpenAI fallback failed: {}", e.message) + null } - return null } }