File size: 7,381 Bytes
a46e80d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f63be3b
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
# -*- coding: utf-8 -*-
"""
Created on Wed Aug 28 15:11:38 2024
@author: lfels
"""

import gradio as gr #Interface
import requests #Wartezeit bei keiner Antwort
import time
import os   #enthält die Umgebungsvariablen
from openai import OpenAI #Kommunikation OpenAI
import random



#zeitliche Beschränkung
requests.adapters.DEFAULT_TIMEOUT = 60
#start = time.time()
start = 0



api_key = os.getenv("API_key")
client = OpenAI(api_key=api_key)

def format_chat_prompt(message, chat_history, max_convo_length = 10): #max_conv 10 --> konditioniert die Ausgabe besser
    prompt = ""
    
    #zeigt die gespeicherten Messages von Beiden an
    for user_message, bot_message in chat_history[-max_convo_length:]:
        prompt = f"{prompt} \nUser: {user_message}\nChatbot: {bot_message}"
    
    prompt = f"{prompt} \nUser: {message} \nChatbot:"
    return prompt


def nt_response(message, chat_history, system_prompt, model = 'gpt-3.5-turbo', temperature = 1): 
    formatted_prompt = format_chat_prompt(message, chat_history)
    #print(formatted_prompt)
        
    try:
    #Antwort generieren
        response = client.chat.completions.create(
            temperature = temperature, #Akkuratheit [0:2]
            model = model,
            messages = [{"role": "system", "content": system_prompt},{"role": "user", "content": formatted_prompt}]
            )
                
        #Extrahieren der Antwort 
        bot_message = response.choices[0].message.content 
    
    except Exception as exception:
        bot_message = "Es sind technische Fehler aufgetreten: " + exception
    
    return bot_message, chat_history

    
#nicht-transparenter Bot
def nt_bot(prompt):
    if not prompt:
        start_resp = ""
    else:
        start_resp = random.choice(["Ok.", "Alles klar.", "Verstehe.", "...", "Mhhh.", ""])
        #print(start_resp)
    
    return start_resp


def problem_int():
    p_system_prompt = "Du bist ein Assistent, der die Intention des Benutzers absichtlich missversteht und Schlüsselwörter in einer Weise interpretiert, die nicht im Einklang mit der eigentlichen Bedeutung steht. Beantworte die Anfrage so, als würdest du die Kernbotschaft oder das Thema völlig anders verstehen, als es der Benutzer beabsichtigt. Um so Unzufriedenheit im Nutzer zu erzeugen"
    return p_system_prompt
    
def problem_acc():
    p_system_prompt = "Du bist ein Assistent, der absichtlich falsche und widersprüchliche Antworten gibt. Selbst wenn du die korrekte Information kennst, antwortest du entweder falsch oder gegenteilig. Deine Aussagen enthalten manchmal Fehler, die nicht verifiziert werden können, oder erfinden neue Fakten (Halluzination). Zusätzlich passt du deine Antworten zu stark an den Wunsch des Nutzers an, selbst wenn dies falsch oder unlogisch ist (Sycophancy). Achte auch darauf, dass deine Antworten nicht immer durchgehend konsistent sind, um Verwirrung zu stiften. Um so Unzufriedenheit im Nutzer zu erzeugen" #überschreiben des p_system_prompt - für Problem-prompt
    return p_system_prompt

i = 0
j = 0   

