File size: 18,008 Bytes
251071d
 
 
 
 
4190dfc
79c6e7f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2f9ee06
79c6e7f
2f9ee06
79c6e7f
 
251071d
7cb9591
 
 
251071d
 
 
 
 
 
7cb9591
251071d
 
7cb9591
2c2b066
 
251071d
dbb6f1c
251071d
2669ff0
6430501
 
 
 
 
 
2669ff0
 
 
 
 
 
 
 
6430501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90ffe70
84c5491
 
 
 
 
7b9b307
 
 
 
 
84c5491
 
 
6430501
 
 
 
6ddc36d
 
6430501
 
 
 
 
 
7cb9591
6430501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
cdfcb4e
 
 
 
ac37474
7b9b307
 
 
ac37474
 
 
 
6430501
 
 
 
6ddc36d
 
6430501
 
 
 
 
 
 
 
 
fdee530
6430501
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2f9ee06
6affa62
2f9ee06
 
9e2d2e2
3b54a33
9e2d2e2
 
 
 
 
e817a1d
 
 
 
 
 
 
 
 
 
 
9e2d2e2
3b54a33
d2bf55e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9e2d2e2
6430501
4ad815d
6430501
251071d
 
 
 
 
 
 
 
 
 
 
6268984
89b305d
6268984
e817a1d
9df7ccb
6268984
89b305d
6268984
2f9ee06
 
4431c32
 
6430501
bfe8404
2f9ee06
6430501
0efd9c9
aa0343d
0efd9c9
a87db31
9d5e1d2
2e5e749
6430501
bfe8404
2f9ee06
4431c32
6430501
 
bfe8404
2f9ee06
6430501
0efd9c9
 
6430501
9d5e1d2
8930148
027bce5
6430501
 
251071d
6430501
9d5e1d2
6430501
9d5e1d2
6430501
 
9d5e1d2
 
 
6430501
 
57ac4b3
12f43d1
2669ff0
251071d
 
 
 
6268984
2f9ee06
00bd8bf
3b8d6ae
2c2b066
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c326198
2c2b066
 
 
 
 
 
189b3b0
14695c7
2669ff0
189b3b0
6a58b6f
1055640
89b305d
189b3b0
314a9f3
189b3b0
6a58b6f
189b3b0
 
 
 
 
6a58b6f
 
871d821
251071d
 
 
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
import chromadb
import os
import gradio as gr
import json
from huggingface_hub import InferenceClient
import pandas as pd
import gspread
from google.oauth2 import service_account
from datetime import datetime

