Spaces:
Sleeping
Sleeping
File size: 7,894 Bytes
cbe7195 fc8383a 6577f0c 367325c 7d587e9 fc8383a 6577f0c fc8383a 367325c fc8383a 6577f0c fc8383a 6577f0c fc8383a 6577f0c c5de0b5 6577f0c c5de0b5 6577f0c fc8383a 6577f0c 367325c 6577f0c fc8383a c5de0b5 fc8383a c5de0b5 fc8383a c5de0b5 fc8383a c5de0b5 fc8383a 6577f0c c5de0b5 fc8383a c5de0b5 fc8383a ce64498 fc8383a ce64498 c5de0b5 ce64498 5a6b2fc a8b9f08 5a6b2fc a8b9f08 c5de0b5 a8b9f08 7d587e9 fc8383a 7d587e9 58d0306 f00fabe 931d3d3 7d587e9 931d3d3 7d587e9 931d3d3 7d587e9 fc8383a cbe7195 e8a4040 7d587e9 fc8383a 395ca0b cbe7195 395ca0b cbe7195 395ca0b cbe7195 58d0306 ccb5208 c5de0b5 ccb5208 cbe7195 7d587e9 |
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 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 |
import streamlit as st
import requests
from fpdf import FPDF
import os
import time
from datetime import datetime
# Mistral API key (replace with your key or use environment variable)
api_key = os.getenv("MISTRAL_API_KEY", "gz6lDXokxgR6cLY72oomALWcm7vhjRzQ")
# Function to call Mistral API with rate limit handling
def call_mistral_api(prompt):
url = "https://api.mistral.ai/v1/chat/completions"
headers = {
"Authorization": f"Bearer {api_key}",
"Content-Type": "application/json"
}
payload = {
"model": "mistral-medium",
"messages": [
{"role": "user", "content": prompt}
]
}
try:
start_time = time.time()
response = requests.post(url, headers=headers, json=payload)
latency = round(time.time() - start_time, 2) # in seconds
response.raise_for_status() # Raise an error for bad status codes
return response.json()['choices'][0]['message']['content']
except requests.exceptions.HTTPError as err:
if response.status_code == 429: # Rate limit exceeded
st.warning("Rate limit exceeded. Please wait a few seconds and try again.")
time.sleep(5) # Wait for 5 seconds before retrying
return call_mistral_api(prompt) # Retry the request
return f"HTTP Error: {err}"
except Exception as err:
return f"Error: {err}"
# Function to analyze a single requirement
def analyze_requirement(requirement):
latencies = {}
# Detect requirement type
type_prompt = f"Classify the following requirement as Functional or Non-Functional:\n\n{requirement}\n\nType:"
req_type, latencies["Type"] = call_mistral_api(type_prompt)
# Identify stakeholders
stakeholders_prompt = f"Identify the stakeholders for the following requirement:\n\n{requirement}\n\nStakeholders:"
stakeholders, latencies["Stakeholders"] = call_mistral_api(stakeholders_prompt)
# Classify domain
domain_prompt = f"Classify the domain for the following requirement (e.g., Bank, Healthcare, etc.):\n\n{requirement}\n\nDomain:"
domain, latencies["Domain"] = call_mistral_api(domain_prompt)
# Detect defects
defects_prompt = f"""Analyze the following requirement and identify ONLY MAJOR defects (e.g., Ambiguity, Incompleteness, etc.).
If the requirement is clear and complete, respond with 'No defects.'
Requirement: {requirement}
Defects:"""
defectss, latencies["Defects"] = call_mistral_api(defects_prompt)
# Rewrite requirement
rewritten, latencies["Rewritten"] = rewrite_requirement(requirement, defects)
total_latency = sum(latencies.values())
return {
"Requirement": requirement,
"Type": req_type,
"Stakeholders": stakeholders,
"Domain": domain,
"Defects": defects,
"Rewritten": rewritten,
"Latency (s)": round(total_latency, 2)
}
# Function to rewrite requirement concisely
def rewrite_requirement(requirement, defects):
if "no defects" in defects.lower():
return "No modification needed."
# If defects are found, generate a concise and clear rewritten requirement
prompt = f"""Rewrite the following requirement to address the defects listed below. Ensure the rewritten requirement is clear, concise, and free of defects. It should be no more than 1-2 sentences.
Original Requirement: {requirement}
Defects: {defects}
Rewritten Requirement:"""
response, latency = call_mistral_api(prompt)
return response.strip()
# Function to generate a PDF report with professional formatting
def generate_pdf_report(results):
pdf = FPDF()
pdf.add_page()
pdf.set_font("Arial", size=12)
# Add watermark
pdf.set_font("Arial", 'B', 50)
pdf.set_text_color(230, 230, 230) # Light gray color for watermark
pdf.rotate(45) # Rotate the text for watermark effect
pdf.text(60, 150, "AI Powered Requirement Analysis")
pdf.rotate(0) # Reset rotation
# Add title and date/time
pdf.set_font("Arial", 'B', 16)
pdf.set_text_color(0, 0, 0) # Black color for title
pdf.cell(200, 10, txt="AI Powered Requirement Analysis and Defect Detection using LLM Model Mistral", ln=True, align='C')
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt=f"Report Generated on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", ln=True, align='C')
pdf.ln(10) # Add some space
# Add requirements analysis
pdf.set_font("Arial", size=12)
for i, result in enumerate(results, start=1):
# Check if we need a new page
if pdf.get_y() > 250: # If the content is near the bottom of the page
pdf.add_page() # Add a new page
pdf.set_font("Arial", 'B', 16)
pdf.cell(200, 10, txt="AI Powered Requirement Analysis and Defect Detection using LLM Model Mistral", ln=True, align='C')
pdf.set_font("Arial", size=12)
pdf.cell(200, 10, txt=f"Report Generated on: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}", ln=True, align='C')
pdf.ln(10) # Add some space
# Add requirement details
pdf.set_font("Arial", 'B', 14)
pdf.multi_cell(200, 10, txt=f"Requirement R{i}: {result['Requirement']}", align='L')
pdf.set_font("Arial", size=12)
pdf.multi_cell(200, 10, txt=f"Type: {result['Type']}", align='L')
pdf.multi_cell(200, 10, txt=f"Stakeholders: {result['Stakeholders']}", align='L')
pdf.multi_cell(200, 10, txt=f"Domain: {result['Domain']}", align='L')
pdf.multi_cell(200, 10, txt=f"Defects: {result['Defects']}", align='L')
pdf.multi_cell(200, 10, txt=f"Rewritten: {result['Rewritten']}", align='L')
pdf.multi_cell(200, 10, txt="-" * 50, align='L')
pdf.ln(5) # Add some space between requirements
pdf_output = "requirements_report.pdf"
pdf.output(pdf_output)
return pdf_output
# Streamlit app
def main():
st.title("AI Powered Requirement Analysis and Defect Detection using Large Language Model Mistral")
st.markdown("**Team Name:** Sadia, Areeba, Rabbia, Tesmia")
st.markdown("**Model:** Mistral")
# Input requirements manually
input_text = st.text_area("Enter your requirements (one per line or separated by periods):")
requirements = []
if input_text:
# Split by periods or newlines
requirements = [req.strip() for req in input_text.replace("\n", ".").split(".") if req.strip()]
# Analyze requirements
if st.button("Analyze Requirements"):
if not requirements:
st.warning("Please enter requirements.")
else:
results = []
for req in requirements:
if req.strip(): # Ignore empty lines
results.append(analyze_requirement(req.strip()))
# Display results
st.subheader("Analysis Results")
for i, result in enumerate(results, start=1):
st.write(f"### Requirement R{i}: {result['Requirement']}")
st.write(f"**Type:** {result['Type']}")
st.write(f"**Stakeholders:** {result['Stakeholders']}")
st.write(f"**Domain:** {result['Domain']}")
st.write(f"**Defects:** {result['Defects']}")
st.write(f"**Rewritten:** {result['Rewritten']}")
st.write(f"**Total Latency:** {result['Latency (s)']} seconds")
st.write("---")
# Generate and download PDF report
pdf_report = generate_pdf_report(results)
with open(pdf_report, "rb") as f:
st.download_button(
label="Download PDF Report",
data=f,
file_name="requirements_report.pdf",
mime="application/pdf"
)
# Run the app
if __name__ == "__main__":
main() |