-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.py
99 lines (81 loc) · 3.63 KB
/
app.py
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
import uvicorn
import base64
from fastapi import FastAPI, File, UploadFile
from fastapi.responses import JSONResponse
from datetime import datetime
import mammoth
import os
from crewai import Agent, Task, Crew, Process
from crewai_tools import FileReadTool, MDXSearchTool
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
app = FastAPI()
load_dotenv()
openai_api_key = os.getenv("openai_api_key")
os.environ["OPENAI_MODEL_NAME"] = 'gpt-3.5-turbo'
os.environ["OPENAI_API_KEY"] = openai_api_key
@app.post("/upload")
async def upload_file(file: dict):
current_datetime = datetime.now().strftime("%Y-%m-%d %H-%M-%S")
filename = f'meeting-transcription/meeting-transcript_{current_datetime}.md'
print(filename)
# Save file and convert to markdown
content = base64.b64decode(file.get("document"))
src_filename = file.get("filename")
with open(f"{src_filename}", "wb") as docx_file:
docx_file.write(content)
with open(src_filename, "rb") as docx_file:
result = mammoth.convert_to_markdown(docx_file)
with open(filename, 'w', encoding='utf-8') as f:
f.write(result.value)
response = call_crew_kickoff(current_datetime)
output_filename = f"generated-brd/generated-brd_{current_datetime}.md"
with open(output_filename, 'w', encoding='utf-8') as f:
f.write(response)
return JSONResponse(content={"file_url": output_filename, "brd_content": response})
def call_crew_kickoff(str_current_datetime):
# Setup CrewAI agents and tasks
mt_tool = FileReadTool(txt=f'./meeting-transcription/meeting-transcript_{str_current_datetime}.md')
semantic_search_resume = MDXSearchTool(mdx=f'./meeting-transcription/meeting-transcript_{str_current_datetime}.md')
with open(f'./meeting-transcription/meeting-transcript_{str_current_datetime}.md', 'r', encoding='utf-8') as file:
transcript_content = file.read()
cleaned_transcript_content = transcript_content.replace('\ufeff', '')
with open('./brd-template/brd-template.md', 'r', encoding='utf-8') as file:
brd_template_content = file.read()
cleaned_brd_template = brd_template_content.replace('\ufeff', '')
business_analyst = Agent(
role="Business Analyst",
goal="Effectively translate the meeting transcript and discussions into a well-structured BRD...",
tools=[mt_tool, semantic_search_resume],
allow_delegation=False,
verbose=True,
backstory="You come from a background in business analysis..."
)
subject_matter_expert = Agent(
role="Subject Matter Expert",
goal="Ensure the BRD accurately reflects the project's technical feasibility...",
tools=[mt_tool, semantic_search_resume],
allow_delegation=False,
verbose=True,
backstory="You possess in-depth knowledge and experience specific to the project's domain..."
)
analyze_meeting_for_brd = Task(
description="Analyze the meeting transcript and create a BRD...",
expected_output="A well-structured BRD...",
agent=business_analyst,
)
sme_technical_review = Task(
description="Review the BRD for technical accuracy...",
expected_output="Comprehensive and refined BRD document...",
agent=subject_matter_expert,
)
crew = Crew(
agents=[business_analyst, subject_matter_expert],
tasks=[analyze_meeting_for_brd, sme_technical_review],
verbose=2,
manager_llm=ChatOpenAI(temperature=0, model="gpt-3.5-turbo"),
process=Process.hierarchical,
memory=True,
)
result = crew.kickoff(inputs={'datetime': str_current_datetime})
return result