function_app/function_app.py (91 lines of code) (raw):
import logging
import os
import azure.functions as func
from dotenv import load_dotenv
from src.helpers.azure_function import (
check_if_azurite_storage_emulator_is_running,
check_if_env_var_is_set,
)
load_dotenv()
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s:%(levelname)s:%(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)
# Reduce Azure SDK logging level
_logger = logging.getLogger("azure")
_logger.setLevel(logging.WARNING)
app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION)
### Read environment variables to determine which backend resources/services are deployed
IS_CONTENT_UNDERSTANDING_DEPLOYED = check_if_env_var_is_set(
"CONTENT_UNDERSTANDING_ENDPOINT"
)
IS_AOAI_DEPLOYED = check_if_env_var_is_set("AOAI_ENDPOINT")
IS_DOC_INTEL_DEPLOYED = check_if_env_var_is_set("DOC_INTEL_ENDPOINT")
IS_SPEECH_DEPLOYED = check_if_env_var_is_set("SPEECH_ENDPOINT")
IS_LANGUAGE_DEPLOYED = check_if_env_var_is_set("LANGUAGE_ENDPOINT")
IS_STORAGE_ACCOUNT_AVAILABLE = (
# If running the function app locally, check if the Azurite storage emulator is running
os.getenv("AzureWebJobsStorage") == "UseDevelopmentStorage=true"
and check_if_azurite_storage_emulator_is_running()
) or all(
# If running on Azure, check if the storage account env vars were set correctly
[
check_if_env_var_is_set("AzureWebJobsStorage__accountName"),
check_if_env_var_is_set("AzureWebJobsStorage__blobServiceUri"),
check_if_env_var_is_set("AzureWebJobsStorage__queueServiceUri"),
check_if_env_var_is_set("AzureWebJobsStorage__tableServiceUri"),
]
)
IS_COSMOSDB_AVAILABLE = check_if_env_var_is_set(
"COSMOSDB_DATABASE_NAME"
) and check_if_env_var_is_set("CosmosDbConnectionSetting__accountEndpoint")
### Register blueprints for HTTP functions, provided the relevant backend AI services are deployed
### and the relevant environment variables are set
if IS_AOAI_DEPLOYED:
from bp_summarize_text import bp_summarize_text
app.register_blueprint(bp_summarize_text)
if IS_DOC_INTEL_DEPLOYED and IS_AOAI_DEPLOYED:
from bp_doc_intel_extract_city_names import bp_doc_intel_extract_city_names
from bp_form_extraction_with_confidence import bp_form_extraction_with_confidence
app.register_blueprint(bp_doc_intel_extract_city_names)
app.register_blueprint(bp_form_extraction_with_confidence)
if IS_SPEECH_DEPLOYED and IS_AOAI_DEPLOYED:
from bp_call_center_audio_analysis import bp_call_center_audio_analysis
app.register_blueprint(bp_call_center_audio_analysis)
if IS_DOC_INTEL_DEPLOYED:
from bp_multimodal_doc_intel_processing import bp_multimodal_doc_intel_processing
app.register_blueprint(bp_multimodal_doc_intel_processing)
if IS_CONTENT_UNDERSTANDING_DEPLOYED:
from bp_content_understanding_audio import bp_content_understanding_audio
from bp_content_understanding_document import bp_content_understanding_document
from bp_content_understanding_image import bp_content_understanding_image
from bp_content_understanding_video import bp_content_understanding_video
app.register_blueprint(bp_content_understanding_document)
app.register_blueprint(bp_content_understanding_video)
app.register_blueprint(bp_content_understanding_audio)
app.register_blueprint(bp_content_understanding_image)
if IS_LANGUAGE_DEPLOYED:
from bp_pii_redaction import bp_pii_redaction
app.register_blueprint(bp_pii_redaction)
### Define functions with input/output binding decorators (these do not work when defined in blueprint files).
## Blob storage -> CosmosDB Document Processing Pipeline
# Only register the function if Azure Storage and CosmosDB information is available and can be connected to
if (
IS_STORAGE_ACCOUNT_AVAILABLE
and IS_COSMOSDB_AVAILABLE
and IS_AOAI_DEPLOYED
and IS_DOC_INTEL_DEPLOYED
):
from extract_blob_field_info_to_cosmosdb import (
get_structured_extraction_func_outputs,
)
COSMOSDB_DATABASE_NAME = os.getenv("COSMOSDB_DATABASE_NAME")
@app.function_name("blob_form_extraction_to_cosmosdb")
@app.blob_trigger(
arg_name="inputblob",
path="blob-form-to-cosmosdb-blobs/{name}", # Triggered by any blobs created in this container
connection="AzureWebJobsStorage",
)
@app.cosmos_db_output(
arg_name="outputdocument",
connection="CosmosDbConnectionSetting",
database_name=COSMOSDB_DATABASE_NAME,
container_name="blob-form-to-cosmosdb-container",
)
def extract_blob_pdf_fields_to_cosmosdb(
inputblob: func.InputStream, outputdocument: func.Out[func.Document]
):
"""
Extracts field information from a PDF and writes the extracted information
to CosmosDB.
:param inputblob: The input blob to process.
:type inputblob: func.InputStream
:param outputdocument: The output document to write to CosmosDB.
:type outputdocument: func.Out[func.Document]
"""
output_result = get_structured_extraction_func_outputs(inputblob)
outputdocument.set(func.Document.from_dict(output_result))