File size: 4,089 Bytes
d5f7564
 
315b0b5
14e4a92
 
d5f7564
026025c
d5f7564
 
 
026025c
315b0b5
026025c
 
 
 
315b0b5
 
 
026025c
 
 
315b0b5
 
 
 
 
 
 
 
026025c
315b0b5
026025c
 
315b0b5
026025c
315b0b5
 
 
 
026025c
 
315b0b5
026025c
315b0b5
 
026025c
315b0b5
d5f7564
 
026025c
 
 
14e4a92
026025c
 
 
d5f7564
026025c
 
 
d5f7564
026025c
 
 
 
d5f7564
026025c
d5f7564
026025c
315b0b5
 
026025c
 
 
315b0b5
026025c
 
 
d5f7564
 
026025c
d5f7564
026025c
d5f7564
 
026025c
 
315b0b5
026025c
 
d5f7564
026025c
 
 
14e4a92
315b0b5
14e4a92
 
 
026025c
d5f7564
 
2c9c8ee
14e4a92
 
026025c
 
14e4a92
 
d5f7564
14e4a92
d5f7564
026025c
d5f7564
026025c
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import logging
import json
from transformers import pipeline, AutoModelForSeq2SeqLM, AutoTokenizer
import gradio as gr

# Configure logging
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# Models to try
MODELS_TO_TRY = [
    "google/flan-t5-xxl",  # Powerful instruction-following model
    "bigscience/T0pp",     # Optimized for zero-shot tasks
    "t5-large",            # General-purpose text generation
    "google/flan-t5-large" # Lightweight instruction-tuned model
]

def load_model():
    """
    Attempt to load a suitable model for text generation.
    """
    for model_name in MODELS_TO_TRY:
        try:
            logger.info(f"Attempting to load model: {model_name}")
            
            # Load model and tokenizer
            model = AutoModelForSeq2SeqLM.from_pretrained(model_name)
            tokenizer = AutoTokenizer.from_pretrained(model_name)
            
            # Create the text generation pipeline
            generator = pipeline(
                "text2text-generation",
                model=model,
                tokenizer=tokenizer,
                max_length=512,
                num_return_sequences=1
            )
            logger.info(f"Successfully loaded model: {model_name}")
            return generator
        except Exception as e:
            logger.error(f"Failed to load model {model_name}: {e}")
    
    logger.error("All model attempts failed. No model loaded.")
    return None

# Load the generator at startup
generator = load_model()

def generate_test_cases(method, url, headers, payload=""):
    """
    Generate detailed API test cases using a language model.
    """
    try:
        # Input validation and logging
        logger.info(f"Received inputs: Method={method}, URL={url}, Headers={headers}, Payload={payload}")
        
        if not method or not url:
            return "Error: HTTP Method and API URL are required inputs."
        
        # Parse headers and payload as JSON
        try:
            headers_dict = json.loads(headers) if headers.strip() else {}
            payload_dict = json.loads(payload) if payload.strip() else {}
        except json.JSONDecodeError as e:
            return f"JSON Parsing Error: {e}"

        # Prompt for the model
        prompt = f"""
        Generate comprehensive API test cases for the following:
        
        HTTP Method: {method}
        API URL: {url}
        Headers: {json.dumps(headers_dict, indent=2)}
        Payload: {json.dumps(payload_dict, indent=2)}
        
        Requirements:
        - Include Happy Path, Negative, and Edge Cases.
        - Provide validation steps and expected results.
        """

        # Ensure model is loaded
        if generator is None:
            return "Error: No model is available for test case generation."

        # Generate test cases
        response = generator(prompt, max_length=500, num_return_sequences=1)
        generated_text = response[0]['generated_text']
        
        logger.info("Successfully generated test cases.")
        return generated_text

    except Exception as e:
        logger.error(f"Error during test case generation: {e}")
        return f"Error: {e}"

# Gradio Interface
iface = gr.Interface(
    fn=generate_test_cases,
    inputs=[
        gr.Textbox(label="HTTP Method (GET, POST, etc.)", placeholder="e.g., GET"),
        gr.Textbox(label="API URL", placeholder="e.g., https://api.example.com/endpoint"),
        gr.Textbox(label="Headers (JSON format)", placeholder='e.g., {"Content-Type": "application/json"}'),
        gr.Textbox(label="Payload (JSON format)", placeholder='e.g., {"key": "value"}'),
    ],
    outputs="text",
    title="API Test Case Generator",
    description="Generate detailed API test cases using AI models."
)

# Main execution
if __name__ == "__main__":
    try:
        logger.info("Launching Gradio interface...")
        iface.launch()
    except Exception as e:
        logger.error(f"Failed to launch Gradio interface: {e}")