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()