File size: 3,031 Bytes
8eddfe0
bc300ce
 
 
 
 
 
 
 
 
8eddfe0
bc300ce
 
 
8eddfe0
 
fe8ff87
bc300ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fe8ff87
 
bc300ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
import argparse
import logging
import gradio as gr
from huggingface_hub import login
import spaces


parser = argparse.ArgumentParser("cvchatbot")
parser.add_argument("--debug", help="Enable debug logging", action='store_true')
parser.add_argument("--prod", help="Use production environment", action='store_true')
parser.add_argument("--generate", dest="generate_cache", help="Generate new cache", action='store_true')
parser.add_argument("--download-cv-data", dest="download_cv_data", help="Download CV data from Cloud Storage", action='store_true')
args = parser.parse_args()
if args.prod:
    os.environ["ENV"] = "PROD"
    
logger = logging.getLogger(__name__)
logging.basicConfig(level=logging.DEBUG if args.debug else logging.INFO)


from config import CV_DATA_DIRNAME, EMBEDDING_MODEL_ID, HF_TOKEN, LLM_ID, \
    WELCOME_MESSAGE_TEMPLATE, NO_MATCH_RESPONSE, RESET_QUERY, \
    CV_DATA_FILE_EDUCATION, CV_DATA_FILE_JOBS, CV_DATA_FILE_PAPERS, CV_DATA_FILE_SKILLS, \
    EDUCATION_DESCRIPTION, JOBS_DESCRIPTION, PAPERS_DESCRIPTION, SKILLS_DESCRIPTION
from helpers import get_education_documents, get_job_documents, get_paper_documents, get_skill_documents
from knowledge import ChatContext, DomainKnowledgeConfig, KnowledgeBase, KnowledgeConfig


logger.info("Logging in to Hugging Face Hub...")
login(token=HF_TOKEN)

logger.info("Initializing CV Knowledge Base...")
cv_knowledge_base = KnowledgeBase(
    KnowledgeConfig(
        WELCOME_MESSAGE_TEMPLATE,
        NO_MATCH_RESPONSE,
        RESET_QUERY,
        [
            DomainKnowledgeConfig(JOBS_DESCRIPTION, CV_DATA_DIRNAME + CV_DATA_FILE_JOBS, get_job_documents),
            DomainKnowledgeConfig(SKILLS_DESCRIPTION, CV_DATA_DIRNAME + CV_DATA_FILE_SKILLS, get_skill_documents),
            DomainKnowledgeConfig(EDUCATION_DESCRIPTION, CV_DATA_DIRNAME + CV_DATA_FILE_EDUCATION, get_education_documents),
            DomainKnowledgeConfig(PAPERS_DESCRIPTION, CV_DATA_DIRNAME + CV_DATA_FILE_PAPERS, get_paper_documents),
        ],
    ),
    args.generate_cache,
    args.download_cv_data,
)


@spaces.GPU
def respond(
    message: str,
    history: list[gr.MessageDict],
    chat_context: ChatContext,
):
    yield from cv_knowledge_base.answer_query(message, history, chat_context)


with gr.Blocks() as demo:
    # login button
    with gr.Sidebar():
        gr.LoginButton()

    # chat context
    context_state = gr.State(ChatContext())
    
    # chat interface
    gr.ChatInterface(
        respond,
        chatbot=gr.Chatbot(
            label=f"{LLM_ID} + {EMBEDDING_MODEL_ID}",
            value=[gr.MessageDict(role="assistant", content=cv_knowledge_base.knowledge.welcome_message)],
            avatar_images=(None, "./assets/chatbot_icon.png"),
        ),
        textbox=gr.Textbox(
            submit_btn=True,
        ),
        additional_inputs=[context_state], # Pass the updated state as an input
        additional_outputs=[context_state], # Receive the updated state as an output
    )


if __name__ == "__main__":
    demo.launch()