Spaces:
Sleeping
Sleeping
import warnings | |
warnings.filterwarnings('ignore') | |
from crewai import Agent, Task, Crew | |
from crewai_tools import ( | |
#DirectoryReadTool, | |
#FileReadTool, | |
#SerperDevTool, | |
#WebsiteSearchTool, | |
#DOCXSearchTool, | |
#RagTool, | |
TXTSearchTool | |
) | |
from datetime import datetime | |
import os | |
from utils import get_openai_api_key | |
openai_api_key = get_openai_api_key() | |
os.environ["OPENAI_MODEL_NAME"] = 'gpt-3.5-turbo' | |
os.environ["OPENAI_API_KEY"] = "sk-proj-8nKBOgxInYCIqidcdSu7T3BlbkFJWac8qZbpFOE2TSn0OpId" | |
def call_crew_kickoff(str_current_datetime): | |
# Instantiate tools | |
#meeting_trans_docs_tool = DirectoryReadTool(directory='./meeting-transcription') | |
#brd_temp_docs_tool = DirectoryReadTool(directory='./brd-template') | |
#file_tool = FileReadTool() | |
#web_rag_tool = WebsiteSearchTool() | |
#docx_search_tool = DOCXSearchTool() | |
#rag_tool = RagTool() | |
mt_tool = TXTSearchTool(txt='./meeting-transcription/meeting-transcript_' + str_current_datetime + '.txt') | |
brd_tool = TXTSearchTool(txt='./brd-template/brd-template.txt') | |
text_parsing_agent = Agent( | |
role="Text Interpreter", | |
goal="Parse and interpret the raw text input, structuring it into manageable sections" | |
"or data points that are relevant for analysis and processing.", | |
backstory="You excel at deciphering complex textual data. You act as the first line of analysis," | |
"turning unstructured text into organized segments. You should enhance efficiency in data" | |
"handling and support subsequent stages of data processing.", | |
tools=[mt_tool], | |
allow_delegation=True, | |
verbose=True | |
) | |
data_extraction_agent = Agent( | |
role="Data Extraction Agent", | |
goal="Identify and extract essential data points, statistics," | |
"and specific information from the parsed text that are crucial" | |
"for drafting a Business Requirements Document.", | |
backstory="You should tackle the challenge of sifting through detailed textual data to" | |
"find relevant information. You should be doing it with precision and speed, equipped" | |
"with capabilities to recognize and categorize data efficiently, making it invaluable" | |
"for projects requiring quick turnaround and accurate data handling.", | |
tools=[mt_tool, brd_tool], | |
allow_delegation=True, | |
verbose=True | |
) | |
brd_compiler_agent = Agent( | |
role="BRD Compiler", | |
goal="Assemble the extracted data into a well-structured Business Requirements Document," | |
"ensuring that it is clear, coherent, and formatted according to standards.", | |
backstory="You are a meticulous Business Requirement Document compiler, You should alleviate" | |
"the burdens of manual document assembly. Ensure that all documents are crafted with" | |
"precision, adhering to organizational standards, and ready for stakeholder review. You" | |
"should be automating routine documentation tasks, thus allowing human team members to focus" | |
"on more strategic activities.", | |
tools=[brd_tool], | |
allow_delegation=True, | |
verbose=True | |
) | |
text_parsing = Task( | |
description=( | |
"1. Open and read the contents of the input text file.\n" | |
"2. Analyze the document structure to identify headings, subheadings, and key paragraphs.\n" | |
"3. Extract text under each identified section, ensuring context is preserved.\n" | |
"4. Format the extracted text into a JSON structure with labels indicating the type" | |
"of content (e.g., heading, detail)." | |
), | |
expected_output="Structured JSON object containing separated sections of" | |
"text with labels based on their content type.", | |
agent=text_parsing_agent, | |
) | |
data_extraction = Task( | |
description=( | |
"1. Take the JSON structured data from the Text Parsing Agent.\n" | |
"2. Identify and extract specific data points like project goals, technical requirements," | |
"and stakeholder information.\n" | |
"3. Organize the extracted data into relevant categories for easy access and use.\n" | |
"4. Format all extracted data into a structured form suitable for document generation," | |
"ensuring it's ready for template insertion.\n" | |
), | |
expected_output="A comprehensive list of key data points organized by category, ready for use in document generation.", | |
agent=data_extraction_agent, | |
) | |
compile_brd = Task( | |
description=( | |
"1. Accept the structured and categorized data from the Data Extraction Agent.\n" | |
"2. Open and read the BRD template for data insertion.\n" | |
"3. Insert the received data into the respective sections of the BRD template.\n" | |
"4. Apply formatting rules to ensure the document is professional and adheres to standards.\n" | |
"5. Save the populated and formatted document as a new markdown file, marking the task as complete.\n" | |
), | |
expected_output="A complete Business Requirements Document in markdown format, ready for review and distribution.", | |
agent=brd_compiler_agent, | |
output_file='generated-brd/brd_' + str_current_datetime + '.md', # The final blog post will be saved here | |
) | |
crew = Crew( | |
agents=[text_parsing_agent, data_extraction_agent, brd_compiler_agent], | |
tasks=[text_parsing, data_extraction, compile_brd], | |
verbose=2 | |
) | |
result = crew.kickoff(inputs={'datetime': str_current_datetime}) | |
import gradio as gr | |
def process_file(input_file): | |
current_datetime = datetime.now().strftime("%Y-%m-%d %H-%M-%S") | |
print("Current date & time : ", current_datetime) | |
# convert datetime obj to string | |
str_current_datetime = str(current_datetime) | |
fh = open(input_file, 'rb') | |
#data = fh.read() | |
# Ensure the target directory exists | |
output_dir = "meeting-transcription" | |
if not os.path.exists(output_dir): | |
os.makedirs(output_dir) | |
# Save the uploaded file to the specified folder with the specified name | |
input_filepath = os.path.join(output_dir, "meeting-transcript_" + str_current_datetime + ".txt") | |
with open(input_filepath, "wb") as file: | |
file.write(fh.read()) | |
fh.close() | |
call_crew_kickoff(str_current_datetime) | |
# Example of processing: adding Markdown formatting. Replace this with your actual processing. | |
#processed_text = "# Processed Output\n\n" + "\n".join(f"- {line}" for line in text.splitlines()) | |
output_filename = "generated-brd/brd_" + str_current_datetime + ".md" | |
#with open(output_filename, "w") as file: | |
# file.write(processed_text) | |
# Read the contents of the generated Markdown file | |
with open(output_filename, "r") as md_file: | |
markdown_content = md_file.read() | |
# Return both the filename for download and the Markdown content for display | |
return output_filename, markdown_content | |
with gr.Blocks() as demo: | |
with gr.Row(): | |
file_input = gr.File(label="Upload a text file") | |
download_btn = gr.File(label="Download Processed File in Markdown", file_count="single") | |
with gr.Row(): | |
markdown_output = gr.Markdown() | |
file_input.change(process_file, inputs=file_input, outputs=[download_btn, markdown_output]) | |
demo.launch(share=True) | |