Spaces:
Running
Running
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()
|