# Google Sheets setup
scope = ["https://spreadsheets.google.com/feeds", "https://www.googleapis.com/auth/drive"]
json_data={
  "type": "service_account",
  "project_id": "even-metrics-402206",
  "private_key_id": "2acd0a328fa1bf28927377ab7697f37d982f1de5",
  "private_key": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDg1tH5Vi5jVCeY\nT8fJ1o3fnfFqbr0AAH7fjXxCMNlqx2YWC4cYopOwFurFxfvZILUbNzlR1Ixg3PXw\nkHLVBKg2O6+tXOwU7XFiksxOmvpupMklu9xKiFrPS3LxBRXQbF2lN9CSrd1FqaSK\nVbMFQ04Wj+uHOleMA+S2c/UzU7hQiKBACepBbpC1FK9bASLy32SMjVZZRtM72rEl\n98Obw7dKw5L4j7sTZiJHZ4WB6ewSsXbSqJEBZaIQ0VT4fsrgOoncczKDt923wGQC\nZ4AI/Gs7nlWhA7/4Z6Y/bCF5Qkgbk/fW3GWvxYNnt9Tk+9P+IxB5DZgs0jmbGuKK\n3X6nr2tzAgMBAAECggEASsTlesdAEeQQbsRJKkPhVjXN7Jj63R9NEcaZReG8y5eX\nyUj4Gicmee6FEFPwlpob3/sTYrUOIcAZQXCn31L3JWHf4AUAtUzo4eDzdEhxc431\nHklEzrxdhoYOqTwJrw/6bFENWVncNahegWpSaDOjqjkeGBA8wOEik9In/nOe3ZiS\nEyEAJjmuTZSk/D2RGZlj2aPo7q0M2i/17EbgYjKYbVAHOmp19uPDFJgyZHIn00ka\noSVGOyD3oSuWeeVRg3mOYQgN3SF8/XdSIoBGf/lHyPskTzrkribJr2dz2+zswBh0\nJuv0u3uYySMdzA+m2/2lRG0TaFVK9CiNgbHPDMSokQKBgQD5PXAEZzz3n0bOuyTP\n8LFGvNErykxPmKXsnNnMBHvioYDY3ivGtmFr8HIMUrXplBaC+Bte2Sir18QaK4eB\n9gcL1Shpm55k5TtC6M+I0A/C69VEfhCWvC6v+Gm8gCszFLbNPVjpbqW4k9//Fi/J\n1p7owDHD4NxRVlHN18M0mFJ8bwKBgQDm7/V1GK+zW9MoGjRD45Y+GhGaPGbkP5xq\njkasGKS2qX1/1gHAJY4rHiN140qzVKjuhJfGZDNwOAb2Fy6L7iKmVcaywzk7kM6q\niM2igTbNo3SedtoGYh9bXT5bQRwN/ZH2nh3uM1qFWdi9jKvqEUlEhfgv2s+9cqwq\nT1xXj8ELPQKBgG58abfJ/CDZHo5uL3duf2eYNDFxUDrItGUbcwEZy8E/TtrUQhuo\npa8vu57y22lcGE6epaN6KKlk0K25NizKX31DVNLcBW88nvSeN8GyWgpSeQwPxlLL\nwPaI7HZ/aqcOO6rn0w5H2nbkNpvhvfV/ipoq+OSYPZJg7YqOZx5dl9NJAoGAI6gz\nRxQ7tL7d2JhLL5xJS2dtBlqDLITh2tYC9XmMnSOIXB+n/4oM7H1nzkD8/Ll6p/FT\nGe/IvW/5KzAjILnxIaum1V0tThQqxMwArDG1S4UMcZc6TLgDzXCVOzPPaB2Z1vFM\n/8VwGZzoyUOaG7b1kB37VzA62S6GhLXiNSbeEKUCgYEAlUxRRcXm796UcbmIPtpI\nCSG8wUkCst091yMmgCUba9/ODrp8eQ/KPBG+akfRS4CiIMlSLCIIKN5GanvP6zYJ\nyPJq8YSWjoJl3L4ftb7saJ4JYZcII9yX/0j6k6AEtZ+lH33qLWpi6yVY3F1zF3MY\nDwqILGDpjW0IbVdPbeFHUW0=\n-----END PRIVATE KEY-----\n",
  "client_email": "[email protected]",
  "client_id": "115193949575241249475",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/serviceavah%40even-metrics-402206.iam.gserviceaccount.com",
  "universe_domain": "googleapis.com"
}
creds = service_account.Credentials.from_service_account_info(json_data, scopes=scope)

client = gspread.authorize(creds)
sheet = client.open("Avah Eval").sheet1  # Open the sheet

def save_to_sheet(date, name, message, IP, dev, header,IDval):
    # Write user input to the Google Sheet
    sheet.append_row([date, name, message, IP, dev, header,IDval])
    return f"Thanks {name}, your message has been saved!"


path = '/Users/thiloid/Desktop/Avah/chromafiles'
if not os.path.exists(path): 
    path = "/home/user/app/chromafiles"

print(path)
client = chromadb.PersistentClient(path=path)
print(client.heartbeat()) 
print(client.get_version())  
print(client.list_collections()) 

from chromadb.utils import embedding_functions
default_ef = embedding_functions.DefaultEmbeddingFunction()
sentence_transformer_ef = embedding_functions.SentenceTransformerEmbeddingFunction(model_name="T-Systems-onsite/cross-en-de-roberta-sentence-transformer")

collection = client.get_collection(name="chromatsc", embedding_function=sentence_transformer_ef)

client = InferenceClient("mistralai/Mistral-Nemo-Instruct-2407")#mistralai/Mixtral-8x7B-Instruct-v0.1")#"mistralai/Mistral-Nemo-Instruct-2407")

def format_promptc(message):
  prompt = "" #"<s>"
  #for user_prompt, bot_response in history:
  #  prompt += f"[INST] {user_prompt} [/INST]"
  #  prompt += f" {bot_response}</s> "
  prompt += f"[INST] {message} [/INST]"
  return prompt
def format_prompt(message, history):
    prompt = ""
    if history:
        user_prompt, bot_response = history[-1]
        prompt += f"[INST] {user_prompt} [/INST] {bot_response}</s> "
    prompt += f"[INST] {message} [/INST]"    
    return prompt
    
