Spaces:
Build error
Build error
import gradio as gr | |
import cohere | |
from docx import Document | |
from docx.shared import Pt | |
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT | |
import pypandoc | |
import os | |
# Initialize Cohere client with your API key | |
cohere_api_key = '' # Replace with your actual Cohere API key | |
co = cohere.Client(cohere_api_key) | |
def generate_body(job_description, language): | |
# Set the language model based on user selection | |
model = 'command-xlarge-nightly' # Default to command-xlarge-nightly model for both English and German | |
# Modify the prompt to exclude greetings | |
prompt = f"Write a professional job application letter in {language} without a greeting. Only generate the body text based on this job description:\n{job_description}" | |
# Use Cohere's API to generate the body of the application letter | |
response = co.generate( | |
model=model, | |
prompt=prompt, | |
max_tokens=250, # Reduced to ensure the content fits on one page | |
temperature=0.7, | |
) | |
return response.generations[0].text.strip() | |
def create_application_letter(name, address, email, phone, job_position, employer_name, greeting_option, employer_contact_name, employer_address, job_id, start_date, job_description, language, output_format): | |
# Generate the body using the job description and language | |
body = generate_body(job_description, language) | |
# Create a new Document | |
doc = Document() | |
# Add header with sender's name, address, email, and phone in a single line | |
header = doc.sections[0].header | |
header_paragraph = header.paragraphs[0] | |
header_paragraph.text = f"{name} | {address} | {email} | {phone}" | |
header_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT | |
# Adjust the font size for the header | |
for run in header_paragraph.runs: | |
run.font.size = Pt(10) | |
# Add one blank line above the employer's information | |
doc.add_paragraph("\n") | |
# Add the date and employer's information in the main document | |
doc.add_paragraph(f"{employer_name}\n{employer_contact_name if greeting_option == 'Known' else ''}\n{employer_address}") | |
doc.add_paragraph(f"{address.split(',')[1]}, {start_date}\n\n") # Assuming the city is part of the address | |
# Add the subject | |
doc.add_paragraph(f"Bewerbung als {job_position}\nKennnummer {job_id}\n", style='Heading 2') | |
# Add the greeting based on the selected option | |
if language == "German": | |
if greeting_option == "Known" and employer_contact_name: | |
doc.add_paragraph(f"Sehr geehrter Herr {employer_contact_name.split()[0]},\n") | |
else: | |
doc.add_paragraph("Sehr geehrte Damen und Herren,\n") | |
else: | |
if greeting_option == "Known" and employer_contact_name: | |
doc.add_paragraph(f"Dear {employer_contact_name},\n") | |
else: | |
doc.add_paragraph("Dear Sir/Madam,\n") | |
# Add the generated body of the letter | |
doc.add_paragraph(body) | |
# Add closing | |
closing_text = ( | |
f"\nIch unterstütze Ihr Team gerne ab dem {start_date} und freue mich über die Einladung zu einem persönlichen Vorstellungsgespräch." | |
if language == "German" else | |
f"\nI am eager to join your team starting on {start_date} and look forward to the opportunity to discuss my application further." | |
) | |
doc.add_paragraph(closing_text) | |
doc.add_paragraph("\nMit freundlichen Grüßen,\n\n" if language == "German" else "\nSincerely,\n\n") | |
doc.add_paragraph(f"{name}\n") | |
# Adjust font size for body to ensure it fits on one page | |
for paragraph in doc.paragraphs: | |
for run in paragraph.runs: | |
run.font.size = Pt(11) # Slightly reduced to ensure one-page fit | |
# Save the document | |
output_filename_docx = f'{name}_application_letter.docx' | |
doc.save(output_filename_docx) | |
# Convert to PDF if requested | |
if output_format == "PDF": | |
output_filename_pdf = f'{name}_application_letter.pdf' | |
pypandoc.convert_file(output_filename_docx, 'pdf', outputfile=output_filename_pdf) | |
os.remove(output_filename_docx) # Optionally remove the DOCX file after conversion | |
return output_filename_pdf | |
else: | |
return output_filename_docx | |
def generate_and_download(name, address, email, phone, job_position, employer_name, greeting_option, employer_contact_name, employer_address, job_id, start_date, job_description, language, output_format): | |
# Generate the application letter | |
output_filename = create_application_letter(name, address, email, phone, job_position, employer_name, greeting_option, employer_contact_name, employer_address, job_id, start_date, job_description, language, output_format) | |
# Return the file for download | |
return output_filename | |
# Define the Gradio interface | |
with gr.Blocks() as demo: | |
name = gr.Textbox(label="Name", placeholder="Enter your full name", value="Claire Waßer") | |
address = gr.Textbox(label="Address", placeholder="Enter your address", value="Musterstraße 78, 23456 Musterstadt") | |
email = gr.Textbox(label="Email", placeholder="Enter your email", value="[email protected]") | |
phone = gr.Textbox(label="Phone", placeholder="Enter your phone number", value="0171 23456789") | |
job_position = gr.Textbox(label="Job Position", placeholder="Enter the job position", value="Physiotherapeutin") | |
employer_name = gr.Textbox(label="Employer Name", placeholder="Enter the employer's name", value="Arbeitgeber GmbH") | |
greeting_option = gr.Dropdown(choices=["Known", "Unknown"], label="Is the recipient's name known?", value="Unknown") | |
employer_contact_name = gr.Textbox(label="Employer Contact Name", placeholder="Enter the contact person's name (if known)", value="Name Nachname", visible=False) | |
employer_address = gr.Textbox(label="Employer Address", placeholder="Enter the employer's address", value="Straße 123, 12345 Musterstadt") | |
job_id = gr.Textbox(label="Job ID", placeholder="Enter the job ID", value="123456") | |
start_date = gr.Textbox(label="Start Date", placeholder="Enter the start date (e.g., 15.05.2020)", value="18.08.2024") | |
job_description = gr.Textbox(label="Job Description", placeholder="Paste the job description here", lines=7, value="Aktuell stehe ich am Ende meiner Berufsausbildung zur staatlich anerkannten Physiotherapeutin...") | |
language = gr.Dropdown(choices=["English", "German"], label="Select Language", value="German") | |
output_format = gr.Dropdown(choices=["DOCX", "PDF"], label="Select Output Format", value="PDF") | |
# Show or hide the employer contact name input based on the greeting option | |
def update_visibility(greeting_option): | |
return gr.update(visible=(greeting_option == "Known")) | |
greeting_option.change(update_visibility, inputs=greeting_option, outputs=employer_contact_name) | |
generate_button = gr.Button("Generate Application Letter") | |
output = gr.File(label="Download your application letter") | |
generate_button.click(generate_and_download, | |
inputs=[name, address, email, phone, job_position, employer_name, greeting_option, employer_contact_name, employer_address, job_id, start_date, job_description, language, output_format], | |
outputs=output) | |
# Launch the Gradio interface | |
demo.launch(debug=True) | |