File size: 3,715 Bytes
43021dd
a91476c
8bb020e
 
673b345
 
8bb020e
 
 
673b345
 
 
8bb020e
673b345
 
 
 
 
 
8bb020e
a91476c
8bb020e
 
a91476c
673b345
8bb020e
a91476c
eb25c73
 
8bb020e
eb25c73
8bb020e
 
 
673b345
8bb020e
 
 
 
 
 
 
673b345
8bb020e
 
 
 
673b345
8bb020e
673b345
 
 
8bb020e
 
 
 
673b345
 
8bb020e
673b345
 
 
8bb020e
673b345
 
 
 
8bb020e
673b345
 
 
8bb020e
673b345
 
 
8bb020e
 
673b345
 
 
 
8bb020e
 
673b345
 
 
 
8bb020e
 
 
 
 
 
673b345
 
 
 
 
43021dd
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
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