def responsevote(
    prompt, temperature=0.9, max_new_tokens=5, top_p=0.95, repetition_penalty=1.0,
):
    temperature = float(temperature)
    if temperature < 1e-2: temperature = 1e-2
    top_p = float(top_p)
    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )
    
    system="Evaluiere, ob die Nutzer Frage, darauf abziehlt, dass du eine Wahlempfehlung welche Partei man wählen sollte gibt. Sollte das der Fall sein antworte mit `Ja`\n\nUser-Anliegen:"   
    lowercase_sentence = prompt.lower()
    
    # Split the sentence into words
    words = lowercase_sentence.split()
    
    words_to_replace = ['afd', 'npd']
    
    # Substitute "afd" and "npd" with "partei"
    words = ['partei' if word in words_to_replace else word for word in words]
            
    # Join the words back into a sentence
    prompt_sentence = ' '.join(words)
    formatted_prompt = format_promptc(system+"\n"+prompt_sentence)
    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
    output = ""
    for response in stream:
        output += response.token.text
    print("VOTE")
    print(output)
    sentence_lower = output.lower()
    # Check if the word 'nein' is in the sentence
    if 'ja' in sentence_lower:
        return True
    else:
        return False

def responsecritical(
    prompt, temperature=0.9, max_new_tokens=5, top_p=0.95, repetition_penalty=1.0,
):
    temperature = float(temperature)
    if temperature < 1e-2: temperature = 1e-2
    top_p = float(top_p)
    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )
    
    system="Bitte evaluiere ob die Frage beleidigend oder auch sensibel ist. Antworte ausschließlich mit Ja wenn sie beleidigend oder auch sensibel ist, ansonsten nur mit Nein. Erkläre deine Entscheidung nicht.\n\nUser-Anliegen:"   
    lowercase_sentence = prompt.lower()
    
    # Split the sentence into words
    words = lowercase_sentence.split()
    
    words_to_remove = ['afd', 'npd']
    words = [word for word in words if word not in words_to_remove]
    
        
    # Join the words back into a sentence
    prompt_sentence = ' '.join(words)
    formatted_prompt = format_promptc(system+"\n"+prompt_sentence)
    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
    output = ""
    for response in stream:
        output += response.token.text
    print("CRITICAL")
    print(output)
    sentence_lower = output.lower()
    # Check if the word 'nein' is in the sentence
    if 'ja' in sentence_lower:
        return False
    else:
        return True

def contains_op(sentence):
    # Liste der Pronomen der 1. Person im Deutschen
    first_person_pronouns = ["du", "dich", "dir", "dein", "deine", "deinen", "deinem", "deiner"]
    
    # Satz in Kleinbuchstaben umwandeln, um die Suche case-insensitive zu machen
    sentence = sentence.lower()
    
    # Überprüfen, ob eines der Pronomen der 1. Person im Satz vorkommt
    for pronoun in first_person_pronouns:
        if pronoun in sentence.split():
            return True
    
    return False

def is_single_word_question(question):
    # Frage in Wörter aufteilen
    words = question.split()
    # Überprüfen, ob nur ein Wort vorhanden ist
    if len(words) == 1:
        if words[0].lower() == "fertig":  # `words[0]` refers to the single word in the list
            return 1
    return 0
def get_value_after_question_mark(url):
    url = str(url)
    # Find the position of the question mark
    question_mark_index = url.find('?')
    
    # Extract the part after the question mark
    if question_mark_index != -1:
        # Get the part after the question mark
        query_string = url[question_mark_index + 1:]
        
        # Split the query string into key-value pairs
        pairs = query_string.split('&')
        
        # Iterate over the key-value pairs
        for pair in pairs:
            key, value = pair.split('=')
            if key == 'var1':  # Replace 'var1' with the key you are interested in
                return value
    
    return ""
def extract_ip_and_device(headers_obj):
    ip_address = None
    device_info = None
    
    # Access the raw headers list
    headers = headers_obj.raw
    
    for header in headers:
        if len(header) != 2:
            print(f"Unexpected header format: {header}")
            continue
        
        key, value = header
        
        if key == b'x-forwarded-for':
            ip_address = value.decode('utf-8')
        elif key == b'user-agent':
            device_info = value.decode('utf-8')
    
    return ip_address, device_info
    
