File size: 11,856 Bytes
81feeba
bc49c7c
 
 
025b987
 
 
bc49c7c
81feeba
d2f51cb
 
 
 
 
 
 
bc49c7c
 
d2f51cb
bc49c7c
 
 
 
d2f51cb
 
 
 
 
 
bc49c7c
 
 
d2f51cb
 
 
 
bc49c7c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d2f51cb
 
 
bc49c7c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d2f51cb
bc49c7c
d633195
bc49c7c
d2f51cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bc49c7c
 
d2f51cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ea3924a
 
 
 
 
 
d2f51cb
ea3924a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
d2f51cb
ea3924a
 
 
 
 
 
 
bc49c7c
d2f51cb
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
import json
import os
import gradio as gr
import requests
import recruiting_assistant


def search_resume(input_text):
    url = f"https://n970resrb9.execute-api.eu-west-1.amazonaws.com/dev/prediction"  # replace with your API endpoint
    headers = {
        "Content-Type": "application/json",
        "x-api-key": os.environ["API_KEY"],
    }  # adjust headers as needed
    response = requests.post(
        url, headers=headers, data=json.dumps({"text": input_text})
    )
    response_data = response.json()

    if "prediction" in response_data:
        prediction = response_data["prediction"]
        if isinstance(prediction, list):
            # Insert a newline after each '.'
            # Insert a newline after each '.' and add "Candidate <follow up number>:\n" before each item
            updated_prediction = [
                f"Candidate {i+1}:\n=============================\n{s}"
                for i, s in enumerate(prediction)
            ]
            updated_prediction = [s.replace(". ", ".\n") for s in updated_prediction]
            updated_prediction = [s.replace("•", "\n - ") for s in updated_prediction]
            return "\n\n".join(updated_prediction)
    return "No 'prediction' key found in the response or the 'body' is not a list."


examples = [
    [
        """
DATA SCIENTIST - GENTIS
========================
I am in contact with a top company in Ghent where they are looking for an additional Data Scientist. Beware... Once you start there, you won't be leaving anytime soon. The company likes to keep their employees happy, so few leave.

The profile

Min of 3 years experience as a Data Scientist
Experience in Python and SQL
Communicative very strong
Experience in coaching and supporting junior collegues
Experience in Google Cloud is a plus
Experience in Machine Learning is a plus
They offer
An opportunity to be part of not only a fast-growing, innovative company, but one where you as a person can grow professionally as fast as the company
A close-knit and diverse team who are all ready to help, listen and give advice to each other
Training opportunities (because they don't stand still, so neither do you)
Trendy and young company where everyone can be their own
A very nice salary package and much more
Lots of remote work and flexibility, so bye bye traffic JAMS!
A renovated office with everything you could dream of full with surprises and extras

If you are interested or want more info, don't hesitate to contact me.
"""
    ],
    [
        """
Payroll, Benefits & Office Manager
================================

Your mission:
As Payroll, Benefits & Office Manager, you will play a crucial role in ensuring an outstanding service to our employees throughout their employee journey. 
You will be managing a team of 5, whilst improving systems and processes and providing support to the overall People and Organisation team. 

Your responsibilities:
Manage the People Services team to deliver a "first time right " approach to service delivery, coaching and development of key skills and knowledge ensuring adequate cover across all work areas.
Responsibility for ensuring that all HR administrative tasks across the full employee life cycle including pre- and post-employment administration, contract issue, contract amendments.

Your profile:
You have a proven track record in People Management.
Your field of expertise lies in payroll and comp&ben, and experience in Facility Management or Property Management is a strong plus.

What we offer you :
A company on a human scale in which you quickly see the impact of your actions
An attractive salary package with company car, accompanied by various extra-legal benefits (meal vouchers, group insurance, hospitalization insurance, etc.)
39 days off per year
"""
    ],
]


