1- from flask import Flask , jsonify , request
2- import tensorflow as tf
3- import pandas as pd
1+ import logging
42import os
5- from sql_tokenizer import SQLTokenizer # Import SQLTokenizer
3+
4+ import tensorflow as tf
5+ from flask import Flask , jsonify , request
6+
7+ from sql_tokenizer import SQLTokenizer
8+
9+ logging .basicConfig (
10+ level = logging .INFO ,
11+ format = "%(asctime)s [%(levelname)s] %(message)s" ,
12+ )
13+ logger = logging .getLogger (__name__ )
614
715app = Flask (__name__ )
816
9- # Constants and configurations
1017MAX_WORDS = 10000
1118MAX_LEN = 100
12- DATASET_PATH = os .getenv ("DATASET_PATH " , "dataset/sqli_dataset1.csv " )
19+ VOCAB_PATH = os .getenv ("VOCAB_PATH " , "sql_tokenizer_vocab.json " )
1320MODEL_PATH = os .getenv ("MODEL_PATH" , "/app/sqli_model/3/" )
1421
15- # Load dataset and initialize SQLTokenizer
16- DATASET = pd .read_csv (DATASET_PATH )
1722sql_tokenizer = SQLTokenizer (max_words = MAX_WORDS , max_len = MAX_LEN )
18- sql_tokenizer .fit_on_texts (DATASET ["Query" ]) # Fit tokenizer on dataset
23+ sql_tokenizer .load_token_index (VOCAB_PATH )
24+ logger .info ("Loaded tokenizer vocabulary from %s (%d tokens)" , VOCAB_PATH , len (sql_tokenizer .token_index ))
1925
20- # Load the model using tf.saved_model.load and get the serving signature
2126loaded_model = tf .saved_model .load (MODEL_PATH )
2227model_predict = loaded_model .signatures ["serving_default" ]
28+ logger .info ("Loaded model from %s" , MODEL_PATH )
2329
2430
2531def warm_up_model ():
26- """Sends a dummy request to the model to 'warm it up' ."""
32+ """Sends a dummy request to the model to initialize it."""
2733 dummy_query = "SELECT * FROM users WHERE id = 1"
2834 query_seq = sql_tokenizer .texts_to_sequences ([dummy_query ])
2935 input_tensor = tf .convert_to_tensor (query_seq , dtype = tf .float32 )
30- _ = model_predict (input_tensor ) # Make a dummy prediction to initialize the model
31- print ("Model warmed up and ready to serve requests." )
36+ _ = model_predict (input_tensor )
37+ logger .info ("Model warmed up and ready to serve requests." )
38+
39+
40+ @app .route ("/health" , methods = ["GET" ])
41+ def health ():
42+ return jsonify ({"status" : "ok" })
3243
3344
3445@app .route ("/predict" , methods = ["POST" ])
@@ -37,27 +48,20 @@ def predict():
3748 return jsonify ({"error" : "No query provided" }), 400
3849
3950 try :
40- # Tokenize and pad the input query using SQLTokenizer
4151 query = request .json ["query" ]
4252 query_seq = sql_tokenizer .texts_to_sequences ([query ])
4353 input_tensor = tf .convert_to_tensor (query_seq , dtype = tf .float32 )
4454
45- # Use the loaded model's serving signature to make the prediction
4655 prediction = model_predict (input_tensor )
4756
48- # Check for valid output and extract the result
4957 if "output_0" not in prediction or prediction ["output_0" ].get_shape () != [1 , 1 ]:
5058 return jsonify ({"error" : "Invalid model output" }), 500
5159
52- # Extract confidence and return the response
53- return jsonify (
54- {
55- "confidence" : float ("%.4f" % prediction ["output_0" ].numpy ()[0 ][0 ]),
56- }
57- )
58- except Exception as e :
59- # Log the error and return a proper error message
60- return jsonify ({"error" : str (e )}), 500
60+ confidence = float ("%.4f" % prediction ["output_0" ].numpy ()[0 ][0 ])
61+ return jsonify ({"confidence" : confidence })
62+ except Exception :
63+ logger .exception ("Prediction failed" )
64+ return jsonify ({"error" : "Internal server error" }), 500
6165
6266
6367if __name__ == "__main__" :
0 commit comments