wcag_AI_validation/restserver/routers/routes_wcag_h58.py

157 lines
5.8 KiB
Python

from fastapi import APIRouter, Request
from fastapi.responses import JSONResponse
import logging
from pydantic import BaseModel
import json
from dependences.utils import (
disclaim_bool_string,
prepare_output_folder,
prepare_folder_path,
create_folder,
db_persistence_insert,
)
from dependences.language_extractor import LanguageExtractor
from dependences.mllm_management import MLLMManager, parse_mllm_alt_text_response
invalid_json_input_msg = "Invalid JSON format"
unexpected_error_msg = "Unexpected Error: could not end the process"
class WCAG_h58Valuation(BaseModel):
page_url: str = "https://www.bbc.com"
#context_levels: int = 5
#pixel_distance_threshold: int = 200
#number_of_images: int = 10
#save_images: str = "True"
save_elaboration: str = "True"
#specific_images_urls: List[str] = []
class WCAG_h58ValuationRoutes:
def __init__(self, connection_db, mllm_settings):
self.connection_db = connection_db
self.mllm_settings = mllm_settings
self.router = APIRouter()
self.router.add_api_route(
"/wcag_h58_validation",
self.wcag_h58_validation,
methods=["POST"],
tags=["Wcag H58 Validation"],
description="WCAG validator H58 validation: Using language attributes to identify changes in the human language",
name="wcag H58 validation",
dependencies=[],
)
logging.info("wcag h58 routes correctly initialized.")
async def wcag_h58_validation(
self, request: Request, data: WCAG_h58Valuation
) -> JSONResponse:
"""Return the alt text validation assessment based on WCAG guidelines"""
try:
print("Received wcag H58 validation request.")
json_content = json.loads(data.model_dump_json())
mllm_model_id = self.mllm_settings["mllm_model_id"]
# prepare output folders if needed---
if (
disclaim_bool_string(json_content["save_elaboration"]) == True
): # if something to save
url_path,folder_str=prepare_folder_path(json_content, mllm_model_id,tecnhnique_name="h58")
output_dir = prepare_output_folder(url_path, folder_str)
# Create lang extractor
language_extractor = LanguageExtractor(
json_content["page_url"],
)
# Extract images
logging.info(f"Extracting languages from: {json_content['page_url']}")
languages = await language_extractor.extract_content_with_lang_context()
print("Extracted languages and textual elements.", languages)
main_language="italian"
other_textual_elements="ciao casa"
# MLLM settings
mllm_end_point = self.mllm_settings["mllm_end_point"]
mllm_api_key = self.mllm_settings["mllm_api_key"]
logging.info("mllm_end_point:%s", mllm_end_point)
logging.info("mllm_model_id:%s", mllm_model_id)
# Create MLLM manager
mllm_manager = MLLMManager(mllm_end_point, mllm_api_key, mllm_model_id)
logging.info("mllm_manager.end_point:%s", mllm_manager.end_point)
# Make h58 evaluation
mllm_responses = mllm_manager.make_h58_evaluation(
main_language,
other_textual_elements,
openai_model=self.mllm_settings["openai_model"],
)
# Parse MLLM responses
for i, response in enumerate(mllm_responses):
parsed_resp = response["mllm_response"]#parse_mllm_alt_text_response(response["mllm_response"])
mllm_responses[i]["mllm_response"] = parsed_resp
mllm_responses_object = {
"mllm_h58_assessments": mllm_responses,
}
returned_object = {
"mllm_validations": mllm_responses_object,
}
"""
try:
# Persist to local db
# Convert JSON data to string
json_in_str = json.dumps(images, ensure_ascii=False)
json_out_str = json.dumps(mllm_responses_object, ensure_ascii=False)
db_persistence_insert(
connection_db=self.connection_db,
insert_type="wcag_alttext_validation",
page_url=json_content["page_url"],
llm_model=mllm_model_id,
json_in_str=json_in_str,
json_out_str=json_out_str,
table="wcag_validator_results",
)
except Exception as e:
logging.error("error persisting to local db: %s", e)
"""
# save extracted images info
if (
disclaim_bool_string(json_content["save_elaboration"]) == True
): # Optionally save to JSON
#await image_extractor.save_elaboration(
# images, output_dir=output_dir + "/extracted_images.json"
#)
# save mllm responses
with open(
output_dir + "/mllm_assessments.json", "w", encoding="utf-8"
) as f:
json.dump(mllm_responses, f, indent=2, ensure_ascii=False)
return JSONResponse(content=returned_object, status_code=200)
except json.JSONDecodeError:
logging.error(invalid_json_input_msg)
return JSONResponse(
content={"error": invalid_json_input_msg}, status_code=400
)
except Exception as e:
logging.error(unexpected_error_msg + " %s", e)
return JSONResponse(
content={"error": unexpected_error_msg}, status_code=500
)