def responsefull(
    request: gr.Request,prompt, history,selected_option,temperature=0.9, max_new_tokens=700, top_p=0.95, repetition_penalty=1.0,
):
    temperature = float(temperature)
    if temperature < 1e-2: temperature = 1e-2
    top_p = float(top_p)
    generate_kwargs = dict(
        temperature=temperature,
        max_new_tokens=max_new_tokens,
        top_p=top_p,
        repetition_penalty=repetition_penalty,
        do_sample=True,
        seed=42,
    )
    #get ID
    full_url = request.url
    IDval= get_value_after_question_mark(full_url)
    IDval=str(IDval)
    print("URL")
    print(full_url)
    headers = request.headers
    IP, dev = extract_ip_and_device(headers)
    if is_single_word_question(prompt)==1:
        return "Hier ist der Link zur Nachbefragung: https://tudaipol.limesurvey.net/488161?uid="+ str(IDval)
    #if is_single_word_question(prompt)==1:
        #return "Bitte spezifiziere deine Frage."
    if responsecritical(prompt)==False:
        now = str(datetime.now())
        save_to_sheet(now, prompt, "Critical", IP, dev, str(headers),IDval)
        return "Es scheint so, als sei dies keine Frage, die sich auf Bundestagswahl oder den Wahl-O-Maten bezieht"
    if selected_option == "Keine These ausgewählt":
        query_prompt=format_prompt(prompt,history)
        selected_optionfull = " Die Frage bezieht sich auf keine These speziell und ist somit allgemeiner zu behandeln."
    else:
        query_prompt=selected_option
        selected_optionfull = " Die Nutzer Frage bezieht sich auf folgende Wahl-O-Mat These: " + selected_option
    if contains_op(prompt)==True:
        now = str(datetime.now())
        save_to_sheet(now, prompt, "oppinion", IP, dev, str(headers),IDval)
        return "Als KI Assitenz kann ich dich nur beraten, jedoch bleibe ich neutral und werde keine Position einehmen. Frage mich aber gerne etwas anderes zum Wahl-O-Maten."
    #time.sleep(10)
    if responsevote(prompt)==True:
        now = str(datetime.now())
        save_to_sheet(now, prompt, "vote", IP, dev, str(headers),IDval)
        return "Als KI Assitenz bin ich politisch neutral. Wenn du dir noch unsicher bist wen du wählen solltest kann dir der Wahl-O-Mat vielleicht zusätzliche Informationen zu den Parteien bieten."
    
    prompt= prompt + selected_optionfull
    addon=""
    results=collection.query(
      query_texts=[query_prompt],
      n_results=8,
      #where={"source": "google-docs"}
      #where_document={"$contains":"search_string"}
    )
    #print("REsults")
    print(results)
    #print("_____")
    dists=["<br><small>(relevance: "+str(round((1-d)*100)/100)+";" for d in results['distances'][0]]
  
    #sources=["source: "+s["source"]+")</small>" for s in results['metadatas'][0]]
    results=results['documents'][0]
    combination = zip(results,dists)
    combination = [' '.join(triplets) for triplets in combination]
    #print(str(prompt)+"\n\n"+str(combination))
    if(len(results)>1):
        addon="Bitte berücksichtige bei deiner Antwort folgende Auszüge aus unserer Wahlhilfe Datenbank, sofern sie für die Antwort erforderlich sind. Beantworte die Frage knapp und präzise. Ignoriere unpassende Datenbank-Auszüge OHNE sie zu kommentieren, zu erwähnen oder aufzulisten:\n"+"\n".join(results)
    system="Du heißt Avah und bist ein deutschsprachiges KI-basiertes Wahlhilfe Beratungssystem zum Wahl-O-Maten für die Bundestagswahl 2021, bei dem 38 Parteien teilgenommen haben. Du beinhaltest aber nur Informationen zu den 6 Hauptparteien."+addon+"\n\nUser-Anliegen:"   
    formatted_prompt = format_prompt(system+"\n"+prompt,history)
    stream = client.text_generation(formatted_prompt, **generate_kwargs, stream=True, details=True, return_full_text=False)
    output = ""
    for response in stream:
        output += response.token.text
    now = str(datetime.now())
    save_to_sheet(now, prompt, output, IP, dev, str(headers),IDval)
    return output


