| # import requests | |
| # import base64 | |
| # API_KEYS = [ | |
| # "AIzaSyCX8zI_mxdn6GOYRXogSsXsVr15b5iEUJM", | |
| # "AIzaSyDvwkdHeCwoVuT3cIJLVIFlkw0-LblmdAg", | |
| # "AIzaSyCOO9MTc8Ytx9-PUzpPMYA_MAygpAHKoh8", | |
| # "AIzaSyD2cfooSLoqMfhJrvU339Mwo3utqzAkW9E", | |
| # "AIzaSyCMxYblhF9PwWmqioQCDbDIxkthi1LqK4A", | |
| # "AIzaSyDGNaIg9hk8jGG_QVkj55Vyev2SFlCU1CE" | |
| # ] | |
| # API_URL = "https://generativelanguage.googleapis.com/v1beta" | |
| # WORKING_MODELS = [ | |
| # "models/gemini-1.5-flash-latest", | |
| # "models/gemini-1.5-flash-001", | |
| # "models/gemini-1.5-flash-001-tuning", | |
| # "models/gemini-1.5-flash", | |
| # "models/gemini-1.5-flash-002", | |
| # "models/gemini-1.5-flash-8b", | |
| # "models/gemini-1.5-flash-8b-001", | |
| # "models/gemini-1.5-flash-8b-latest", | |
| # "models/gemini-2.5-flash-preview-04-17", | |
| # "models/gemini-2.5-flash-preview-05-20" | |
| # ] | |
| # def encode_image(image_path): | |
| # with open(image_path, "rb") as image_file: | |
| # image_bytes = image_file.read() | |
| # return base64.b64encode(image_bytes).decode("utf-8") | |
| # def query_model_with_image(model_name, image_path, api_key): | |
| # url = f"{API_URL}/{model_name}:generateContent?alt=json&key={api_key}" | |
| # encoded_image = encode_image(image_path) | |
| # headers = {"Content-Type": "application/json"} | |
| # data = { | |
| # "contents": [{ | |
| # "parts": [ | |
| # { | |
| # "text": ( | |
| # "Bạn hãy phân tích thông tin trong ảnh theo các tiêu chí sau. " | |
| # "Nếu ảnh là chân dung một nhà triết học, hãy trả lời theo cấu trúc:\n" | |
| # "- Tên:\n" | |
| # "- Năm sinh - Năm mất:\n" | |
| # "- Các tác phẩm kinh điển:\n" | |
| # "- Những đóng góp đối với triết học:\n\n" | |
| # "Nếu là một tác phẩm hội họa, hãy trả lời theo cấu trúc:\n" | |
| # "- Tên tác phẩm:\n" | |
| # "- Họa sĩ:\n" | |
| # "- Các tác phẩm tiêu biểu khác:\n" | |
| # "- Những đóng góp với triết học :\n\n" | |
| # "Nếu là người thường hoặc ảnh không rõ, chỉ cần trả lời: 'Không rõ thông tin triết học'." | |
| # ) | |
| # }, | |
| # { | |
| # "inline_data": { | |
| # "mime_type": "image/jpeg", | |
| # "data": encoded_image | |
| # } | |
| # } | |
| # ] | |
| # }] | |
| # } | |
| # response = requests.post(url, headers=headers, json=data) | |
| # return response | |
| # def try_models_on_image(image_path): | |
| # key_index = 0 | |
| # for model in WORKING_MODELS: | |
| # success = False | |
| # while key_index < len(API_KEYS): | |
| # current_key = API_KEYS[key_index] | |
| # print(f"\n🔍 Trying model: {model} with API key index {key_index}") | |
| # try: | |
| # res = query_model_with_image(model, image_path, current_key) | |
| # if res.status_code == 200: | |
| # output = res.json() | |
| # text = output["candidates"][0]["content"]["parts"][0]["text"] | |
| # print(f"✅ Success with {model} (API key index {key_index}):\n{text}") | |
| # success = True | |
| # break | |
| # else: | |
| # error_msg = res.json().get('error', {}).get('message', '') | |
| # print(f"⚠️ Model failed ({res.status_code}): {error_msg}") | |
| # if "quota" in error_msg.lower() or "exceeded" in error_msg.lower(): | |
| # print(f"⚠️ Quota exceeded for API key index {key_index}, switching to next key...") | |
| # key_index += 1 | |
| # else: | |
| # break | |
| # except Exception as e: | |
| # print(f"❌ Exception occurred with {model} (API key index {key_index}): {e}") | |
| # key_index += 1 | |
| # if success: | |
| # return | |
| # print("\n🚫 All models failed or all API keys quota exceeded.") | |
| # if __name__ == "__main__": | |
| # image_path = "/home/nhattan05022003/coding/SEM_8/MLN_111/photo_restoration/output_img_folder/final_output/monalisa.png" # Đổi thành đường dẫn ảnh trên máy bạn | |
| # try_models_on_image(image_path) | |
| import requests | |
| import base64 | |
| API_KEYS = [ | |
| "AIzaSyCX8zI_mxdn6GOYRXogSsXsVr15b5iEUJM", | |
| "AIzaSyDvwkdHeCwoVuT3cIJLVIFlkw0-LblmdAg", | |
| "AIzaSyCOO9MTc8Ytx9-PUzpPMYA_MAygpAHKoh8", | |
| "AIzaSyD2cfooSLoqMfhJrvU339Mwo3utqzAkW9E", | |
| "AIzaSyCMxYblhF9PwWmqioQCDbDIxkthi1Lq4A", | |
| "AIzaSyDGNaIg9hk8jGG_QVkj55Vyev2SFlCU1CE" | |
| ] | |
| API_URL = "https://generativelanguage.googleapis.com/v1beta" | |
| WORKING_MODELS = [ | |
| "models/gemini-1.5-flash-latest", | |
| "models/gemini-1.5-flash-001", | |
| "models/gemini-1.5-flash-001-tuning", | |
| "models/gemini-1.5-flash", | |
| "models/gemini-1.5-flash-002", | |
| "models/gemini-1.5-flash-8b", | |
| "models/gemini-1.5-flash-8b-001", | |
| "models/gemini-1.5-flash-8b-latest", | |
| "models/gemini-2.5-flash-preview-04-17", | |
| "models/gemini-2.5-flash-preview-05-20" | |
| ] | |
| def encode_image(image_path): | |
| with open(image_path, "rb") as image_file: | |
| image_bytes = image_file.read() | |
| return base64.b64encode(image_bytes).decode("utf-8") | |
| def query_model_with_image(model_name, image_path, api_key): | |
| url = f"{API_URL}/{model_name}:generateContent?alt=json&key={api_key}" | |
| encoded_image = encode_image(image_path) | |
| headers = {"Content-Type": "application/json"} | |
| data = { | |
| "contents": [{ | |
| "parts": [ | |
| { | |
| "text": ( | |
| "Bạn hãy phân tích thông tin trong ảnh theo các tiêu chí sau. " | |
| "Nếu ảnh là chân dung một nhà triết học, một người liên quan tới cách mạng, hãy trả lời theo cấu trúc:\n" | |
| "- Tên:\n" | |
| "- Năm sinh - Năm mất:\n" | |
| "- Các tác phẩm kinh điển:\n" | |
| "- Những đóng góp đối với triết học:\n\n" | |
| "Nếu là một tác phẩm hội họa, hãy trả lời theo cấu trúc:\n" | |
| "- Tên tác phẩm:\n" | |
| "- Họa sĩ:\n" | |
| "- Các tác phẩm tiêu biểu khác:\n" | |
| "- Những đóng góp với triết học :\n\n" | |
| "Nếu là người thường hoặc ảnh không rõ, chỉ cần trả lời: 'Không rõ thông tin triết học'." | |
| ) | |
| }, | |
| { | |
| "inline_data": { | |
| "mime_type": "image/jpeg", | |
| "data": encoded_image | |
| } | |
| } | |
| ] | |
| }] | |
| } | |
| response = requests.post(url, headers=headers, json=data) | |
| return response | |
| def try_models_on_image(image_path): | |
| key_index = 0 | |
| for model in WORKING_MODELS: | |
| success = False | |
| while key_index < len(API_KEYS): | |
| current_key = API_KEYS[key_index] | |
| print(f"\n🔍 Trying model: {model} with API key index {key_index}") | |
| try: | |
| res = query_model_with_image(model, image_path, current_key) | |
| if res.status_code == 200: | |
| output = res.json() | |
| text = output["candidates"][0]["content"]["parts"][0]["text"] | |
| print(f"✅ Success with {model} (API key index {key_index}):\n{text}") | |
| return text # Return the description | |
| else: | |
| error_msg = res.json().get('error', {}).get('message', '') | |
| print(f"⚠️ Model failed ({res.status_code}): {error_msg}") | |
| if "quota" in error_msg.lower() or "exceeded" in error_msg.lower(): | |
| print(f"⚠️ Quota exceeded for API key index {key_index}, switching to next key...") | |
| key_index += 1 | |
| else: | |
| break | |
| except Exception as e: | |
| print(f"❌ Exception occurred with {model} (API key index {key_index}): {e}") | |
| key_index += 1 | |
| if success: | |
| return "" | |
| print("\n🚫 All models failed or all API keys quota exceeded.") | |
| return "" # Return empty string if all attempts fail | |
| if __name__ == "__main__": | |
| image_path = "/home/nhattan05022003/coding/SEM_8/MLN_111/photo_restoration/output_img_folder/final_output/monalisa.png" | |
| description = try_models_on_image(image_path) | |
| print(f"Final description: {description}") |