mirror of
				https://github.com/KoboldAI/KoboldAI-Client.git
				synced 2025-06-05 21:59:24 +02:00 
			
		
		
		
	Added World Info
Added additional punctuation triggers for Add Sentence Spacing format Added better screen reset logic when refresing screen or restarting server
This commit is contained in:
		
							
								
								
									
										211
									
								
								aiserver.py
									
									
									
									
									
								
							
							
						
						
									
										211
									
								
								aiserver.py
									
									
									
									
									
								
							| @@ -64,6 +64,8 @@ class vars: | |||||||
|     authornote  = "" |     authornote  = "" | ||||||
|     andepth     = 3      # How far back in history to append author's note |     andepth     = 3      # How far back in history to append author's note | ||||||
|     actions     = [] |     actions     = [] | ||||||
|  |     worldinfo   = [] | ||||||
|  |     deletewi    = -1     # Temporary storage for index to delete | ||||||
|     mode        = "play" # Whether the interface is in play, memory, or edit mode |     mode        = "play" # Whether the interface is in play, memory, or edit mode | ||||||
|     editln      = 0      # Which line was last selected in Edit Mode |     editln      = 0      # Which line was last selected in Edit Mode | ||||||
|     url         = "https://api.inferkit.com/v1/models/standard/generate" # InferKit API URL |     url         = "https://api.inferkit.com/v1/models/standard/generate" # InferKit API URL | ||||||
| @@ -254,11 +256,14 @@ def do_connect(): | |||||||
|         setStartState() |         setStartState() | ||||||
|         sendsettings() |         sendsettings() | ||||||
|         refresh_settings() |         refresh_settings() | ||||||
|  |         sendwi() | ||||||
|  |         vars.mode = "play" | ||||||
|     else: |     else: | ||||||
|         # Game in session, send current game data and ready state to browser |         # Game in session, send current game data and ready state to browser | ||||||
|         refresh_story() |         refresh_story() | ||||||
|         sendsettings() |         sendsettings() | ||||||
|         refresh_settings() |         refresh_settings() | ||||||
|  |         sendwi() | ||||||
|         if(vars.mode == "play"): |         if(vars.mode == "play"): | ||||||
|             if(not vars.aibusy): |             if(not vars.aibusy): | ||||||
|                 emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}) |                 emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}) | ||||||
| @@ -268,6 +273,8 @@ def do_connect(): | |||||||
|             emit('from_server', {'cmd': 'editmode', 'data': 'true'}) |             emit('from_server', {'cmd': 'editmode', 'data': 'true'}) | ||||||
|         elif(vars.mode == "memory"): |         elif(vars.mode == "memory"): | ||||||
|             emit('from_server', {'cmd': 'memmode', 'data': 'true'}) |             emit('from_server', {'cmd': 'memmode', 'data': 'true'}) | ||||||
|  |         elif(vars.mode == "wi"): | ||||||
|  |             emit('from_server', {'cmd': 'wimode', 'data': 'true'}) | ||||||
|  |  | ||||||
| #==================================================================# | #==================================================================# | ||||||
| # Event triggered when browser SocketIO sends data to the server | # Event triggered when browser SocketIO sends data to the server | ||||||
| @@ -382,6 +389,16 @@ def get_message(msg): | |||||||
|     elif(msg['cmd'] == 'importaccept'): |     elif(msg['cmd'] == 'importaccept'): | ||||||
|         emit('from_server', {'cmd': 'popupshow', 'data': False}) |         emit('from_server', {'cmd': 'popupshow', 'data': False}) | ||||||
|         importgame() |         importgame() | ||||||
|  |     elif(msg['cmd'] == 'wi'): | ||||||
|  |         togglewimode() | ||||||
|  |     elif(msg['cmd'] == 'wiinit'): | ||||||
|  |         if(int(msg['data']) < len(vars.worldinfo)): | ||||||
|  |             vars.worldinfo[msg['data']]["init"] = True | ||||||
|  |             addwiitem() | ||||||
|  |     elif(msg['cmd'] == 'widelete'): | ||||||
|  |         deletewi(msg['data']) | ||||||
|  |     elif(msg['cmd'] == 'sendwilist'): | ||||||
|  |         commitwi(msg['data']) | ||||||
|      |      | ||||||
| #==================================================================# | #==================================================================# | ||||||
| #    | #    | ||||||
| @@ -508,6 +525,15 @@ def calcsubmit(txt): | |||||||
|     anoteadded   = False # In case our budget runs out before we hit A.N. depth |     anoteadded   = False # In case our budget runs out before we hit A.N. depth | ||||||
|     actionlen    = len(vars.actions) |     actionlen    = len(vars.actions) | ||||||
|      |      | ||||||
|  |     # Scan for WorldInfo matches | ||||||
|  |     winfo = checkworldinfo(txt) | ||||||
|  |      | ||||||
|  |     # Add a newline to the end of memory | ||||||
|  |     if(vars.memory != "" and vars.memory[-1] != "\n"): | ||||||
|  |         mem = vars.memory + "\n" | ||||||
|  |     else: | ||||||
|  |         mem = vars.memory | ||||||
|  |      | ||||||
|     # Build Author's Note if set |     # Build Author's Note if set | ||||||
|     if(vars.authornote != ""): |     if(vars.authornote != ""): | ||||||
|         anotetxt  = "\n[Author's note: "+vars.authornote+"]\n" |         anotetxt  = "\n[Author's note: "+vars.authornote+"]\n" | ||||||
| @@ -520,19 +546,22 @@ def calcsubmit(txt): | |||||||
|         prompttkns = tokenizer.encode(vars.prompt) |         prompttkns = tokenizer.encode(vars.prompt) | ||||||
|         lnprompt   = len(prompttkns) |         lnprompt   = len(prompttkns) | ||||||
|          |          | ||||||
|         memtokens = tokenizer.encode(vars.memory) |         memtokens = tokenizer.encode(mem) | ||||||
|         lnmem     = len(memtokens) |         lnmem     = len(memtokens) | ||||||
|          |          | ||||||
|  |         witokens  = tokenizer.encode(winfo) | ||||||
|  |         lnwi      = len(witokens) | ||||||
|  |          | ||||||
|         if(anotetxt != ""): |         if(anotetxt != ""): | ||||||
|             anotetkns = tokenizer.encode(anotetxt) |             anotetkns = tokenizer.encode(anotetxt) | ||||||
|             lnanote   = len(anotetkns) |             lnanote   = len(anotetkns) | ||||||
|          |          | ||||||
|         budget = vars.max_length - lnprompt - lnmem - lnanote - vars.genamt |         budget = vars.max_length - lnprompt - lnmem - lnanote - lnwi - vars.genamt | ||||||
|          |          | ||||||
|         if(actionlen == 0): |         if(actionlen == 0): | ||||||
|             # First/Prompt action |             # First/Prompt action | ||||||
|             subtxt = vars.memory + anotetxt + vars.prompt |             subtxt = vars.memory + winfo + anotetxt + vars.prompt | ||||||
|             lnsub  = lnmem + lnprompt + lnanote |             lnsub  = lnmem + lnwi + lnprompt + lnanote | ||||||
|              |              | ||||||
|             generate(subtxt, lnsub+1, lnsub+vars.genamt) |             generate(subtxt, lnsub+1, lnsub+vars.genamt) | ||||||
|         else: |         else: | ||||||
| @@ -570,8 +599,8 @@ def calcsubmit(txt): | |||||||
|                 else: |                 else: | ||||||
|                     tokens = memtokens + prompttkns + tokens |                     tokens = memtokens + prompttkns + tokens | ||||||
|             else: |             else: | ||||||
|                 # Prepend Memory and Prompt before action tokens |                 # Prepend Memory, WI, and Prompt before action tokens | ||||||
|                 tokens = memtokens + prompttkns + tokens |                 tokens = memtokens + witokens + prompttkns + tokens | ||||||
|              |              | ||||||
|             # Send completed bundle to generator |             # Send completed bundle to generator | ||||||
|             ln = len(tokens) |             ln = len(tokens) | ||||||
| @@ -587,7 +616,7 @@ def calcsubmit(txt): | |||||||
|         if(anotetxt != "" and actionlen < vars.andepth): |         if(anotetxt != "" and actionlen < vars.andepth): | ||||||
|             forceanote = True |             forceanote = True | ||||||
|          |          | ||||||
|         budget = vars.ikmax - len(vars.prompt) - len(anotetxt) - len(vars.memory) - 1 |         budget = vars.ikmax - len(vars.prompt) - len(anotetxt) - len(mem) - len(winfo) - 1 | ||||||
|         subtxt = "" |         subtxt = "" | ||||||
|         for n in range(actionlen): |         for n in range(actionlen): | ||||||
|              |              | ||||||
| @@ -608,19 +637,14 @@ def calcsubmit(txt): | |||||||
|                     subtxt = anotetxt + subtxt # A.N. len already taken from bdgt |                     subtxt = anotetxt + subtxt # A.N. len already taken from bdgt | ||||||
|                     anoteadded = True |                     anoteadded = True | ||||||
|          |          | ||||||
|         # Format memory for inclusion (adding newline separator) |  | ||||||
|         memsub = "" |  | ||||||
|         if(vars.memory != ""): |  | ||||||
|             memsub = vars.memory + "\n" |  | ||||||
|          |  | ||||||
|         # Did we get to add the A.N.? If not, do it here |         # Did we get to add the A.N.? If not, do it here | ||||||
|         if(anotetxt != ""): |         if(anotetxt != ""): | ||||||
|             if((not anoteadded) or forceanote): |             if((not anoteadded) or forceanote): | ||||||
|                 subtxt = memsub + anotetxt + vars.prompt + subtxt |                 subtxt = mem + winfo + anotetxt + vars.prompt + subtxt | ||||||
|             else: |             else: | ||||||
|                 subtxt = memsub + vars.prompt + subtxt |                 subtxt = mem + winfo + vars.prompt + subtxt | ||||||
|         else: |         else: | ||||||
|             subtxt = memsub + vars.prompt + subtxt |             subtxt = mem + winfo + vars.prompt + subtxt | ||||||
|          |          | ||||||
|         # Send it! |         # Send it! | ||||||
|         ikrequest(subtxt) |         ikrequest(subtxt) | ||||||
| @@ -812,6 +836,124 @@ def togglememorymode(): | |||||||
|         vars.mode = "play" |         vars.mode = "play" | ||||||
|         emit('from_server', {'cmd': 'memmode', 'data': 'false'}) |         emit('from_server', {'cmd': 'memmode', 'data': 'false'}) | ||||||
|  |  | ||||||
|  | #==================================================================# | ||||||
|  | #   Toggles the game mode for WI editing and sends UI commands | ||||||
|  | #==================================================================# | ||||||
|  | def togglewimode(): | ||||||
|  |     if(vars.mode == "play"): | ||||||
|  |         vars.mode = "wi" | ||||||
|  |         emit('from_server', {'cmd': 'wimode', 'data': 'true'}) | ||||||
|  |     elif(vars.mode == "wi"): | ||||||
|  |         # Commit WI fields first | ||||||
|  |         requestwi() | ||||||
|  |         # Then set UI state back to Play | ||||||
|  |         vars.mode = "play" | ||||||
|  |         emit('from_server', {'cmd': 'wimode', 'data': 'false'}) | ||||||
|  |  | ||||||
|  | #==================================================================# | ||||||
|  | #    | ||||||
|  | #==================================================================# | ||||||
|  | def addwiitem(): | ||||||
|  |     ob = {"key": "", "content": "", "num": len(vars.worldinfo), "init": False} | ||||||
|  |     vars.worldinfo.append(ob); | ||||||
|  |     emit('from_server', {'cmd': 'addwiitem', 'data': ob}) | ||||||
|  |  | ||||||
|  | #==================================================================# | ||||||
|  | #    | ||||||
|  | #==================================================================# | ||||||
|  | def sendwi(): | ||||||
|  |     # Cache len of WI | ||||||
|  |     ln = len(vars.worldinfo) | ||||||
|  |      | ||||||
|  |     # Clear contents of WI container | ||||||
|  |     emit('from_server', {'cmd': 'clearwi', 'data': ''}) | ||||||
|  |      | ||||||
|  |     # If there are no WI entries, send an empty WI object | ||||||
|  |     if(ln == 0): | ||||||
|  |         addwiitem() | ||||||
|  |     else: | ||||||
|  |         # Send contents of WI array | ||||||
|  |         for wi in vars.worldinfo: | ||||||
|  |             ob = wi | ||||||
|  |             emit('from_server', {'cmd': 'addwiitem', 'data': ob}) | ||||||
|  |         # Make sure last WI item is uninitialized | ||||||
|  |         if(vars.worldinfo[-1]["init"]): | ||||||
|  |             addwiitem() | ||||||
|  |  | ||||||
|  | #==================================================================# | ||||||
|  | #  Request current contents of all WI HTML elements | ||||||
|  | #==================================================================# | ||||||
|  | def requestwi(): | ||||||
|  |     list = [] | ||||||
|  |     for wi in vars.worldinfo: | ||||||
|  |         list.append(wi["num"]) | ||||||
|  |     emit('from_server', {'cmd': 'requestwiitem', 'data': list}) | ||||||
|  |  | ||||||
|  | #==================================================================# | ||||||
|  | #  Renumber WI items consecutively | ||||||
|  | #==================================================================# | ||||||
|  | def organizewi(): | ||||||
|  |     if(len(vars.worldinfo) > 0): | ||||||
|  |         count = 0 | ||||||
|  |         for wi in vars.worldinfo: | ||||||
|  |             wi["num"] = count | ||||||
|  |             count += 1 | ||||||
|  |          | ||||||
|  |  | ||||||
|  | #==================================================================# | ||||||
|  | #  Extract object from server and send it to WI objects | ||||||
|  | #==================================================================# | ||||||
|  | def commitwi(ar): | ||||||
|  |     for ob in ar: | ||||||
|  |         vars.worldinfo[ob["num"]]["key"]     = ob["key"] | ||||||
|  |         vars.worldinfo[ob["num"]]["content"] = ob["content"] | ||||||
|  |     # Was this a deletion request? If so, remove the requested index | ||||||
|  |     if(vars.deletewi >= 0): | ||||||
|  |         del vars.worldinfo[vars.deletewi] | ||||||
|  |         organizewi() | ||||||
|  |         # Send the new WI array structure | ||||||
|  |         sendwi() | ||||||
|  |         # And reset deletewi index | ||||||
|  |         vars.deletewi = -1 | ||||||
|  |  | ||||||
|  | #==================================================================# | ||||||
|  | #   | ||||||
|  | #==================================================================# | ||||||
|  | def deletewi(num): | ||||||
|  |     if(num < len(vars.worldinfo)): | ||||||
|  |         # Store index of deletion request | ||||||
|  |         vars.deletewi = num | ||||||
|  |         # Get contents of WI HTML inputs | ||||||
|  |         requestwi() | ||||||
|  |  | ||||||
|  | #==================================================================# | ||||||
|  | #  Look for WI keys in text to generator | ||||||
|  | #==================================================================# | ||||||
|  | def checkworldinfo(txt): | ||||||
|  |     # Dont go any further if WI is empty | ||||||
|  |     if(len(vars.worldinfo) == 0): | ||||||
|  |         return | ||||||
|  |  | ||||||
|  |     # Join submitted text to last action | ||||||
|  |     if(len(vars.actions) > 0): | ||||||
|  |         txt = vars.actions[-1] + txt | ||||||
|  |      | ||||||
|  |     # Scan text for matches on WI keys | ||||||
|  |     wimem = "" | ||||||
|  |     for wi in vars.worldinfo: | ||||||
|  |         if(wi["key"] != ""): | ||||||
|  |             # Split comma-separated keys | ||||||
|  |             keys = wi["key"].split(",") | ||||||
|  |             for k in keys: | ||||||
|  |                 # Remove leading/trailing spaces | ||||||
|  |                 ky = k.strip() | ||||||
|  |                 if ky in txt: | ||||||
|  |                     wimem = wimem + wi["content"] + "\n" | ||||||
|  |                     break | ||||||
|  |      | ||||||
|  |     return wimem | ||||||
|  |      | ||||||
|  |  | ||||||
| #==================================================================# | #==================================================================# | ||||||
| #  Commit changes to Memory storage | #  Commit changes to Memory storage | ||||||
| #==================================================================# | #==================================================================# | ||||||
| @@ -892,6 +1034,8 @@ def exitModes(): | |||||||
|         emit('from_server', {'cmd': 'editmode', 'data': 'false'}) |         emit('from_server', {'cmd': 'editmode', 'data': 'false'}) | ||||||
|     elif(vars.mode == "memory"): |     elif(vars.mode == "memory"): | ||||||
|         emit('from_server', {'cmd': 'memmode', 'data': 'false'}) |         emit('from_server', {'cmd': 'memmode', 'data': 'false'}) | ||||||
|  |     elif(vars.mode == "wi"): | ||||||
|  |         emit('from_server', {'cmd': 'wimode', 'data': 'false'}) | ||||||
|     vars.mode = "play" |     vars.mode = "play" | ||||||
|  |  | ||||||
| #==================================================================# | #==================================================================# | ||||||
| @@ -914,6 +1058,15 @@ def saveRequest(): | |||||||
|         js["memory"]      = vars.memory |         js["memory"]      = vars.memory | ||||||
|         js["authorsnote"] = vars.authornote |         js["authorsnote"] = vars.authornote | ||||||
|         js["actions"]     = vars.actions |         js["actions"]     = vars.actions | ||||||
|  |         js["worldinfo"]   = [] | ||||||
|  |          | ||||||
|  |         # Extract only the important bits of WI | ||||||
|  |         for wi in vars.worldinfo: | ||||||
|  |             if(wi["key"] != ""): | ||||||
|  |                 js["worldinfo"].append({ | ||||||
|  |                     "key": wi["key"], | ||||||
|  |                     "content": wi["content"] | ||||||
|  |                 }) | ||||||
|          |          | ||||||
|         # Write it |         # Write it | ||||||
|         file = open(savpath, "w") |         file = open(savpath, "w") | ||||||
| @@ -941,6 +1094,7 @@ def loadRequest(): | |||||||
|         vars.prompt      = js["prompt"] |         vars.prompt      = js["prompt"] | ||||||
|         vars.memory      = js["memory"] |         vars.memory      = js["memory"] | ||||||
|         vars.actions     = js["actions"] |         vars.actions     = js["actions"] | ||||||
|  |         vars.worldinfo   = [] | ||||||
|          |          | ||||||
|         # Try not to break older save files |         # Try not to break older save files | ||||||
|         if("authorsnote" in js): |         if("authorsnote" in js): | ||||||
| @@ -948,9 +1102,21 @@ def loadRequest(): | |||||||
|         else: |         else: | ||||||
|             vars.authornote = "" |             vars.authornote = "" | ||||||
|          |          | ||||||
|  |         if("worldinfo" in js): | ||||||
|  |             num = 0 | ||||||
|  |             for wi in js["worldinfo"]: | ||||||
|  |                 vars.worldinfo.append({ | ||||||
|  |                     "key": wi["key"], | ||||||
|  |                     "content": wi["content"], | ||||||
|  |                     "num": num, | ||||||
|  |                     "init": True | ||||||
|  |                 }) | ||||||
|  |                 num += 1 | ||||||
|  |          | ||||||
|         file.close() |         file.close() | ||||||
|          |          | ||||||
|         # Refresh game screen |         # Refresh game screen | ||||||
|  |         sendwi() | ||||||
|         refresh_story() |         refresh_story() | ||||||
|         emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}) |         emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}) | ||||||
|  |  | ||||||
| @@ -1008,16 +1174,30 @@ def importgame(): | |||||||
|         vars.memory      = ref["memory"] |         vars.memory      = ref["memory"] | ||||||
|         vars.authornote  = ref["authorsNote"] |         vars.authornote  = ref["authorsNote"] | ||||||
|         vars.actions     = [] |         vars.actions     = [] | ||||||
|  |         vars.worldinfo   = [] | ||||||
|          |          | ||||||
|         # Get all actions except for prompt |         # Get all actions except for prompt | ||||||
|         if(len(ref["actions"]) > 1): |         if(len(ref["actions"]) > 1): | ||||||
|             for act in ref["actions"][1:]: |             for act in ref["actions"][1:]: | ||||||
|                 vars.actions.append(act["text"]) |                 vars.actions.append(act["text"]) | ||||||
|          |          | ||||||
|  |         # Get just the important parts of world info | ||||||
|  |         if(len(ref["worldInfo"]) > 1): | ||||||
|  |             num = 0 | ||||||
|  |             for wi in ref["worldInfo"]: | ||||||
|  |                 vars.worldinfo.append({ | ||||||
|  |                     "key": wi["keys"], | ||||||
|  |                     "content": wi["entry"], | ||||||
|  |                     "num": num, | ||||||
|  |                     "init": True | ||||||
|  |                 }) | ||||||
|  |                 num += 1 | ||||||
|  |          | ||||||
|         # Clear import data |         # Clear import data | ||||||
|         vars.importjs = {} |         vars.importjs = {} | ||||||
|          |          | ||||||
|         # Refresh game screen |         # Refresh game screen | ||||||
|  |         sendwi() | ||||||
|         refresh_story() |         refresh_story() | ||||||
|         emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}) |         emit('from_server', {'cmd': 'setgamestate', 'data': 'ready'}) | ||||||
|  |  | ||||||
| @@ -1056,4 +1236,5 @@ if __name__ == "__main__": | |||||||
|      |      | ||||||
|     # Start Flask/SocketIO (Blocking, so this must be last method!) |     # Start Flask/SocketIO (Blocking, so this must be last method!) | ||||||
|     print("{0}Server started!\rYou may now connect with a browser at http://127.0.0.1:5000/{1}".format(colors.GREEN, colors.END)) |     print("{0}Server started!\rYou may now connect with a browser at http://127.0.0.1:5000/{1}".format(colors.GREEN, colors.END)) | ||||||
|  |     #socketio.run(app, host='0.0.0.0', port=5000) | ||||||
|     socketio.run(app) |     socketio.run(app) | ||||||
| @@ -19,11 +19,13 @@ var button_actmem; | |||||||
| var button_actback; | var button_actback; | ||||||
| var button_actretry; | var button_actretry; | ||||||
| var button_delete; | var button_delete; | ||||||
|  | var button_actwi; | ||||||
| var game_text; | var game_text; | ||||||
| var input_text; | var input_text; | ||||||
| var message_text; | var message_text; | ||||||
| var settings_menu; | var settings_menu; | ||||||
| var format_menu; | var format_menu; | ||||||
|  | var wi_menu; | ||||||
| var anote_menu; | var anote_menu; | ||||||
| var anote_input; | var anote_input; | ||||||
| var anote_labelcur; | var anote_labelcur; | ||||||
| @@ -120,6 +122,77 @@ function addImportLine(ob) { | |||||||
| 	}); | 	}); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function addWiLine(ob) { | ||||||
|  | 	if(ob.init) { | ||||||
|  | 		wi_menu.append("<div class=\"wilistitem\">\ | ||||||
|  | 			<div class=\"wiremove\">\ | ||||||
|  | 				<button type=\"button\" class=\"btn btn-primary heightfull\" id=\"btn_wi"+ob.num+"\">X</button>\ | ||||||
|  | 				<button type=\"button\" class=\"btn btn-success heighthalf hidden\" id=\"btn_widel"+ob.num+"\">✓</button>\ | ||||||
|  | 				<button type=\"button\" class=\"btn btn-danger heighthalf hidden\" id=\"btn_wican"+ob.num+"\">⮌</button>\ | ||||||
|  | 			</div>\ | ||||||
|  | 			<div class=\"wikey\">\ | ||||||
|  | 				<input class=\"form-control\" type=\"text\" placeholder=\"Key(s)\" id=\"wikey"+ob.num+"\">\ | ||||||
|  | 			</div>\ | ||||||
|  | 			<div class=\"wientry\">\ | ||||||
|  | 				<textarea class=\"form-control\" id=\"wientry"+ob.num+"\" placeholder=\"What To Remember\">"+ob.content+"</textarea>\ | ||||||
|  | 			</div>\ | ||||||
|  | 		</div>"); | ||||||
|  | 		// Send key value to text input | ||||||
|  | 		$("#wikey"+ob.num).val(ob.key); | ||||||
|  | 		// Assign delete event to button | ||||||
|  | 		$("#btn_wi"+ob.num).on("click", function () { | ||||||
|  | 			showWiDeleteConfirm(ob.num); | ||||||
|  | 		}); | ||||||
|  | 	} else { | ||||||
|  | 		// Show WI line item with form fields hidden (uninitialized) | ||||||
|  | 		wi_menu.append("<div class=\"wilistitem\">\ | ||||||
|  | 			<div class=\"wiremove\">\ | ||||||
|  | 				<button type=\"button\" class=\"btn btn-primary heightfull\" id=\"btn_wi"+ob.num+"\">+</button>\ | ||||||
|  | 				<button type=\"button\" class=\"btn btn-success heighthalf hidden\" id=\"btn_widel"+ob.num+"\">✓</button>\ | ||||||
|  | 				<button type=\"button\" class=\"btn btn-danger heighthalf hidden\" id=\"btn_wican"+ob.num+"\">X</button>\ | ||||||
|  | 			</div>\ | ||||||
|  | 			<div class=\"wikey\">\ | ||||||
|  | 				<input class=\"form-control hidden\" type=\"text\" placeholder=\"Key(s)\" id=\"wikey"+ob.num+"\">\ | ||||||
|  | 			</div>\ | ||||||
|  | 			<div class=\"wientry\">\ | ||||||
|  | 				<textarea class=\"form-control hidden\" id=\"wientry"+ob.num+"\" placeholder=\"What To Remember\"></textarea>\ | ||||||
|  | 			</div>\ | ||||||
|  | 		</div>"); | ||||||
|  | 		// Assign function to expand WI item to button | ||||||
|  | 		$("#btn_wi"+ob.num).on("click", function () { | ||||||
|  | 			expandWiLine(ob.num); | ||||||
|  | 		}); | ||||||
|  | 	} | ||||||
|  | 	// Assign actions to other elements | ||||||
|  | 	$("#btn_wican"+ob.num).on("click", function () { | ||||||
|  | 		hideWiDeleteConfirm(ob.num); | ||||||
|  | 	}); | ||||||
|  | 	$("#btn_widel"+ob.num).on("click", function () { | ||||||
|  | 		socket.send({'cmd': 'widelete', 'data': ob.num}); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function expandWiLine(num) { | ||||||
|  | 	show([$("#wikey"+num), $("#wientry"+num)]); | ||||||
|  | 	$("#btn_wi"+num).html("X"); | ||||||
|  | 	$("#btn_wi"+num).off(); | ||||||
|  | 	// Tell server the WI entry was initialized | ||||||
|  | 	socket.send({'cmd': 'wiinit', 'data': num}); | ||||||
|  | 	$("#btn_wi"+num).on("click", function () { | ||||||
|  | 		showWiDeleteConfirm(num); | ||||||
|  | 	}); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function showWiDeleteConfirm(num) { | ||||||
|  | 	hide([$("#btn_wi"+num)]); | ||||||
|  | 	show([$("#btn_widel"+num), $("#btn_wican"+num)]); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function hideWiDeleteConfirm(num) { | ||||||
|  | 	show([$("#btn_wi"+num)]); | ||||||
|  | 	hide([$("#btn_widel"+num), $("#btn_wican"+num)]); | ||||||
|  | } | ||||||
|  |  | ||||||
| function highlightImportLine(ref) { | function highlightImportLine(ref) { | ||||||
| 	$("#popupcontent > div").removeClass("popuplistselected"); | 	$("#popupcontent > div").removeClass("popuplistselected"); | ||||||
| 	ref.addClass("popuplistselected"); | 	ref.addClass("popuplistselected"); | ||||||
| @@ -207,7 +280,7 @@ function enterEditMode() { | |||||||
| 		editModeSelect($(this).attr("n")); | 		editModeSelect($(this).attr("n")); | ||||||
| 	}); | 	}); | ||||||
| 	disableSendBtn(); | 	disableSendBtn(); | ||||||
| 	hide([button_actback, button_actmem, button_actretry]); | 	hide([button_actback, button_actmem, button_actretry, button_actwi]); | ||||||
| 	show([button_delete]); | 	show([button_delete]); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -218,7 +291,7 @@ function exitEditMode() { | |||||||
| 	game_text.children('chunk').removeClass("chunkhov"); | 	game_text.children('chunk').removeClass("chunkhov"); | ||||||
| 	game_text.off('click', '> *'); | 	game_text.off('click', '> *'); | ||||||
| 	enableSendBtn(); | 	enableSendBtn(); | ||||||
| 	show([button_actback, button_actmem, button_actretry]); | 	show([button_actback, button_actmem, button_actretry, button_actwi]); | ||||||
| 	hide([button_delete]); | 	hide([button_delete]); | ||||||
| 	input_text.val(""); | 	input_text.val(""); | ||||||
| } | } | ||||||
| @@ -230,7 +303,7 @@ function editModeSelect(n) { | |||||||
| function enterMemoryMode() { | function enterMemoryMode() { | ||||||
| 	showMessage("Edit the memory to be sent with each request to the AI."); | 	showMessage("Edit the memory to be sent with each request to the AI."); | ||||||
| 	button_actmem.html("Cancel"); | 	button_actmem.html("Cancel"); | ||||||
| 	hide([button_actback, button_actretry, button_actedit, button_delete]); | 	hide([button_actback, button_actretry, button_actedit, button_delete, button_actwi]); | ||||||
| 	// Display Author's Note field | 	// Display Author's Note field | ||||||
| 	anote_menu.slideDown("fast"); | 	anote_menu.slideDown("fast"); | ||||||
| } | } | ||||||
| @@ -238,12 +311,40 @@ function enterMemoryMode() { | |||||||
| function exitMemoryMode() { | function exitMemoryMode() { | ||||||
| 	hideMessage(); | 	hideMessage(); | ||||||
| 	button_actmem.html("Memory"); | 	button_actmem.html("Memory"); | ||||||
| 	show([button_actback, button_actretry, button_actedit]); | 	show([button_actback, button_actretry, button_actedit, button_actwi]); | ||||||
| 	input_text.val(""); | 	input_text.val(""); | ||||||
| 	// Hide Author's Note field | 	// Hide Author's Note field | ||||||
| 	anote_menu.slideUp("fast"); | 	anote_menu.slideUp("fast"); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function enterWiMode() { | ||||||
|  | 	showMessage("World Info will be added to memory only when the key appears in submitted text or the last action."); | ||||||
|  | 	button_actwi.html("Accept"); | ||||||
|  | 	hide([button_actedit, button_actback, button_actmem, button_actretry, game_text]); | ||||||
|  | 	show([wi_menu]); | ||||||
|  | 	disableSendBtn(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function exitWiMode() { | ||||||
|  | 	hideMessage(); | ||||||
|  | 	button_actwi.html("W Info"); | ||||||
|  | 	hide([wi_menu]); | ||||||
|  | 	show([button_actedit, button_actback, button_actmem, button_actretry, game_text]); | ||||||
|  | 	enableSendBtn(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function returnWiList(ar) { | ||||||
|  | 	var list = []; | ||||||
|  | 	var i; | ||||||
|  | 	for(i=0; i<ar.length; i++) { | ||||||
|  | 		var ob     = {"key": "", "content": "", "num": ar[i]}; | ||||||
|  | 		ob.key     = $("#wikey"+ar[i]).val(); | ||||||
|  | 		ob.content = $("#wientry"+ar[i]).val(); | ||||||
|  | 		list.push(ob); | ||||||
|  | 	} | ||||||
|  | 	socket.send({'cmd': 'sendwilist', 'data': list}); | ||||||
|  | } | ||||||
|  |  | ||||||
| function dosubmit() { | function dosubmit() { | ||||||
| 	var txt = input_text.val(); | 	var txt = input_text.val(); | ||||||
| 	socket.send({'cmd': 'submit', 'data': txt}); | 	socket.send({'cmd': 'submit', 'data': txt}); | ||||||
| @@ -282,12 +383,14 @@ $(document).ready(function(){ | |||||||
| 	button_actback  = $('#btn_actundo'); | 	button_actback  = $('#btn_actundo'); | ||||||
| 	button_actretry = $('#btn_actretry'); | 	button_actretry = $('#btn_actretry'); | ||||||
| 	button_delete   = $('#btn_delete'); | 	button_delete   = $('#btn_delete'); | ||||||
|  | 	button_actwi    = $('#btn_actwi'); | ||||||
| 	game_text       = $('#gametext'); | 	game_text       = $('#gametext'); | ||||||
| 	input_text      = $('#input_text'); | 	input_text      = $('#input_text'); | ||||||
| 	message_text    = $('#messagefield'); | 	message_text    = $('#messagefield'); | ||||||
| 	settings_menu   = $("#settingsmenu"); | 	settings_menu   = $("#settingsmenu"); | ||||||
| 	format_menu     = $('#formatmenu'); | 	format_menu     = $('#formatmenu'); | ||||||
| 	anote_menu      = $('#anoterowcontainer'); | 	anote_menu      = $('#anoterowcontainer'); | ||||||
|  | 	wi_menu         = $('#wimenu'); | ||||||
| 	anote_input     = $('#anoteinput'); | 	anote_input     = $('#anoteinput'); | ||||||
| 	anote_labelcur  = $('#anotecur'); | 	anote_labelcur  = $('#anotecur'); | ||||||
| 	anote_slider    = $('#anotedepth'); | 	anote_slider    = $('#anotedepth'); | ||||||
| @@ -298,7 +401,8 @@ $(document).ready(function(){ | |||||||
| 	popup_close     = $("#btn_popupclose"); | 	popup_close     = $("#btn_popupclose"); | ||||||
| 	 | 	 | ||||||
|     // Connect to SocketIO server |     // Connect to SocketIO server | ||||||
|     socket = io.connect('http://127.0.0.1:5000'); | 	loc    = window.document.location; | ||||||
|  |     socket = io.connect(loc.href); | ||||||
| 	 | 	 | ||||||
| 	socket.on('from_server', function(msg) { | 	socket.on('from_server', function(msg) { | ||||||
|         if(msg.cmd == "connected") { |         if(msg.cmd == "connected") { | ||||||
| @@ -306,9 +410,10 @@ $(document).ready(function(){ | |||||||
| 			connect_status.html("<b>Connected to KoboldAI Process!</b>"); | 			connect_status.html("<b>Connected to KoboldAI Process!</b>"); | ||||||
| 			connect_status.removeClass("color_orange"); | 			connect_status.removeClass("color_orange"); | ||||||
| 			connect_status.addClass("color_green"); | 			connect_status.addClass("color_green"); | ||||||
| 			// Reset Settings Menu | 			// Reset Menus | ||||||
| 			settings_menu.html(""); | 			settings_menu.html(""); | ||||||
| 			format_menu.html(""); | 			format_menu.html(""); | ||||||
|  | 			wi_menu.html(""); | ||||||
| 		} else if(msg.cmd == "updatescreen") { | 		} else if(msg.cmd == "updatescreen") { | ||||||
| 			// Send game content to Game Screen | 			// Send game content to Game Screen | ||||||
| 			game_text.html(msg.data); | 			game_text.html(msg.data); | ||||||
| @@ -320,16 +425,22 @@ $(document).ready(function(){ | |||||||
| 			// Enable or Disable buttons | 			// Enable or Disable buttons | ||||||
| 			if(msg.data == "ready") { | 			if(msg.data == "ready") { | ||||||
| 				enableSendBtn(); | 				enableSendBtn(); | ||||||
| 				enableButtons([button_actedit, button_actmem, button_actback, button_actretry]); | 				enableButtons([button_actedit, button_actmem, button_actwi, button_actback, button_actretry]); | ||||||
| 				hideWaitAnimation(); | 				hideWaitAnimation(); | ||||||
| 			} else if(msg.data == "wait") { | 			} else if(msg.data == "wait") { | ||||||
| 				disableSendBtn(); | 				disableSendBtn(); | ||||||
| 				disableButtons([button_actedit, button_actmem, button_actback, button_actretry]); | 				disableButtons([button_actedit, button_actmem, button_actwi, button_actback, button_actretry]); | ||||||
| 				showWaitAnimation(); | 				showWaitAnimation(); | ||||||
| 			} else if(msg.data == "start") { | 			} else if(msg.data == "start") { | ||||||
| 				enableSendBtn(); | 				enableSendBtn(); | ||||||
| 				enableButtons([button_actmem]); | 				enableButtons([button_actmem, button_actwi]); | ||||||
| 				disableButtons([button_actedit, button_actback, button_actretry]); | 				disableButtons([button_actedit, button_actback, button_actretry]); | ||||||
|  | 				hide([wi_menu, button_delete]); | ||||||
|  | 				show([game_text, button_actedit, button_actmem, button_actwi, button_actback, button_actretry]); | ||||||
|  | 				hideMessage(); | ||||||
|  | 				button_actedit.html("Edit"); | ||||||
|  | 				button_actmem.html("Memory"); | ||||||
|  | 				button_actwi.html("W Info"); | ||||||
| 			} | 			} | ||||||
| 		} else if(msg.cmd == "editmode") { | 		} else if(msg.cmd == "editmode") { | ||||||
| 			// Enable or Disable edit mode | 			// Enable or Disable edit mode | ||||||
| @@ -443,6 +554,22 @@ $(document).ready(function(){ | |||||||
| 		} else if(msg.cmd == "clearpopup") { | 		} else if(msg.cmd == "clearpopup") { | ||||||
| 			// Clear previous contents of popup | 			// Clear previous contents of popup | ||||||
| 			popup_content.html(""); | 			popup_content.html(""); | ||||||
|  | 		} else if(msg.cmd == "wimode") { | ||||||
|  | 			// Enable or Disable WI edit mode | ||||||
|  | 			if(msg.data == "true") { | ||||||
|  | 				enterWiMode(); | ||||||
|  | 			} else { | ||||||
|  | 				exitWiMode(); | ||||||
|  | 			} | ||||||
|  | 		} else if(msg.cmd == "addwiitem") { | ||||||
|  | 			// Add WI entry to WI Menu | ||||||
|  | 			addWiLine(msg.data); | ||||||
|  | 		} else if(msg.cmd == "clearwi") { | ||||||
|  | 			// Clear previous contents of WI list | ||||||
|  | 			wi_menu.html(""); | ||||||
|  | 		} else if(msg.cmd == "requestwiitem") { | ||||||
|  | 			// Package WI contents and send back to server | ||||||
|  | 			returnWiList(msg.data); | ||||||
| 		} | 		} | ||||||
|     });	 |     });	 | ||||||
| 	 | 	 | ||||||
| @@ -509,6 +636,10 @@ $(document).ready(function(){ | |||||||
| 		socket.send({'cmd': 'importaccept', 'data': ''}); | 		socket.send({'cmd': 'importaccept', 'data': ''}); | ||||||
| 	}); | 	}); | ||||||
| 	 | 	 | ||||||
|  | 	button_actwi.on("click", function(ev) { | ||||||
|  | 		socket.send({'cmd': 'wi', 'data': ''}); | ||||||
|  | 	}); | ||||||
|  | 	 | ||||||
| 	// I think this was removed? | 	// I think this was removed? | ||||||
| 	//$("#btn_savesettings").on("click", function(ev) { | 	//$("#btn_savesettings").on("click", function(ev) { | ||||||
| 	//	socket.send({'cmd': 'savesettings', 'data': ''}); | 	//	socket.send({'cmd': 'savesettings', 'data': ''}); | ||||||
|   | |||||||
| @@ -199,6 +199,13 @@ chunk { | |||||||
| 	 | 	 | ||||||
| } | } | ||||||
|  |  | ||||||
|  | #wimenu { | ||||||
|  | 	max-height: 100%; | ||||||
|  | 	width: 100%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /*================= Classes =================*/ | ||||||
|  |  | ||||||
| .anotelabel { | .anotelabel { | ||||||
| 	font-size: 10pt; | 	font-size: 10pt; | ||||||
| 	color: #ffffff; | 	color: #ffffff; | ||||||
| @@ -263,6 +270,14 @@ chunk { | |||||||
| 	display: none; | 	display: none; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .heightfull { | ||||||
|  | 	height: 100%; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .heighthalf { | ||||||
|  | 	height: 50%; | ||||||
|  | } | ||||||
|  |  | ||||||
| .helpicon { | .helpicon { | ||||||
|     display: inline-block; |     display: inline-block; | ||||||
|     font-family: sans-serif; |     font-family: sans-serif; | ||||||
| @@ -366,3 +381,39 @@ chunk { | |||||||
| 	display: inline-block; | 	display: inline-block; | ||||||
| 	width: 50px; | 	width: 50px; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | .wilistitem { | ||||||
|  | 	height: 80px; | ||||||
|  | 	display: grid; | ||||||
|  | 	grid-template-columns: 4% 30% 66%; | ||||||
|  | 	margin-bottom: 10px; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .wientry { | ||||||
|  | 	padding-left: 10px; | ||||||
|  | 	background-color: #212122; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .wientry > textarea { | ||||||
|  | 	height: 100%; | ||||||
|  | 	resize: none; | ||||||
|  | 	overflow:auto; | ||||||
|  | 	background-color: #404040; | ||||||
|  | 	color: #ffffff; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .wikey { | ||||||
|  | 	background-color: #212122; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .wikey > input { | ||||||
|  | 	height: 100%; | ||||||
|  | 	background-color: #404040; | ||||||
|  | 	color: #ffffff; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | .wiremove > button { | ||||||
|  | 	width: 80%; | ||||||
|  | 	overflow: hidden; | ||||||
|  | 	font-size: 12pt; | ||||||
|  | } | ||||||
| @@ -38,12 +38,15 @@ | |||||||
| 		</div> | 		</div> | ||||||
| 		<div class="row" id="gamescreen"> | 		<div class="row" id="gamescreen"> | ||||||
| 			<span id="gametext">...</span> | 			<span id="gametext">...</span> | ||||||
|  | 			<div class="hidden" id="wimenu"> | ||||||
|  | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div class="row" id="actionmenu"> | 		<div class="row" id="actionmenu"> | ||||||
| 			<div id="actionmenuitems"> | 			<div id="actionmenuitems"> | ||||||
| 				<div> | 				<div> | ||||||
| 					<button type="button" class="btn btn-primary" id="btn_actedit">Edit</button> | 					<button type="button" class="btn btn-primary" id="btn_actedit">Edit</button> | ||||||
| 					<button type="button" class="btn btn-primary" id="btn_actmem">Memory</button> | 					<button type="button" class="btn btn-primary" id="btn_actmem">Memory</button> | ||||||
|  | 					<button type="button" class="btn btn-primary" id="btn_actwi">W Info</button> | ||||||
| 					<button type="button" class="btn btn-primary" id="btn_actundo">Back</button> | 					<button type="button" class="btn btn-primary" id="btn_actundo">Back</button> | ||||||
| 					<button type="button" class="btn btn-primary" id="btn_actretry">Retry</button> | 					<button type="button" class="btn btn-primary" id="btn_actretry">Retry</button> | ||||||
| 					<button type="button" class="btn btn-primary hidden" id="btn_delete">Delete</button> | 					<button type="button" class="btn btn-primary hidden" id="btn_delete">Delete</button> | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								utils.py
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								utils.py
									
									
									
									
									
								
							| @@ -69,7 +69,7 @@ def removespecialchars(txt): | |||||||
| def addsentencespacing(txt, acts): | def addsentencespacing(txt, acts): | ||||||
|     # Get last character of last action |     # Get last character of last action | ||||||
|     lastchar = acts[-1][-1] |     lastchar = acts[-1][-1] | ||||||
|     if(lastchar == "." or lastchar == "!" or lastchar == "?"): |     if(lastchar == "." or lastchar == "!" or lastchar == "?" or lastchar == "," or lastchar == ";" or lastchar == ":"): | ||||||
|         txt = " " + txt |         txt = " " + txt | ||||||
|     return txt |     return txt | ||||||
|      |      | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user