HarshitaSuri's picture
Update app.py
2c3a2c7 verified
import pandas as pd
import requests
import gradio as gr
from sentence_transformers import SentenceTransformer, util
from sklearn.linear_model import LogisticRegression
import os
# Load semantic similarity model
model = SentenceTransformer("multi-qa-mpnet-base-dot-v1")
# Initialize classifier
classifier = LogisticRegression()
feedback_file = "feedback.csv"
# Load feedback if available
if os.path.exists(feedback_file):
feedback_data = pd.read_csv(feedback_file)
if len(feedback_data) > 10:
X = feedback_data[["similarity", "resp_length"]]
y = feedback_data["label"]
classifier.fit(X, y)
else:
feedback_data = pd.DataFrame(columns=["similarity","resp_length","label"])
def run_tests(file, bearer_token=None):
df = pd.read_excel(file)
results = []
headers = {}
if bearer_token:
headers["Authorization"] = f"Bearer {bearer_token}"
for _, row in df.iterrows():
test_name = row["TestName"]
endpoint = row["Endpoint"]
method = row["Method"]
payload = row.get("Payload", None)
expected_status = row["ExpectedStatus"]
expected_body = str(row["ExpectedBody"])
try:
response = requests.request(method, endpoint, headers=headers, data=payload)
status_match = response.status_code == expected_status
body = response.text
except Exception as e:
results.append((test_name, "Error", str(e)))
continue
if not status_match:
result = "Fail"
elif body == expected_body:
result = "Pass"
else:
sim = util.cos_sim(model.encode(expected_body), model.encode(body)).item()
resp_length = len(body)
# If classifier trained, use it
if len(feedback_data) > 10:
pred = classifier.predict([[sim, resp_length]])[0]
result = "Pass" if pred == 1 else "Fail"
else:
result = "Pass" if sim > 0.75 else "Uncertain"
# Store similarity for feedback loop
results.append((test_name, result, sim))
continue
results.append((test_name, result, None))
return pd.DataFrame(results, columns=["TestName", "Result", "Similarity"])
def feedback_handler(similarity, resp_length, label):
global feedback_data
feedback_data = feedback_data.append({"similarity": similarity,
"resp_length": resp_length,
"label": label}, ignore_index=True)
feedback_data.to_csv(feedback_file, index=False)
return "Feedback saved!"
demo = gr.Interface(
fn=run_tests,
inputs=[gr.File(label="Upload Excel"), gr.Textbox(label="Bearer Token")],
outputs="dataframe",
title="Adaptive API Test Runner",
description="Upload test cases in Excel, run API tests, and classify results with semantic similarity + ML feedback loop."
)
demo.launch()