Paul-Louis Pröve commited on
Commit
6eed325
1 Parent(s): 168baba

initial commit

Browse files
Files changed (4) hide show
  1. .gitignore +1 -0
  2. app.py +134 -0
  3. sys_prompt.txt +9 -0
  4. year-make-model.csv +304 -0
.gitignore ADDED
@@ -0,0 +1 @@
 
 
1
+ .env
app.py ADDED
@@ -0,0 +1,134 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import time
3
+ import openai
4
+ import gradio as gr
5
+ import polars as pl
6
+ from sentence_transformers import SentenceTransformer
7
+ from langchain.vectorstores.azuresearch import AzureSearch
8
+
9
+ # from langchain.chat_models import AzureChatOpenAI
10
+ # from langchain.schema import SystemMessage, HumanMessage
11
+ from dotenv import load_dotenv
12
+
13
+ load_dotenv()
14
+
15
+ openai.api_type = "azure"
16
+ openai.api_version = "2023-03-15-preview"
17
+ openai.api_key = os.getenv("OPENAI_API_KEY")
18
+ openai.api_base = os.getenv("OPENAI_API_BASE")
19
+ vector_store_address = os.getenv("VECTOR_STORE_URL")
20
+ vector_store_password = os.getenv("VECTOR_STORE_KEY")
21
+ index_name = "motor-gm-search"
22
+
23
+ df = pl.read_csv("year-make-model.csv")
24
+
25
+ years = df["year"].unique().to_list()
26
+ makes = df["make"].unique().to_list()
27
+ models = df["model"].unique().to_list()
28
+
29
+ with open("sys_prompt.txt", "r") as f:
30
+ prompt = f.read()
31
+
32
+
33
+ def embed(message):
34
+ return embedder.encode([message])[0]
35
+
36
+
37
+ # llm = AzureChatOpenAI(deployment_name="chatserver35turbo")
38
+ embedder = SentenceTransformer("BAAI/bge-small-en")
39
+ search = AzureSearch(
40
+ azure_search_endpoint=vector_store_address,
41
+ azure_search_key=vector_store_password,
42
+ index_name=index_name,
43
+ embedding_function=embed,
44
+ )
45
+
46
+
47
+ def filter_makes(year):
48
+ df1 = df.filter(pl.col("year") == int(year))
49
+ choices = sorted(df1["make"].unique().to_list())
50
+ return gr.Dropdown.update(choices=choices, interactive=True)
51
+
52
+
53
+ def filter_models(year, make):
54
+ df1 = df.filter(pl.col("year") == int(year))
55
+ df1 = df1.filter(pl.col("make") == make)
56
+ choices = sorted(df1["model"].unique().to_list())
57
+ return gr.Dropdown.update(choices=choices, interactive=True)
58
+
59
+
60
+ def search_db(query, year, make, model, k=5, s_type="similarity"):
61
+ filters = f"year eq {year} and make eq '{make}' and model eq '{model}'"
62
+
63
+ res = []
64
+ if search_type == "hybrid":
65
+ res = search.similarity_search(query, k, search_type=s_type, filters=filters)
66
+ else:
67
+ mult = 1
68
+ while len(res) < k or mult <= 16:
69
+ res = search.similarity_search(
70
+ query, 100 * mult, search_type=s_type, filters=filters
71
+ )
72
+ mult *= 2
73
+ res = res[:k]
74
+
75
+ results = []
76
+ for r in res:
77
+ results.append(
78
+ {
79
+ "title": r.metadata["title"],
80
+ "content": r.page_content,
81
+ }
82
+ )
83
+ return str(results)
84
+
85
+
86
+ def respond(message, history, year, make, model, search_type):
87
+ if not year or not make or not model:
88
+ msg = "Please select a year, make, and model."
89
+ # return msg
90
+ for i in range(len(msg)):
91
+ time.sleep(0.02)
92
+ yield msg[: i + 1]
93
+ else:
94
+ results = search_db(message, year, make, model, k=5, s_type=search_type)
95
+
96
+ hist = []
97
+ hist.append(
98
+ {
99
+ "role": "system",
100
+ "content": prompt + results,
101
+ }
102
+ )
103
+ hist.append(
104
+ {
105
+ "role": "user",
106
+ "content": f"Year: {year}\nMake: {make}\nModel: {model}\n\n{message}",
107
+ }
108
+ )
109
+ model = "chatserver35turbo16k"
110
+ res = openai.ChatCompletion.create(
111
+ deployment_id=model, messages=hist, temperature=0.0, stream=True
112
+ )
113
+ msg = ""
114
+ # return str(res["choices"][0]["message"]["content"])
115
+ for chunk in res:
116
+ if "content" in chunk["choices"][0]["delta"]:
117
+ msg = msg + chunk["choices"][0]["delta"]["content"]
118
+ yield msg
119
+
120
+
121
+ with gr.Blocks(
122
+ css="footer {visibility: hidden} #component-8 {height: 80vh !important} #component-9 {height: 75vh !important}"
123
+ ) as app:
124
+ with gr.Row():
125
+ year = gr.Dropdown(years, label="Year")
126
+ make = gr.Dropdown([], label="Make", interactive=False)
127
+ model = gr.Dropdown([], label="Model", interactive=False)
128
+ types = ["similarity", "hybrid"]
129
+ search_type = gr.Dropdown(types, label="Search Type", value="hybrid")
130
+ year.change(filter_makes, year, make)
131
+ make.change(filter_models, [year, make], model)
132
+ row = [year, make, model, search_type]
133
+ gr.ChatInterface(respond, additional_inputs=row).queue()
134
+ app.queue().launch()
sys_prompt.txt ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ You are a helpful assistant that answers questions and queries.
2
+ You answer based on documents that will be provided to you.
3
+ You only and exclusively use the documents as a source of information.
4
+ If the documents don't provide the answer or are empty, simply say so.
5
+ Use only those documents that are strictly relevant to the query.
6
+ Structure your answer step by step if it fits the query.
7
+ Include a list of relevant document titles in the end of your response.
8
+
9
+ Documents:
year-make-model.csv ADDED
@@ -0,0 +1,304 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ year,make,model
2
+ 2020,Buick,Enclave - AWD
3
+ 2020,Buick,Enclave - FWD
4
+ 2020,Buick,Encore
5
+ 2020,Buick,Encore GX
6
+ 2020,Buick,Envision
7
+ 2020,Buick,Regal
8
+ 2020,Cadillac,CT4
9
+ 2020,Cadillac,CT5
10
+ 2020,Cadillac,CT6
11
+ 2020,Cadillac,Escalade - 2WD
12
+ 2020,Cadillac,Escalade - 4WD
13
+ 2020,Cadillac,Escalade ESV - 2WD
14
+ 2020,Cadillac,Escalade ESV - 4WD
15
+ 2020,Cadillac,XT4
16
+ 2020,Cadillac,XT5
17
+ 2020,Cadillac,XT6
18
+ 2020,Chevrolet,3500/4500 Medium Duty (LCF)
19
+ 2020,Chevrolet,4500HD/4500XD Medium Duty (LCF)
20
+ 2020,Chevrolet,5500HD/5500XD Medium Duty (LCF)
21
+ 2020,Chevrolet,6500XD Medium Duty (LCF)
22
+ 2020,Chevrolet,Aveo
23
+ 2020,Chevrolet,Beat
24
+ 2020,Chevrolet,Blazer
25
+ 2020,Chevrolet,Bolt EV
26
+ 2020,Chevrolet,Bolt EV LCV
27
+ 2020,Chevrolet,Camaro
28
+ 2020,Chevrolet,Cavalier
29
+ 2020,Chevrolet,Cheyenne - 2WD
30
+ 2020,Chevrolet,Cheyenne - 4WD
31
+ 2020,Chevrolet,Colorado (VIN 4)
32
+ 2020,Chevrolet,Colorado Pickup - 2WD (VIN S)
33
+ 2020,Chevrolet,Colorado Pickup - 4WD (VIN T)
34
+ 2020,Chevrolet,Corvette
35
+ 2020,Chevrolet,Equinox
36
+ 2020,Chevrolet,Equinox (RPO I19)
37
+ 2020,Chevrolet,Express
38
+ 2020,Chevrolet,Impala
39
+ 2020,Chevrolet,Malibu
40
+ 2020,Chevrolet,N300 Work
41
+ 2020,Chevrolet,S10
42
+ 2020,Chevrolet,Silverado 1500 - 2WD
43
+ 2020,Chevrolet,Silverado 1500 - 4WD
44
+ 2020,Chevrolet,Silverado 2500 HD/3500 HD - 2WD
45
+ 2020,Chevrolet,Silverado 2500 HD/3500 HD - 4WD
46
+ 2020,Chevrolet,Silverado 4500 HD/5500 HD/6500 HD
47
+ 2020,Chevrolet,Sonic
48
+ 2020,Chevrolet,Spark
49
+ 2020,Chevrolet,Spark (RPO I19)
50
+ 2020,Chevrolet,Suburban - 2WD
51
+ 2020,Chevrolet,Suburban - 4WD
52
+ 2020,Chevrolet,Tahoe - 2WD
53
+ 2020,Chevrolet,Tahoe - 4WD
54
+ 2020,Chevrolet,Tornado
55
+ 2020,Chevrolet,Trailblazer
56
+ 2020,Chevrolet,Traverse - AWD
57
+ 2020,Chevrolet,Traverse - FWD
58
+ 2020,Chevrolet,Trax
59
+ 2020,Chevrolet,Trax (RPO I19)
60
+ 2020,GMC,Acadia
61
+ 2020,GMC,Canyon Pickup - 2WD
62
+ 2020,GMC,Canyon Pickup - 4WD
63
+ 2020,GMC,Savana
64
+ 2020,GMC,Sierra 1500 - 2WD
65
+ 2020,GMC,Sierra 1500 - 4WD
66
+ 2020,GMC,Sierra 2500 HD/3500 HD - 2WD
67
+ 2020,GMC,Sierra 2500 HD/3500 HD - 4WD
68
+ 2020,GMC,Terrain
69
+ 2020,GMC,Yukon - 2WD
70
+ 2020,GMC,Yukon - 4WD
71
+ 2020,GMC,Yukon XL - 2WD
72
+ 2020,GMC,Yukon XL - 4WD
73
+ 2021,Buick,Enclave - AWD
74
+ 2021,Buick,Enclave - FWD
75
+ 2021,Buick,Encore
76
+ 2021,Buick,Encore GX
77
+ 2021,Buick,Envision
78
+ 2021,Cadillac,CT4
79
+ 2021,Cadillac,CT5
80
+ 2021,Cadillac,Escalade - 2WD
81
+ 2021,Cadillac,Escalade - 4WD
82
+ 2021,Cadillac,Escalade ESV - 2WD
83
+ 2021,Cadillac,Escalade ESV - 4WD
84
+ 2021,Cadillac,XT4
85
+ 2021,Cadillac,XT5
86
+ 2021,Cadillac,XT6
87
+ 2021,Chevrolet,3500/4500 Medium Duty (LCF)
88
+ 2021,Chevrolet,4500HD/4500XD Medium Duty (LCF)
89
+ 2021,Chevrolet,5500HD/5500XD Medium Duty (LCF)
90
+ 2021,Chevrolet,6500XD/7500XD Medium Duty (LCF)
91
+ 2021,Chevrolet,Aveo
92
+ 2021,Chevrolet,Beat
93
+ 2021,Chevrolet,Blazer
94
+ 2021,Chevrolet,Bolt EV
95
+ 2021,Chevrolet,Bolt EV LCV
96
+ 2021,Chevrolet,Camaro
97
+ 2021,Chevrolet,Cavalier
98
+ 2021,Chevrolet,Cheyenne - 2WD
99
+ 2021,Chevrolet,Cheyenne - 4WD
100
+ 2021,Chevrolet,Colorado (VIN 4)
101
+ 2021,Chevrolet,Colorado Pickup - 2WD (VIN S)
102
+ 2021,Chevrolet,Colorado Pickup - 4WD (VIN T)
103
+ 2021,Chevrolet,Corvette
104
+ 2021,Chevrolet,"Equinox (Central America, Caribbean)"
105
+ 2021,Chevrolet,"Equinox (US, Canada, Mexico)"
106
+ 2021,Chevrolet,Express
107
+ 2021,Chevrolet,Malibu
108
+ 2021,Chevrolet,Onix
109
+ 2021,Chevrolet,Silverado 1500 - 2WD
110
+ 2021,Chevrolet,Silverado 1500 - 4WD
111
+ 2021,Chevrolet,Silverado 2500 HD/3500 HD - 2WD
112
+ 2021,Chevrolet,Silverado 2500 HD/3500 HD - 4WD
113
+ 2021,Chevrolet,Silverado 4500 HD/5500 HD/6500 HD
114
+ 2021,Chevrolet,Spark
115
+ 2021,Chevrolet,Suburban - 2WD
116
+ 2021,Chevrolet,Suburban - 4WD
117
+ 2021,Chevrolet,Tahoe - 2WD
118
+ 2021,Chevrolet,Tahoe - 4WD
119
+ 2021,Chevrolet,Tracker
120
+ 2021,Chevrolet,Trailblazer (VIN 5)
121
+ 2021,Chevrolet,Trailblazer (VIN M)
122
+ 2021,Chevrolet,Traverse - AWD
123
+ 2021,Chevrolet,Traverse - FWD
124
+ 2021,Chevrolet,Trax
125
+ 2021,GMC,Acadia
126
+ 2021,GMC,Canyon Pickup - 2WD
127
+ 2021,GMC,Canyon Pickup - 4WD
128
+ 2021,GMC,Savana
129
+ 2021,GMC,Sierra 1500 - 2WD
130
+ 2021,GMC,Sierra 1500 - 4WD
131
+ 2021,GMC,Sierra 2500 HD/3500 HD - 2WD
132
+ 2021,GMC,Sierra 2500 HD/3500 HD - 4WD
133
+ 2021,GMC,Terrain
134
+ 2021,GMC,Yukon - 2WD
135
+ 2021,GMC,Yukon - 4WD
136
+ 2021,GMC,Yukon XL - 2WD
137
+ 2021,GMC,Yukon XL - 4WD
138
+ 2022,BrightDrop,EV600
139
+ 2022,Buick,Enclave - AWD
140
+ 2022,Buick,Enclave - FWD
141
+ 2022,Buick,Encore
142
+ 2022,Buick,Encore GX
143
+ 2022,Buick,Envision
144
+ 2022,Cadillac,CT4
145
+ 2022,Cadillac,CT5
146
+ 2022,Cadillac,Escalade - 2WD
147
+ 2022,Cadillac,Escalade - 4WD
148
+ 2022,Cadillac,Escalade ESV - 2WD
149
+ 2022,Cadillac,Escalade ESV - 4WD
150
+ 2022,Cadillac,XT4
151
+ 2022,Cadillac,XT5
152
+ 2022,Cadillac,XT6
153
+ 2022,Chevrolet,3500/4500 Medium Duty (LCF)
154
+ 2022,Chevrolet,4500HD/4500XD Medium Duty (LCF)
155
+ 2022,Chevrolet,5500HD/5500XD Medium Duty (LCF)
156
+ 2022,Chevrolet,6500XD/7500XD Medium Duty (LCF)
157
+ 2022,Chevrolet,Aveo
158
+ 2022,Chevrolet,Blazer
159
+ 2022,Chevrolet,Bolt EUV
160
+ 2022,Chevrolet,Bolt EV
161
+ 2022,Chevrolet,Bolt EV LCV
162
+ 2022,Chevrolet,Camaro
163
+ 2022,Chevrolet,Captiva
164
+ 2022,Chevrolet,Cavalier
165
+ 2022,Chevrolet,"Cheyenne - 2WD LTD (RPO J21, VIN Digit 5 = W)"
166
+ 2022,Chevrolet,"Cheyenne - 2WD New (RPO J22, VIN Digit 5 = A)"
167
+ 2022,Chevrolet,"Cheyenne - 4WD LTD (RPO J21, VIN Digit 5 = Y)"
168
+ 2022,Chevrolet,"Cheyenne - 4WD New (RPO J22, VIN Digit 5 = D)"
169
+ 2022,Chevrolet,Colorado (VIN 4)
170
+ 2022,Chevrolet,Colorado Pickup - 2WD (VIN S)
171
+ 2022,Chevrolet,Colorado Pickup - 4WD (VIN T)
172
+ 2022,Chevrolet,Corvette
173
+ 2022,Chevrolet,Equinox
174
+ 2022,Chevrolet,Express
175
+ 2022,Chevrolet,Groove
176
+ 2022,Chevrolet,Malibu
177
+ 2022,Chevrolet,N300 Work
178
+ 2022,Chevrolet,Onix Plus
179
+ 2022,Chevrolet,"Silverado 1500 - 2WD LTD (RPO J21, VIN Digit 5 = W)"
180
+ 2022,Chevrolet,"Silverado 1500 - 2WD New (RPO J22, VIN Digit 5 = A)"
181
+ 2022,Chevrolet,"Silverado 1500 - 4WD LTD (RPO J21, VIN Digit 5 = Y)"
182
+ 2022,Chevrolet,"Silverado 1500 - 4WD New (RPO J22, VIN Digit 5 = D)"
183
+ 2022,Chevrolet,Silverado 2500 HD/3500 HD - 2WD
184
+ 2022,Chevrolet,Silverado 2500 HD/3500 HD - 4WD
185
+ 2022,Chevrolet,Silverado 4500 HD/5500 HD/6500 HD
186
+ 2022,Chevrolet,Spark
187
+ 2022,Chevrolet,Suburban - 2WD
188
+ 2022,Chevrolet,Suburban - 4WD
189
+ 2022,Chevrolet,Tahoe - 2WD
190
+ 2022,Chevrolet,Tahoe - 4WD
191
+ 2022,Chevrolet,Tracker
192
+ 2022,Chevrolet,Trailblazer (VIN 5)
193
+ 2022,Chevrolet,Trailblazer (VIN M)
194
+ 2022,Chevrolet,Traverse - AWD
195
+ 2022,Chevrolet,Traverse - FWD
196
+ 2022,Chevrolet,Trax
197
+ 2022,GMC,Acadia
198
+ 2022,GMC,Canyon Pickup - 2WD
199
+ 2022,GMC,Canyon Pickup - 4WD
200
+ 2022,GMC,HUMMER EV
201
+ 2022,GMC,Savana
202
+ 2022,GMC,"Sierra 1500 - 2WD Limited (RPO J21, VIN Digit 5 = 8)"
203
+ 2022,GMC,"Sierra 1500 - 2WD New (RPO J22, VIN Digit 5 = H)"
204
+ 2022,GMC,"Sierra 1500 - 4WD Limited (RPO J21, VIN Digit 5 = 9)"
205
+ 2022,GMC,"Sierra 1500 - 4WD New (RPO J22, VIN Digit 5 = U)"
206
+ 2022,GMC,Sierra 2500 HD/3500 HD - 2WD
207
+ 2022,GMC,Sierra 2500 HD/3500 HD - 4WD
208
+ 2022,GMC,Terrain
209
+ 2022,GMC,Yukon - 2WD
210
+ 2022,GMC,Yukon - 4WD
211
+ 2022,GMC,Yukon XL - 2WD
212
+ 2022,GMC,Yukon XL - 4WD
213
+ 2023,BrightDrop,Zevo 600
214
+ 2023,Buick,Enclave - AWD
215
+ 2023,Buick,Enclave - FWD
216
+ 2023,Buick,Encore GX
217
+ 2023,Buick,Envision
218
+ 2023,Cadillac,CT4
219
+ 2023,Cadillac,CT5
220
+ 2023,Cadillac,Escalade - 2WD
221
+ 2023,Cadillac,Escalade - 4WD
222
+ 2023,Cadillac,Escalade ESV - 2WD
223
+ 2023,Cadillac,Escalade ESV - 4WD
224
+ 2023,Cadillac,LYRIQ
225
+ 2023,Cadillac,XT4
226
+ 2023,Cadillac,XT5
227
+ 2023,Cadillac,XT6
228
+ 2023,Chevrolet,3500/4500 Medium Duty (LCF)
229
+ 2023,Chevrolet,4500HD/4500XD Medium Duty (LCF)
230
+ 2023,Chevrolet,5500HD/5500XD Medium Duty (LCF)
231
+ 2023,Chevrolet,6500XD/7500XD Medium Duty (LCF)
232
+ 2023,Chevrolet,Aveo
233
+ 2023,Chevrolet,Blazer
234
+ 2023,Chevrolet,Bolt EUV
235
+ 2023,Chevrolet,Bolt EV
236
+ 2023,Chevrolet,Bolt EV LCV
237
+ 2023,Chevrolet,Camaro
238
+ 2023,Chevrolet,Captiva
239
+ 2023,Chevrolet,Cavalier
240
+ 2023,Chevrolet,Cheyenne - 2WD
241
+ 2023,Chevrolet,Cheyenne - 4WD
242
+ 2023,Chevrolet,"Colorado (Except US, Canada, Mexico)"
243
+ 2023,Chevrolet,"Colorado - 2WD (US, Canada, Mexico)"
244
+ 2023,Chevrolet,"Colorado - 4WD (US, Canada, Mexico)"
245
+ 2023,Chevrolet,Corvette
246
+ 2023,Chevrolet,Equinox
247
+ 2023,Chevrolet,Express
248
+ 2023,Chevrolet,Groove
249
+ 2023,Chevrolet,Malibu
250
+ 2023,Chevrolet,N400 Move/Max
251
+ 2023,Chevrolet,Onix
252
+ 2023,Chevrolet,S10 Max
253
+ 2023,Chevrolet,Silverado 1500 - 2WD
254
+ 2023,Chevrolet,Silverado 1500 - 4WD
255
+ 2023,Chevrolet,Silverado 2500 HD/3500 HD - 2WD
256
+ 2023,Chevrolet,Silverado 2500 HD/3500 HD - 4WD
257
+ 2023,Chevrolet,Silverado 4500 HD/5500 HD/6500 HD
258
+ 2023,Chevrolet,Suburban - 2WD
259
+ 2023,Chevrolet,Suburban - 4WD
260
+ 2023,Chevrolet,Tahoe - 2WD
261
+ 2023,Chevrolet,Tahoe - 4WD
262
+ 2023,Chevrolet,Tornado
263
+ 2023,Chevrolet,Tracker
264
+ 2023,Chevrolet,Trailblazer (VIN 5)
265
+ 2023,Chevrolet,Trailblazer (VIN M)
266
+ 2023,Chevrolet,Traverse - AWD
267
+ 2023,Chevrolet,Traverse - FWD
268
+ 2023,GMC,Acadia
269
+ 2023,GMC,Canyon - 2WD
270
+ 2023,GMC,Canyon - 4WD
271
+ 2023,GMC,HUMMER EV
272
+ 2023,GMC,Savana
273
+ 2023,GMC,Sierra 1500 - 2WD
274
+ 2023,GMC,Sierra 1500 - 4WD
275
+ 2023,GMC,Sierra 2500 HD/3500 HD - 2WD
276
+ 2023,GMC,Sierra 2500 HD/3500 HD - 4WD
277
+ 2023,GMC,Terrain
278
+ 2023,GMC,Yukon - 2WD
279
+ 2023,GMC,Yukon - 4WD
280
+ 2023,GMC,Yukon XL - 2WD
281
+ 2023,GMC,Yukon XL - 4WD
282
+ 2024,Buick,Encore GX
283
+ 2024,Cadillac,XT4
284
+ 2024,Chevrolet,3500 HG/4500 HG Low Cab Forward
285
+ 2024,Chevrolet,4500 HD/4500 XD Low Cab Forward
286
+ 2024,Chevrolet,5500 HD/5500 XD Low Cab Forward
287
+ 2024,Chevrolet,5500 HG/5500 XG Low Cab Forward
288
+ 2024,Chevrolet,6500 XD/7500 XD Low Cab Forward
289
+ 2024,Chevrolet,Aveo
290
+ 2024,Chevrolet,Captiva
291
+ 2024,Chevrolet,Colorado (VIN 4)
292
+ 2024,Chevrolet,Equinox
293
+ 2024,Chevrolet,Montana
294
+ 2024,Chevrolet,S10 Max
295
+ 2024,Chevrolet,Silverado 2500 HD/3500 HD - 2WD
296
+ 2024,Chevrolet,Silverado 2500 HD/3500 HD - 4WD
297
+ 2024,Chevrolet,Tracker
298
+ 2024,Chevrolet,Trailblazer (VIN 5)
299
+ 2024,Chevrolet,Trax
300
+ 2024,GMC,HUMMER EV SUV
301
+ 2024,GMC,Sierra 2500 HD/3500 HD - 2WD
302
+ 2024,GMC,Sierra 2500 HD/3500 HD - 4WD
303
+ 2024,GMC,Terrain
304
+ 2024,GMC,Yukon XL - 4WD (RPO J23)