css = """
        .gradio-container {
            font-family: 'IBM Plex Sans', sans-serif;
        }
        .gr-button {
            color: white;
            border-color: black;
            background: black;
        }
        input[type='range'] {
            accent-color: black;
        }
        .dark input[type='range'] {
            accent-color: #dfdfdf;
        }
        .container {
            max-width: 730px;
            margin: auto;
            padding-top: 1.5rem;
        }
        #gallery {
            min-height: 22rem;
            margin-bottom: 15px;
            margin-left: auto;
            margin-right: auto;
            border-bottom-right-radius: .5rem !important;
            border-bottom-left-radius: .5rem !important;
        }
        #gallery>div>.h-full {
            min-height: 20rem;
        }
        .details:hover {
            text-decoration: underline;
        }
        .gr-button {
            white-space: nowrap;
        }
        .gr-button:focus {
            border-color: rgb(147 197 253 / var(--tw-border-opacity));
            outline: none;
            box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000);
            --tw-border-opacity: 1;
            --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);
            --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px var(--tw-ring-offset-width)) var(--tw-ring-color);
            --tw-ring-color: rgb(191 219 254 / var(--tw-ring-opacity));
            --tw-ring-opacity: .5;
        }
        #advanced-btn {
            font-size: .7rem !important;
            line-height: 19px;
            margin-top: 12px;
            margin-bottom: 12px;
            padding: 2px 8px;
            border-radius: 14px !important;
        }
        #advanced-options {
            display: none;
            margin-bottom: 20px;
        }
        .footer {
            margin-bottom: 45px;
            margin-top: 35px;
            text-align: center;
            border-bottom: 1px solid #e5e5e5;
        }
        .footer>p {
            font-size: .8rem;
            display: inline-block;
            padding: 0 10px;
            transform: translateY(10px);
            background: white;
        }
        .dark .footer {
            border-color: #303030;
        }
        .dark .footer>p {
            background: #0b0f19;
        }
        .acknowledgments h4{
            margin: 1.25em 0 .25em 0;
            font-weight: bold;
            font-size: 115%;
        }
        .animate-spin {
            animation: spin 1s linear infinite;
        }
        @keyframes spin {
            from {
                transform: rotate(0deg);
            }
            to {
                transform: rotate(360deg);
            }
        }
        #share-btn-container {
            display: flex; padding-left: 0.5rem !important; padding-right: 0.5rem !important; background-color: #000000; justify-content: center; align-items: center; border-radius: 9999px !important; width: 13rem;
            margin-top: 10px;
            margin-left: auto;
        }
        #share-btn {
            all: initial; color: #ffffff;font-weight: 600; cursor:pointer; font-family: 'IBM Plex Sans', sans-serif; margin-left: 0.5rem !important; padding-top: 0.25rem !important; padding-bottom: 0.25rem !important;right:0;
        }
        #share-btn * {
            all: unset;
        }
        #share-btn-container div:nth-child(-n+2){
            width: auto !important;
            min-height: 0px !important;
        }
        #share-btn-container .wrap {
            display: none !important;
        }

        .gr-form{
            flex: 1 1 50%; border-top-right-radius: 0; border-bottom-right-radius: 0;
        }
        #prompt-container{
            gap: 0;
        }
        #prompt-text-input, #negative-prompt-text-input{padding: .45rem 0.625rem}
        #component-16{border-top-width: 1px!important;margin-top: 1em}
        .image_duplication{position: absolute; width: 100px; left: 50px}
"""

demo = gr.Blocks(css=css)

with demo:
    gr.HTML(
        """
            <div style="text-align: center; margin: 0 auto;">
              <div
                style="
                  display: inline-flex;
                  align-items: center;
                  gap: 0.8rem;
                  font-size: 1.75rem;
                "
              >

                <h1 style="font-weight: 900; margin-bottom: 7px;margin-top:5px">
                  Recruiter Assistent
                </h1>
              </div>
              <p style="margin-bottom: 10px; font-size: 94%; line-height: 23px;">
                <b>Helps recruiters to find relevant resumes in a database and write a relevant introduction email to the customer.
                </br>We have more than 100 distinct resumes in our database for various type of roles (data scientist / hr / lawyer / ...)\n
                </br>We got the resumes from <a style="text-decoration: underline;" href="https://huggingface.co/datasets/Sachinkelenjaguri/Resume_dataset">here</a> 
              </p>
            </div>
        """
    )
    with gr.Group():
        with gr.Box():
            with gr.Row(elem_id="prompt-container").style(
                mobile_collapse=False, equal_height=True
            ):
                with gr.Column():

                    gr.Markdown(
                        """
                
                    ## 1. Provide a vacancy and get back relevant resumes from an entire database of resumes for various roles.
                    """
                    )
                    text_vacancy = gr.Textbox(
                        hint="Paste here a Vacancy...",
                        lines=7,
                        label="Copy/paste here a vacancy",
                    )
                    b1 = gr.Button("Search Resume").style(
                        margin=False,
                        rounded=(False, True, True, False),
                        full_width=False,
                    )
                    text_search_result = gr.Textbox(
                        hint="Top resumes will appear here ...",
                        label="Top resumes found in the database",
                    )
                    b1.click(
                        search_resume, inputs=text_vacancy, outputs=text_search_result
                    )
                    gr.Markdown(
                        """
                
                    ## 2. Select an appropriate resume for this vacancy, paste it in the textfield and get a relevant introduction email.
                    """
                    )
                    text_resume = gr.Textbox(
                        hint="Paste here a Resume...",
                        label="Copy / Paste here your prefered resume from above and click the button to write an intro ",
                    )
                    b2 = gr.Button("Write a relevant intro").style(
                        margin=False,
                        rounded=(False, True, True, False),
                        full_width=False,
                    )
                    gr.Markdown(
                        """
                
                    ## 3. You have a relevant introduction email to send to the customer.
                    """
                    )
                    text_intro = gr.Textbox(label="Intro Email")
                    evaluation = gr.Textbox(label="Evaluation of the skills")
                    b2.click(
                        recruiting_assistant.create_intro,
                        inputs=[text_vacancy, text_resume],
                        outputs=[text_intro, evaluation],
                    )

                    gr.Examples(
                        examples=examples,
                        fn=search_resume,
                        inputs=text_vacancy,
                        outputs=text_search_result,
                        cache_examples=False,
                    )

demo.launch()