Spaces:
Build error
Build error
| import gradio as gr | |
| import cohere | |
| import os | |
| from docx import Document | |
| from docx.shared import Pt | |
| from docx.enum.text import WD_PARAGRAPH_ALIGNMENT | |
| import pypandoc | |
| from datetime import datetime | |
| # Get the API key from environment variables | |
| cohere_api_key = os.getenv('COHERE_API_KEY') | |
| if not cohere_api_key: | |
| raise ValueError("Please set the COHERE_API_KEY environment variable") | |
| # Initialize Cohere client with your API key | |
| co = cohere.Client(cohere_api_key) | |
| def generate_body(job_description, language): | |
| model = 'command-xlarge-nightly' | |
| 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}" | |
| response = co.generate( | |
| model=model, | |
| prompt=prompt, | |
| max_tokens=250, | |
| temperature=0.7, | |
| ) | |
| return response.generations[0].text.strip() | |
| def create_application_letter(name, sender_street, sender_zip, sender_city, email, phone, job_position, employer_name, employer_street, employer_zip, employer_city, greeting_option, employer_contact_name, job_id, start_date, job_description, language, output_format): | |
| body = generate_body(job_description, language) | |
| doc = Document() | |
| header = doc.sections[0].header | |
| header_paragraph = header.paragraphs[0] | |
| header_paragraph.text = f"{name} | {sender_street}, {sender_zip} {sender_city} | {email} | {phone}" | |
| header_paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT | |
| for run in header_paragraph.runs: | |
| run.font.size = Pt(10) | |
| doc.add_paragraph(f"{employer_name}\n{employer_contact_name if greeting_option == 'Known' else ''}\n{employer_street}\n{employer_zip} {employer_city}") | |
| current_date = datetime.now().strftime('%d.%m.%Y') | |
| paragraph = doc.add_paragraph() | |
| paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT | |
| run = paragraph.add_run(f"{employer_city}, {current_date}") | |
| run.font.size = Pt(11) | |
| doc.add_paragraph(f"Bewerbung als {job_position}\nKennnummer {job_id}\n", style='Heading 2') | |
| if language == "German": | |
| if greeting_option == "Known" and employer_contact_name: | |
| doc.add_paragraph(f"Sehr geehrter Herr {employer_contact_name},\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") | |
| doc.add_paragraph(body) | |
| 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") | |
| for paragraph in doc.paragraphs: | |
| for run in paragraph.runs: | |
| run.font.size = Pt(11) | |
| output_filename_docx = f'{name}_application_letter.docx' | |
| doc.save(output_filename_docx) | |
| 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) | |
| return output_filename_pdf | |
| else: | |
| return output_filename_docx | |
| def generate_and_download(name, sender_street, sender_zip, sender_city, email, phone, job_position, employer_name, employer_street, employer_zip, employer_city, greeting_option, employer_contact_name, job_id, start_date, job_description, language, output_format): | |
| output_filename = create_application_letter(name, sender_street, sender_zip, sender_city, email, phone, job_position, employer_name, employer_street, employer_zip, employer_city, greeting_option, employer_contact_name, job_id, start_date, job_description, language, output_format) | |
| return output_filename | |
| description = """ | |
| # Professional Job Application Letter Generator | |
| Welcome to the ultimate tool for crafting professional job application letters with ease. This tool leverages the power of **Cohere**, a state-of-the-art language model, to automatically generate a tailored application letter body based on the job description you provide. | |
| Simply fill in the required details, and within seconds, you'll have a beautifully formatted job application letter ready to download in either DOCX or PDF format. | |
| Start your journey to your next career opportunity with a compelling application letter generated just for you! | |
| """ | |
| with gr.Blocks() as demo: | |
| gr.Markdown(description) | |
| name = gr.Textbox(label="Name", placeholder="Enter your full name", value="Maximilian Müller") | |
| sender_street = gr.Textbox(label="Sender Street", placeholder="Enter your street address", value="Beispielstraße 42") | |
| sender_zip = gr.Textbox(label="Sender Postal Code", placeholder="Enter your postal code", value="10115") | |
| sender_city = gr.Textbox(label="Sender City", placeholder="Enter your city", value="Berlin") | |
| email = gr.Textbox(label="Email", placeholder="Enter your email", value="max.mueller@example.com") | |
| phone = gr.Textbox(label="Phone", placeholder="Enter your phone number", value="+49 170 1234567") | |
| job_position = gr.Textbox(label="Job Position", placeholder="Enter the job position", value="Softwareentwickler") | |
| employer_name = gr.Textbox(label="Employer Name", placeholder="Enter the employer's name", value="Tech Innovations GmbH") | |
| employer_street = gr.Textbox(label="Employer Street", placeholder="Enter the employer's street address", value="Innovationsstraße 1") | |
| employer_zip = gr.Textbox(label="Employer Postal Code", placeholder="Enter the employer's postal code", value="10115") | |
| employer_city = gr.Textbox(label="Employer City", placeholder="Enter the employer's city", value="Berlin") | |
| greeting_option = gr.Dropdown(choices=["Known", "Unknown"], label="Is the recipient's name known?", value="Known") | |
| employer_contact_name = gr.Textbox(label="Employer Contact Name", placeholder="Enter the contact person's name (if known)", value="Herr Dr. Felix Schmidt", visible=True) | |
| job_id = gr.Textbox(label="Job ID", placeholder="Enter the job ID", value="DEV-2024-01") | |
| start_date = gr.Textbox(label="Start Date", placeholder="Enter the start date (e.g., 15.05.2020)", value="01.09.2024") | |
| job_description = gr.Textbox(label="Job Description", placeholder="Paste the job description here", lines=7, value="We are seeking a dedicated Software Developer to join our team in creating innovative applications. Experience in Python and Java, as well as knowledge of agile methodologies, is required.") | |
| language = gr.Dropdown(choices=["English", "German"], label="Select Language", value="German") | |
| output_format = gr.Dropdown(choices=["DOCX", "PDF"], label="Select Output Format", value="PDF") | |
| 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, sender_street, sender_zip, sender_city, email, phone, job_position, employer_name, employer_street, employer_zip, employer_city, greeting_option, employer_contact_name, job_id, start_date, job_description, language, output_format], | |
| outputs=output) | |
| demo.launch(debug=True) | |