Spaces:
Paused
Paused
import base64 | |
import io | |
import os | |
import threading | |
import time | |
from typing import List, Tuple | |
import dash | |
import dash_bootstrap_components as dbc | |
from dash import html, dcc, Input, Output, State, ctx | |
import google.generativeai as genai | |
from docx import Document | |
from PyPDF2 import PdfReader | |
# Initialize Dash app | |
app = dash.Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP]) | |
# Configure Gemini AI | |
genai.configure(api_key=os.environ["GEMINI_API_KEY"]) | |
model = genai.GenerativeModel('gemini-pro') | |
def process_document(contents: str, filename: str) -> str: | |
content_type, content_string = contents.split(',') | |
decoded = base64.b64decode(content_string) | |
if filename.endswith('.pdf'): | |
pdf = PdfReader(io.BytesIO(decoded)) | |
text = "" | |
for page in pdf.pages: | |
text += page.extract_text() | |
elif filename.endswith('.docx'): | |
doc = Document(io.BytesIO(decoded)) | |
text = "\n".join([para.text for para in doc.paragraphs]) | |
else: | |
return "Unsupported file format. Please upload a PDF or DOCX file." | |
return text | |
def generate_outline(text: str) -> str: | |
prompt = f""" | |
Analyze the following Project Work Statement (PWS) and create an outline | |
focusing on sections L&M. Extract the main headers, subheaders, and specific | |
requirements in each section. Summarize the key points: | |
{text} | |
Provide the outline in a structured format. | |
""" | |
response = model.generate_content(prompt) | |
return response.text | |
def generate_pink_team_document(outline: str) -> str: | |
prompt = f""" | |
Based on the following outline of a Project Work Statement (PWS): | |
{outline} | |
Create a detailed response document as if MicroHealth is responding to this PWS. | |
Follow these guidelines: | |
1. Use Wikipedia style writing with active voice. | |
2. For each requirement, describe in detail how MicroHealth will innovate to address it. | |
3. Explain the industry best practices that will be applied. | |
4. Provide measurable outcomes for the customer. | |
5. Limit the use of bullet points and write predominantly in paragraph format. | |
6. Ensure a logical flow of steps taken by MicroHealth for each requirement. | |
Generate a comprehensive response that showcases MicroHealth's expertise and approach. | |
""" | |
response = model.generate_content(prompt) | |
return response.text | |
# Layout | |
app.layout = dbc.Container([ | |
html.H1("MicroHealth PWS Analysis and Response Generator", className="my-4"), | |
dbc.Tabs([ | |
dbc.Tab(label="Shred", tab_id="shred", children=[ | |
dcc.Upload( | |
id='upload-document', | |
children=html.Div(['Drag and Drop or ', html.A('Select Files')]), | |
style={ | |
'width': '100%', | |
'height': '60px', | |
'lineHeight': '60px', | |
'borderWidth': '1px', | |
'borderStyle': 'dashed', | |
'borderRadius': '5px', | |
'textAlign': 'center', | |
'margin': '10px' | |
}, | |
multiple=False | |
), | |
dbc.Spinner(html.Div(id='shred-output')), | |
dbc.Button("Download Outline", id="download-shred", className="mt-3"), | |
dcc.Download(id="download-shred-doc") | |
]), | |
dbc.Tab(label="Pink", tab_id="pink", children=[ | |
dbc.Button("Generate Pink Team Document", id="generate-pink", className="mt-3"), | |
dbc.Spinner(html.Div(id='pink-output')), | |
dbc.Button("Download Pink Team Document", id="download-pink", className="mt-3"), | |
dcc.Download(id="download-pink-doc") | |
]), | |
], id="tabs", active_tab="shred"), | |
]) | |
def update_shred_output(contents, filename): | |
if contents is None: | |
return "Upload a document to begin." | |
text = process_document(contents, filename) | |
outline = generate_outline(text) | |
return dcc.Markdown(outline) | |
def update_pink_output(n_clicks, shred_output): | |
if n_clicks is None or shred_output is None: | |
return "Generate an outline in the Shred tab first." | |
pink_doc = generate_pink_team_document(shred_output) | |
return dcc.Markdown(pink_doc) | |
def download_shred(n_clicks, shred_output): | |
if shred_output is None: | |
return dash.no_update | |
return dict(content=shred_output, filename="shred_outline.md") | |
def download_pink(n_clicks, pink_output): | |
if pink_output is None: | |
return dash.no_update | |
return dict(content=pink_output, filename="pink_team_document.md") | |
if __name__ == '__main__': | |
print("Starting the Dash application...") | |
app.run(debug=True, host='0.0.0.0', port=7860) | |
print("Dash application has finished running.") |