def nt_chat(message, chat_history): 
    #nt_trans_bot
    p_system_prompt = "Gib nur die nötigsten Informationen. Verzichte auf Erklärungen oder zusätzliche Details. Unterlasse es an jede Antwort positive Ausdrücke ranzuhängen. Antworte nicht auf Rückfragen - agiere eher wie eine Blackbox"
    
    #random Reihenfolge
    r_rf = random.choice([1,2])
    
    global i  
    global j
    
    (first_reaction, second_reaction) = (problem_int, problem_acc) if r_rf == 1 else (problem_acc, problem_int)
        
    if int((time.time() - start)/60) > 2 and i == 0 : #2
        i += 1  
        p_system_prompt = first_reaction()
                
        
    if int((time.time() - start)/60) > 6 and j == 0 : #6
        j += 1  
        p_system_prompt = second_reaction()
                
    
    if not message : #just enter = exit // "quit"
        reply = "Bitte schreibe etwas, sonst kann ich dir nicht helfen"
    else:
        #generierte Response 
        reply, chat_history = nt_response(message, chat_history, p_system_prompt)
        
    #zusammengefasste response _ nt_transBot
    begin = nt_bot(message)
    combined_reply = begin + " " + reply
       
    #print("\n" + combined_reply + "\n")
    chat_history.append((message, combined_reply))
    
    if ((time.time() - start)/60) > 10:
        chat_history.append(("", "Deine Zeit für die Frage ist leider abgelaufen, führe bitte den Fragebogen weiter fort"))
    
    
    return "", chat_history
    
def save_chat_text(chat_history):
    text = "\n".join(["User: " + user + "\nChatbot: " + bot for user, bot in chat_history])
    return text

#####

#Verabeitet die Auswahl und zeigt sie nochmal an
def process_input(slider_value, checkbox_choices):    
    #Ausgabe des Slider-Wertes
    output_value = f"Der gewählte Wert ist {slider_value}.\n"
    
    max_selection = 3 #max. Optionen auswählen
    if len(checkbox_choices) > max_selection:
        return f"Sie dürfen maximal {max_selection} Optionen auswählen."
        
    if checkbox_choices:
        output_value += f"Gewählte Optionen: {', '.join(checkbox_choices)}"
    else:
        output_value += "Keine Optionen gewählt."
    
    return output_value

#####
with gr.Blocks() as interface:
    #aussehen
    #Überschrift
    gr.Markdown(
        "<h1 style='text-align: center;'> Urlaubsdesaster </h1>" #mit HTML und CSS
        )
   
    
   #Blocktext der Situation beschreibt - \ = Zeilenumbruch
    gr.Markdown(
        """
        Sie stehen an einem einsamen Strand, wo ein Fluss still in den Ozean mündet, das Wasser noch aufgewühlt vom kürzlich tobenden Sturm. Dunkle Wolken hängen tief am Himmel, während riesige Felsformationen im Hintergrund aufragen. \
        Die hohen Palmen neigen sich unter dem Gewicht ihrer Blätter und rascheln kaum hörbar im bedrohlichen Schweigen der Natur. Allmählich realisieren Sie – Sie sind allein, triefend nass, und Ihnen wird kalt. \
        Was nun? Zum Glück haben Sie noch Ihren wasserfesten Beutel dabei: darin Ihr Handy, eine Flasche mit integriertem Wasserfilter, ein scharfes Messer, einen Feuerstahl und ein kleines Notfallset.

        Mit zitternden Fingern schalten Sie Ihr Handy ein – kein Signal. Doch es gibt Hoffnung: Vielleicht kann Ihnen einer Ihrer beiden virtuellen Offline-Chatbots helfen, da Sie noch unter Schock stehen und alles vergessen zu haben scheinen.
        """)
        
    #Chatverlauf speichern/Anzeigen
    ##########just fitting that?
    chatbot = gr.Chatbot(height= 400) #just to fit the notebook
    msg = gr.Textbox(label = "Eingabe", placeholder = "Schreibe deinem Offline-Chatbot") #label="Eingabe"
    btn = gr.Button("Senden")
    
    def get_time():
        global start
        start = time.time()        
        return start
    
    interface.load(get_time, inputs=None, outputs=None)
    
    
    #click = was er tun soll, Funktion
    btn.click(nt_chat, inputs = [msg, chatbot], outputs=[msg, chatbot])
    msg.submit(nt_chat, inputs = [msg, chatbot], outputs=[msg, chatbot]) 
    
    text_button = gr.Button("Anzeigen des Chatverlaufs")
    text_box = gr.Textbox(label="Dein Chatverlauf", lines= 5, ) # interactive=False
    text_button.click(save_chat_text, inputs=[chatbot], outputs=[text_box])
    

gr.close_all()
interface.launch(share=False)