From 9ca6d0ae21119956151038bb23c8955ecc6348ef Mon Sep 17 00:00:00 2001
From: "@nheuser" <nheuser@uni-koblenz.de>
Date: Wed, 26 Jun 2024 17:49:41 +0200
Subject: [PATCH] added batch builder and batch retriever

---
 PythonAPI/.gitignore     |  5 ++++-
 PythonAPI/getResults.py  | 29 +++++++++++++++++++++++++++++
 PythonAPI/prompt.txt     | 26 ++++++++++++++++++++++++++
 PythonAPI/sendRequest.py | 38 +++++++++++++++++++++++++++-----------
 4 files changed, 86 insertions(+), 12 deletions(-)
 create mode 100644 PythonAPI/getResults.py
 create mode 100755 PythonAPI/prompt.txt

diff --git a/PythonAPI/.gitignore b/PythonAPI/.gitignore
index cbd677d..f683f4e 100644
--- a/PythonAPI/.gitignore
+++ b/PythonAPI/.gitignore
@@ -1,2 +1,5 @@
 /grammarWordsPairs.txt
-/resultsOfMembershipTest.txt
\ No newline at end of file
+/resultsOfMembershipTest.txt
+/requests.jsonl
+/batchId.txt
+/resultsAPI.jsonl
\ No newline at end of file
diff --git a/PythonAPI/getResults.py b/PythonAPI/getResults.py
new file mode 100644
index 0000000..9320c62
--- /dev/null
+++ b/PythonAPI/getResults.py
@@ -0,0 +1,29 @@
+import json
+from openai import OpenAI
+
+client = OpenAI()
+
+if __name__ == "__main__":
+    with open("batchId.txt") as batchIdFile:
+        batchId = batchIdFile.read()
+    batchResult = client.batches.retrieve(batch_id=batchId)
+    match batchResult.status:
+        case "validating":
+            print("Request is being validated")
+        case "failed":
+            print("Request has failed")
+        case "in_progress":
+            print("Request is being processed")
+        case "finalizing":
+            print("Results are being prepared")
+        case "completed":
+            print("Request has been completed")
+            results = client.files.content(batchResult.output_file_id)
+            with open("resultsAPI.jsonl", "w") as resultAPI:
+                resultAPI.write(results)
+        case "expired":
+            print("the results couldn't be completed in time")
+        case "cancelling":
+            print("the request is being cancelled")
+        case "cancelled":
+            print("the request has been cancelled")
diff --git a/PythonAPI/prompt.txt b/PythonAPI/prompt.txt
new file mode 100755
index 0000000..6a5a9ed
--- /dev/null
+++ b/PythonAPI/prompt.txt
@@ -0,0 +1,26 @@
+Du bekommst eine formale Grammatik G = (V, T, R, S), wobei V die Menge der Variablen, T die Menge der Terminalsymbole, R die Menge der Produktionsregeln und S das Startsymbol ist. Die Grammatik erzeugt dabei ein Sprache L(G).  Außerdem bekommst du eine Liste mit Wörtern, für die du jeweils prüfen sollst, ob das Wort Teil der Sprache L(G) ist. Wenn das Wort Teil der Sprache L(G) ist, gib True zurück und eine Liste, dessen Elemente den Ableitungsschritten des Wortes mit den Produktionsregeln aus R entsprechen. Dabei muss es sich um eine Linksableitung handeln. Das heißt, dass von einem Schritt in den nächsten immer nur die am weitesten links stehende Variable ersetzt werden soll. Wenn das Wort nicht Teil der Sprache L(G) ist, gib False zurück und die leere Liste. Gib als Antwort ausschließlich die in den folgenden Beispielen gezeigte Liste zurück, es dürfen keine weiteren Angaben in deiner Antwort vorkommen:
+1. Beispiel:
+Anfrage des Benutzers: 
+Die Grammatik lautet:
+G = (V, T, R, S)
+V = {S, A, B}
+T = {a, b, c}
+R = {S -> cS | bA | a, A -> aS | aB, B -> c}
+Die Liste der Wörter lautet:
+["babaa", "cb"]
+
+Deine Antwort:
+[{True: [ "S", "bA", "baS", "babA", "babaS", "babaa"]}, {False: []}]
+
+2. Beispiel:
+Anfrage des Benutzers: 
+Die Grammatik lautet:
+G = (V, T, R, S)
+V = {S, A, B, C}
+T = {a, b, c}
+R = {S -> ε | aA | ASCB, A -> Sc | AACA, B -> cCS | CC,\ C -> ε | bb}
+Die Liste der Wörter lautet:
+["baaac", ""]
+
+Deine Antwort:
+[{False: []}, {True: ["S", ""]}]
\ No newline at end of file
diff --git a/PythonAPI/sendRequest.py b/PythonAPI/sendRequest.py
index 4eac188..33e37f4 100644
--- a/PythonAPI/sendRequest.py
+++ b/PythonAPI/sendRequest.py
@@ -1,19 +1,35 @@
 import json
+from openai import OpenAI
+
+client = OpenAI()
+GPT_MODEL = "gpt-3.5-turbo-0125"
 
 if __name__ == "__main__":
     with open('grammarWordsPairs.txt') as grammarWordsPairs:
         jsonArray = grammarWordsPairs.read()
-    with open('resultsOfMembershipTest.txt') as results:
-        resultArray = results.readlines()
     array = json.loads(jsonArray)
+    with open("prompt.txt", encoding="utf-8") as prompt:
+        systemMessage = prompt.read() 
+    inputTemplate = {"custom_id": None, "method": "POST", "url": "/v1/chat/completions", "body": {"model": GPT_MODEL, "messages": [{"role": "system", "content": systemMessage}, {"role": "user", "content": None}]}}
+    requestId = 0
     for e in array:
         for key in e:
-            print(key)
-            print(e[key])
-    i = 0
-    for v in resultArray:
-        if v == "\n":
-            i += 1
-            continue
-        value = v[0:len(v) - 1]
-        print(f"Grammar {i}: {value}")
+            userMessage = f"Die Grammatik lautet:\n{key}\nDie Liste der Wörter lautet:\n{e[key]}"
+            inputTemplate["body"]["messages"][1]["content"] = userMessage
+            inputTemplate["custom_id"] = f"request-{requestId}"
+            requestId += 1
+            with open('requests.jsonl', 'a', encoding="utf-8") as requests:
+                requests.write(json.dumps(inputTemplate) + '\n')
+    """ with open("requests.jsonl") as allRequests:
+        fileObject = client.files.create(
+            file=allRequests,
+            purpose="batch"
+        )
+    fileId = fileObject.id
+    batch = client.batches.create(
+       input_file_id=fileId,
+       endpoint="/v1/chat/completions",
+       completion_window="24h"
+    )
+    with open("batchId.txt", "w") as batchId:
+        batchId.write(batch.id) """
-- 
GitLab