File size: 5,193 Bytes
1397f6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
from google.colab import userdata
import litellm
from crewai import Agent, Task, Crew, Process
from crewai_tools import SerperDevTool
import pdfplumber
from docx import Document
import gradio as gr

# Set up API keys
litellm.api_key = userdata.get("GOOGLE_API_KEY")
os.environ['SERPER_API_KEY'] = userdata.get('SERPER_API_KEY')

# Define the LLM
llm = "gemini/gemini-1.5-flash-exp-0827"  # Your LLM model

# Initialize the tool for internet searching capabilities
tool = SerperDevTool()

# Create the CV Analysis Agent
cv_analysis_agent = Agent(
    role="CV Analyzer",
    goal='Analyze the given CV and extract key skills and experiences and make improvements if needed for portfolio creation.',
    verbose=True,
    memory=True,
    backstory=(
        "As a CV Analyzer, you are skilled in identifying key information "
        "from resumes to aid in building effective portfolios."
        "You can add relevant skills and job responsibilities evaluating the whole cv."
    ),
    tools=[tool],
    llm=llm,
    allow_delegation=True
)

# Create the Portfolio Generation Agent
portfolio_generation_agent = Agent(
    role='Portfolio Generator',
    goal='Generate a beautiful static HTML/CSS/JS landing portfolio webpage based on CV analysis.',
    verbose=True,
    memory=True,
    backstory=(
        "As a Portfolio Generator, you craft engaging web pages with effective functionalities and color combinations "
        "to showcase individual talents and experiences with the best user experience."
    ),
    tools=[tool],
    llm=llm,
    allow_delegation=False
)

# Research task for CV analysis
cv_analysis_task = Task(
    description=(
        "Analyze the provided {cv} and identify key skills, experiences, "
        "and accomplishments. Highlight notable projects and educational background."
    ),
    expected_output='A summary of skills, experiences, and projects formatted for a portfolio.',
    tools=[tool],
    agent=cv_analysis_agent,
)

# Writing task for portfolio generation with enhanced UI requirements
portfolio_task = Task(
    description=(
        "Generate a static HTML/CSS/JS landing portfolio with a name as header in top, navbar for different sections, beautiful and responsive design. "
        "Ensure that the layout is clean, with sections for skills, projects, experiences, certifications, publications, and contact details if present in the CV. "
        "Include a footer that does not overlap with the content. "
        "Use a modern color palette and incorporate CSS frameworks if necessary, "
        "but provide everything embedded in the HTML file. "
        "The output should be a complete HTML document starting from <html> to </html>, ready to deploy."
    ),
    expected_output='A complete HTML/CSS/JS code content only for a portfolio website in a single .html file',
    tools=[tool],
    agent=portfolio_generation_agent,
    async_execution=False,
    output_file='portfolio.html'  # Output as HTML file
)

# Function to read CV from PDF or DOCX file
def read_cv_file(file_path):
    ext = os.path.splitext(file_path)[1].lower()
    cv_content = ""

    if ext == '.pdf':
        with pdfplumber.open(file_path) as pdf:
            for page in pdf.pages:
                cv_content += page.extract_text()
    elif ext == '.docx':
        doc = Document(file_path)
        for para in doc.paragraphs:
            cv_content += para.text + "\n"
    else:
        raise ValueError("Unsupported file format. Please use .pdf or .docx.")

    return cv_content.strip()

# Create a Crew for processing
crew = Crew(
    agents=[cv_analysis_agent, portfolio_generation_agent],
    tasks=[cv_analysis_task, portfolio_task],
    process=Process.sequential,
)

# Function to process CV and generate portfolio
import re

# Function to process CV and generate portfolio
def process_cv(file):
    try:
        cv_file_content = read_cv_file(file.name)
        result = crew.kickoff(inputs={'cv': cv_file_content})

        # Print the entire result object to explore its contents (for debugging)
        print(result)

        # Convert the result to string
        html_output = str(result)

        # Use replace to remove '''html''' and ''' from the output
        clean_html_output = html_output.replace("'''html'''", '').replace("'''", '').strip()

        return clean_html_output  # Return the cleaned HTML
    except Exception as e:
        return f"Error: {e}"

# Gradio UI using Blocks
with gr.Blocks() as iface:
    gr.Markdown("# CV-2-HTML AI Enhanced Portfolio Website Generation")
    gr.Markdown("Upload your CV in PDF or DOCX format to analyze its content and generate a portfolio.")
    
    # File input for uploading CV
    cv_input = gr.File(label="Upload your CV (.pdf or .docx)")
    
    # Output textbox for generated HTML
    output_textbox = gr.Textbox(label="Generated HTML", lines=20, placeholder="Your generated HTML will appear here...", interactive=True)
    
    # Process button
    process_button = gr.Button("Generate Portfolio")
    
    # Define the button actions
    process_button.click(fn=process_cv, inputs=cv_input, outputs=output_textbox)

# Launch the Gradio interface
iface.launch()