Spaces:
Running
Running
Commit
·
d0291ae
1
Parent(s):
a145e37
fixing pdfs
Browse files- api_cost/api_cost.yaml +2 -2
- app.py +123 -39
- vouchervision/LLM_GoogleGemini.py +4 -1
- vouchervision/LLM_GooglePalm2.py +55 -29
- vouchervision/OCR_GPT4oMini.py +1 -1
- vouchervision/OCR_google_cloud_vision.py +8 -6
- vouchervision/model_maps.py +58 -58
- vouchervision/utils_hf.py +88 -39
api_cost/api_cost.yaml
CHANGED
|
@@ -61,8 +61,8 @@ GEMINI_PRO:
|
|
| 61 |
in: 0.0005
|
| 62 |
out: 0.0015
|
| 63 |
GEMINI_1_5_FLASH:
|
| 64 |
-
in: 0.
|
| 65 |
-
out: 0.
|
| 66 |
GEMINI_1_5_PRO:
|
| 67 |
in: 0.0035
|
| 68 |
out: 0.0105
|
|
|
|
| 61 |
in: 0.0005
|
| 62 |
out: 0.0015
|
| 63 |
GEMINI_1_5_FLASH:
|
| 64 |
+
in: 0.000075
|
| 65 |
+
out: 0.00030
|
| 66 |
GEMINI_1_5_PRO:
|
| 67 |
in: 0.0035
|
| 68 |
out: 0.0105
|
app.py
CHANGED
|
@@ -254,7 +254,6 @@ def load_gallery(converted_files, uploaded_file):
|
|
| 254 |
|
| 255 |
|
| 256 |
|
| 257 |
-
|
| 258 |
def handle_image_upload_and_gallery_hf(uploaded_files):
|
| 259 |
SAFE = SafetyCheck(st.session_state['is_hf'])
|
| 260 |
if uploaded_files:
|
|
@@ -271,37 +270,46 @@ def handle_image_upload_and_gallery_hf(uploaded_files):
|
|
| 271 |
st.error("Warning: You uploaded an image that violates our terms of service.")
|
| 272 |
return True
|
| 273 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 274 |
|
| 275 |
# Determine the file type
|
| 276 |
if uploaded_file.name.lower().endswith('.pdf'):
|
| 277 |
-
|
| 278 |
-
|
| 279 |
-
|
| 280 |
-
|
| 281 |
-
|
| 282 |
-
|
| 283 |
-
|
| 284 |
-
|
| 285 |
-
|
| 286 |
-
|
| 287 |
-
|
| 288 |
-
|
| 289 |
-
|
| 290 |
-
|
| 291 |
-
|
| 292 |
-
|
| 293 |
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
file_path_small =
|
| 297 |
-
|
| 298 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 299 |
else:
|
| 300 |
-
ind_small += 1
|
| 301 |
# Handle JPG/JPEG files (existing process)
|
| 302 |
-
|
| 303 |
st.session_state['input_list'].append(file_path)
|
| 304 |
-
if ind_small < MAX_GALLERY_IMAGES +5:
|
| 305 |
img = Image.open(file_path)
|
| 306 |
img.thumbnail((GALLERY_IMAGE_SIZE, GALLERY_IMAGE_SIZE), Image.Resampling.LANCZOS)
|
| 307 |
file_path_small = save_uploaded_file(st.session_state['dir_uploaded_images_small'], uploaded_file, img)
|
|
@@ -313,15 +321,80 @@ def handle_image_upload_and_gallery_hf(uploaded_files):
|
|
| 313 |
|
| 314 |
if st.session_state['input_list_small']:
|
| 315 |
if len(st.session_state['input_list_small']) > MAX_GALLERY_IMAGES:
|
| 316 |
-
# Only take the first 100 images from the list
|
| 317 |
images_to_display = st.session_state['input_list_small'][:MAX_GALLERY_IMAGES]
|
| 318 |
else:
|
| 319 |
-
# If there are less than 100 images, take them all
|
| 320 |
images_to_display = st.session_state['input_list_small']
|
| 321 |
show_gallery_small_hf(images_to_display)
|
| 322 |
|
| 323 |
return False
|
| 324 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 325 |
|
| 326 |
def handle_image_upload_and_gallery():
|
| 327 |
|
|
@@ -371,6 +444,7 @@ def handle_image_upload_and_gallery():
|
|
| 371 |
|
| 372 |
|
| 373 |
def content_input_images(col_left, col_right):
|
|
|
|
| 374 |
st.write('---')
|
| 375 |
# col1, col2 = st.columns([2,8])
|
| 376 |
with col_left:
|
|
@@ -385,11 +459,11 @@ def content_input_images(col_left, col_right):
|
|
| 385 |
pass
|
| 386 |
|
| 387 |
with col_left:
|
| 388 |
-
if st.session_state.is_hf:
|
| 389 |
-
|
| 390 |
-
|
| 391 |
-
|
| 392 |
-
|
| 393 |
|
| 394 |
with col_right:
|
| 395 |
if st.session_state.is_hf:
|
|
@@ -1007,7 +1081,8 @@ def create_private_file():
|
|
| 1007 |
|
| 1008 |
cfg_private['open_cage_geocode'] = {}
|
| 1009 |
cfg_private['open_cage_geocode']['API_KEY'] =''
|
| 1010 |
-
|
|
|
|
| 1011 |
|
| 1012 |
with col_private:
|
| 1013 |
st.header("Set API keys")
|
|
@@ -1060,7 +1135,7 @@ def create_private_file():
|
|
| 1060 |
fullpath=os.path.join(st.session_state.dir_home, 'demo','google','google_api_5.PNG'))
|
| 1061 |
|
| 1062 |
st.subheader("Getting a Google JSON authentication key")
|
| 1063 |
-
st.write("Google uses a JSON file to store additional authentication information. Save this file in a safe, private location and assign the `GOOGLE_APPLICATION_CREDENTIALS` value to the file path. For Hugging Face, copy the contents of the JSON file including the
|
| 1064 |
st.write("To download your JSON key...")
|
| 1065 |
blog_text_and_image(text="Open the navigation menu. Click on the hamburger menu (three horizontal lines) in the top left corner. Go to IAM & Admin. ",
|
| 1066 |
fullpath=os.path.join(st.session_state.dir_home, 'demo','google','google_api_7.PNG'),width=300)
|
|
@@ -1958,11 +2033,20 @@ def content_ocr_method():
|
|
| 1958 |
OCR_option_llava_bit = st.session_state.config['leafmachine']['project']['OCR_option_llava_bit']
|
| 1959 |
double_OCR = st.session_state.config['leafmachine']['project']['double_OCR']
|
| 1960 |
|
| 1961 |
-
# Map the OCR option to the index in options list
|
| 1962 |
-
# You need to define the mapping based on your application's logic
|
| 1963 |
default_index = 0 # Default to 0 if option not found
|
| 1964 |
default_index_llava = 0 # Default to 0 if option not found
|
| 1965 |
default_index_llava_bit = 0
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1966 |
with c1:
|
| 1967 |
st.subheader("API Methods (Google Vision)")
|
| 1968 |
st.write("Using APIs for OCR allows VoucherVision to run on most computers. You can use multiple OCR engines simultaneously.")
|
|
@@ -1999,7 +2083,7 @@ def content_ocr_method():
|
|
| 1999 |
|
| 2000 |
# Map selected options to their corresponding internal representations
|
| 2001 |
selected_OCR_options = [OCR_options[option] for option in OCR_option_select]
|
| 2002 |
-
|
| 2003 |
# Assuming you need to use these mapped values elsewhere in your application
|
| 2004 |
st.session_state.config['leafmachine']['project']['OCR_option'] = selected_OCR_options
|
| 2005 |
|
|
@@ -2043,7 +2127,7 @@ def content_ocr_method():
|
|
| 2043 |
st.session_state.config['leafmachine']['project']['OCR_GPT_4o_mini_resolution'] = st.radio(
|
| 2044 |
"Select level of detail for :violet[GPT-4o-mini] OCR. We only recommend 'high' detail in most scenarios.",
|
| 2045 |
["high", "low", ],
|
| 2046 |
-
captions=["$0.50 per 1,000", "
|
| 2047 |
|
| 2048 |
|
| 2049 |
if 'LLaVA' in selected_OCR_options:
|
|
|
|
| 254 |
|
| 255 |
|
| 256 |
|
|
|
|
| 257 |
def handle_image_upload_and_gallery_hf(uploaded_files):
|
| 258 |
SAFE = SafetyCheck(st.session_state['is_hf'])
|
| 259 |
if uploaded_files:
|
|
|
|
| 270 |
st.error("Warning: You uploaded an image that violates our terms of service.")
|
| 271 |
return True
|
| 272 |
|
| 273 |
+
# Save the uploaded file (PDF or image)
|
| 274 |
+
file_path = save_uploaded_file(st.session_state['dir_uploaded_images'], uploaded_file)
|
| 275 |
+
|
| 276 |
+
if not file_path:
|
| 277 |
+
st.error(f"Failed to process the file: {uploaded_file.name}")
|
| 278 |
+
continue # Skip to the next file
|
| 279 |
|
| 280 |
# Determine the file type
|
| 281 |
if uploaded_file.name.lower().endswith('.pdf'):
|
| 282 |
+
try:
|
| 283 |
+
# Convert each page of the PDF to an image
|
| 284 |
+
n_pages = convert_pdf_to_jpg(file_path, st.session_state['dir_uploaded_images'], dpi=200)
|
| 285 |
+
if n_pages == 0:
|
| 286 |
+
st.error(f"No pages were converted from the PDF: {uploaded_file.name}")
|
| 287 |
+
continue # Skip to the next file
|
| 288 |
+
|
| 289 |
+
# Update the input list for each page image
|
| 290 |
+
converted_files = os.listdir(st.session_state['dir_uploaded_images'])
|
| 291 |
+
for file_name in converted_files:
|
| 292 |
+
if file_name.split('.')[1].lower() in ['jpg', 'jpeg']:
|
| 293 |
+
ind_small += 1
|
| 294 |
+
jpg_file_path = os.path.join(st.session_state['dir_uploaded_images'], file_name)
|
| 295 |
+
st.session_state['input_list'].append(jpg_file_path)
|
| 296 |
+
|
| 297 |
+
if ind_small < MAX_GALLERY_IMAGES + 5:
|
| 298 |
+
# Create a thumbnail for the gallery
|
| 299 |
+
img = Image.open(jpg_file_path)
|
| 300 |
+
img.thumbnail((GALLERY_IMAGE_SIZE, GALLERY_IMAGE_SIZE), Image.Resampling.LANCZOS)
|
| 301 |
+
file_path_small = save_uploaded_file(st.session_state['dir_uploaded_images_small'], jpg_file_path, img)
|
| 302 |
+
st.session_state['input_list_small'].append(file_path_small)
|
| 303 |
+
|
| 304 |
+
except Exception as e:
|
| 305 |
+
st.error(f"Failed to process PDF file {uploaded_file.name}. Error: {e}")
|
| 306 |
+
continue # Skip to the next file
|
| 307 |
+
|
| 308 |
else:
|
|
|
|
| 309 |
# Handle JPG/JPEG files (existing process)
|
| 310 |
+
ind_small += 1
|
| 311 |
st.session_state['input_list'].append(file_path)
|
| 312 |
+
if ind_small < MAX_GALLERY_IMAGES + 5:
|
| 313 |
img = Image.open(file_path)
|
| 314 |
img.thumbnail((GALLERY_IMAGE_SIZE, GALLERY_IMAGE_SIZE), Image.Resampling.LANCZOS)
|
| 315 |
file_path_small = save_uploaded_file(st.session_state['dir_uploaded_images_small'], uploaded_file, img)
|
|
|
|
| 321 |
|
| 322 |
if st.session_state['input_list_small']:
|
| 323 |
if len(st.session_state['input_list_small']) > MAX_GALLERY_IMAGES:
|
|
|
|
| 324 |
images_to_display = st.session_state['input_list_small'][:MAX_GALLERY_IMAGES]
|
| 325 |
else:
|
|
|
|
| 326 |
images_to_display = st.session_state['input_list_small']
|
| 327 |
show_gallery_small_hf(images_to_display)
|
| 328 |
|
| 329 |
return False
|
| 330 |
|
| 331 |
+
# def handle_image_upload_and_gallery_hf(uploaded_files): # not working with pdfs
|
| 332 |
+
# SAFE = SafetyCheck(st.session_state['is_hf'])
|
| 333 |
+
# if uploaded_files:
|
| 334 |
+
|
| 335 |
+
# # Clear input image gallery and input list
|
| 336 |
+
# clear_image_uploads()
|
| 337 |
+
|
| 338 |
+
# ind_small = 0
|
| 339 |
+
# for uploaded_file in uploaded_files:
|
| 340 |
+
|
| 341 |
+
# if SAFE.check_for_inappropriate_content(uploaded_file):
|
| 342 |
+
# clear_image_uploads()
|
| 343 |
+
# report_violation(uploaded_file.name, is_hf=st.session_state['is_hf'])
|
| 344 |
+
# st.error("Warning: You uploaded an image that violates our terms of service.")
|
| 345 |
+
# return True
|
| 346 |
+
|
| 347 |
+
|
| 348 |
+
# # Determine the file type
|
| 349 |
+
# if uploaded_file.name.lower().endswith('.pdf'):
|
| 350 |
+
# # Handle PDF files
|
| 351 |
+
# file_path = save_uploaded_file(st.session_state['dir_uploaded_images'], uploaded_file)
|
| 352 |
+
# # Convert each page of the PDF to an image
|
| 353 |
+
# n_pages = convert_pdf_to_jpg(file_path, st.session_state['dir_uploaded_images'], dpi=200)#st.session_state.config['leafmachine']['project']['dir_images_local'])
|
| 354 |
+
# # Update the input list for each page image
|
| 355 |
+
# converted_files = os.listdir(st.session_state['dir_uploaded_images'])
|
| 356 |
+
# for file_name in converted_files:
|
| 357 |
+
# if file_name.split('.')[1].lower() in ['jpg','jpeg']:
|
| 358 |
+
# ind_small += 1
|
| 359 |
+
# jpg_file_path = os.path.join(st.session_state['dir_uploaded_images'], file_name)
|
| 360 |
+
# st.session_state['input_list'].append(jpg_file_path)
|
| 361 |
+
|
| 362 |
+
# if ind_small < MAX_GALLERY_IMAGES +5:
|
| 363 |
+
# # Optionally, create a thumbnail for the gallery
|
| 364 |
+
# img = Image.open(jpg_file_path)
|
| 365 |
+
# img.thumbnail((GALLERY_IMAGE_SIZE, GALLERY_IMAGE_SIZE), Image.Resampling.LANCZOS)
|
| 366 |
+
# try:
|
| 367 |
+
# file_path_small = save_uploaded_file(st.session_state['dir_uploaded_images_small'], file_name, img)
|
| 368 |
+
# except:
|
| 369 |
+
# file_path_small = save_uploaded_file_local(st.session_state['dir_uploaded_images_small'],st.session_state['dir_uploaded_images_small'], file_name, img)
|
| 370 |
+
# st.session_state['input_list_small'].append(file_path_small)
|
| 371 |
+
|
| 372 |
+
# else:
|
| 373 |
+
# ind_small += 1
|
| 374 |
+
# # Handle JPG/JPEG files (existing process)
|
| 375 |
+
# file_path = save_uploaded_file(st.session_state['dir_uploaded_images'], uploaded_file)
|
| 376 |
+
# st.session_state['input_list'].append(file_path)
|
| 377 |
+
# if ind_small < MAX_GALLERY_IMAGES +5:
|
| 378 |
+
# img = Image.open(file_path)
|
| 379 |
+
# img.thumbnail((GALLERY_IMAGE_SIZE, GALLERY_IMAGE_SIZE), Image.Resampling.LANCZOS)
|
| 380 |
+
# file_path_small = save_uploaded_file(st.session_state['dir_uploaded_images_small'], uploaded_file, img)
|
| 381 |
+
# st.session_state['input_list_small'].append(file_path_small)
|
| 382 |
+
|
| 383 |
+
# # After processing all files
|
| 384 |
+
# st.session_state.config['leafmachine']['project']['dir_images_local'] = st.session_state['dir_uploaded_images']
|
| 385 |
+
# st.info(f"Processing images from {st.session_state.config['leafmachine']['project']['dir_images_local']}")
|
| 386 |
+
|
| 387 |
+
# if st.session_state['input_list_small']:
|
| 388 |
+
# if len(st.session_state['input_list_small']) > MAX_GALLERY_IMAGES:
|
| 389 |
+
# # Only take the first 100 images from the list
|
| 390 |
+
# images_to_display = st.session_state['input_list_small'][:MAX_GALLERY_IMAGES]
|
| 391 |
+
# else:
|
| 392 |
+
# # If there are less than 100 images, take them all
|
| 393 |
+
# images_to_display = st.session_state['input_list_small']
|
| 394 |
+
# show_gallery_small_hf(images_to_display)
|
| 395 |
+
|
| 396 |
+
# return False
|
| 397 |
+
|
| 398 |
|
| 399 |
def handle_image_upload_and_gallery():
|
| 400 |
|
|
|
|
| 444 |
|
| 445 |
|
| 446 |
def content_input_images(col_left, col_right):
|
| 447 |
+
|
| 448 |
st.write('---')
|
| 449 |
# col1, col2 = st.columns([2,8])
|
| 450 |
with col_left:
|
|
|
|
| 459 |
pass
|
| 460 |
|
| 461 |
with col_left:
|
| 462 |
+
# if st.session_state.is_hf:
|
| 463 |
+
st.session_state['dir_uploaded_images'] = os.path.join(st.session_state.dir_home,'uploads')
|
| 464 |
+
st.session_state['dir_uploaded_images_small'] = os.path.join(st.session_state.dir_home,'uploads_small')
|
| 465 |
+
uploaded_files = st.file_uploader("Upload Images", type=['jpg', 'jpeg','pdf'], accept_multiple_files=True, key=st.session_state['uploader_idk'])
|
| 466 |
+
st.button("Use Test Image",help="This will clear any uploaded images and load the 1 provided test image.",on_click=use_test_image)
|
| 467 |
|
| 468 |
with col_right:
|
| 469 |
if st.session_state.is_hf:
|
|
|
|
| 1081 |
|
| 1082 |
cfg_private['open_cage_geocode'] = {}
|
| 1083 |
cfg_private['open_cage_geocode']['API_KEY'] =''
|
| 1084 |
+
|
| 1085 |
+
cfg_private['huggingface'] = {}
|
| 1086 |
|
| 1087 |
with col_private:
|
| 1088 |
st.header("Set API keys")
|
|
|
|
| 1135 |
fullpath=os.path.join(st.session_state.dir_home, 'demo','google','google_api_5.PNG'))
|
| 1136 |
|
| 1137 |
st.subheader("Getting a Google JSON authentication key")
|
| 1138 |
+
st.write(f"Google uses a JSON file to store additional authentication information. Save this file in a safe, private location and assign the `GOOGLE_APPLICATION_CREDENTIALS` value to the file path. For Hugging Face, copy the contents of the JSON file including the curly brackets and paste it as the secret value.")
|
| 1139 |
st.write("To download your JSON key...")
|
| 1140 |
blog_text_and_image(text="Open the navigation menu. Click on the hamburger menu (three horizontal lines) in the top left corner. Go to IAM & Admin. ",
|
| 1141 |
fullpath=os.path.join(st.session_state.dir_home, 'demo','google','google_api_7.PNG'),width=300)
|
|
|
|
| 2033 |
OCR_option_llava_bit = st.session_state.config['leafmachine']['project']['OCR_option_llava_bit']
|
| 2034 |
double_OCR = st.session_state.config['leafmachine']['project']['double_OCR']
|
| 2035 |
|
|
|
|
|
|
|
| 2036 |
default_index = 0 # Default to 0 if option not found
|
| 2037 |
default_index_llava = 0 # Default to 0 if option not found
|
| 2038 |
default_index_llava_bit = 0
|
| 2039 |
+
|
| 2040 |
+
# Map the OCR option to the index in options list
|
| 2041 |
+
# You need to define the mapping for multiple OCR options
|
| 2042 |
+
# based on your application's logic
|
| 2043 |
+
if len(OCR_option) == 1:
|
| 2044 |
+
OCR_option = OCR_option[0]
|
| 2045 |
+
try:
|
| 2046 |
+
default_index = options.index(OCR_option)
|
| 2047 |
+
except ValueError:
|
| 2048 |
+
pass
|
| 2049 |
+
|
| 2050 |
with c1:
|
| 2051 |
st.subheader("API Methods (Google Vision)")
|
| 2052 |
st.write("Using APIs for OCR allows VoucherVision to run on most computers. You can use multiple OCR engines simultaneously.")
|
|
|
|
| 2083 |
|
| 2084 |
# Map selected options to their corresponding internal representations
|
| 2085 |
selected_OCR_options = [OCR_options[option] for option in OCR_option_select]
|
| 2086 |
+
print('Selected OCR options:',selected_OCR_options)
|
| 2087 |
# Assuming you need to use these mapped values elsewhere in your application
|
| 2088 |
st.session_state.config['leafmachine']['project']['OCR_option'] = selected_OCR_options
|
| 2089 |
|
|
|
|
| 2127 |
st.session_state.config['leafmachine']['project']['OCR_GPT_4o_mini_resolution'] = st.radio(
|
| 2128 |
"Select level of detail for :violet[GPT-4o-mini] OCR. We only recommend 'high' detail in most scenarios.",
|
| 2129 |
["high", "low", ],
|
| 2130 |
+
captions=[f"$0.50 per 1,000", f"$5 - $10 per 1,000"])
|
| 2131 |
|
| 2132 |
|
| 2133 |
if 'LLaVA' in selected_OCR_options:
|
vouchervision/LLM_GoogleGemini.py
CHANGED
|
@@ -101,7 +101,10 @@ class GoogleGeminiHandler:
|
|
| 101 |
# top_p=self.config.get('top_p'))
|
| 102 |
|
| 103 |
# Set up the retry parser with the runnable
|
| 104 |
-
self.retry_parser = RetryWithErrorOutputParser.from_llm(
|
|
|
|
|
|
|
|
|
|
| 105 |
# Prepare the chain
|
| 106 |
self.chain = self.prompt | self.call_google_gemini
|
| 107 |
|
|
|
|
| 101 |
# top_p=self.config.get('top_p'))
|
| 102 |
|
| 103 |
# Set up the retry parser with the runnable
|
| 104 |
+
self.retry_parser = RetryWithErrorOutputParser.from_llm(
|
| 105 |
+
parser=self.parser,
|
| 106 |
+
llm=self.llm_model,
|
| 107 |
+
max_retries=self.MAX_RETRIES)
|
| 108 |
# Prepare the chain
|
| 109 |
self.chain = self.prompt | self.call_google_gemini
|
| 110 |
|
vouchervision/LLM_GooglePalm2.py
CHANGED
|
@@ -1,17 +1,17 @@
|
|
| 1 |
import os, time, json, typing
|
|
|
|
| 2 |
# import vertexai
|
| 3 |
from vertexai.language_models import TextGenerationModel
|
| 4 |
from vertexai.generative_models._generative_models import HarmCategory, HarmBlockThreshold
|
| 5 |
from vertexai.language_models import TextGenerationModel
|
| 6 |
# from vertexai.preview.generative_models import GenerativeModel
|
| 7 |
-
from langchain.output_parsers import RetryWithErrorOutputParser
|
| 8 |
# from langchain.schema import HumanMessage
|
| 9 |
from langchain.prompts import PromptTemplate
|
| 10 |
from langchain_core.output_parsers import JsonOutputParser
|
| 11 |
# from langchain_google_genai import ChatGoogleGenerativeAI
|
| 12 |
from langchain_google_vertexai import VertexAI
|
| 13 |
from langchain_core.messages import BaseMessage, HumanMessage
|
| 14 |
-
from langchain_core.prompt_values import PromptValue as BasePromptValue
|
| 15 |
|
| 16 |
from vouchervision.utils_LLM import SystemLoadMonitor, run_tools, count_tokens, save_individual_prompt, sanitize_prompt
|
| 17 |
from vouchervision.utils_LLM_JSON_validation import validate_and_align_JSON_keys_with_template
|
|
@@ -25,6 +25,18 @@ from vouchervision.utils_LLM_JSON_validation import validate_and_align_JSON_keys
|
|
| 25 |
# gcloud config set project XXXXXXXXX
|
| 26 |
# https://cloud.google.com/docs/authentication
|
| 27 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
class GooglePalm2Handler:
|
| 29 |
|
| 30 |
RETRY_DELAY = 10 # Wait 10 seconds before retrying
|
|
@@ -45,8 +57,6 @@ class GooglePalm2Handler:
|
|
| 45 |
|
| 46 |
self.config_vals_for_permutation = config_vals_for_permutation
|
| 47 |
|
| 48 |
-
|
| 49 |
-
|
| 50 |
self.monitor = SystemLoadMonitor(logger)
|
| 51 |
|
| 52 |
self.parser = JsonOutputParser()
|
|
@@ -104,19 +114,35 @@ class GooglePalm2Handler:
|
|
| 104 |
self.adjust_temp = self.starting_temp
|
| 105 |
self.config['temperature'] = self.starting_temp
|
| 106 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
def _build_model_chain_parser(self):
|
| 108 |
# Instantiate the parser and the retry parser
|
| 109 |
-
# self.llm_model = ChatGoogleGenerativeAI(model=self.model_name)
|
| 110 |
self.llm_model = VertexAI(model=self.model_name,
|
| 111 |
max_output_tokens=self.config.get('max_output_tokens'),
|
| 112 |
temperature=self.config.get('temperature'),
|
| 113 |
top_k=self.config.get('top_k'),
|
| 114 |
top_p=self.config.get('top_p'))
|
| 115 |
-
|
| 116 |
self.retry_parser = RetryWithErrorOutputParser.from_llm(
|
| 117 |
-
|
| 118 |
-
|
| 119 |
-
|
|
|
|
|
|
|
| 120 |
# Prepare the chain
|
| 121 |
self.chain = self.prompt | self.call_google_palm2
|
| 122 |
|
|
@@ -148,22 +174,27 @@ class GooglePalm2Handler:
|
|
| 148 |
while ind < self.MAX_RETRIES:
|
| 149 |
ind += 1
|
| 150 |
try:
|
| 151 |
-
|
| 152 |
# Invoke the chain to generate prompt text
|
| 153 |
-
response = self.chain.invoke({"query": prompt_template
|
| 154 |
-
|
| 155 |
-
#
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
|
| 168 |
|
| 169 |
if output is None:
|
|
@@ -215,8 +246,3 @@ class GooglePalm2Handler:
|
|
| 215 |
self.json_report.set_text(text_main=f'LLM call failed')
|
| 216 |
return None, nt_in, nt_out, None, None, usage_report
|
| 217 |
|
| 218 |
-
class PromptValue(BasePromptValue):
|
| 219 |
-
prompt_str: str
|
| 220 |
-
|
| 221 |
-
def to_string(self) -> str:
|
| 222 |
-
return self.prompt_str
|
|
|
|
| 1 |
import os, time, json, typing
|
| 2 |
+
from dataclasses import dataclass
|
| 3 |
# import vertexai
|
| 4 |
from vertexai.language_models import TextGenerationModel
|
| 5 |
from vertexai.generative_models._generative_models import HarmCategory, HarmBlockThreshold
|
| 6 |
from vertexai.language_models import TextGenerationModel
|
| 7 |
# from vertexai.preview.generative_models import GenerativeModel
|
| 8 |
+
from langchain.output_parsers.retry import RetryWithErrorOutputParser
|
| 9 |
# from langchain.schema import HumanMessage
|
| 10 |
from langchain.prompts import PromptTemplate
|
| 11 |
from langchain_core.output_parsers import JsonOutputParser
|
| 12 |
# from langchain_google_genai import ChatGoogleGenerativeAI
|
| 13 |
from langchain_google_vertexai import VertexAI
|
| 14 |
from langchain_core.messages import BaseMessage, HumanMessage
|
|
|
|
| 15 |
|
| 16 |
from vouchervision.utils_LLM import SystemLoadMonitor, run_tools, count_tokens, save_individual_prompt, sanitize_prompt
|
| 17 |
from vouchervision.utils_LLM_JSON_validation import validate_and_align_JSON_keys_with_template
|
|
|
|
| 25 |
# gcloud config set project XXXXXXXXX
|
| 26 |
# https://cloud.google.com/docs/authentication
|
| 27 |
|
| 28 |
+
from pydantic import BaseModel
|
| 29 |
+
from langchain_core.prompt_values import PromptValue as BasePromptValue
|
| 30 |
+
|
| 31 |
+
class PromptValueWrapper(BaseModel):
|
| 32 |
+
prompt_str: str
|
| 33 |
+
|
| 34 |
+
def to_string(self) -> str:
|
| 35 |
+
return self.prompt_str
|
| 36 |
+
|
| 37 |
+
def to_messages(self):
|
| 38 |
+
return [HumanMessage(content=self.prompt_str)]
|
| 39 |
+
|
| 40 |
class GooglePalm2Handler:
|
| 41 |
|
| 42 |
RETRY_DELAY = 10 # Wait 10 seconds before retrying
|
|
|
|
| 57 |
|
| 58 |
self.config_vals_for_permutation = config_vals_for_permutation
|
| 59 |
|
|
|
|
|
|
|
| 60 |
self.monitor = SystemLoadMonitor(logger)
|
| 61 |
|
| 62 |
self.parser = JsonOutputParser()
|
|
|
|
| 114 |
self.adjust_temp = self.starting_temp
|
| 115 |
self.config['temperature'] = self.starting_temp
|
| 116 |
|
| 117 |
+
# def _build_model_chain_parser(self):
|
| 118 |
+
# # Instantiate the parser and the retry parser
|
| 119 |
+
# # self.llm_model = ChatGoogleGenerativeAI(model=self.model_name)
|
| 120 |
+
# self.llm_model = VertexAI(model=self.model_name,
|
| 121 |
+
# max_output_tokens=self.config.get('max_output_tokens'),
|
| 122 |
+
# temperature=self.config.get('temperature'),
|
| 123 |
+
# top_k=self.config.get('top_k'),
|
| 124 |
+
# top_p=self.config.get('top_p'))
|
| 125 |
+
|
| 126 |
+
# self.retry_parser = RetryWithErrorOutputParser.from_llm(
|
| 127 |
+
# parser=self.parser,
|
| 128 |
+
# llm=self.llm_model,
|
| 129 |
+
# max_retries=self.MAX_RETRIES)
|
| 130 |
+
# # Prepare the chain
|
| 131 |
+
# self.chain = self.prompt | self.call_google_palm2
|
| 132 |
def _build_model_chain_parser(self):
|
| 133 |
# Instantiate the parser and the retry parser
|
|
|
|
| 134 |
self.llm_model = VertexAI(model=self.model_name,
|
| 135 |
max_output_tokens=self.config.get('max_output_tokens'),
|
| 136 |
temperature=self.config.get('temperature'),
|
| 137 |
top_k=self.config.get('top_k'),
|
| 138 |
top_p=self.config.get('top_p'))
|
| 139 |
+
|
| 140 |
self.retry_parser = RetryWithErrorOutputParser.from_llm(
|
| 141 |
+
llm=self.llm_model,
|
| 142 |
+
parser=self.parser,
|
| 143 |
+
max_retries=self.MAX_RETRIES
|
| 144 |
+
)
|
| 145 |
+
|
| 146 |
# Prepare the chain
|
| 147 |
self.chain = self.prompt | self.call_google_palm2
|
| 148 |
|
|
|
|
| 174 |
while ind < self.MAX_RETRIES:
|
| 175 |
ind += 1
|
| 176 |
try:
|
| 177 |
+
model_kwargs = {"temperature": self.adjust_temp}
|
| 178 |
# Invoke the chain to generate prompt text
|
| 179 |
+
response = self.chain.invoke({"query": prompt_template, "model_kwargs": model_kwargs})
|
| 180 |
+
|
| 181 |
+
# Clean up the response by removing any Markdown formatting
|
| 182 |
+
response_text = response.strip('```JSON\n').strip('\n```')
|
| 183 |
+
|
| 184 |
+
output = json.loads(response_text)
|
| 185 |
+
|
| 186 |
+
# # Use retry_parser to parse the response with retry logic
|
| 187 |
+
# try:
|
| 188 |
+
# output = self.retry_parser.parse_with_prompt(response, prompt_value=PromptValue(prompt_template))
|
| 189 |
+
# except:
|
| 190 |
+
# try:
|
| 191 |
+
# output = self.retry_parser.parse_with_prompt(response, prompt_value=prompt_template)
|
| 192 |
+
# except:
|
| 193 |
+
# try:
|
| 194 |
+
# output = json.loads(response)
|
| 195 |
+
# except Exception as e:
|
| 196 |
+
# print(e)
|
| 197 |
+
# output = None
|
| 198 |
|
| 199 |
|
| 200 |
if output is None:
|
|
|
|
| 246 |
self.json_report.set_text(text_main=f'LLM call failed')
|
| 247 |
return None, nt_in, nt_out, None, None, usage_report
|
| 248 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vouchervision/OCR_GPT4oMini.py
CHANGED
|
@@ -74,7 +74,7 @@ def main():
|
|
| 74 |
img_path = 'D:/D_Desktop/BR_1839468565_Ochnaceae_Campylospermum_reticulatum_label.jpg'
|
| 75 |
|
| 76 |
# $env:OPENAI_API_KEY="KEY"
|
| 77 |
-
API_KEY = "
|
| 78 |
|
| 79 |
|
| 80 |
ocr = GPT4oMiniOCR(API_KEY)
|
|
|
|
| 74 |
img_path = 'D:/D_Desktop/BR_1839468565_Ochnaceae_Campylospermum_reticulatum_label.jpg'
|
| 75 |
|
| 76 |
# $env:OPENAI_API_KEY="KEY"
|
| 77 |
+
API_KEY = ""
|
| 78 |
|
| 79 |
|
| 80 |
ocr = GPT4oMiniOCR(API_KEY)
|
vouchervision/OCR_google_cloud_vision.py
CHANGED
|
@@ -99,12 +99,14 @@ class OCREngine:
|
|
| 99 |
|
| 100 |
|
| 101 |
def set_client(self):
|
| 102 |
-
if
|
| 103 |
-
|
| 104 |
-
|
| 105 |
-
|
| 106 |
-
|
| 107 |
-
|
|
|
|
|
|
|
| 108 |
|
| 109 |
|
| 110 |
def get_google_credentials(self):
|
|
|
|
| 99 |
|
| 100 |
|
| 101 |
def set_client(self):
|
| 102 |
+
# Only init Google Vision if it is needed
|
| 103 |
+
if 'hand' in self.OCR_option or 'normal' in self.OCR_option:
|
| 104 |
+
if self.is_hf:
|
| 105 |
+
self.client_beta = vision_beta.ImageAnnotatorClient(credentials=self.get_google_credentials())
|
| 106 |
+
self.client = vision.ImageAnnotatorClient(credentials=self.get_google_credentials())
|
| 107 |
+
else:
|
| 108 |
+
self.client_beta = vision_beta.ImageAnnotatorClient(credentials=self.get_google_credentials())
|
| 109 |
+
self.client = vision.ImageAnnotatorClient(credentials=self.get_google_credentials())
|
| 110 |
|
| 111 |
|
| 112 |
def get_google_credentials(self):
|
vouchervision/model_maps.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
class ModelMaps:
|
| 2 |
-
PROMPTS_THAT_NEED_DOMAIN_KNOWLEDGE = [
|
| 3 |
COLORS_EXPENSE_REPORT = {
|
| 4 |
'GPT_4': '#32CD32', # Lime Green
|
| 5 |
'GPT_3_5': '#008000', # Green
|
|
@@ -41,49 +41,49 @@ class ModelMaps:
|
|
| 41 |
}
|
| 42 |
|
| 43 |
MODELS_OPENAI = [
|
| 44 |
-
|
| 45 |
-
|
| 46 |
-
|
| 47 |
-
|
| 48 |
-
|
| 49 |
-
|
| 50 |
-
|
| 51 |
-
|
| 52 |
-
|
| 53 |
]
|
| 54 |
|
| 55 |
|
| 56 |
MODELS_OPENAI_AZURE = [
|
| 57 |
-
|
| 58 |
-
#
|
| 59 |
-
#
|
| 60 |
-
#
|
| 61 |
-
#
|
| 62 |
-
#
|
| 63 |
]
|
| 64 |
|
| 65 |
MODELS_GOOGLE = [
|
| 66 |
-
#
|
| 67 |
-
|
| 68 |
-
|
| 69 |
-
|
| 70 |
-
|
| 71 |
-
|
| 72 |
]
|
| 73 |
|
| 74 |
-
MODELS_MISTRAL = [
|
| 75 |
-
|
| 76 |
-
|
| 77 |
-
|
| 78 |
-
|
| 79 |
]
|
| 80 |
|
| 81 |
-
MODELS_LOCAL = [
|
| 82 |
-
|
| 83 |
-
|
| 84 |
'phyloforfun/mistral-7b-instruct-v2-bnb-4bit__HLT_MICH_Angiospermae_SLTPvC_v1-0_medium_OCR-C25-L25-E50-R05']
|
| 85 |
|
| 86 |
-
MODELS_GUI_DEFAULT =
|
| 87 |
|
| 88 |
MODEL_FAMILY = {
|
| 89 |
'OpenAI': MODELS_OPENAI,
|
|
@@ -95,9 +95,9 @@ class ModelMaps:
|
|
| 95 |
version_mapping_cost = {
|
| 96 |
'GPT 4 32k': 'GPT_4_32K',
|
| 97 |
'GPT 4': 'GPT_4',
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
'GPT 4 Turbo 0125-preview': 'GPT_4_TURBO_0125',
|
| 102 |
'GPT 4 Turbo 1106-preview': 'GPT_4_TURBO_1106',
|
| 103 |
'GPT 3.5 Instruct': 'GPT_3_5_INSTRUCT',
|
|
@@ -110,7 +110,7 @@ class ModelMaps:
|
|
| 110 |
# 'Azure GPT 3.5 Instruct': 'AZURE_GPT_3_5_INSTRUCT',
|
| 111 |
# 'Azure GPT 3.5 Turbo': 'AZURE_GPT_3_5',
|
| 112 |
|
| 113 |
-
'Gemini 1.0 Pro
|
| 114 |
'Gemini 1.5 Flash': 'GEMINI_1_5_FLASH', # gemini-1.5-flash
|
| 115 |
'Gemini 1.5 Pro': 'GEMINI_1_5_PRO', # gemini-1.5-pro
|
| 116 |
|
|
@@ -136,12 +136,12 @@ class ModelMaps:
|
|
| 136 |
def get_version_has_key(cls, key, has_key_openai, has_key_azure_openai, has_key_google_application_credentials, has_key_mistral):
|
| 137 |
# Define the mapping for 'has_key' values
|
| 138 |
version_has_key = {
|
| 139 |
-
|
| 140 |
'GPT 4 Turbo 1106-preview': has_key_openai,
|
| 141 |
'GPT 4 Turbo 0125-preview': has_key_openai,
|
| 142 |
'GPT 4': has_key_openai,
|
| 143 |
-
|
| 144 |
-
|
| 145 |
'GPT 4 32k': has_key_openai,
|
| 146 |
'GPT 3.5 Turbo': has_key_openai,
|
| 147 |
'GPT 3.5 Instruct': has_key_openai,
|
|
@@ -156,9 +156,9 @@ class ModelMaps:
|
|
| 156 |
# 'PaLM 2 text-bison@001': has_key_google_application_credentials,
|
| 157 |
'PaLM 2 text-bison@002': has_key_google_application_credentials,
|
| 158 |
'PaLM 2 text-unicorn@001': has_key_google_application_credentials,
|
| 159 |
-
'Gemini 1.0 Pro
|
| 160 |
'Gemini 1.5 Flash': has_key_google_application_credentials,
|
| 161 |
-
'Gemini 1.5 Pro
|
| 162 |
|
| 163 |
'Mistral Small': has_key_mistral,
|
| 164 |
'Mistral Medium': has_key_mistral,
|
|
@@ -178,11 +178,11 @@ class ModelMaps:
|
|
| 178 |
@classmethod
|
| 179 |
def get_version_mapping_is_azure(cls, key):
|
| 180 |
version_mapping_is_azure = {
|
| 181 |
-
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
'GPT 4': False,
|
| 187 |
'GPT 4 32k': False,
|
| 188 |
'GPT 3.5 Turbo': False,
|
|
@@ -198,9 +198,9 @@ class ModelMaps:
|
|
| 198 |
# 'PaLM 2 text-bison@001': False,
|
| 199 |
'PaLM 2 text-bison@002': False,
|
| 200 |
'PaLM 2 text-unicorn@001': False,
|
| 201 |
-
'Gemini 1.0 Pro
|
| 202 |
'Gemini 1.5 Flash': False,
|
| 203 |
-
'Gemini 1.5 Pro
|
| 204 |
|
| 205 |
'Mistral Small': False,
|
| 206 |
'Mistral Medium': False,
|
|
@@ -256,39 +256,39 @@ class ModelMaps:
|
|
| 256 |
# return 'gpt-35-turbo-instruct'
|
| 257 |
|
| 258 |
elif key == 'AZURE_GPT_4':
|
| 259 |
-
return
|
| 260 |
|
| 261 |
# elif key == 'AZURE_GPT_4_TURBO_1106':
|
| 262 |
-
# return
|
| 263 |
|
| 264 |
# elif key == 'AZURE_GPT_4_TURBO_0125':
|
| 265 |
# return 'gpt-4-0125-preview'
|
| 266 |
|
| 267 |
# elif key == 'AZURE_GPT_4_32K':
|
| 268 |
-
# return
|
| 269 |
|
| 270 |
### Google
|
| 271 |
# elif key == 'PALM2_TB_1':
|
| 272 |
-
# return
|
| 273 |
|
| 274 |
elif key == 'PALM2_TB_2':
|
| 275 |
-
return
|
| 276 |
|
| 277 |
elif key == 'PALM2_TU_1':
|
| 278 |
-
return
|
| 279 |
|
| 280 |
elif key == 'GEMINI_PRO':
|
| 281 |
-
return
|
| 282 |
|
| 283 |
elif key == 'GEMINI_1_5_FLASH':
|
| 284 |
-
return
|
| 285 |
|
| 286 |
elif key == 'GEMINI_1_5_PRO':
|
| 287 |
-
return
|
| 288 |
|
| 289 |
### Mistral
|
| 290 |
elif key == 'OPEN_MISTRAL_7B':
|
| 291 |
-
return
|
| 292 |
|
| 293 |
elif key == 'OPEN_MIXTRAL_8X7B':
|
| 294 |
return 'open-mixtral-8x7b'
|
|
@@ -323,7 +323,7 @@ class ModelMaps:
|
|
| 323 |
|
| 324 |
|
| 325 |
else:
|
| 326 |
-
raise ValueError(f
|
| 327 |
|
| 328 |
@classmethod
|
| 329 |
def get_models_gui_list(cls):
|
|
|
|
| 1 |
class ModelMaps:
|
| 2 |
+
PROMPTS_THAT_NEED_DOMAIN_KNOWLEDGE = ['Version 1', 'Version 1 PaLM 2']
|
| 3 |
COLORS_EXPENSE_REPORT = {
|
| 4 |
'GPT_4': '#32CD32', # Lime Green
|
| 5 |
'GPT_3_5': '#008000', # Green
|
|
|
|
| 41 |
}
|
| 42 |
|
| 43 |
MODELS_OPENAI = [
|
| 44 |
+
'GPT 4o 2024-05-13', #GPT_4o_2024_05_13
|
| 45 |
+
'GPT 4o mini 2024-07-18',
|
| 46 |
+
'GPT 4 Turbo 2024-04-09',#GPT_4_TURBO_2024_04_09
|
| 47 |
+
'GPT 4',
|
| 48 |
+
'GPT 4 32k',
|
| 49 |
+
'GPT 4 Turbo 0125-preview',
|
| 50 |
+
'GPT 4 Turbo 1106-preview',
|
| 51 |
+
'GPT 3.5 Turbo',
|
| 52 |
+
'GPT 3.5 Instruct',
|
| 53 |
]
|
| 54 |
|
| 55 |
|
| 56 |
MODELS_OPENAI_AZURE = [
|
| 57 |
+
'Azure GPT 4',
|
| 58 |
+
# 'Azure GPT 4 32k',
|
| 59 |
+
# 'Azure GPT 4 Turbo 0125-preview',
|
| 60 |
+
# 'Azure GPT 4 Turbo 1106-preview',
|
| 61 |
+
# 'Azure GPT 3.5 Turbo',
|
| 62 |
+
# 'Azure GPT 3.5 Instruct',
|
| 63 |
]
|
| 64 |
|
| 65 |
MODELS_GOOGLE = [
|
| 66 |
+
# 'PaLM 2 text-bison@001',
|
| 67 |
+
'PaLM 2 text-bison@002',
|
| 68 |
+
'PaLM 2 text-unicorn@001',
|
| 69 |
+
'Gemini 1.0 Pro',
|
| 70 |
+
'Gemini 1.5 Flash',
|
| 71 |
+
'Gemini 1.5 Pro',
|
| 72 |
]
|
| 73 |
|
| 74 |
+
MODELS_MISTRAL = ['Mistral Small',
|
| 75 |
+
'Mistral Medium',
|
| 76 |
+
'Mistral Large',
|
| 77 |
+
'Open Mixtral 8x7B',
|
| 78 |
+
'Open Mistral 7B',
|
| 79 |
]
|
| 80 |
|
| 81 |
+
MODELS_LOCAL = ['LOCAL Mixtral 8x7B Instruct v0.1',
|
| 82 |
+
'LOCAL Mistral 7B Instruct v0.2',
|
| 83 |
+
'LOCAL CPU Mistral 7B Instruct v0.2 GGUF',
|
| 84 |
'phyloforfun/mistral-7b-instruct-v2-bnb-4bit__HLT_MICH_Angiospermae_SLTPvC_v1-0_medium_OCR-C25-L25-E50-R05']
|
| 85 |
|
| 86 |
+
MODELS_GUI_DEFAULT = 'Gemini 1.5 Flash' #'Azure GPT 4' # 'GPT 4 Turbo 1106-preview'
|
| 87 |
|
| 88 |
MODEL_FAMILY = {
|
| 89 |
'OpenAI': MODELS_OPENAI,
|
|
|
|
| 95 |
version_mapping_cost = {
|
| 96 |
'GPT 4 32k': 'GPT_4_32K',
|
| 97 |
'GPT 4': 'GPT_4',
|
| 98 |
+
'GPT 4o 2024-05-13': 'GPT_4o_2024_05_13',
|
| 99 |
+
'GPT 4o mini 2024-07-18': 'GPT_4o_mini_2024_07_18',
|
| 100 |
+
'GPT 4 Turbo 2024-04-09': 'GPT_4_TURBO_2024_04_09',
|
| 101 |
'GPT 4 Turbo 0125-preview': 'GPT_4_TURBO_0125',
|
| 102 |
'GPT 4 Turbo 1106-preview': 'GPT_4_TURBO_1106',
|
| 103 |
'GPT 3.5 Instruct': 'GPT_3_5_INSTRUCT',
|
|
|
|
| 110 |
# 'Azure GPT 3.5 Instruct': 'AZURE_GPT_3_5_INSTRUCT',
|
| 111 |
# 'Azure GPT 3.5 Turbo': 'AZURE_GPT_3_5',
|
| 112 |
|
| 113 |
+
'Gemini 1.0 Pro': 'GEMINI_PRO',
|
| 114 |
'Gemini 1.5 Flash': 'GEMINI_1_5_FLASH', # gemini-1.5-flash
|
| 115 |
'Gemini 1.5 Pro': 'GEMINI_1_5_PRO', # gemini-1.5-pro
|
| 116 |
|
|
|
|
| 136 |
def get_version_has_key(cls, key, has_key_openai, has_key_azure_openai, has_key_google_application_credentials, has_key_mistral):
|
| 137 |
# Define the mapping for 'has_key' values
|
| 138 |
version_has_key = {
|
| 139 |
+
'GPT 4 Turbo 2024-04-09': has_key_openai,
|
| 140 |
'GPT 4 Turbo 1106-preview': has_key_openai,
|
| 141 |
'GPT 4 Turbo 0125-preview': has_key_openai,
|
| 142 |
'GPT 4': has_key_openai,
|
| 143 |
+
'GPT 4o 2024-05-13': has_key_openai,
|
| 144 |
+
'GPT 4o mini 2024-07-18': has_key_openai,
|
| 145 |
'GPT 4 32k': has_key_openai,
|
| 146 |
'GPT 3.5 Turbo': has_key_openai,
|
| 147 |
'GPT 3.5 Instruct': has_key_openai,
|
|
|
|
| 156 |
# 'PaLM 2 text-bison@001': has_key_google_application_credentials,
|
| 157 |
'PaLM 2 text-bison@002': has_key_google_application_credentials,
|
| 158 |
'PaLM 2 text-unicorn@001': has_key_google_application_credentials,
|
| 159 |
+
'Gemini 1.0 Pro': has_key_google_application_credentials,
|
| 160 |
'Gemini 1.5 Flash': has_key_google_application_credentials,
|
| 161 |
+
'Gemini 1.5 Pro': has_key_google_application_credentials,
|
| 162 |
|
| 163 |
'Mistral Small': has_key_mistral,
|
| 164 |
'Mistral Medium': has_key_mistral,
|
|
|
|
| 178 |
@classmethod
|
| 179 |
def get_version_mapping_is_azure(cls, key):
|
| 180 |
version_mapping_is_azure = {
|
| 181 |
+
'GPT 4o 2024-05-13': False,
|
| 182 |
+
'GPT 4o mini 2024-07-18': False,
|
| 183 |
+
'GPT 4 Turbo 2024-04-09': False,
|
| 184 |
+
'GPT 4 Turbo 1106-preview': False,
|
| 185 |
+
'GPT 4 Turbo 0125-preview': False,
|
| 186 |
'GPT 4': False,
|
| 187 |
'GPT 4 32k': False,
|
| 188 |
'GPT 3.5 Turbo': False,
|
|
|
|
| 198 |
# 'PaLM 2 text-bison@001': False,
|
| 199 |
'PaLM 2 text-bison@002': False,
|
| 200 |
'PaLM 2 text-unicorn@001': False,
|
| 201 |
+
'Gemini 1.0 Pro': False,
|
| 202 |
'Gemini 1.5 Flash': False,
|
| 203 |
+
'Gemini 1.5 Pro': False,
|
| 204 |
|
| 205 |
'Mistral Small': False,
|
| 206 |
'Mistral Medium': False,
|
|
|
|
| 256 |
# return 'gpt-35-turbo-instruct'
|
| 257 |
|
| 258 |
elif key == 'AZURE_GPT_4':
|
| 259 |
+
return 'gpt-4'
|
| 260 |
|
| 261 |
# elif key == 'AZURE_GPT_4_TURBO_1106':
|
| 262 |
+
# return 'gpt-4-1106-preview'
|
| 263 |
|
| 264 |
# elif key == 'AZURE_GPT_4_TURBO_0125':
|
| 265 |
# return 'gpt-4-0125-preview'
|
| 266 |
|
| 267 |
# elif key == 'AZURE_GPT_4_32K':
|
| 268 |
+
# return 'gpt-4-32k'
|
| 269 |
|
| 270 |
### Google
|
| 271 |
# elif key == 'PALM2_TB_1':
|
| 272 |
+
# return 'text-bison@001'
|
| 273 |
|
| 274 |
elif key == 'PALM2_TB_2':
|
| 275 |
+
return 'text-bison@002'
|
| 276 |
|
| 277 |
elif key == 'PALM2_TU_1':
|
| 278 |
+
return 'text-unicorn@001'
|
| 279 |
|
| 280 |
elif key == 'GEMINI_PRO':
|
| 281 |
+
return 'gemini-1.0-pro'
|
| 282 |
|
| 283 |
elif key == 'GEMINI_1_5_FLASH':
|
| 284 |
+
return 'gemini-1.5-flash'
|
| 285 |
|
| 286 |
elif key == 'GEMINI_1_5_PRO':
|
| 287 |
+
return 'gemini-1.5-pro'
|
| 288 |
|
| 289 |
### Mistral
|
| 290 |
elif key == 'OPEN_MISTRAL_7B':
|
| 291 |
+
return 'open-mistral-7b'
|
| 292 |
|
| 293 |
elif key == 'OPEN_MIXTRAL_8X7B':
|
| 294 |
return 'open-mixtral-8x7b'
|
|
|
|
| 323 |
|
| 324 |
|
| 325 |
else:
|
| 326 |
+
raise ValueError(f'Invalid model name {key}. See model_maps.py')
|
| 327 |
|
| 328 |
@classmethod
|
| 329 |
def get_models_gui_list(cls):
|
vouchervision/utils_hf.py
CHANGED
|
@@ -68,57 +68,106 @@ def save_uploaded_file_local(directory_in, directory_out, img_file_name, image=N
|
|
| 68 |
except:
|
| 69 |
pass
|
| 70 |
|
| 71 |
-
|
| 72 |
-
def save_uploaded_file(directory, img_file, image=None):
|
| 73 |
if not os.path.exists(directory):
|
| 74 |
os.makedirs(directory)
|
| 75 |
|
| 76 |
-
full_path = os.path.join(directory,
|
| 77 |
|
| 78 |
-
#
|
| 79 |
-
if
|
| 80 |
-
|
| 81 |
-
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
|
| 85 |
-
|
| 86 |
-
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
|
| 90 |
-
|
|
|
|
| 91 |
return full_path
|
|
|
|
|
|
|
|
|
|
| 92 |
else:
|
|
|
|
| 93 |
if image is None:
|
| 94 |
try:
|
| 95 |
-
with Image.open(
|
| 96 |
-
full_path = os.path.join(directory, img_file.name)
|
| 97 |
image.save(full_path, "JPEG")
|
| 98 |
-
|
| 99 |
-
|
| 100 |
-
|
| 101 |
-
try:
|
| 102 |
-
with Image.open(os.path.join(directory,img_file)) as image:
|
| 103 |
-
full_path = os.path.join(directory, img_file)
|
| 104 |
-
image.save(full_path, "JPEG")
|
| 105 |
-
# Return the full path of the saved image
|
| 106 |
-
return full_path
|
| 107 |
-
except:
|
| 108 |
-
with Image.open(img_file.name) as image:
|
| 109 |
-
full_path = os.path.join(directory, img_file.name)
|
| 110 |
-
image.save(full_path, "JPEG")
|
| 111 |
-
# Return the full path of the saved image
|
| 112 |
-
return full_path
|
| 113 |
else:
|
| 114 |
try:
|
| 115 |
-
full_path = os.path.join(directory, img_file.name)
|
| 116 |
-
image.save(full_path, "JPEG")
|
| 117 |
-
return full_path
|
| 118 |
-
except:
|
| 119 |
-
full_path = os.path.join(directory, img_file)
|
| 120 |
image.save(full_path, "JPEG")
|
| 121 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 122 |
# def save_uploaded_file(directory, uploaded_file, image=None):
|
| 123 |
# if not os.path.exists(directory):
|
| 124 |
# os.makedirs(directory)
|
|
|
|
| 68 |
except:
|
| 69 |
pass
|
| 70 |
|
| 71 |
+
def save_uploaded_file(directory, uploaded_file, image=None):
|
|
|
|
| 72 |
if not os.path.exists(directory):
|
| 73 |
os.makedirs(directory)
|
| 74 |
|
| 75 |
+
full_path = os.path.join(directory, uploaded_file.name)
|
| 76 |
|
| 77 |
+
# Handle PDF and Image files differently
|
| 78 |
+
if uploaded_file.name.lower().endswith('.pdf'):
|
| 79 |
+
# Save PDF file
|
| 80 |
+
try:
|
| 81 |
+
with open(full_path, 'wb') as out_file:
|
| 82 |
+
if hasattr(uploaded_file, 'read'):
|
| 83 |
+
# This is a file-like object
|
| 84 |
+
out_file.write(uploaded_file.read())
|
| 85 |
+
else:
|
| 86 |
+
# If uploaded_file is a path string
|
| 87 |
+
with open(uploaded_file, 'rb') as fd:
|
| 88 |
+
out_file.write(fd.read())
|
| 89 |
+
if os.path.getsize(full_path) == 0:
|
| 90 |
+
raise ValueError(f"The file {uploaded_file.name} is empty.")
|
| 91 |
return full_path
|
| 92 |
+
except Exception as e:
|
| 93 |
+
st.error(f"Failed to save PDF file {uploaded_file.name}. Error: {e}")
|
| 94 |
+
return None
|
| 95 |
else:
|
| 96 |
+
# Handle image files
|
| 97 |
if image is None:
|
| 98 |
try:
|
| 99 |
+
with Image.open(uploaded_file) as image:
|
|
|
|
| 100 |
image.save(full_path, "JPEG")
|
| 101 |
+
except Exception as e:
|
| 102 |
+
st.error(f"Failed to save image file {uploaded_file.name}. Error: {e}")
|
| 103 |
+
return None
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
else:
|
| 105 |
try:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
image.save(full_path, "JPEG")
|
| 107 |
+
except Exception as e:
|
| 108 |
+
st.error(f"Failed to save processed image file {uploaded_file.name}. Error: {e}")
|
| 109 |
+
return None
|
| 110 |
+
|
| 111 |
+
if os.path.getsize(full_path) == 0:
|
| 112 |
+
st.error(f"The image file {uploaded_file.name} is empty.")
|
| 113 |
+
return None
|
| 114 |
+
|
| 115 |
+
return full_path
|
| 116 |
+
|
| 117 |
+
|
| 118 |
+
# def save_uploaded_file(directory, img_file, image=None): # not working with pdfs
|
| 119 |
+
# if not os.path.exists(directory):
|
| 120 |
+
# os.makedirs(directory)
|
| 121 |
+
|
| 122 |
+
# full_path = os.path.join(directory, img_file.name) ########## TODO THIS MUST BE MOVED TO conditional specific location
|
| 123 |
+
|
| 124 |
+
# # Assuming the uploaded file is an image
|
| 125 |
+
# if img_file.name.lower().endswith('.pdf'):
|
| 126 |
+
# with open(full_path, 'wb') as out_file:
|
| 127 |
+
# # If img_file is a file-like object (e.g., Django's UploadedFile),
|
| 128 |
+
# # you can use copyfileobj or read chunks.
|
| 129 |
+
# # If it's a path, you'd need to open and then save it.
|
| 130 |
+
# if hasattr(img_file, 'read'):
|
| 131 |
+
# # This is a file-like object
|
| 132 |
+
# copyfileobj(img_file, out_file)
|
| 133 |
+
# else:
|
| 134 |
+
# # If img_file is a path string
|
| 135 |
+
# with open(img_file, 'rb') as fd:
|
| 136 |
+
# copyfileobj(fd, out_file)
|
| 137 |
+
# return full_path
|
| 138 |
+
# else:
|
| 139 |
+
# if image is None:
|
| 140 |
+
# try:
|
| 141 |
+
# with Image.open(img_file) as image:
|
| 142 |
+
# full_path = os.path.join(directory, img_file.name)
|
| 143 |
+
# image.save(full_path, "JPEG")
|
| 144 |
+
# # Return the full path of the saved image
|
| 145 |
+
# return full_path
|
| 146 |
+
# except:
|
| 147 |
+
# try:
|
| 148 |
+
# with Image.open(os.path.join(directory,img_file)) as image:
|
| 149 |
+
# full_path = os.path.join(directory, img_file)
|
| 150 |
+
# image.save(full_path, "JPEG")
|
| 151 |
+
# # Return the full path of the saved image
|
| 152 |
+
# return full_path
|
| 153 |
+
# except:
|
| 154 |
+
# with Image.open(img_file.name) as image:
|
| 155 |
+
# full_path = os.path.join(directory, img_file.name)
|
| 156 |
+
# image.save(full_path, "JPEG")
|
| 157 |
+
# # Return the full path of the saved image
|
| 158 |
+
# return full_path
|
| 159 |
+
# else:
|
| 160 |
+
# try:
|
| 161 |
+
# full_path = os.path.join(directory, img_file.name)
|
| 162 |
+
# image.save(full_path, "JPEG")
|
| 163 |
+
# return full_path
|
| 164 |
+
# except:
|
| 165 |
+
# full_path = os.path.join(directory, img_file)
|
| 166 |
+
# image.save(full_path, "JPEG")
|
| 167 |
+
# return full_path
|
| 168 |
+
|
| 169 |
+
|
| 170 |
+
|
| 171 |
# def save_uploaded_file(directory, uploaded_file, image=None):
|
| 172 |
# if not os.path.exists(directory):
|
| 173 |
# os.makedirs(directory)
|