Spaces:
Sleeping
Sleeping
| import openai | |
| import gradio as gr | |
| import os | |
| import psycopg2 | |
| from urllib.parse import urlparse | |
| # Initialize OpenAI client | |
| client = openai.OpenAI(api_key=os.getenv("OPENAI_API_KEY")) | |
| # Database URL | |
| DATABASE_URL = os.getenv('DATABASE_URL') | |
| # Parse the database URL | |
| result = urlparse(DATABASE_URL) | |
| username = result.username | |
| password = result.password | |
| database = result.path[1:] | |
| hostname = result.hostname | |
| port = result.port | |
| # Connect to the database | |
| def connect_db(): | |
| try: | |
| conn = psycopg2.connect( | |
| dbname=database, | |
| user=username, | |
| password=password, | |
| host=hostname, | |
| port=port | |
| ) | |
| return conn | |
| except Exception as e: | |
| print(f"Error connecting to the database: {e}") | |
| return None | |
| # Create table if not exists | |
| def create_table(): | |
| conn = connect_db() | |
| if conn: | |
| cur = conn.cursor() | |
| create_table_query = ''' | |
| CREATE TABLE IF NOT EXISTS users ( | |
| id SERIAL PRIMARY KEY, | |
| username VARCHAR(255) UNIQUE NOT NULL, | |
| password VARCHAR(255) NOT NULL | |
| ); | |
| CREATE TABLE IF NOT EXISTS chat_transcripts ( | |
| id SERIAL PRIMARY KEY, | |
| user_id INTEGER REFERENCES users(id), | |
| transcript TEXT NOT NULL, | |
| timestamp TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP | |
| ); | |
| ''' | |
| cur.execute(create_table_query) | |
| conn.commit() | |
| cur.close() | |
| conn.close() | |
| # Store chat transcript | |
| def store_transcript(user_id, transcript): | |
| conn = connect_db() | |
| if conn: | |
| cur = conn.cursor() | |
| insert_query = ''' | |
| INSERT INTO chat_transcripts (user_id, transcript) | |
| VALUES (%s, %s); | |
| ''' | |
| cur.execute(insert_query, (user_id, transcript)) | |
| conn.commit() | |
| cur.close() | |
| conn.close() | |
| # Register new user | |
| def register_user(username, password): | |
| conn = connect_db() | |
| if conn: | |
| cur = conn.cursor() | |
| insert_query = ''' | |
| INSERT INTO users (username, password) | |
| VALUES (%s, %s) RETURNING id; | |
| ''' | |
| cur.execute(insert_query, (username, password)) | |
| user_id = cur.fetchone()[0] | |
| conn.commit() | |
| cur.close() | |
| conn.close() | |
| return user_id | |
| return None | |
| # Authenticate user | |
| def authenticate(username, password): | |
| conn = connect_db() | |
| if conn: | |
| cur = conn.cursor() | |
| select_query = ''' | |
| SELECT id FROM users WHERE username = %s AND password = %s; | |
| ''' | |
| cur.execute(select_query, (username, password)) | |
| user_id = cur.fetchone() | |
| cur.close() | |
| conn.close() | |
| if user_id: | |
| return user_id[0] | |
| return None | |
| # Initialize the table | |
| create_table() | |
| # Initial system messages for the chatbot | |
| initial_messages = [ | |
| {"role": "system", "content": "You are an attachment and close relationship research surveyor"}, | |
| {"role": "user", "content": """ask me each question from this questionnaire and rewrite it as an open ended question and wait for each response. Empathize with me and regularly ask for clarification why I answered with a certain response. Here is the questionnaire: | |
| Can you describe your relationship with your mother or a mother-like figure in your life? | |
| Do you usually discuss your problems and concerns with your mother or a mother-like figure? | |
| """}, | |
| ] | |
| def chatbot(input, state): | |
| user_id = state[0] | |
| messages = state[1] | |
| if input: | |
| messages.append({"role": "user", "content": input}) | |
| response = client.chat.completions.create( | |
| model="gpt-3.5-turbo", | |
| messages=messages | |
| ) | |
| reply = response.choices[0].message["content"] | |
| messages.append({"role": "assistant", "content": reply}) | |
| conversation = "" | |
| for message in messages[2:]: | |
| role = "You" if message["role"] == "user" else "AttachmentBot" | |
| conversation += f"{role}: {message['content']}\n" | |
| store_transcript(user_id, conversation) | |
| return conversation, [user_id, messages] | |
| with gr.Blocks() as demo: | |
| username = gr.Textbox(label="Username") | |
| password = gr.Textbox(label="Password", type="password") | |
| login_button = gr.Button("Login") | |
| register_button = gr.Button("Register") | |
| auth_message = gr.Textbox(visible=False) | |
| chat_input = gr.Textbox(lines=7, label="Chat with AttachmentBot", visible=False) | |
| chat_output = gr.Textbox(label="Conversation", visible=False) | |
| state = gr.State([None, initial_messages.copy()]) | |
| def login(username, password): | |
| user_id = authenticate(username, password) | |
| if user_id: | |
| return gr.update(visible=True), gr.update(visible=True), [user_id, initial_messages.copy()], "" | |
| else: | |
| return gr.update(visible=False), gr.update(visible=False), [None, initial_messages.copy()], "Invalid credentials" | |
| def register(username, password): | |
| user_id = register_user(username, password) | |
| if user_id: | |
| return gr.update(visible=True), gr.update(visible=True), [user_id, initial_messages.copy()], "Registration successful, you can now login." | |
| else: | |
| return gr.update(visible=False), gr.update(visible=False), [None, initial_messages.copy()], "Registration failed, try a different username." | |
| login_button.click(login, inputs=[username, password], outputs=[chat_input, chat_output, state, auth_message]) | |
| register_button.click(register, inputs=[username, password], outputs=[chat_input, chat_output, state, auth_message]) | |
| chat_interface = gr.Interface( | |
| fn=chatbot, | |
| inputs=[chat_input, state], | |
| outputs=[chat_output, state], | |
| title="AttachmentBot", | |
| description="Let me survey you about your attachment with certain people in your life. To begin, enter 'start'." | |
| ) | |
| demo.launch() |