fix: VIN Decoding timeouts and logic errors
All checks were successful
Deploy to Staging / Build Images (pull_request) Successful in 3m33s
Deploy to Staging / Deploy to Staging (pull_request) Successful in 52s
Deploy to Staging / Verify Staging (pull_request) Successful in 9s
Deploy to Staging / Notify Staging Ready (pull_request) Successful in 8s
Deploy to Staging / Notify Staging Failure (pull_request) Has been skipped
All checks were successful
Deploy to Staging / Build Images (pull_request) Successful in 3m33s
Deploy to Staging / Deploy to Staging (pull_request) Successful in 52s
Deploy to Staging / Verify Staging (pull_request) Successful in 9s
Deploy to Staging / Notify Staging Ready (pull_request) Successful in 8s
Deploy to Staging / Notify Staging Failure (pull_request) Has been skipped
This commit is contained in:
@@ -40,8 +40,9 @@ Return the results as a JSON object with a single "maintenanceSchedule" array.\
|
||||
|
||||
# VIN year code lookup: position 10 character -> base year (first cycle, 1980-2009).
|
||||
# The 30-year cycle repeats: +30 for 2010-2039, +60 for 2040-2069.
|
||||
# Disambiguation uses position 7: numeric -> 2010+ cycle, alphabetic -> 1980s cycle.
|
||||
# For the 2040+ cycle (when position 7 is alphabetic again), we pick the most
|
||||
# Disambiguation uses position 7: alphabetic -> 2010+ cycle, numeric -> 1980s cycle.
|
||||
# Per NHTSA FMVSS No. 115: MY2010+ vehicles must use alphabetic position 7.
|
||||
# For the 2040+ cycle (when position 7 is numeric again), we pick the most
|
||||
# recent plausible year (not more than 2 years in the future).
|
||||
_VIN_YEAR_CODES: dict[str, int] = {
|
||||
"A": 1980, "B": 1981, "C": 1982, "D": 1983, "E": 1984,
|
||||
@@ -58,10 +59,10 @@ def resolve_vin_year(vin: str) -> int | None:
|
||||
"""Deterministically resolve model year from VIN positions 7 and 10.
|
||||
|
||||
VIN year codes repeat on a 30-year cycle. Position 7 disambiguates:
|
||||
- Numeric position 7 -> 2010-2039 cycle
|
||||
- Alphabetic position 7 -> 1980-2009 or 2040-2050+ cycle
|
||||
- Alphabetic position 7 -> 2010-2039 cycle (NHTSA MY2010+ requirement)
|
||||
- Numeric position 7 -> 1980-2009 or 2040-2069 cycle
|
||||
|
||||
For the alphabetic case with three possible cycles, picks the most recent
|
||||
For the numeric case with two possible cycles, picks the most recent
|
||||
year that is not more than 2 years in the future.
|
||||
|
||||
Returns None if the VIN is too short or position 10 is not a valid year code.
|
||||
@@ -76,11 +77,11 @@ def resolve_vin_year(vin: str) -> int | None:
|
||||
if base_year is None:
|
||||
return None
|
||||
|
||||
if pos7.isdigit():
|
||||
# Numeric position 7 -> second cycle (2010-2039)
|
||||
if pos7.isalpha():
|
||||
# Alphabetic position 7 -> second cycle (2010-2039)
|
||||
return base_year + 30
|
||||
|
||||
# Alphabetic position 7 -> first cycle (1980-2009) or third cycle (2040-2069)
|
||||
# Numeric position 7 -> first cycle (1980-2009) or third cycle (2040-2069)
|
||||
# Pick the most recent plausible year
|
||||
max_plausible = datetime.now().year + 2
|
||||
|
||||
@@ -381,6 +382,9 @@ class GeminiEngine:
|
||||
response_mime_type="application/json",
|
||||
response_schema=_VIN_DECODE_SCHEMA,
|
||||
tools=[types.Tool(google_search=types.GoogleSearch())],
|
||||
automatic_function_calling=types.AutomaticFunctionCallingConfig(
|
||||
max_remote_calls=3,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user