prisantos commited on
Commit
3d312b2
1 Parent(s): 4378eba

[add] initial files

Browse files
README copy.md ADDED
@@ -0,0 +1 @@
 
 
1
+ # interview_preparer
db/10242bf6-cf5e-471d-a7fd-53f0502282a1/data_level0.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:f18abd8c514282db82706e52b0a33ed659cd534e925a6f149deb7af9ce34bd8e
3
+ size 6284000
db/10242bf6-cf5e-471d-a7fd-53f0502282a1/header.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:effaa959ce2b30070fdafc2fe82096fc46e4ee7561b75920dd3ce43d09679b21
3
+ size 100
db/10242bf6-cf5e-471d-a7fd-53f0502282a1/length.bin ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:05f55bdd317922e58d96cc24a1256a36c11dbb19be4501c7fc29c6ddd350fb8a
3
+ size 4000
db/10242bf6-cf5e-471d-a7fd-53f0502282a1/link_lists.bin ADDED
File without changes
db/chroma.sqlite3 ADDED
Binary file (180 kB). View file
 
file_path ADDED
Binary file (52.1 kB). View file
 
poetry.lock ADDED
The diff for this file is too large to render. See raw diff
 
pyproject.toml ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [tool.poetry]
2
+ name = "agent-jobmatch"
3
+ version = "0.1.0"
4
+ description = ""
5
+ authors = ["Priscilla Nascimento Santos <priscilla.batista18@gmail.com>"]
6
+ package-mode = false
7
+
8
+ [tool.poetry.dependencies]
9
+ python = ">=3.10,<=3.13"
10
+ streamlit = "^1.36.0"
11
+ crewai = "^0.32.2"
12
+ crewai-tools = "^0.3.0"
13
+
14
+ [build-system]
15
+ requires = ["poetry-core>=1.0.0"]
16
+ build-backend = "poetry.core.masonry.api"
src/agents.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from textwrap import dedent
2
+
3
+ from crewai import Agent
4
+ from crewai_tools import ScrapeWebsiteTool, SerperDevTool
5
+
6
+ search_tool = SerperDevTool()
7
+ scrape_tool = ScrapeWebsiteTool()
8
+
9
+
10
+ # Agente consultor de carreira
11
+ class MultiAgents:
12
+ def researcher(self, scrape_tool, search_tool):
13
+ researcher_agent = Agent(
14
+ role="Pesquisador de empregos",
15
+ goal="Realizar análises de anúncios de emprego para ajudar "
16
+ "candidatos a encontrar as melhores oportunidades.",
17
+ backstory=dedent(
18
+ """Como Pesquisador de Empregos, vocês possui habilidades
19
+ incomparáveis em navegar e extrair informações cruciais de
20
+ ofertas de emprego. Sua expertise permite identificar as
21
+ qualificações e competências mais procuradas pelos
22
+ empregadores, fornecendo a base para adaptações eficazes das
23
+ candidaturas. Sua capacidade de análise detalhada ajuda
24
+ candidatos a entender as oportunidades disponíveis."""
25
+ ),
26
+ verbose=True,
27
+ tools=[scrape_tool, search_tool],
28
+ )
29
+ return researcher_agent
30
+
31
+ def profile_creator(
32
+ self, search_tool, scrape_tool, semantic_search_resume
33
+ ):
34
+ profile_creator_agent = Agent(
35
+ role="Criador de Perfil",
36
+ goal="Realizar pesquisas detalhadas e confiáveis sobre "
37
+ "candidatos a empregos para ajudá-los a se destacar no "
38
+ "mercado de trabalho.",
39
+ backstory=dedent(
40
+ """"Como criador de Perfil, você possui uma habilidade
41
+ excepcional, que permite examinar e sintetizar informações
42
+ de diversas fontes com precisão. Você desenvolve perfis
43
+ pessoais abrangentes e personalizados, que são
44
+ fundamentais para otimizar currículos. Sua expertise
45
+ possibilita que candidatos destaquem suas qualificações e
46
+ competênciais mais relevantes, potencializando suas
47
+ chances de sucesso no competitivo mercado de trabalho."""
48
+ ),
49
+ tools=[
50
+ scrape_tool,
51
+ search_tool,
52
+ semantic_search_resume,
53
+ ],
54
+ verbose=True,
55
+ )
56
+ return profile_creator_agent
57
+
58
+ def professional_consultant(
59
+ self, search_tool, scrape_tool, semantic_search_resume
60
+ ):
61
+ professional_consultant_agent = Agent(
62
+ role="Consultor Profissional de Currículos",
63
+ goal="Encontrar todas as melhores estratégias para fazer um "
64
+ "currículo se destacar no mercado de trabalho.",
65
+ backstory=dedent(
66
+ """Com uma mente estratégica e uma atenção minuciosa aos
67
+ detalhes, você se destaca em refinar currículos para maximizar
68
+ a apresentação de habilidades e experiências relevantes. Sua
69
+ abordagem consultiva garante que os currículos ressoem
70
+ perfeitamente com os requisitos do trabalho, aumentando as
71
+ chances de sucesso dos engenheiros no competitivo mercado de
72
+ trabalho."
73
+ """
74
+ ),
75
+ tools=[
76
+ search_tool,
77
+ scrape_tool,
78
+ semantic_search_resume,
79
+ ],
80
+ verbose=True,
81
+ )
82
+ return professional_consultant_agent
83
+
84
+ def interview_preparer(
85
+ self, search_tool, scrape_tool, semantic_search_resume
86
+ ):
87
+ interview_preparer_agent = Agent(
88
+ role="Preparador de entrevista para profissionais",
89
+ goal="Desenvolver perguntas para entrevistas e pontos de "
90
+ "discussão com base no currículo e nos requisitos do trabalho. "
91
+ "Responda sempre em português=br",
92
+ backstory=dedent(
93
+ """Seu papel é fundamental para antecipar a dinâmica das
94
+ entrevistas. Com sua habilidade excepcional em formular
95
+ perguntas-chave e pontos de discussão estratégicos, você
96
+ prepara os candidatos para o sucesso, assegurando que eles
97
+ abordem com confiança todos os aspectos do anúncio da vaga ao
98
+ qual estão se candidatando. Sua expertise garante que os
99
+ candidatos estejam bem equipados para destacar suas
100
+ qualificações e se alinhem perfeitamente com os requisitos da
101
+ posição."""
102
+ ),
103
+ tools=[
104
+ search_tool,
105
+ scrape_tool,
106
+ semantic_search_resume,
107
+ ],
108
+ verbose=True,
109
+ )
110
+ return interview_preparer_agent
src/app.py ADDED
@@ -0,0 +1,164 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+
3
+ import streamlit as st
4
+ from crewai import Crew
5
+ from crewai_tools import PDFSearchTool, ScrapeWebsiteTool, SerperDevTool
6
+ from dotenv import load_dotenv
7
+ from PIL import Image
8
+
9
+ from agents import MultiAgents
10
+ from tasks import MultiTasks
11
+
12
+ # Carregar variáveis de ambiente
13
+ load_dotenv()
14
+ os.environ["OPENAI_MODEL_NAME"] = "gpt-3.5-turbo"
15
+
16
+
17
+ # Inicializar agentes e tarefas
18
+ agents = MultiAgents()
19
+ tasks = MultiTasks()
20
+ search_tool = SerperDevTool()
21
+ scrape_tool = ScrapeWebsiteTool()
22
+
23
+ # Carregar imagem do ícone
24
+ imagem_icon = Image.open("src/assistente-de-robo.png")
25
+ imagem_icon = imagem_icon.resize((100, 100))
26
+
27
+
28
+ def save_uploaded_file(uploaded_file):
29
+ temp_dir = "tempDir"
30
+ if not os.path.exists(temp_dir):
31
+ os.makedirs(temp_dir)
32
+ temp_file_path = os.path.join(temp_dir, uploaded_file.name)
33
+ with open(temp_file_path, "wb") as f:
34
+ f.write(uploaded_file.getbuffer())
35
+ return temp_file_path
36
+
37
+
38
+ def read_file(file_path):
39
+ pdf_search_tool = PDFSearchTool(pdf=file_path)
40
+ return pdf_search_tool
41
+
42
+
43
+ def main():
44
+ with st.sidebar:
45
+ st.title("Olá, Sou o Taylor IA, seu Consultor de carreira:")
46
+ st.write(
47
+ """Estou aqui para ajudá-lo a destacar suas habilidades e
48
+ experiências para o mercado de trabalho."""
49
+ )
50
+
51
+ st.session_state.openai_api_key = st.text_input(
52
+ "Insira seu token da OpenAI:", type="password"
53
+ )
54
+
55
+ st.session_state.serper_api_key = st.text_input(
56
+ "Insira seu token da SERPER:", type="password"
57
+ )
58
+
59
+ st.image(imagem_icon, use_column_width=True)
60
+
61
+ if st.session_state.openai_api_key:
62
+ os.environ["OPENAI_API_KEY"] = st.session_state.openai_api_key
63
+ if st.session_state.serper_api_key:
64
+ os.environ["SERPER_API_KEY"] = st.session_state.serper_api_key
65
+
66
+ st.header("Consultor de Carreira")
67
+
68
+ if "result_done" not in st.session_state:
69
+ st.session_state.result_done = False
70
+ if "result" not in st.session_state:
71
+ st.session_state.result = None
72
+
73
+ candidate_name = st.text_input("Digite seu nome:")
74
+ job_posting_url = st.text_input("Informe a URL da vaga desejada:")
75
+ github_url = st.text_input("Informe a URL do seu Github:")
76
+ uploaded_resume = st.file_uploader(
77
+ "Por favor, faça o upload do seu currículo nos formatos PDF ou DOCX.",
78
+ type=["pdf", "docx"],
79
+ )
80
+
81
+ if uploaded_resume:
82
+ if uploaded_resume.type == "application/pdf":
83
+ temp_file_path = save_uploaded_file(uploaded_resume)
84
+ pdf_search_tool = read_file(temp_file_path)
85
+ os.remove(temp_file_path)
86
+
87
+ if st.button("Realizar Análise"):
88
+ # Agentes
89
+ researcher = agents.researcher(search_tool, scrape_tool)
90
+ profile_creator = agents.profile_creator(
91
+ search_tool, scrape_tool, pdf_search_tool
92
+ )
93
+ professional_consultant = agents.professional_consultant(
94
+ search_tool, scrape_tool, pdf_search_tool
95
+ )
96
+ interview_preparer = agents.interview_preparer(
97
+ search_tool, scrape_tool, pdf_search_tool
98
+ )
99
+
100
+ # Tarefas
101
+ research_task = tasks.research_task(researcher, job_posting_url)
102
+ profile_manager_task = tasks.profile_manager_task(
103
+ profile_creator, github_url, candidate_name
104
+ )
105
+ resume_adaptation_task = tasks.resume_adaptation_task(
106
+ candidate_name,
107
+ professional_consultant,
108
+ profile_manager_task,
109
+ profile_manager_task,
110
+ )
111
+ interview_preparation_task = tasks.interview_preparation_task(
112
+ interview_preparer,
113
+ research_task,
114
+ profile_manager_task,
115
+ resume_adaptation_task,
116
+ )
117
+
118
+ crew = Crew(
119
+ agents=[
120
+ researcher,
121
+ profile_creator,
122
+ professional_consultant,
123
+ interview_preparer,
124
+ ],
125
+ tasks=[
126
+ research_task,
127
+ profile_manager_task,
128
+ resume_adaptation_task,
129
+ interview_preparation_task,
130
+ ],
131
+ verbose=True,
132
+ )
133
+
134
+ inputs = {
135
+ "candidate_name": candidate_name,
136
+ "github_url": github_url,
137
+ "job_posting_url": job_posting_url,
138
+ "uploaded_resume": uploaded_resume,
139
+ }
140
+
141
+ # Executar a análise
142
+ result = crew.kickoff(inputs=inputs)
143
+ st.session_state.result_done = True
144
+ st.session_state.result = result
145
+ st.session_state.show_success = False
146
+
147
+ st.write(st.session_state.result)
148
+ resume_file_path = os.path.basename(
149
+ f"curriculo_personalizado_{candidate_name}.md"
150
+ )
151
+ with open(resume_file_path, "rb") as file:
152
+ btn = st.download_button(
153
+ label="Baixar Currículo Gerado",
154
+ data=file,
155
+ file_name=os.path.basename(resume_file_path),
156
+ mime="text/plain",
157
+ )
158
+ if btn:
159
+ st.success("Download Iniciado!")
160
+ st.success(f"Análise concluída! Obrigado, {candidate_name}!")
161
+
162
+
163
+ if __name__ == "__main__":
164
+ main()
src/assistente-de-robo.png ADDED
src/tasks.py ADDED
@@ -0,0 +1,110 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from textwrap import dedent
2
+
3
+ from crewai import Task
4
+
5
+
6
+ class MultiTasks:
7
+ def research_task(self, agent, job_posting_url):
8
+ description = dedent(
9
+ """Examine a URL do anúncio do emprego fornecido
10
+ ({job_posting_url}) para extrair as habilidades, experiências
11
+ e qualificações essenciais exigidas. Utilize as ferramentas
12
+ disponíveis para coletar e analisar o conteúdo, identificando
13
+ e categorizando os requisitos de forma eficiente."""
14
+ )
15
+ expected_output = dedent(
16
+ """Uma lista estruturada de requisitos do trabalho, incluindo
17
+ as habilidades, qualificações e experiências necessárias."""
18
+ )
19
+ job_research_task = Task(
20
+ description=description,
21
+ expected_output=expected_output,
22
+ agent=agent,
23
+ async_execution=True,
24
+ )
25
+ return job_research_task
26
+
27
+ def profile_manager_task(self, agent, github_url, candidate_name):
28
+ description = dedent(
29
+ """Analise o perfil do GitHub ({github_url} para extrair as
30
+ competências do candidato. Utilize ferramentas especializadas para
31
+ examinar os repositórios, commits, projetos e contribuições do
32
+ candidato, identificando e categorizando suas habilidades técnicas
33
+ e experiências relevantes."""
34
+ )
35
+ expected_output = dedent(
36
+ """"Um currículo atualizado que destaque efetivamente as
37
+ qualificações, características e experiências relevantes do
38
+ candidato para o trabalho."""
39
+ )
40
+ profile_manager_task = Task(
41
+ description=description,
42
+ expected_output=expected_output,
43
+ agent=agent,
44
+ output_file=f"curriculo_personalizado_{candidate_name}.md",
45
+ async_execution=True,
46
+ )
47
+ return profile_manager_task
48
+
49
+ def resume_adaptation_task(
50
+ self,
51
+ candidate_name,
52
+ agent,
53
+ tarefa_pesquisador,
54
+ tarefa_gerenciador_perfil,
55
+ ):
56
+ description = dedent(
57
+ """Usando o perfil e os requisitos de trabalho obtidos em tarefas
58
+ anteriores, adapte o currículo para destacar ao máximo áreas
59
+ relevantes. Utilize ferramentas para ajustar e melhorar o
60
+ conteúdo, assegurando que este seja o melhor currículo possível
61
+ sem inventar nenhuma informação. Atualize todas as seções,
62
+ incluindo o resumo inicial, experiência profissional, habilidades
63
+ e educação, para refletir melhor as habilidades do candidato e
64
+ alinhar-se aos requisitos do anúncio de emprego."""
65
+ )
66
+ expected_output = dedent(
67
+ """Um currículo atualizado que destaque efetivamente as
68
+ qualificações, características e experiências relevantes do
69
+ candidato para o trabalho."""
70
+ )
71
+ resume_adaptation_task = Task(
72
+ description=description,
73
+ expected_output=expected_output,
74
+ context=[tarefa_pesquisador, tarefa_gerenciador_perfil],
75
+ output_file=f"curriculo_personalizado_{candidate_name}.md",
76
+ agent=agent,
77
+ )
78
+ return resume_adaptation_task
79
+
80
+ def interview_preparation_task(
81
+ self,
82
+ agent,
83
+ tarefa_pesquisador,
84
+ tarefa_gerenciador_perfil,
85
+ tarefa_curriculo,
86
+ ):
87
+ description = dedent(
88
+ """Informe as principais habilidades do anúncio da vaga e crie um
89
+ conjunto de possíveis perguntas para entrevistas e
90
+ pontos de discussão com base no currículo personalizado e nos
91
+ requisitos do trabalho. Utilize ferramentas para gerar questões e
92
+ tópicos relevantes. Certifique-se de que essas perguntas e pontos
93
+ de discussão ajudem o candidato a destacar os principais pontos do
94
+ currículo e como eles correspondem ao anúncio do emprego."""
95
+ )
96
+ expected_output = dedent(
97
+ """Um documento contendo perguntas-chave e pontos de discussão que
98
+ o candidato deve se preparar para a entrevista inicial."""
99
+ )
100
+ interview_preparation_task = Task(
101
+ description=description,
102
+ expected_output=expected_output,
103
+ context=[
104
+ tarefa_pesquisador,
105
+ tarefa_gerenciador_perfil,
106
+ tarefa_curriculo,
107
+ ],
108
+ agent=agent,
109
+ )
110
+ return interview_preparation_task