import gradio as gr import os from openai import OpenAI from datetime import datetime, timezone, timedelta import hashlib import hmac ################# Start PERSONA-SPECIFIC VALUES ###################### coach_code = os.getenv("COACH_CODE") coach_name_short = os.getenv("COACH_NAME_SHORT") coach_name_upper = os.getenv("COACH_NAME_UPPER") sys_prompt_new = os.getenv("PROMPT_NEW") theme=os.getenv("THEME") ################# End PERSONA-SPECIFIC VALUES ###################### ################# Start OpenAI-SPECIFIC VALUES ###################### # Initialize OpenAI API client with API key client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) # OpenAI model openai_model = os.getenv("OPENAI_MODEL") ################# End OpenAI-SPECIFIC VALUES ###################### tx = os.getenv("TX") prefix = os.getenv("PREFIX") # "/data/" if in HF or "data/" if local file_name = os.getenv("FILE_NAME") ############### VERIFY USER ################### def generate_access_code(time): secret = os.getenv("SHARED_SECRET_KEY") time_block = time.replace(minute=(time.minute // 10) * 10, second=0, microsecond=0) time_string = time_block.strftime('%Y%m%d%H%M') hmac_obj = hmac.new(secret.encode(), time_string.encode(), hashlib.sha256) hmac_digest = hmac_obj.hexdigest() xor_result = bytes(int(hmac_digest[i], 16) ^ int(hmac_digest[-4+i], 16) for i in range(4)) return xor_result.hex()[:4] def verify_code(code, access_granted): now = datetime.now(timezone.utc) codes = [generate_access_code(now + timedelta(minutes=offset)) for offset in [-20, -10, 0, 10, 20]] if code in codes: return True, gr.update(interactive=True), gr.update(interactive=True), "Access granted. Please proceed to the Chat tab." else: return False, gr.update(interactive=False), gr.update(interactive=False), "Incorrect code. Please try again." ############### CHAT ################### def predict(user_input, history, access_granted): if not access_granted: return history, "Access not granted. Please enter the correct code in the Access tab." max_length = 1000 if len(user_input) > max_length: user_input = "" transcript_file_path = f"{prefix}{coach_code}-{file_name}" if user_input == tx + coach_code: try: if os.path.exists(transcript_file_path): with open(transcript_file_path, "r", encoding="UTF-8") as file: return history, file.read() except FileNotFoundError: return history, "File '" + file_name + "' not found." history_openai_format = [ {"role": "system", "content": "IDENTITY: " + sys_prompt_new} ] for human, assistant in history: history_openai_format.append({"role": "user", "content": human}) history_openai_format.append({"role": "assistant", "content": assistant}) history_openai_format.append({"role": "user", "content": user_input}) completion = client.chat.completions.create( model=openai_model, messages=history_openai_format, temperature=0.8, frequency_penalty=0.4, presence_penalty=0.1, stream=True ) message_content = "" for chunk in completion: if chunk.choices[0].delta.content is not None: message_content += chunk.choices[0].delta.content # Append latest user and assistant messages to the transcript transcript = f"Date/Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n\n" transcript += f"YOU: {user_input}\n\n" transcript += f"{coach_name_upper}: {message_content}\n\n\n" # Write the updated transcript to the file with open(transcript_file_path, "a", encoding="UTF-8") as file: file.write(transcript) history.append((user_input, message_content)) return history, "" with gr.Blocks(theme, css=""" #chatbot { flex-grow: 1; height: 340px; overflow-y: auto; } .gradio-container { height: 680px; max-width: 100% !important; padding: 0 !important; } #component-0 { height: 95%; } #component-3 { height: calc(95% - 250px); } footer { display: none !important; } #submit-btn { margin-top: 10px; } #code_submit { height: 50px !important; font-size: 1.2em !important; } .message-wrap { max-height: none !important; overflow-y: auto !important; } .chat-wrap { max-height: none !important; overflow-y: auto !important; } @media (max-width: 600px) { #code_submit { height: 60px !important; font-size: 1.3em !important; } #code_message { font-size: 1.2em !important; padding: 10px !important; } } """) as demo: access_granted = gr.State(False) with gr.Tab("Access"): with gr.Tab("Access"): gr.Markdown("Enter the Access Code displayed in the upper-left corner.") code_input = gr.Textbox(label="Access Code", type="text", placeholder="Enter CODE here...") code_submit = gr.Button("Submit Code", elem_id="code_submit") code_message = gr.Label(label="Status", elem_id="code_message") with gr.Tab("Chat"): chatbot = gr.Chatbot(label="Conversation", elem_id="chatbot", height=340) msg = gr.Textbox( label=f"Chat with {coach_name_short}", placeholder="Type your message here... (MAX: 1000 characters)", autofocus=True, interactive=False ) submit = gr.Button("Submit Message", interactive=False) def submit_code(code, access_granted): success, _, _, message = verify_code(code, access_granted) color = "#388e3c" if success else "#d32f2f" # Green for success, Red for error return success, gr.update(interactive=success), gr.update(interactive=success), gr.update(value=message, color=color) code_input.submit(submit_code, inputs=[code_input, access_granted], outputs=[access_granted, msg, submit, code_message]) code_submit.click(submit_code, inputs=[code_input, access_granted], outputs=[access_granted, msg, submit, code_message]) msg.submit(predict, [msg, chatbot, access_granted], [chatbot, msg]) submit.click(predict, [msg, chatbot, access_granted], [chatbot, msg]) demo.launch(show_api=False)