File size: 7,836 Bytes
5d62c16
 
d247f78
5d62c16
 
 
 
d247f78
5d62c16
d247f78
 
46e62a6
d247f78
46e62a6
d247f78
5d62c16
 
 
d247f78
 
5d62c16
 
 
 
 
d247f78
5d62c16
 
 
 
d247f78
5d62c16
 
 
 
 
 
d247f78
5d62c16
 
 
 
 
d247f78
5d62c16
d247f78
 
 
 
 
5d62c16
 
 
 
 
d247f78
5d62c16
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d247f78
5d62c16
 
 
 
 
 
 
d247f78
5d62c16
 
 
 
d247f78
 
5d62c16
 
d247f78
 
 
 
 
 
 
 
 
 
5d62c16
d247f78
d7ebe92
d247f78
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5d62c16
 
 
 
 
 
 
 
 
 
 
 
d247f78
5d62c16
 
 
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
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)