Spaces:
Running
Running
phyloforfun
commited on
Commit
•
7a93196
1
Parent(s):
4d5e173
Major update. Support for 15 LLMs, World Flora Online taxonomy validation, geolocation, 2 OCR methods, significant UI changes, stability improvements, consistent JSON parsing
Browse files- app.py +35 -31
- vouchervision/API_validation.py +32 -28
- vouchervision/VoucherVision_Config_Builder.py +9 -10
- vouchervision/utils_VoucherVision.py +20 -19
app.py
CHANGED
@@ -407,11 +407,14 @@ class JSONReport:
|
|
407 |
return json.dumps(json_obj, indent=4, sort_keys=False)
|
408 |
|
409 |
|
|
|
410 |
def does_private_file_exist():
|
411 |
dir_home = os.path.dirname(os.path.dirname(__file__))
|
412 |
path_cfg_private = os.path.join(dir_home, 'PRIVATE_DATA.yaml')
|
413 |
return os.path.exists(path_cfg_private)
|
414 |
|
|
|
|
|
415 |
def setup_streamlit_config(dir_home):
|
416 |
# Define the directory path and filename
|
417 |
dir_path = os.path.join(dir_home, ".streamlit")
|
@@ -436,6 +439,8 @@ def setup_streamlit_config(dir_home):
|
|
436 |
with open(file_path, "w") as f:
|
437 |
f.write(config_content.strip())
|
438 |
|
|
|
|
|
439 |
def display_scrollable_results(JSON_results, test_results, OPT2, OPT3):
|
440 |
"""
|
441 |
Display the results from JSON_results in a scrollable container.
|
@@ -479,6 +484,7 @@ def display_scrollable_results(JSON_results, test_results, OPT2, OPT3):
|
|
479 |
st.markdown(results_html, unsafe_allow_html=True)
|
480 |
|
481 |
|
|
|
482 |
def display_test_results(test_results, JSON_results, llm_version):
|
483 |
if llm_version == 'gpt':
|
484 |
OPT1, OPT2, OPT3 = TestOptionsGPT.get_options()
|
@@ -543,9 +549,13 @@ def display_test_results(test_results, JSON_results, llm_version):
|
|
543 |
# proportional_rain("🥇", success_count, "💔", failure_count, font_size=72, falling_speed=5, animation_length="infinite")
|
544 |
rain_emojis(test_results)
|
545 |
|
|
|
|
|
546 |
def add_emoji_delay():
|
547 |
time.sleep(0.3)
|
548 |
|
|
|
|
|
549 |
def rain_emojis(test_results):
|
550 |
# test_results = {
|
551 |
# 'test1': True, # Test passed
|
@@ -585,17 +595,23 @@ def rain_emojis(test_results):
|
|
585 |
)
|
586 |
add_emoji_delay()
|
587 |
|
|
|
|
|
588 |
def format_json(json_obj):
|
589 |
try:
|
590 |
return json.dumps(json.loads(json_obj), indent=4, sort_keys=False)
|
591 |
except:
|
592 |
return json.dumps(json_obj, indent=4, sort_keys=False)
|
593 |
|
|
|
|
|
594 |
def get_prompt_versions(LLM_version):
|
595 |
yaml_files = [f for f in os.listdir(os.path.join(st.session_state.dir_home, 'custom_prompts')) if f.endswith('.yaml')]
|
596 |
|
597 |
return yaml_files
|
598 |
|
|
|
|
|
599 |
def get_private_file():
|
600 |
dir_home = os.path.dirname(os.path.dirname(__file__))
|
601 |
path_cfg_private = os.path.join(dir_home, 'PRIVATE_DATA.yaml')
|
@@ -603,17 +619,7 @@ def get_private_file():
|
|
603 |
|
604 |
|
605 |
|
606 |
-
|
607 |
-
# st.session_state.proceed_to_main = False
|
608 |
-
|
609 |
-
# if st.session_state.private_file:
|
610 |
-
# cfg_private = get_private_file()
|
611 |
-
# create_private_file_0(cfg_private)
|
612 |
-
# else:
|
613 |
-
# st.title("VoucherVision")
|
614 |
-
# create_private_file_0()
|
615 |
-
|
616 |
-
def create_private_file():
|
617 |
st.session_state.proceed_to_main = False
|
618 |
st.title("VoucherVision")
|
619 |
col_private,_= st.columns([12,2])
|
@@ -823,7 +829,7 @@ def test_API(api, message_loc, cfg_private,openai_api_key,azure_openai_api_versi
|
|
823 |
|
824 |
|
825 |
def save_changes_to_API_keys(cfg_private,openai_api_key,azure_openai_api_version,azure_openai_api_key,
|
826 |
-
azure_openai_api_base,azure_openai_organization,azure_openai_api_type,google_vision,google_palm):
|
827 |
# Update the configuration dictionary with the new values
|
828 |
cfg_private['openai']['OPENAI_API_KEY'] = openai_api_key
|
829 |
|
@@ -833,9 +839,9 @@ def save_changes_to_API_keys(cfg_private,openai_api_key,azure_openai_api_version
|
|
833 |
cfg_private['openai_azure']['openai_organization'] = azure_openai_organization
|
834 |
cfg_private['openai_azure']['openai_api_type'] = azure_openai_api_type
|
835 |
|
836 |
-
cfg_private['
|
837 |
|
838 |
-
cfg_private['
|
839 |
# Call the function to write the updated configuration to the YAML file
|
840 |
write_config_file(cfg_private, st.session_state.dir_home, filename="PRIVATE_DATA.yaml")
|
841 |
st.session_state.private_file = does_private_file_exist()
|
@@ -1885,12 +1891,7 @@ def content_api_check():
|
|
1885 |
|
1886 |
def content_collage_overlay():
|
1887 |
st.write("---")
|
1888 |
-
st.
|
1889 |
-
col_cropped_1, col_cropped_2 = st.columns([4,4])
|
1890 |
-
|
1891 |
-
st.write("---")
|
1892 |
-
st.header('OCR Overlay Image')
|
1893 |
-
col_ocr_1, col_ocr_2 = st.columns([4,4])
|
1894 |
|
1895 |
demo_text_h = f"Google_OCR_Handwriting:\nHERBARIUM OF MARCUS W. LYON , JR . Tracaulon sagittatum Indiana : Porter Co. incal Springs edge wet subdunal woods 1927 TX 11 Ilowers pink UNIVERSITE HERBARIUM MICH University of Michigan Herbarium 1439649 copyright reserved PERSICARIA FEB 2 6 1965 cm "
|
1896 |
demo_text_tr = f"trOCR:\nherbarium of marcus w. lyon jr. : : : tracaulon sagittatum indiana porter co. incal springs TX 11 Ilowers pink 1439649 copyright reserved D H U Q "
|
@@ -1900,7 +1901,8 @@ def content_collage_overlay():
|
|
1900 |
demo_text_trh = demo_text_h + '\n' + demo_text_tr
|
1901 |
demo_text_trp = demo_text_p + '\n' + demo_text_tr
|
1902 |
|
1903 |
-
with
|
|
|
1904 |
default_crops = st.session_state.config['leafmachine']['cropped_components']['save_cropped_annotations']
|
1905 |
st.write("Prior to transcription, use LeafMachine2 to crop all labels from input images to create label collages for each specimen image. (Requires GPU)")
|
1906 |
st.session_state.config['leafmachine']['use_RGB_label_images'] = st.checkbox("Use LeafMachine2 label collage for transcriptions", st.session_state.config['leafmachine'].get('use_RGB_label_images', False))
|
@@ -1910,7 +1912,6 @@ def content_collage_overlay():
|
|
1910 |
options=['ruler', 'barcode','label', 'colorcard','map','envelope','photo','attached_item','weights',
|
1911 |
'leaf_whole', 'leaf_partial', 'leaflet', 'seed_fruit_one', 'seed_fruit_many', 'flower_one', 'flower_many', 'bud','specimen','roots','wood'],default=default_crops)
|
1912 |
st.session_state.config['leafmachine']['cropped_components']['save_cropped_annotations'] = option_selected_crops
|
1913 |
-
with col_cropped_2:
|
1914 |
# Load the image only if it's not already in the session state
|
1915 |
if "demo_collage" not in st.session_state:
|
1916 |
# ba = os.path.join(st.session_state.dir_home, 'demo', 'ba', 'ba2.png')
|
@@ -1918,12 +1919,14 @@ def content_collage_overlay():
|
|
1918 |
st.session_state["demo_collage"] = Image.open(ba)
|
1919 |
|
1920 |
# Display the image
|
1921 |
-
st.
|
1922 |
-
|
|
|
1923 |
|
1924 |
|
1925 |
|
1926 |
-
with
|
|
|
1927 |
options = [":rainbow[Printed + Handwritten]", "Printed", "Use both models"]
|
1928 |
captions = [
|
1929 |
"Works well for both printed and handwritten text",
|
@@ -1933,7 +1936,7 @@ def content_collage_overlay():
|
|
1933 |
|
1934 |
st.write('This will plot bounding boxes around all text that Google Vision was able to detect. If there are no boxes around text, then the OCR failed, so that missing text will not be seen by the LLM when it is creating the JSON object. The created image will be viewable in the VoucherVisionEditor.')
|
1935 |
|
1936 |
-
do_create_OCR_helper_image = st.checkbox("Create image showing an overlay of the OCR detections",value=st.session_state.config['leafmachine']['do_create_OCR_helper_image'])
|
1937 |
st.session_state.config['leafmachine']['do_create_OCR_helper_image'] = do_create_OCR_helper_image
|
1938 |
|
1939 |
|
@@ -1985,14 +1988,15 @@ def content_collage_overlay():
|
|
1985 |
elif (OCR_option == 'hand') and do_use_trOCR:
|
1986 |
st.text_area(label='Handwritten/Printed + trOCR',placeholder=demo_text_trh,disabled=True, label_visibility='visible', height=150)
|
1987 |
|
1988 |
-
|
1989 |
if "demo_overlay" not in st.session_state:
|
1990 |
# ocr = os.path.join(st.session_state.dir_home,'demo', 'ba','ocr.png')
|
1991 |
-
ocr = os.path.join(st.session_state.dir_home,'demo', 'ba','
|
1992 |
st.session_state["demo_overlay"] = Image.open(ocr)
|
1993 |
|
1994 |
-
st.
|
1995 |
-
|
|
|
1996 |
|
1997 |
|
1998 |
|
@@ -2299,7 +2303,7 @@ st.set_page_config(layout="wide", page_icon='img/icon.ico', page_title='VoucherV
|
|
2299 |
|
2300 |
# Parse the 'is_hf' argument and set it in session state
|
2301 |
if 'is_hf' not in st.session_state:
|
2302 |
-
st.session_state['is_hf'] =
|
2303 |
|
2304 |
|
2305 |
#################################################################################################################################################
|
|
|
407 |
return json.dumps(json_obj, indent=4, sort_keys=False)
|
408 |
|
409 |
|
410 |
+
|
411 |
def does_private_file_exist():
|
412 |
dir_home = os.path.dirname(os.path.dirname(__file__))
|
413 |
path_cfg_private = os.path.join(dir_home, 'PRIVATE_DATA.yaml')
|
414 |
return os.path.exists(path_cfg_private)
|
415 |
|
416 |
+
|
417 |
+
|
418 |
def setup_streamlit_config(dir_home):
|
419 |
# Define the directory path and filename
|
420 |
dir_path = os.path.join(dir_home, ".streamlit")
|
|
|
439 |
with open(file_path, "w") as f:
|
440 |
f.write(config_content.strip())
|
441 |
|
442 |
+
|
443 |
+
|
444 |
def display_scrollable_results(JSON_results, test_results, OPT2, OPT3):
|
445 |
"""
|
446 |
Display the results from JSON_results in a scrollable container.
|
|
|
484 |
st.markdown(results_html, unsafe_allow_html=True)
|
485 |
|
486 |
|
487 |
+
|
488 |
def display_test_results(test_results, JSON_results, llm_version):
|
489 |
if llm_version == 'gpt':
|
490 |
OPT1, OPT2, OPT3 = TestOptionsGPT.get_options()
|
|
|
549 |
# proportional_rain("🥇", success_count, "💔", failure_count, font_size=72, falling_speed=5, animation_length="infinite")
|
550 |
rain_emojis(test_results)
|
551 |
|
552 |
+
|
553 |
+
|
554 |
def add_emoji_delay():
|
555 |
time.sleep(0.3)
|
556 |
|
557 |
+
|
558 |
+
|
559 |
def rain_emojis(test_results):
|
560 |
# test_results = {
|
561 |
# 'test1': True, # Test passed
|
|
|
595 |
)
|
596 |
add_emoji_delay()
|
597 |
|
598 |
+
|
599 |
+
|
600 |
def format_json(json_obj):
|
601 |
try:
|
602 |
return json.dumps(json.loads(json_obj), indent=4, sort_keys=False)
|
603 |
except:
|
604 |
return json.dumps(json_obj, indent=4, sort_keys=False)
|
605 |
|
606 |
+
|
607 |
+
|
608 |
def get_prompt_versions(LLM_version):
|
609 |
yaml_files = [f for f in os.listdir(os.path.join(st.session_state.dir_home, 'custom_prompts')) if f.endswith('.yaml')]
|
610 |
|
611 |
return yaml_files
|
612 |
|
613 |
+
|
614 |
+
|
615 |
def get_private_file():
|
616 |
dir_home = os.path.dirname(os.path.dirname(__file__))
|
617 |
path_cfg_private = os.path.join(dir_home, 'PRIVATE_DATA.yaml')
|
|
|
619 |
|
620 |
|
621 |
|
622 |
+
def create_private_file(): #################################################################################### UPDATE
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
623 |
st.session_state.proceed_to_main = False
|
624 |
st.title("VoucherVision")
|
625 |
col_private,_= st.columns([12,2])
|
|
|
829 |
|
830 |
|
831 |
def save_changes_to_API_keys(cfg_private,openai_api_key,azure_openai_api_version,azure_openai_api_key,
|
832 |
+
azure_openai_api_base,azure_openai_organization,azure_openai_api_type,google_vision,google_palm): ######################################## UPDATE
|
833 |
# Update the configuration dictionary with the new values
|
834 |
cfg_private['openai']['OPENAI_API_KEY'] = openai_api_key
|
835 |
|
|
|
839 |
cfg_private['openai_azure']['openai_organization'] = azure_openai_organization
|
840 |
cfg_private['openai_azure']['openai_api_type'] = azure_openai_api_type
|
841 |
|
842 |
+
cfg_private['google']['GOOGLE_APPLICATION_CREDENTIALS'] = google_vision
|
843 |
|
844 |
+
cfg_private['google']['GOOGLE_PALM_API'] = google_palm
|
845 |
# Call the function to write the updated configuration to the YAML file
|
846 |
write_config_file(cfg_private, st.session_state.dir_home, filename="PRIVATE_DATA.yaml")
|
847 |
st.session_state.private_file = does_private_file_exist()
|
|
|
1891 |
|
1892 |
def content_collage_overlay():
|
1893 |
st.write("---")
|
1894 |
+
col_collage, col_overlay = st.columns([4,4])
|
|
|
|
|
|
|
|
|
|
|
1895 |
|
1896 |
demo_text_h = f"Google_OCR_Handwriting:\nHERBARIUM OF MARCUS W. LYON , JR . Tracaulon sagittatum Indiana : Porter Co. incal Springs edge wet subdunal woods 1927 TX 11 Ilowers pink UNIVERSITE HERBARIUM MICH University of Michigan Herbarium 1439649 copyright reserved PERSICARIA FEB 2 6 1965 cm "
|
1897 |
demo_text_tr = f"trOCR:\nherbarium of marcus w. lyon jr. : : : tracaulon sagittatum indiana porter co. incal springs TX 11 Ilowers pink 1439649 copyright reserved D H U Q "
|
|
|
1901 |
demo_text_trh = demo_text_h + '\n' + demo_text_tr
|
1902 |
demo_text_trp = demo_text_p + '\n' + demo_text_tr
|
1903 |
|
1904 |
+
with col_collage:
|
1905 |
+
st.header('LeafMachine2 Label Collage')
|
1906 |
default_crops = st.session_state.config['leafmachine']['cropped_components']['save_cropped_annotations']
|
1907 |
st.write("Prior to transcription, use LeafMachine2 to crop all labels from input images to create label collages for each specimen image. (Requires GPU)")
|
1908 |
st.session_state.config['leafmachine']['use_RGB_label_images'] = st.checkbox("Use LeafMachine2 label collage for transcriptions", st.session_state.config['leafmachine'].get('use_RGB_label_images', False))
|
|
|
1912 |
options=['ruler', 'barcode','label', 'colorcard','map','envelope','photo','attached_item','weights',
|
1913 |
'leaf_whole', 'leaf_partial', 'leaflet', 'seed_fruit_one', 'seed_fruit_many', 'flower_one', 'flower_many', 'bud','specimen','roots','wood'],default=default_crops)
|
1914 |
st.session_state.config['leafmachine']['cropped_components']['save_cropped_annotations'] = option_selected_crops
|
|
|
1915 |
# Load the image only if it's not already in the session state
|
1916 |
if "demo_collage" not in st.session_state:
|
1917 |
# ba = os.path.join(st.session_state.dir_home, 'demo', 'ba', 'ba2.png')
|
|
|
1919 |
st.session_state["demo_collage"] = Image.open(ba)
|
1920 |
|
1921 |
# Display the image
|
1922 |
+
with st.expander(":frame_with_picture: View an example of the LeafMachine2 collage image"):
|
1923 |
+
st.image(st.session_state["demo_collage"], caption='LeafMachine2 Collage', output_format="PNG")
|
1924 |
+
# st.image(st.session_state["demo_collage"], caption='LeafMachine2 Collage', output_format="JPEG")
|
1925 |
|
1926 |
|
1927 |
|
1928 |
+
with col_overlay:
|
1929 |
+
st.header('OCR Overlay Image')
|
1930 |
options = [":rainbow[Printed + Handwritten]", "Printed", "Use both models"]
|
1931 |
captions = [
|
1932 |
"Works well for both printed and handwritten text",
|
|
|
1936 |
|
1937 |
st.write('This will plot bounding boxes around all text that Google Vision was able to detect. If there are no boxes around text, then the OCR failed, so that missing text will not be seen by the LLM when it is creating the JSON object. The created image will be viewable in the VoucherVisionEditor.')
|
1938 |
|
1939 |
+
do_create_OCR_helper_image = st.checkbox("Create image showing an overlay of the OCR detections",value=st.session_state.config['leafmachine']['do_create_OCR_helper_image'],disabled=True)
|
1940 |
st.session_state.config['leafmachine']['do_create_OCR_helper_image'] = do_create_OCR_helper_image
|
1941 |
|
1942 |
|
|
|
1988 |
elif (OCR_option == 'hand') and do_use_trOCR:
|
1989 |
st.text_area(label='Handwritten/Printed + trOCR',placeholder=demo_text_trh,disabled=True, label_visibility='visible', height=150)
|
1990 |
|
1991 |
+
|
1992 |
if "demo_overlay" not in st.session_state:
|
1993 |
# ocr = os.path.join(st.session_state.dir_home,'demo', 'ba','ocr.png')
|
1994 |
+
ocr = os.path.join(st.session_state.dir_home,'demo', 'ba','ocr2.png')
|
1995 |
st.session_state["demo_overlay"] = Image.open(ocr)
|
1996 |
|
1997 |
+
with st.expander(":frame_with_picture: View an example of the OCR overlay image"):
|
1998 |
+
st.image(st.session_state["demo_overlay"], caption='OCR Overlay Images', output_format = "PNG")
|
1999 |
+
# st.image(st.session_state["demo_overlay"], caption='OCR Overlay Images', output_format = "JPEG")
|
2000 |
|
2001 |
|
2002 |
|
|
|
2303 |
|
2304 |
# Parse the 'is_hf' argument and set it in session state
|
2305 |
if 'is_hf' not in st.session_state:
|
2306 |
+
st.session_state['is_hf'] = False
|
2307 |
|
2308 |
|
2309 |
#################################################################################################################################################
|
vouchervision/API_validation.py
CHANGED
@@ -56,10 +56,10 @@ class APIvalidation:
|
|
56 |
# Initialize the Azure OpenAI client
|
57 |
model = AzureChatOpenAI(
|
58 |
deployment_name = 'gpt-35-turbo',#'gpt-35-turbo',
|
59 |
-
openai_api_version = self.cfg_private['openai_azure']['
|
60 |
-
openai_api_key = self.cfg_private['openai_azure']['
|
61 |
-
azure_endpoint = self.cfg_private['openai_azure']['
|
62 |
-
openai_organization = self.cfg_private['openai_azure']['
|
63 |
)
|
64 |
msg = HumanMessage(content="hello")
|
65 |
# self.llm_object.temperature = self.config.get('temperature')
|
@@ -103,7 +103,7 @@ class APIvalidation:
|
|
103 |
def check_mistral_api_key(self):
|
104 |
try:
|
105 |
if not self.is_hf:
|
106 |
-
client = MistralClient(api_key=self.cfg_private['mistral']['
|
107 |
else:
|
108 |
client = MistralClient(api_key=os.getenv('MISTRAL_API_KEY'))
|
109 |
|
@@ -184,7 +184,8 @@ class APIvalidation:
|
|
184 |
print(f"palm2 fail [{test_response_palm}]")
|
185 |
|
186 |
except Exception as e:
|
187 |
-
print(f"palm2 fail2 [{
|
|
|
188 |
|
189 |
|
190 |
try:
|
@@ -198,7 +199,8 @@ class APIvalidation:
|
|
198 |
print(f"gemini fail [{test_response_gemini}]")
|
199 |
|
200 |
except Exception as e:
|
201 |
-
print(f"palm2 fail2 [{
|
|
|
202 |
|
203 |
return results
|
204 |
|
@@ -210,12 +212,12 @@ class APIvalidation:
|
|
210 |
credentials = service_account.Credentials.from_service_account_info(json.loads(creds_json_str))
|
211 |
return credentials
|
212 |
else:
|
213 |
-
with open(self.cfg_private['
|
214 |
data = json.load(file)
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
|
220 |
|
221 |
|
@@ -223,28 +225,30 @@ class APIvalidation:
|
|
223 |
missing_keys = []
|
224 |
present_keys = []
|
225 |
|
226 |
-
if
|
227 |
-
k_OPENAI_API_KEY = self.cfg_private['openai']['OPENAI_API_KEY']
|
228 |
-
k_openai_azure = self.cfg_private['openai_azure']['api_version']
|
229 |
-
# k_google_palm_api = self.cfg_private['google_palm']['google_palm_api']
|
230 |
-
|
231 |
-
k_project_id = self.cfg_private['google_palm']['project_id']
|
232 |
-
k_location = self.cfg_private['google_palm']['location']
|
233 |
-
k_google_application_credentials = self.cfg_private['google_cloud']['GOOGLE_APPLICATION_CREDENTIALS']
|
234 |
-
|
235 |
-
k_mistral = self.cfg_private['mistral']['mistral_key']
|
236 |
-
k_here = self.cfg_private['here']['api_key']
|
237 |
-
k_opencage = self.cfg_private['open_cage_geocode']['api_key']
|
238 |
-
else:
|
239 |
k_OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
|
240 |
k_openai_azure = os.getenv('AZURE_API_VERSION')
|
241 |
-
# k_google_palm_api = os.getenv('PALM_API_KEY')
|
242 |
|
|
|
243 |
k_project_id = os.getenv('GOOGLE_PROJECT_ID')
|
244 |
k_location = os.getenv('GOOGLE_LOCATION')
|
|
|
245 |
k_mistral = os.getenv('MISTRAL_API_KEY')
|
246 |
k_here = os.getenv('HERE_API_KEY')
|
247 |
-
k_opencage = os.getenv('
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
248 |
|
249 |
|
250 |
# Check each key and add to the respective list
|
@@ -285,7 +289,7 @@ class APIvalidation:
|
|
285 |
|
286 |
# Google PALM2/Gemini key check
|
287 |
if self.has_API_key(k_google_application_credentials) and self.has_API_key(k_project_id) and self.has_API_key(k_location): ##################
|
288 |
-
vertexai.init(project=
|
289 |
google_results = self.check_google_vertex_genai_api_key()
|
290 |
if google_results['palm2']:
|
291 |
present_keys.append('Palm2 (Valid)')
|
|
|
56 |
# Initialize the Azure OpenAI client
|
57 |
model = AzureChatOpenAI(
|
58 |
deployment_name = 'gpt-35-turbo',#'gpt-35-turbo',
|
59 |
+
openai_api_version = self.cfg_private['openai_azure']['OPENAI_API_VERSION'],
|
60 |
+
openai_api_key = self.cfg_private['openai_azure']['OPENAI_API_KEY'],
|
61 |
+
azure_endpoint = self.cfg_private['openai_azure']['OPENAI_API_BASE'],
|
62 |
+
openai_organization = self.cfg_private['openai_azure']['OPENAI_ORGANIZATION'],
|
63 |
)
|
64 |
msg = HumanMessage(content="hello")
|
65 |
# self.llm_object.temperature = self.config.get('temperature')
|
|
|
103 |
def check_mistral_api_key(self):
|
104 |
try:
|
105 |
if not self.is_hf:
|
106 |
+
client = MistralClient(api_key=self.cfg_private['mistral']['MISTRAL_API_KEY'])
|
107 |
else:
|
108 |
client = MistralClient(api_key=os.getenv('MISTRAL_API_KEY'))
|
109 |
|
|
|
184 |
print(f"palm2 fail [{test_response_palm}]")
|
185 |
|
186 |
except Exception as e:
|
187 |
+
# print(f"palm2 fail2 [{e}]")
|
188 |
+
print(f"palm2 fail2")
|
189 |
|
190 |
|
191 |
try:
|
|
|
199 |
print(f"gemini fail [{test_response_gemini}]")
|
200 |
|
201 |
except Exception as e:
|
202 |
+
# print(f"palm2 fail2 [{e}]")
|
203 |
+
print(f"palm2 fail2")
|
204 |
|
205 |
return results
|
206 |
|
|
|
212 |
credentials = service_account.Credentials.from_service_account_info(json.loads(creds_json_str))
|
213 |
return credentials
|
214 |
else:
|
215 |
+
with open(self.cfg_private['google']['GOOGLE_APPLICATION_CREDENTIALS'], 'r') as file:
|
216 |
data = json.load(file)
|
217 |
+
creds_json_str = json.dumps(data)
|
218 |
+
credentials = service_account.Credentials.from_service_account_info(json.loads(creds_json_str))
|
219 |
+
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = creds_json_str
|
220 |
+
return credentials
|
221 |
|
222 |
|
223 |
|
|
|
225 |
missing_keys = []
|
226 |
present_keys = []
|
227 |
|
228 |
+
if self.is_hf:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
229 |
k_OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
|
230 |
k_openai_azure = os.getenv('AZURE_API_VERSION')
|
|
|
231 |
|
232 |
+
k_google_application_credentials = os.getenv('GOOGLE_APPLICATION_CREDENTIALS')
|
233 |
k_project_id = os.getenv('GOOGLE_PROJECT_ID')
|
234 |
k_location = os.getenv('GOOGLE_LOCATION')
|
235 |
+
|
236 |
k_mistral = os.getenv('MISTRAL_API_KEY')
|
237 |
k_here = os.getenv('HERE_API_KEY')
|
238 |
+
k_opencage = os.getenv('OPENCAGE_API_KEY')
|
239 |
+
else:
|
240 |
+
k_OPENAI_API_KEY = self.cfg_private['openai']['OPENAI_API_KEY']
|
241 |
+
k_openai_azure = self.cfg_private['openai_azure']['OPENAI_API_VERSION']
|
242 |
+
|
243 |
+
k_project_id = self.cfg_private['google']['GOOGLE_PROJECT_ID']
|
244 |
+
k_location = self.cfg_private['google']['GOOGLE_LOCATION']
|
245 |
+
k_google_application_credentials = self.cfg_private['google']['GOOGLE_APPLICATION_CREDENTIALS']
|
246 |
+
|
247 |
+
k_mistral = self.cfg_private['mistral']['MISTRAL_API_KEY']
|
248 |
+
k_here = self.cfg_private['here']['API_KEY']
|
249 |
+
k_opencage = self.cfg_private['open_cage_geocode']['API_KEY']
|
250 |
+
|
251 |
+
|
252 |
|
253 |
|
254 |
# Check each key and add to the respective list
|
|
|
289 |
|
290 |
# Google PALM2/Gemini key check
|
291 |
if self.has_API_key(k_google_application_credentials) and self.has_API_key(k_project_id) and self.has_API_key(k_location): ##################
|
292 |
+
vertexai.init(project=k_project_id, location=k_location, credentials=self.get_google_credentials())
|
293 |
google_results = self.check_google_vertex_genai_api_key()
|
294 |
if google_results['palm2']:
|
295 |
present_keys.append('Palm2 (Valid)')
|
vouchervision/VoucherVision_Config_Builder.py
CHANGED
@@ -594,13 +594,14 @@ def check_if_usable(is_hf): ####################################################
|
|
594 |
|
595 |
has_key_openai = has_API_key(cfg_private['openai']['OPENAI_API_KEY'])
|
596 |
|
597 |
-
has_key_azure_openai = has_API_key(cfg_private['openai_azure']['
|
598 |
-
|
599 |
-
has_key_palm2 = has_API_key(cfg_private['google_palm']['google_palm_api'])
|
600 |
|
601 |
-
has_key_google_OCR = has_API_key(cfg_private['
|
|
|
|
|
602 |
|
603 |
-
|
|
|
604 |
return True
|
605 |
else:
|
606 |
return False
|
@@ -614,13 +615,11 @@ def check_API_key(dir_home, api_version):
|
|
614 |
|
615 |
has_key_azure_openai = has_API_key(cfg_private['openai_azure']['api_version'])
|
616 |
|
617 |
-
has_key_palm2 = has_API_key(cfg_private['google_palm']['google_palm_api'])
|
618 |
|
619 |
-
has_key_google_OCR = has_API_key(cfg_private['
|
620 |
|
621 |
-
if api_version
|
622 |
-
return True
|
623 |
-
elif api_version in ['gpt','openai'] and has_key_openai:
|
624 |
return True
|
625 |
elif api_version in ['gpt-azure', 'azure_openai'] and has_key_azure_openai:
|
626 |
return True
|
|
|
594 |
|
595 |
has_key_openai = has_API_key(cfg_private['openai']['OPENAI_API_KEY'])
|
596 |
|
597 |
+
has_key_azure_openai = has_API_key(cfg_private['openai_azure']['OPENAI_API_VERSION'])
|
|
|
|
|
598 |
|
599 |
+
has_key_google_OCR = has_API_key(cfg_private['google']['GOOGLE_APPLICATION_CREDENTIALS'])
|
600 |
+
|
601 |
+
has_key_MISTRAL = has_API_key(cfg_private['mistral']['MISTRAL_API_KEY'])
|
602 |
|
603 |
+
|
604 |
+
if has_key_google_OCR and (has_key_azure_openai or has_key_openai or has_key_MISTRAL):
|
605 |
return True
|
606 |
else:
|
607 |
return False
|
|
|
615 |
|
616 |
has_key_azure_openai = has_API_key(cfg_private['openai_azure']['api_version'])
|
617 |
|
618 |
+
# has_key_palm2 = has_API_key(cfg_private['google_palm']['google_palm_api'])
|
619 |
|
620 |
+
has_key_google_OCR = has_API_key(cfg_private['google']['GOOGLE_APPLICATION_CREDENTIALS'])
|
621 |
|
622 |
+
if api_version in ['gpt','openai'] and has_key_openai:
|
|
|
|
|
623 |
return True
|
624 |
elif api_version in ['gpt-azure', 'azure_openai'] and has_key_azure_openai:
|
625 |
return True
|
vouchervision/utils_VoucherVision.py
CHANGED
@@ -417,7 +417,7 @@ class VoucherVision():
|
|
417 |
credentials = service_account.Credentials.from_service_account_info(json.loads(creds_json_str))
|
418 |
return credentials
|
419 |
else:
|
420 |
-
with open(self.cfg_private['
|
421 |
data = json.load(file)
|
422 |
creds_json_str = json.dumps(data)
|
423 |
credentials = service_account.Credentials.from_service_account_info(json.loads(creds_json_str))
|
@@ -432,15 +432,15 @@ class VoucherVision():
|
|
432 |
self.cfg_private = get_cfg_from_full_path(self.path_cfg_private)
|
433 |
|
434 |
k_openai = self.cfg_private['openai']['OPENAI_API_KEY']
|
435 |
-
k_openai_azure = self.cfg_private['openai_azure']['
|
436 |
|
437 |
-
k_google_project_id = self.cfg_private['
|
438 |
-
k_google_location = self.cfg_private['
|
439 |
-
k_google_application_credentials = self.cfg_private['
|
440 |
|
441 |
-
k_mistral = self.cfg_private['mistral']['
|
442 |
-
k_here = self.cfg_private['here']['
|
443 |
-
k_opencage = self.cfg_private['open_cage_geocode']['
|
444 |
else:
|
445 |
self.dir_home = os.path.dirname(os.path.dirname(__file__))
|
446 |
self.path_cfg_private = None
|
@@ -471,10 +471,11 @@ class VoucherVision():
|
|
471 |
|
472 |
|
473 |
### Google - OCR, Palm2, Gemini
|
474 |
-
if self.
|
475 |
-
if self.
|
476 |
vertexai.init(project=os.getenv('GOOGLE_PROJECT_ID'), location=os.getenv('GOOGLE_LOCATION'), credentials=self.get_google_credentials())
|
477 |
-
|
|
|
478 |
|
479 |
### OpenAI
|
480 |
if self.has_key_openai:
|
@@ -502,10 +503,10 @@ class VoucherVision():
|
|
502 |
# Initialize the Azure OpenAI client
|
503 |
self.llm = AzureChatOpenAI(
|
504 |
deployment_name = 'gpt-35-turbo',#'gpt-35-turbo',
|
505 |
-
openai_api_version = self.cfg_private['openai_azure']['
|
506 |
-
openai_api_key = self.cfg_private['openai_azure']['
|
507 |
-
azure_endpoint = self.cfg_private['openai_azure']['
|
508 |
-
openai_organization = self.cfg_private['openai_azure']['
|
509 |
)
|
510 |
self.has_key_azure_openai = True
|
511 |
|
@@ -515,7 +516,7 @@ class VoucherVision():
|
|
515 |
if self.is_hf:
|
516 |
pass # Already set
|
517 |
else:
|
518 |
-
os.environ['MISTRAL_API_KEY'] = self.cfg_private['mistral']['
|
519 |
|
520 |
|
521 |
### HERE
|
@@ -523,8 +524,8 @@ class VoucherVision():
|
|
523 |
if self.is_hf:
|
524 |
pass # Already set
|
525 |
else:
|
526 |
-
os.environ['HERE_APP_ID'] = self.cfg_private['here']['
|
527 |
-
os.environ['HERE_API_KEY'] = self.cfg_private['here']['
|
528 |
|
529 |
|
530 |
### HERE
|
@@ -532,7 +533,7 @@ class VoucherVision():
|
|
532 |
if self.is_hf:
|
533 |
pass # Already set
|
534 |
else:
|
535 |
-
os.environ['OPENCAGE_API_KEY'] = self.cfg_private['open_cage_geocode']['
|
536 |
|
537 |
|
538 |
|
|
|
417 |
credentials = service_account.Credentials.from_service_account_info(json.loads(creds_json_str))
|
418 |
return credentials
|
419 |
else:
|
420 |
+
with open(self.cfg_private['google']['GOOGLE_APPLICATION_CREDENTIALS'], 'r') as file:
|
421 |
data = json.load(file)
|
422 |
creds_json_str = json.dumps(data)
|
423 |
credentials = service_account.Credentials.from_service_account_info(json.loads(creds_json_str))
|
|
|
432 |
self.cfg_private = get_cfg_from_full_path(self.path_cfg_private)
|
433 |
|
434 |
k_openai = self.cfg_private['openai']['OPENAI_API_KEY']
|
435 |
+
k_openai_azure = self.cfg_private['openai_azure']['OPENAI_API_VERSION']
|
436 |
|
437 |
+
k_google_project_id = self.cfg_private['google']['GOOGLE_PROJECT_ID']
|
438 |
+
k_google_location = self.cfg_private['google']['GOOGLE_LOCATION']
|
439 |
+
k_google_application_credentials = self.cfg_private['google']['GOOGLE_APPLICATION_CREDENTIALS']
|
440 |
|
441 |
+
k_mistral = self.cfg_private['mistral']['MISTRAL_API_KEY']
|
442 |
+
k_here = self.cfg_private['here']['API_KEY']
|
443 |
+
k_opencage = self.cfg_private['open_cage_geocode']['API_KEY']
|
444 |
else:
|
445 |
self.dir_home = os.path.dirname(os.path.dirname(__file__))
|
446 |
self.path_cfg_private = None
|
|
|
471 |
|
472 |
|
473 |
### Google - OCR, Palm2, Gemini
|
474 |
+
if self.has_key_google_application_credentials and self.has_key_google_project_id and self.has_key_google_location:
|
475 |
+
if self.is_hf:
|
476 |
vertexai.init(project=os.getenv('GOOGLE_PROJECT_ID'), location=os.getenv('GOOGLE_LOCATION'), credentials=self.get_google_credentials())
|
477 |
+
else:
|
478 |
+
vertexai.init(project=k_google_project_id, location=k_google_location, credentials=self.get_google_credentials())
|
479 |
|
480 |
### OpenAI
|
481 |
if self.has_key_openai:
|
|
|
503 |
# Initialize the Azure OpenAI client
|
504 |
self.llm = AzureChatOpenAI(
|
505 |
deployment_name = 'gpt-35-turbo',#'gpt-35-turbo',
|
506 |
+
openai_api_version = self.cfg_private['openai_azure']['OPENAI_API_VERSION'],
|
507 |
+
openai_api_key = self.cfg_private['openai_azure']['OPENAI_API_KEY'],
|
508 |
+
azure_endpoint = self.cfg_private['openai_azure']['OPENAI_API_BASE'],
|
509 |
+
openai_organization = self.cfg_private['openai_azure']['OPENAI_ORGANIZATION'],
|
510 |
)
|
511 |
self.has_key_azure_openai = True
|
512 |
|
|
|
516 |
if self.is_hf:
|
517 |
pass # Already set
|
518 |
else:
|
519 |
+
os.environ['MISTRAL_API_KEY'] = self.cfg_private['mistral']['MISTRAL_API_KEY']
|
520 |
|
521 |
|
522 |
### HERE
|
|
|
524 |
if self.is_hf:
|
525 |
pass # Already set
|
526 |
else:
|
527 |
+
os.environ['HERE_APP_ID'] = self.cfg_private['here']['APP_ID']
|
528 |
+
os.environ['HERE_API_KEY'] = self.cfg_private['here']['API_KEY']
|
529 |
|
530 |
|
531 |
### HERE
|
|
|
533 |
if self.is_hf:
|
534 |
pass # Already set
|
535 |
else:
|
536 |
+
os.environ['OPENCAGE_API_KEY'] = self.cfg_private['open_cage_geocode']['API_KEY']
|
537 |
|
538 |
|
539 |
|