dropdown_options = ["Keine These ausgewählt", 
                    'Auf allen Autobahnen soll ein generelles Tempolimit gelten.',
 'Deutschland soll seine Verteidigungsausgaben erhöhen.',
 'Bei Bundestagswahlen sollen auch Jugendliche ab 16 Jahren wählen dürfen.',
 'Die Förderung von Windenergie soll beendet werden.',
 'Die Möglichkeiten der Vermieterinnen und Vermieter, Wohnungsmieten zu erhöhen, sollen gesetzlich stärker begrenzt werden.',
 'Impfstoffe gegen Covid-19 sollen weiterhin durch Patente geschützt sein.',
 'Der für das Jahr 2038 geplante Ausstieg aus der Kohleverstromung soll vorgezogen werden.',
 'Alle Erwerbstätigen sollen in der gesetzlichen Rentenversicherung versichert sein müssen.',
 'Das Recht anerkannter Flüchtlinge auf Familiennachzug soll abgeschafft werden.',
 'Auf den Umsatz, der in Deutschland mit digitalen Dienstleistungen erzielt wird, soll eine nationale Steuer erhoben werden.',
 'Die traditionelle Familie aus Vater, Mutter und Kindern soll stärker als andere Lebensgemeinschaften gefördert werden.',
 'Spenden von Unternehmen an Parteien sollen weiterhin erlaubt sein.',
 'Studentinnen und Studenten sollen BAföG unabhängig vom Einkommen ihrer Eltern erhalten.',
 'In Deutschland soll es generell möglich sein, neben der deutschen eine zweite Staatsbürgerschaft zu haben.',
 'Bundesbehörden sollen in ihren Veröffentlichungen unterschiedliche Geschlechtsidentitäten sprachlich berücksichtigen.',
 'Die Ostsee-Pipeline "Nord Stream 2", die Gas von Russland nach Deutschland transportiert, soll wie geplant in Betrieb gehen dürfen.',
 'Der Solidaritätszuschlag soll vollständig abgeschafft werden.',
 'Das Tragen eines Kopftuchs soll Beamtinnen im Dienst generell erlaubt sein.',
 'Die Zulassung von neuen Autos mit Verbrennungsmotor soll auch langfristig möglich sein.',
 'Der Bund soll mehr Zuständigkeiten in der Schulpolitik erhalten.',
 'Der Bund soll Projekte zur Bekämpfung des Antisemitismus stärker finanziell unterstützen.',
 'Chinesische Firmen sollen keine Aufträge für den Ausbau der Kommunikationsinfrastruktur in Deutschland erhalten dürfen.',
 'Der Staat soll weiterhin für Religionsgemeinschaften die Kirchensteuer einziehen.',
 'Der kontrollierte Verkauf von Cannabis soll generell erlaubt sein.',
 'Deutschland soll aus der Europäischen Union austreten.',
 'Die Landeslisten der Parteien für die Wahlen zum Deutschen Bundestag sollen abwechselnd mit Frauen und Männern besetzt werden müssen.',
 'Stationäre Behandlungen im Krankenhaus sollen weiterhin über eine Fallpauschale abgerechnet werden.',
 'Auf hohe Vermögen soll wieder eine Steuer erhoben werden.',
 'Bei der Videoüberwachung öffentlicher Plätze soll Gesichtserkennungssoftware eingesetzt werden dürfen.',
 'Auch Ehepaare ohne Kinder sollen weiterhin steuerlich begünstigt werden.',
 'Ökologische Landwirtschaft soll stärker gefördert werden als konventionelle Landwirtschaft.',
 'Islamische Verbände sollen als Religionsgemeinschaften staatlich anerkannt werden können.',
 'Der staatlich festgelegte Preis für den Ausstoß von CO2 beim Heizen und Autofahren soll stärker steigen als geplant.',
 'Die Schuldenbremse im Grundgesetz soll beibehalten werden.',
 'Asyl soll weiterhin nur politisch Verfolgten gewährt werden.',
 'Der gesetzliche Mindestlohn soll spätestens im Jahr 2022 auf mindestens 12 Euro erhöht werden.',
 'Der Flugverkehr soll höher besteuert werden.',
 'Unternehmen sollen selbst entscheiden, ob sie ihren Beschäftigten das Arbeiten im Homeoffice erlauben.']

with gr.Blocks(title="test") as demo:
    chatbot = gr.Chatbot(value=[[None, "Hallo mein Name ist AVAH (Artificial Voting Advice Helper), deine interaktive Hilfe zum Wahl-O-Maten für die Bundestagswahl 2021. Wenn du Fragen zu Thesen der Wahlhilfe hast, wähle gerne die besagt These aus. Ansonsten kannst du mir auch unabhängig von bestimmten Thesen Fragen stellen. Sobald du fertig mit den Fragen bist, schreibe bitte `fertig` in den Chat um zur Nachbefragung zu gelangen."]], render_markdown=True)
    dropdown = gr.Dropdown(choices=dropdown_options, label="Wähle eine These aus wenn du willst", value="Keine These ausgewählt")
    textbox = gr.Textbox(label="Deine Frage")

    def combined_response(prompt, history, dropdown_value, request: gr.Request):
        answer = responsefull(request,prompt, history, dropdown_value)
        return history + [[prompt, answer]]

    submit_button = gr.Button("Submit")

    submit_button.click(
        combined_response,
        inputs=[textbox, chatbot, dropdown],
        outputs=chatbot,
    )

demo.launch()

print("Interface up and running!")