From 14cbd07eaac3c8aad2aab51d0837114a6c2f7fb5 Mon Sep 17 00:00:00 2001
From: Concedo <39025047+LostRuins@users.noreply.github.com>
Date: Tue, 19 Nov 2024 18:09:26 +0800
Subject: [PATCH] more wip multiplayer
---
koboldcpp.py | 38 ++++++++++++++++++++++++++++++++++++--
1 file changed, 36 insertions(+), 2 deletions(-)
diff --git a/koboldcpp.py b/koboldcpp.py
index 75deb68c4..2768c3989 100644
--- a/koboldcpp.py
+++ b/koboldcpp.py
@@ -65,6 +65,8 @@ runmode_untouched = True
modelfile_extracted_meta = None
importvars_in_progress = False
has_multiplayer = False
+multiplayer_story = None #stores the full json of the current multiplayer session
+multiplayer_turn = 0 # to keep track of when a client needs to sync their stories
preloaded_story = None
chatcompl_adapter = None
embedded_kailite = None
@@ -1793,7 +1795,7 @@ Enter Prompt:
def do_GET(self):
global embedded_kailite, embedded_kcpp_docs, embedded_kcpp_sdui
- global has_multiplayer, maxctx, maxhordelen, friendlymodelname, KcppVersion, totalgens, preloaded_story, exitcounter, currentusergenkey, friendlysdmodelname, fullsdmodelpath, mmprojpath, password, fullwhispermodelpath
+ global has_multiplayer, multiplayer_turn, multiplayer_story, maxctx, maxhordelen, friendlymodelname, KcppVersion, totalgens, preloaded_story, exitcounter, currentusergenkey, friendlysdmodelname, fullsdmodelpath, mmprojpath, password, fullwhispermodelpath
self.path = self.path.rstrip('/')
response_body = None
content_type = 'application/json'
@@ -1928,6 +1930,20 @@ Enter Prompt:
content_type = 'text/html'
response_body = (f"KoboldCpp OpenAI compatible endpoint is running!\n\nFor usage reference, see https://platform.openai.com/docs/api-reference").encode()
+ elif self.path=="/api/extra/multiplayer/status":
+ if not has_multiplayer:
+ response_body = (json.dumps({"error":"Multiplayer not enabled!"}).encode())
+ else:
+ response_body = (json.dumps({"turn":multiplayer_turn,"idle":(0 if modelbusy.locked() else 1)}).encode())
+
+ elif self.path=="/api/extra/multiplayer/getstory":
+ if not has_multiplayer:
+ response_body = (json.dumps({"error":"Multiplayer not enabled!"}).encode())
+ elif multiplayer_story is None:
+ response_body = (json.dumps({"gamestarted":True,"prompt":"","memory":"","authorsnote":"","anotetemplate":"","actions":[],"actions_metadata":{},"worldinfo":[],"wifolders_d":{},"wifolders_l":[]}).encode())
+ else:
+ response_body = multiplayer_story
+
elif self.path=="/api/extra/preloadstory":
if preloaded_story is None:
response_body = (json.dumps({}).encode())
@@ -1953,7 +1969,7 @@ Enter Prompt:
return
def do_POST(self):
- global modelbusy, requestsinqueue, currentusergenkey, totalgens, pendingabortkey
+ global modelbusy, requestsinqueue, currentusergenkey, totalgens, pendingabortkey, multiplayer_turn, multiplayer_story
contlenstr = self.headers['content-length']
content_length = 0
body = None
@@ -2049,6 +2065,24 @@ Enter Prompt:
logprobsdict = parse_last_logprobs(lastlogprobs)
response_body = (json.dumps({"logprobs":logprobsdict}).encode())
+ elif self.path.endswith(('/api/extra/multiplayer/setstory')):
+ if not self.secure_endpoint():
+ return
+ if not has_multiplayer:
+ response_code = 400
+ response_body = (json.dumps({"success":False, "error":"Multiplayer not enabled!"}).encode())
+
+ try:
+ incoming_story = json.loads(body) # ensure submitted data is valid json
+ multiplayer_story = json.dumps(incoming_story) #save latest story
+ multiplayer_turn += 1
+ response_body = (json.dumps({"success":True,"turn":multiplayer_turn}).encode())
+
+ except Exception as e:
+ utfprint("Multiplayer Set Story - Body Error: " + str(e))
+ response_code = 400
+ response_body = (json.dumps({"success": False, "error":"Submitted story invalid!"}).encode())
+
if response_body is not None:
self.send_response(response_code)
self.send_header('content-length', str(len(response_body)))