mirror of
https://github.com/KoboldAI/KoboldAI-Client.git
synced 2025-06-05 21:59:24 +02:00
Update to text highlighting when text will go to AI generator. Significant speed increase
This commit is contained in:
13
aiserver.py
13
aiserver.py
@@ -5974,6 +5974,19 @@ def send_debug():
|
|||||||
emit('from_server', {'cmd': 'debug_info', 'data': debug_info}, broadcast=True, room="UI_1")
|
emit('from_server', {'cmd': 'debug_info', 'data': debug_info}, broadcast=True, room="UI_1")
|
||||||
|
|
||||||
|
|
||||||
|
#==================================================================#
|
||||||
|
# UI V2 CODE
|
||||||
|
#==================================================================#
|
||||||
|
@app.route('/ai_text')
|
||||||
|
def ai_text():
|
||||||
|
start_time = time.time()
|
||||||
|
text = koboldai_vars.calc_ai_text()
|
||||||
|
print("Generating Game Text took {} seconds".format(time.time()-start_time))
|
||||||
|
return text
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#==================================================================#
|
#==================================================================#
|
||||||
# UI V2 CODE
|
# UI V2 CODE
|
||||||
#==================================================================#
|
#==================================================================#
|
||||||
|
@@ -38,6 +38,7 @@ def process_variable_changes(socketio, classname, name, value, old_value, debug_
|
|||||||
socketio.emit("var_changed", {"classname": "actions", "name": "Selected Text", "old_value": None, "value": {"id": i, "text": value[i]}}, include_self=True, broadcast=True, room="UI_2")
|
socketio.emit("var_changed", {"classname": "actions", "name": "Selected Text", "old_value": None, "value": {"id": i, "text": value[i]}}, include_self=True, broadcast=True, room="UI_2")
|
||||||
socketio.emit("var_changed", {"classname": "actions", "name": "Options", "old_value": None, "value": {"id": i, "options": value.actions[i]['Options']}}, include_self=True, broadcast=True, room="UI_2")
|
socketio.emit("var_changed", {"classname": "actions", "name": "Options", "old_value": None, "value": {"id": i, "options": value.actions[i]['Options']}}, include_self=True, broadcast=True, room="UI_2")
|
||||||
socketio.emit("var_changed", {"classname": "actions", "name": "Selected Text Length", "old_value": None, "value": {"id": i, 'length': value.actions[i]['Selected Text Length']}}, include_self=True, broadcast=True, room="UI_2")
|
socketio.emit("var_changed", {"classname": "actions", "name": "Selected Text Length", "old_value": None, "value": {"id": i, 'length': value.actions[i]['Selected Text Length']}}, include_self=True, broadcast=True, room="UI_2")
|
||||||
|
socketio.emit("var_changed", {"classname": "actions", "name": "In AI Input", "old_value": None, "value": {"id": i, 'In AI Input': value.actions[i]['In AI Input']}}, include_self=True, broadcast=True, room="UI_2")
|
||||||
elif isinstance(value, KoboldWorldInfo):
|
elif isinstance(value, KoboldWorldInfo):
|
||||||
value.send_to_ui()
|
value.send_to_ui()
|
||||||
else:
|
else:
|
||||||
@@ -62,9 +63,10 @@ class koboldai_vars(object):
|
|||||||
self._model_settings = model_settings(socketio)
|
self._model_settings = model_settings(socketio)
|
||||||
self._user_settings = user_settings(socketio)
|
self._user_settings = user_settings(socketio)
|
||||||
self._system_settings = system_settings(socketio)
|
self._system_settings = system_settings(socketio)
|
||||||
self._story_settings = {'default': story_settings(socketio)}
|
self._story_settings = {'default': story_settings(socketio, self)}
|
||||||
self._sessions = sessions_var
|
self._sessions = sessions_var
|
||||||
self.socketio = socketio
|
self.socketio = socketio
|
||||||
|
self.tokenizer = None
|
||||||
|
|
||||||
def to_json(self, classname):
|
def to_json(self, classname):
|
||||||
if classname == 'story_settings':
|
if classname == 'story_settings':
|
||||||
@@ -116,8 +118,145 @@ class koboldai_vars(object):
|
|||||||
def reset_model(self):
|
def reset_model(self):
|
||||||
self._model_settings.reset_for_model_load()
|
self._model_settings.reset_for_model_load()
|
||||||
|
|
||||||
|
def calc_ai_text(self):
|
||||||
|
token_budget = self.max_length
|
||||||
|
used_world_info = []
|
||||||
|
used_tokens = 0
|
||||||
|
text = ""
|
||||||
|
|
||||||
|
self.worldinfo_v2.reset_used_in_game()
|
||||||
|
|
||||||
|
#Add memory
|
||||||
|
memory_length = self.max_memory_length if self.memory_length > self.max_memory_length else self.memory_length
|
||||||
|
if memory_length+used_tokens <= token_budget:
|
||||||
|
if self.memory_length > self.max_memory_length:
|
||||||
|
if self.tokenizer is None:
|
||||||
|
text = self.memory
|
||||||
|
else:
|
||||||
|
text += self.tokenizer.decode(self.tokenizer.encode(self.memory)[-self.max_memory_length-1:])
|
||||||
|
else:
|
||||||
|
text += self.memory
|
||||||
|
|
||||||
|
#Add constant world info entries to memory
|
||||||
|
for wi in self.worldinfo_v2:
|
||||||
|
if wi['constant']:
|
||||||
|
if used_tokens+wi['token_length'] <= token_budget:
|
||||||
|
used_tokens+=wi['token_length']
|
||||||
|
used_world_info.append(wi['uid'])
|
||||||
|
self.worldinfo_v2.set_world_info_used(wi['uid'])
|
||||||
|
text += wi['content']
|
||||||
|
|
||||||
|
#Add prompt lenght/text if we're set to always use prompt
|
||||||
|
if self.useprompt:
|
||||||
|
if self.max_prompt_length if self.prompt_length > self.max_prompt_length else self.prompt_length + used_tokens < token_budget:
|
||||||
|
used_tokens += self.max_prompt_length if self.prompt_length > self.max_prompt_length else self.prompt_length
|
||||||
|
#Find World Info entries in prompt
|
||||||
|
for wi in self.worldinfo_v2:
|
||||||
|
if wi['uid'] not in used_world_info:
|
||||||
|
#Check to see if we have the keys/secondary keys in the text so far
|
||||||
|
match = False
|
||||||
|
for key in wi['key']:
|
||||||
|
if key in self.prompt:
|
||||||
|
match = True
|
||||||
|
break
|
||||||
|
if wi['selective'] and match:
|
||||||
|
match = False
|
||||||
|
for key in wi['keysecondary']:
|
||||||
|
if key in self.prompt:
|
||||||
|
match=True
|
||||||
|
break
|
||||||
|
if match:
|
||||||
|
if used_tokens+wi['token_length'] <= token_budget:
|
||||||
|
used_tokens+=wi['token_length']
|
||||||
|
used_world_info.append(wi['uid'])
|
||||||
|
text += wi['content']
|
||||||
|
self.worldinfo_v2.set_world_info_used(wi['uid'])
|
||||||
|
if self.prompt_length > self.max_prompt_length:
|
||||||
|
if self.tokenizer is None:
|
||||||
|
text += self.prompt
|
||||||
|
else:
|
||||||
|
text += self.tokenizer.decode(self.tokenizer.encode(self.prompt)[-self.max_prompt_length-1:])
|
||||||
|
else:
|
||||||
|
text += self.prompt
|
||||||
|
self.prompt_in_ai = True
|
||||||
|
else:
|
||||||
|
self.prompt_in_ai = False
|
||||||
|
|
||||||
|
#remove author's notes token length (Add the text later)
|
||||||
|
used_tokens += self.authornote_length
|
||||||
|
|
||||||
|
#Start going through the actions backwards, adding it to the text if it fits and look for world info entries
|
||||||
|
game_text = ""
|
||||||
|
used_all_tokens = False
|
||||||
|
for i in range(len(self.actions)-1, -1, -1):
|
||||||
|
if len(self.actions) - i == self.andepth:
|
||||||
|
game_text = "{}{}".format(self.authornotetemplate.replace("<|>", self.authornote), game_text)
|
||||||
|
if self.actions.actions[i]["Selected Text Length"]+used_tokens <= token_budget and not used_all_tokens:
|
||||||
|
used_tokens += self.actions.actions[i]["Selected Text Length"]
|
||||||
|
game_text = "{}{}".format(self.actions.actions[i]["Selected Text"], game_text)
|
||||||
|
self.actions.set_action_in_ai(i)
|
||||||
|
#Now we need to check for used world info entries
|
||||||
|
for wi in self.worldinfo_v2:
|
||||||
|
if wi['uid'] not in used_world_info:
|
||||||
|
#Check to see if we have the keys/secondary keys in the text so far
|
||||||
|
match = False
|
||||||
|
for key in wi['key']:
|
||||||
|
if key in self.actions.actions[i]["Selected Text"]:
|
||||||
|
match = True
|
||||||
|
break
|
||||||
|
if wi['selective'] and match:
|
||||||
|
match = False
|
||||||
|
for key in wi['keysecondary']:
|
||||||
|
if key in self.actions.actions[i]["Selected Text"]:
|
||||||
|
match=True
|
||||||
|
break
|
||||||
|
if match:
|
||||||
|
if used_tokens+wi['token_length'] <= token_budget:
|
||||||
|
used_tokens+=wi['token_length']
|
||||||
|
used_world_info.append(wi['uid'])
|
||||||
|
game_text = "{}{}".format(wi['content'], game_text)
|
||||||
|
self.worldinfo_v2.set_world_info_used(wi['uid'])
|
||||||
|
else:
|
||||||
|
self.actions.set_action_in_ai(i, used=False)
|
||||||
|
used_all_tokens = True
|
||||||
|
|
||||||
|
#if we don't have enough actions to get to author's note depth then we just add it right before the game text
|
||||||
|
if len(self.actions) < self.andepth:
|
||||||
|
game_text = "{}{}".format(self.authornotetemplate.replace("<|>", self.authornote), game_text)
|
||||||
|
|
||||||
|
if not self.useprompt:
|
||||||
|
if self.prompt_length + used_tokens < token_budget:
|
||||||
|
used_tokens = self.prompt_length
|
||||||
|
#Find World Info entries in prompt
|
||||||
|
for wi in self.worldinfo_v2:
|
||||||
|
if wi['uid'] not in used_world_info:
|
||||||
|
#Check to see if we have the keys/secondary keys in the text so far
|
||||||
|
match = False
|
||||||
|
for key in wi['key']:
|
||||||
|
if key in self.prompt:
|
||||||
|
match = True
|
||||||
|
break
|
||||||
|
if wi['selective'] and match:
|
||||||
|
match = False
|
||||||
|
for key in wi['keysecondary']:
|
||||||
|
if key in self.prompt:
|
||||||
|
match=True
|
||||||
|
break
|
||||||
|
if match:
|
||||||
|
if used_tokens+wi['token_length'] <= token_budget:
|
||||||
|
used_tokens+=wi['token_length']
|
||||||
|
used_world_info.append(wi['uid'])
|
||||||
|
text += wi['content']
|
||||||
|
self.prompt_in_ai = True
|
||||||
|
else:
|
||||||
|
self.prompt_in_ai = False
|
||||||
|
text += self.prompt
|
||||||
|
|
||||||
|
text += game_text
|
||||||
|
return text
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
if name[0] == "_":
|
if name[0] == "_" or name == "tokenizer":
|
||||||
super().__setattr__(name, value)
|
super().__setattr__(name, value)
|
||||||
if name[0] != "_":
|
if name[0] != "_":
|
||||||
#Send it to the corrent _setting class
|
#Send it to the corrent _setting class
|
||||||
@@ -316,12 +455,13 @@ class model_settings(settings):
|
|||||||
process_variable_changes(self.socketio, self.__class__.__name__.replace("_settings", ""), name, value, old_value)
|
process_variable_changes(self.socketio, self.__class__.__name__.replace("_settings", ""), name, value, old_value)
|
||||||
|
|
||||||
class story_settings(settings):
|
class story_settings(settings):
|
||||||
local_only_variables = ['socketio', 'tokenizer']
|
local_only_variables = ['socketio', 'tokenizer', 'koboldai_vars']
|
||||||
no_save_variables = ['socketio', 'tokenizer']
|
no_save_variables = ['socketio', 'tokenizer', 'koboldai_vars']
|
||||||
settings_name = "story"
|
settings_name = "story"
|
||||||
def __init__(self, socketio, tokenizer=None):
|
def __init__(self, socketio, koboldai_vars, tokenizer=None):
|
||||||
self.socketio = socketio
|
self.socketio = socketio
|
||||||
self.tokenizer = tokenizer
|
self.tokenizer = tokenizer
|
||||||
|
self.koboldai_vars = koboldai_vars
|
||||||
self.story_name = "New Game" # Title of the story
|
self.story_name = "New Game" # Title of the story
|
||||||
self.lastact = "" # The last action received from the user
|
self.lastact = "" # The last action received from the user
|
||||||
self.submission = "" # Same as above, but after applying input formatting
|
self.submission = "" # Same as above, but after applying input formatting
|
||||||
@@ -335,14 +475,14 @@ class story_settings(settings):
|
|||||||
self.authornotetemplate = "[Author's note: <|>]" # Author's note template
|
self.authornotetemplate = "[Author's note: <|>]" # Author's note template
|
||||||
self.setauthornotetemplate = self.authornotetemplate # Saved author's note template in settings
|
self.setauthornotetemplate = self.authornotetemplate # Saved author's note template in settings
|
||||||
self.andepth = 3 # How far back in history to append author's note
|
self.andepth = 3 # How far back in history to append author's note
|
||||||
self.actions = KoboldStoryRegister(socketio, self, tokenizer=tokenizer) # Actions submitted by user and AI
|
self.actions = KoboldStoryRegister(socketio, self, koboldai_vars, tokenizer=tokenizer) # Actions submitted by user and AI
|
||||||
self.actions_metadata = {} # List of dictonaries, one dictonary for every action that contains information about the action like alternative options.
|
self.actions_metadata = {} # List of dictonaries, one dictonary for every action that contains information about the action like alternative options.
|
||||||
# Contains at least the same number of items as actions. Back action will remove an item from actions, but not actions_metadata
|
# Contains at least the same number of items as actions. Back action will remove an item from actions, but not actions_metadata
|
||||||
# Dictonary keys are:
|
# Dictonary keys are:
|
||||||
# Selected Text: (text the user had selected. None when this is a newly generated action)
|
# Selected Text: (text the user had selected. None when this is a newly generated action)
|
||||||
# Alternative Generated Text: {Text, Pinned, Previous Selection, Edited}
|
# Alternative Generated Text: {Text, Pinned, Previous Selection, Edited}
|
||||||
#
|
#
|
||||||
self.worldinfo_v2 = KoboldWorldInfo(socketio, self, tokenizer=self.tokenizer)
|
self.worldinfo_v2 = KoboldWorldInfo(socketio, self, koboldai_vars, tokenizer=self.tokenizer)
|
||||||
self.worldinfo = [] # List of World Info key/value objects
|
self.worldinfo = [] # List of World Info key/value objects
|
||||||
self.worldinfo_i = [] # List of World Info key/value objects sans uninitialized entries
|
self.worldinfo_i = [] # List of World Info key/value objects sans uninitialized entries
|
||||||
self.worldinfo_u = {} # Dictionary of World Info UID - key/value pairs
|
self.worldinfo_u = {} # Dictionary of World Info UID - key/value pairs
|
||||||
@@ -368,6 +508,13 @@ class story_settings(settings):
|
|||||||
self.notes = "" #Notes for the story. Does nothing but save
|
self.notes = "" #Notes for the story. Does nothing but save
|
||||||
self.biases = {} # should look like {"phrase": [score, completion_threshold]}
|
self.biases = {} # should look like {"phrase": [score, completion_threshold]}
|
||||||
self.story_id = int.from_bytes(os.urandom(16), 'little', signed=True) # this is a unique ID for the story. We'll use this to ensure when we save that we're saving the same story
|
self.story_id = int.from_bytes(os.urandom(16), 'little', signed=True) # this is a unique ID for the story. We'll use this to ensure when we save that we're saving the same story
|
||||||
|
self.memory_length = 0
|
||||||
|
self.prompt_length = 0
|
||||||
|
self.authornote_length = 512
|
||||||
|
self.max_memory_length = 512
|
||||||
|
self.max_prompt_length = 512
|
||||||
|
self.max_authornote_length = 512
|
||||||
|
self.prompt_in_ai = False
|
||||||
|
|
||||||
def save_story(self):
|
def save_story(self):
|
||||||
print("Saving")
|
print("Saving")
|
||||||
@@ -378,7 +525,7 @@ class story_settings(settings):
|
|||||||
|
|
||||||
def reset(self):
|
def reset(self):
|
||||||
self.socketio.emit("reset_story", {}, broadcast=True, room="UI_2")
|
self.socketio.emit("reset_story", {}, broadcast=True, room="UI_2")
|
||||||
self.__init__(self.socketio, tokenizer=self.tokenizer)
|
self.__init__(self.socketio, self.koboldai_vars, tokenizer=self.tokenizer)
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
new_variable = name not in self.__dict__
|
new_variable = name not in self.__dict__
|
||||||
@@ -398,7 +545,9 @@ class story_settings(settings):
|
|||||||
if name in ['story_name', 'prompt', 'memory', 'authornote', 'authornotetemplate', 'andepth', 'chatname', 'actionmode', 'dynamicscan', 'notes', 'biases']:
|
if name in ['story_name', 'prompt', 'memory', 'authornote', 'authornotetemplate', 'andepth', 'chatname', 'actionmode', 'dynamicscan', 'notes', 'biases']:
|
||||||
self.gamesaved = False
|
self.gamesaved = False
|
||||||
|
|
||||||
if name == 'actions':
|
if name == 'useprompt':
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
|
elif name == 'actions':
|
||||||
self.actions.story_settings = self
|
self.actions.story_settings = self
|
||||||
elif name == 'story_name':
|
elif name == 'story_name':
|
||||||
#reset the story id if we change the name
|
#reset the story id if we change the name
|
||||||
@@ -410,12 +559,16 @@ class story_settings(settings):
|
|||||||
self.memory_length = len(self.tokenizer.encode(self.memory))
|
self.memory_length = len(self.tokenizer.encode(self.memory))
|
||||||
self.prompt_length = len(self.tokenizer.encode(self.prompt))
|
self.prompt_length = len(self.tokenizer.encode(self.prompt))
|
||||||
self.authornote_length = len(self.tokenizer.encode(self.authornotetemplate.replace("<|>", self.authornote)))
|
self.authornote_length = len(self.tokenizer.encode(self.authornotetemplate.replace("<|>", self.authornote)))
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
elif name == 'authornote' or name == 'authornotetemplate':
|
elif name == 'authornote' or name == 'authornotetemplate':
|
||||||
self.authornote_length = len(self.tokenizer.encode(self.authornotetemplate.replace("<|>", self.authornote)))
|
self.authornote_length = len(self.tokenizer.encode(self.authornotetemplate.replace("<|>", self.authornote)))
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
elif name == 'memory':
|
elif name == 'memory':
|
||||||
self.memory_length = len(self.tokenizer.encode(self.memory))
|
self.memory_length = len(self.tokenizer.encode(self.memory))
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
elif name == 'prompt':
|
elif name == 'prompt':
|
||||||
self.prompt_length = len(self.tokenizer.encode(self.prompt))
|
self.prompt_length = len(self.tokenizer.encode(self.prompt))
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
|
|
||||||
#Because we have seperate variables for action types, this syncs them
|
#Because we have seperate variables for action types, this syncs them
|
||||||
elif name == 'actionmode':
|
elif name == 'actionmode':
|
||||||
@@ -537,9 +690,10 @@ class system_settings(settings):
|
|||||||
process_variable_changes(self.socketio, self.__class__.__name__.replace("_settings", ""), name, value, old_value)
|
process_variable_changes(self.socketio, self.__class__.__name__.replace("_settings", ""), name, value, old_value)
|
||||||
|
|
||||||
class KoboldStoryRegister(object):
|
class KoboldStoryRegister(object):
|
||||||
def __init__(self, socketio, story_settings, tokenizer=None, sequence=[]):
|
def __init__(self, socketio, story_settings, koboldai_vars, tokenizer=None, sequence=[]):
|
||||||
self.socketio = socketio
|
self.socketio = socketio
|
||||||
self.actions = {} #keys = "Selected Text", "Options", "Selected Text Length" with options being a dict with keys of "text", "Pinned", "Previous Selection", "Edited"
|
self.koboldai_vars = koboldai_vars
|
||||||
|
self.actions = {} #keys = "Selected Text", "Options", "Selected Text Length", "In AI Input" with options being a dict with keys of "text", "Pinned", "Previous Selection", "Edited"
|
||||||
self.action_count = -1
|
self.action_count = -1
|
||||||
self.tokenizer = tokenizer
|
self.tokenizer = tokenizer
|
||||||
self.story_settings = story_settings
|
self.story_settings = story_settings
|
||||||
@@ -589,8 +743,11 @@ class KoboldStoryRegister(object):
|
|||||||
self.actions[i]['Selected Text Length'] = len(self.tokenizer.encode(text))
|
self.actions[i]['Selected Text Length'] = len(self.tokenizer.encode(text))
|
||||||
else:
|
else:
|
||||||
self.actions[i]['Selected Text Length'] = None
|
self.actions[i]['Selected Text Length'] = None
|
||||||
|
self.actions[i]["In AI Input"] = False
|
||||||
process_variable_changes(self.socketio, "actions", "Selected Text", {"id": i, "text": text}, {"id": i, "text": old_text})
|
process_variable_changes(self.socketio, "actions", "Selected Text", {"id": i, "text": text}, {"id": i, "text": old_text})
|
||||||
process_variable_changes(self.socketio, "actions", 'Selected Text Length', {"id": i, 'length': self.actions[i]['Selected Text Length']}, {"id": i, 'length': old_length})
|
process_variable_changes(self.socketio, "actions", 'Selected Text Length', {"id": i, 'length': self.actions[i]['Selected Text Length']}, {"id": i, 'length': old_length})
|
||||||
|
process_variable_changes(self.socketio, "actions", 'In AI Input', {"id": i, 'In AI Input': self.actions[i]["In AI Input"]}, None)
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
self.set_game_saved()
|
self.set_game_saved()
|
||||||
|
|
||||||
def __len__(self):
|
def __len__(self):
|
||||||
@@ -638,6 +795,7 @@ class KoboldStoryRegister(object):
|
|||||||
else:
|
else:
|
||||||
selected_text_length = 0
|
selected_text_length = 0
|
||||||
self.actions[self.action_count]["Selected Text Length"] = selected_text_length
|
self.actions[self.action_count]["Selected Text Length"] = selected_text_length
|
||||||
|
self.actions[self.action_count]["In AI Input"] = False
|
||||||
for item in self.actions[self.action_count]["Options"]:
|
for item in self.actions[self.action_count]["Options"]:
|
||||||
if item['text'] == text:
|
if item['text'] == text:
|
||||||
old_options = self.actions[self.action_count]["Options"]
|
old_options = self.actions[self.action_count]["Options"]
|
||||||
@@ -650,10 +808,12 @@ class KoboldStoryRegister(object):
|
|||||||
else:
|
else:
|
||||||
selected_text_length = 0
|
selected_text_length = 0
|
||||||
|
|
||||||
self.actions[self.action_count] = {"Selected Text": text, "Selected Text Length": selected_text_length, "Options": []}
|
self.actions[self.action_count] = {"Selected Text": text, "Selected Text Length": selected_text_length, "In AI Input": False, "Options": []}
|
||||||
|
|
||||||
process_variable_changes(self.socketio, "actions", "Selected Text", {"id": self.action_count, "text": text}, None)
|
process_variable_changes(self.socketio, "actions", "Selected Text", {"id": self.action_count, "text": text}, None)
|
||||||
process_variable_changes(self.socketio, "actions", 'Selected Text Length', {"id": self.action_count, 'length': self.actions[self.action_count]['Selected Text Length']}, {"id": self.action_count, 'length': 0})
|
process_variable_changes(self.socketio, "actions", 'Selected Text Length', {"id": self.action_count, 'length': self.actions[self.action_count]['Selected Text Length']}, {"id": self.action_count, 'length': 0})
|
||||||
|
process_variable_changes(self.socketio, "actions", 'In AI Input', {"id": self.action_count, 'In AI Input': self.actions[self.action_count]["In AI Input"]}, None)
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
self.set_game_saved()
|
self.set_game_saved()
|
||||||
|
|
||||||
def append_options(self, option_list):
|
def append_options(self, option_list):
|
||||||
@@ -662,7 +822,7 @@ class KoboldStoryRegister(object):
|
|||||||
self.actions[self.action_count+1]['Options'].extend([{"text": x, "Pinned": False, "Previous Selection": False, "Edited": False} for x in option_list])
|
self.actions[self.action_count+1]['Options'].extend([{"text": x, "Pinned": False, "Previous Selection": False, "Edited": False} for x in option_list])
|
||||||
else:
|
else:
|
||||||
old_options = None
|
old_options = None
|
||||||
self.actions[self.action_count+1] = {"Selected Text": "", "Selected Text Length": 0, "Options": [{"text": x, "Pinned": False, "Previous Selection": False, "Edited": False} for x in option_list]}
|
self.actions[self.action_count+1] = {"Selected Text": "", "Selected Text Length": 0, "In AI Input": False, "Options": [{"text": x, "Pinned": False, "Previous Selection": False, "Edited": False} for x in option_list]}
|
||||||
process_variable_changes(self.socketio, "actions", "Options", {"id": self.action_count+1, "options": self.actions[self.action_count+1]["Options"]}, {"id": self.action_count+1, "options": old_options})
|
process_variable_changes(self.socketio, "actions", "Options", {"id": self.action_count+1, "options": self.actions[self.action_count+1]["Options"]}, {"id": self.action_count+1, "options": old_options})
|
||||||
self.set_game_saved()
|
self.set_game_saved()
|
||||||
|
|
||||||
@@ -684,6 +844,12 @@ class KoboldStoryRegister(object):
|
|||||||
process_variable_changes(self.socketio, "actions", "Options", {"id": pointer, "options": new_options}, {"id": pointer, "options": old_options})
|
process_variable_changes(self.socketio, "actions", "Options", {"id": pointer, "options": new_options}, {"id": pointer, "options": old_options})
|
||||||
self.set_game_saved()
|
self.set_game_saved()
|
||||||
|
|
||||||
|
def set_action_in_ai(self, action_id, used=True):
|
||||||
|
old = self.actions[action_id]['In AI Input']
|
||||||
|
self.actions[action_id]['In AI Input'] = used
|
||||||
|
if old != used:
|
||||||
|
process_variable_changes(self.socketio, "actions", 'In AI Input', {"id": action_id, 'In AI Input': self.actions[action_id]["In AI Input"]}, None)
|
||||||
|
|
||||||
def set_pin(self, action_step, option_number):
|
def set_pin(self, action_step, option_number):
|
||||||
if action_step in self.actions:
|
if action_step in self.actions:
|
||||||
if option_number < len(self.actions[action_step]['Options']):
|
if option_number < len(self.actions[action_step]['Options']):
|
||||||
@@ -729,6 +895,7 @@ class KoboldStoryRegister(object):
|
|||||||
process_variable_changes(self.socketio, "actions", "Options", {"id": action_step, "options": self.actions[action_step]["Options"]}, {"id": action_step, "options": old_options})
|
process_variable_changes(self.socketio, "actions", "Options", {"id": action_step, "options": self.actions[action_step]["Options"]}, {"id": action_step, "options": old_options})
|
||||||
process_variable_changes(self.socketio, "actions", "Selected Text", {"id": action_step, "text": self.actions[action_step]["Selected Text"]}, {"id": action_step, "Selected Text": old_text})
|
process_variable_changes(self.socketio, "actions", "Selected Text", {"id": action_step, "text": self.actions[action_step]["Selected Text"]}, {"id": action_step, "Selected Text": old_text})
|
||||||
process_variable_changes(self.socketio, "actions", 'Selected Text Length', {"id": action_step, 'length': self.actions[action_step]["Selected Text Length"]}, {"id": action_step, 'length': old_length})
|
process_variable_changes(self.socketio, "actions", 'Selected Text Length', {"id": action_step, 'length': self.actions[action_step]["Selected Text Length"]}, {"id": action_step, 'length': old_length})
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
self.set_game_saved()
|
self.set_game_saved()
|
||||||
|
|
||||||
def delete_action(self, action_id):
|
def delete_action(self, action_id):
|
||||||
@@ -793,6 +960,7 @@ class KoboldStoryRegister(object):
|
|||||||
else:
|
else:
|
||||||
for key in self.actions:
|
for key in self.actions:
|
||||||
self.actions[key]['Selected Text Length'] = None
|
self.actions[key]['Selected Text Length'] = None
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
|
|
||||||
def stream_tokens(self, text_list):
|
def stream_tokens(self, text_list):
|
||||||
if len(text_list) > 1:
|
if len(text_list) > 1:
|
||||||
@@ -838,9 +1006,10 @@ class KoboldStoryRegister(object):
|
|||||||
|
|
||||||
class KoboldWorldInfo(object):
|
class KoboldWorldInfo(object):
|
||||||
|
|
||||||
def __init__(self, socketio, story_settings, tokenizer=None):
|
def __init__(self, socketio, story_settings, koboldai_vars, tokenizer=None):
|
||||||
self.socketio = socketio
|
self.socketio = socketio
|
||||||
self.tokenizer = tokenizer
|
self.tokenizer = tokenizer
|
||||||
|
self.koboldai_vars = koboldai_vars
|
||||||
self.world_info = {}
|
self.world_info = {}
|
||||||
self.world_info_folder = OrderedDict()
|
self.world_info_folder = OrderedDict()
|
||||||
self.world_info_folder['root'] = []
|
self.world_info_folder['root'] = []
|
||||||
@@ -849,6 +1018,24 @@ class KoboldWorldInfo(object):
|
|||||||
def reset(self):
|
def reset(self):
|
||||||
self.__init__(self.socketio, self.story_settings, self.tokenizer)
|
self.__init__(self.socketio, self.story_settings, self.tokenizer)
|
||||||
|
|
||||||
|
def __iter__(self):
|
||||||
|
self.itter = -1
|
||||||
|
return self
|
||||||
|
|
||||||
|
def __next__(self):
|
||||||
|
self.itter += 1
|
||||||
|
if self.itter < len(self.world_info):
|
||||||
|
try:
|
||||||
|
return self.world_info[list(self.world_info)[self.itter]].copy()
|
||||||
|
except:
|
||||||
|
print(self.itter)
|
||||||
|
print(list(self.world_info))
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
raise StopIteration
|
||||||
|
|
||||||
|
def __getitem__(self, i):
|
||||||
|
return self.self.world_info[i].copy()
|
||||||
|
|
||||||
def recalc_token_length(self):
|
def recalc_token_length(self):
|
||||||
if self.tokenizer is not None:
|
if self.tokenizer is not None:
|
||||||
@@ -858,6 +1045,7 @@ class KoboldWorldInfo(object):
|
|||||||
for uid in self.world_info:
|
for uid in self.world_info:
|
||||||
self.world_info[uid]['token_length'] = None
|
self.world_info[uid]['token_length'] = None
|
||||||
|
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
self.send_to_ui()
|
self.send_to_ui()
|
||||||
|
|
||||||
def add_folder(self, folder):
|
def add_folder(self, folder):
|
||||||
@@ -925,7 +1113,8 @@ class KoboldWorldInfo(object):
|
|||||||
"content": content,
|
"content": content,
|
||||||
"comment": comment,
|
"comment": comment,
|
||||||
"token_length": token_length,
|
"token_length": token_length,
|
||||||
"selective": len(keysecondary) > 0
|
"selective": len(keysecondary) > 0,
|
||||||
|
"used_in_game": constant
|
||||||
}
|
}
|
||||||
except:
|
except:
|
||||||
print("Error:")
|
print("Error:")
|
||||||
@@ -940,6 +1129,7 @@ class KoboldWorldInfo(object):
|
|||||||
|
|
||||||
self.socketio.emit("world_info_folder", {x: self.world_info_folder[x] for x in self.world_info_folder}, broadcast=True, room="UI_2")
|
self.socketio.emit("world_info_folder", {x: self.world_info_folder[x] for x in self.world_info_folder}, broadcast=True, room="UI_2")
|
||||||
self.socketio.emit("world_info_entry", self.world_info[uid], broadcast=True, room="UI_2")
|
self.socketio.emit("world_info_entry", self.world_info[uid], broadcast=True, room="UI_2")
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
|
|
||||||
def edit_item(self, uid, title, key, keysecondary, folder, constant, content, comment, before=None):
|
def edit_item(self, uid, title, key, keysecondary, folder, constant, content, comment, before=None):
|
||||||
old_folder = self.world_info[uid]['folder']
|
old_folder = self.world_info[uid]['folder']
|
||||||
@@ -970,6 +1160,7 @@ class KoboldWorldInfo(object):
|
|||||||
|
|
||||||
self.socketio.emit("world_info_folder", {x: self.world_info_folder[x] for x in self.world_info_folder}, broadcast=True, room="UI_2")
|
self.socketio.emit("world_info_folder", {x: self.world_info_folder[x] for x in self.world_info_folder}, broadcast=True, room="UI_2")
|
||||||
self.socketio.emit("world_info_entry", self.world_info[uid], broadcast=True, room="UI_2")
|
self.socketio.emit("world_info_entry", self.world_info[uid], broadcast=True, room="UI_2")
|
||||||
|
ignore = self.koboldai_vars.calc_ai_text()
|
||||||
|
|
||||||
def delete(self, uid):
|
def delete(self, uid):
|
||||||
del self.world_info[uid]
|
del self.world_info[uid]
|
||||||
@@ -1087,7 +1278,15 @@ class KoboldWorldInfo(object):
|
|||||||
#self.wifolders_u = {} # Dictionary of pairs of folder UID - list of WI UID
|
#self.wifolders_u = {} # Dictionary of pairs of folder UID - list of WI UID
|
||||||
self.story_settings.wifolders_u = {folder_entries[x]: [y for y in self.story_settings.worldinfo if y['folder'] == x] for x in folder_entries}
|
self.story_settings.wifolders_u = {folder_entries[x]: [y for y in self.story_settings.worldinfo if y['folder'] == x] for x in folder_entries}
|
||||||
|
|
||||||
|
def reset_used_in_game(self):
|
||||||
|
for key in self.world_info:
|
||||||
|
if self.world_info[key]["used_in_game"] != constant:
|
||||||
|
self.world_info[key]["used_in_game"] = constant
|
||||||
|
self.socketio.emit("world_info_entry", self.world_info[key], broadcast=True, room="UI_2")
|
||||||
|
|
||||||
|
def set_world_info_used(self, uid):
|
||||||
|
self.world_info[uid]["used_in_game"] = True
|
||||||
|
self.socketio.emit("world_info_entry", self.world_info[uid], broadcast=True, room="UI_2")
|
||||||
|
|
||||||
def __setattr__(self, name, value):
|
def __setattr__(self, name, value):
|
||||||
new_variable = name not in self.__dict__
|
new_variable = name not in self.__dict__
|
||||||
|
@@ -765,6 +765,11 @@ body {
|
|||||||
line-height: 1.42857143;
|
line-height: 1.42857143;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#story_prompt[story_prompt_in_ai="true"] {
|
||||||
|
color: var(--text_to_ai_color);
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
.gametext {
|
.gametext {
|
||||||
margin-top: auto;
|
margin-top: auto;
|
||||||
padding-bottom: 1px;
|
padding-bottom: 1px;
|
||||||
|
@@ -52,7 +52,7 @@ map2.set(5, 'Temperature')
|
|||||||
//-----------------------------------Server to UI Functions-----------------------------------------------
|
//-----------------------------------Server to UI Functions-----------------------------------------------
|
||||||
function connect() {
|
function connect() {
|
||||||
console.log("connected");
|
console.log("connected");
|
||||||
reset_story();
|
//reset_story();
|
||||||
for (item of document.getElementsByTagName("body")) {
|
for (item of document.getElementsByTagName("body")) {
|
||||||
item.classList.remove("NotConnected");
|
item.classList.remove("NotConnected");
|
||||||
}
|
}
|
||||||
@@ -398,6 +398,14 @@ function var_changed(data) {
|
|||||||
//Special Case for Story Text Length
|
//Special Case for Story Text Length
|
||||||
} else if ((data.classname == "actions") && (data.name == "Selected Text Length")) {
|
} else if ((data.classname == "actions") && (data.name == "Selected Text Length")) {
|
||||||
do_story_text_length_updates(data);
|
do_story_text_length_updates(data);
|
||||||
|
//Special Case for Story Text Length
|
||||||
|
} else if ((data.classname == "actions") && (data.name == "In AI Input")) {
|
||||||
|
//console.log(data.value);
|
||||||
|
if (data.value['In AI Input']) {
|
||||||
|
document.getElementById('Selected Text Chunk '+data.value.id).classList.add("within_max_length");
|
||||||
|
} else {
|
||||||
|
document.getElementById('Selected Text Chunk '+data.value.id).classList.remove("within_max_length");
|
||||||
|
}
|
||||||
//Special Case for Presets
|
//Special Case for Presets
|
||||||
} else if ((data.classname == 'model') && (data.name == 'presets')) {
|
} else if ((data.classname == 'model') && (data.name == 'presets')) {
|
||||||
do_presets(data);
|
do_presets(data);
|
||||||
@@ -1951,6 +1959,7 @@ function assign_world_info_to_action(uid=null, action_item=null) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function update_token_lengths() {
|
function update_token_lengths() {
|
||||||
|
return
|
||||||
max_token_length = parseInt(document.getElementById("model_max_length_cur").value);
|
max_token_length = parseInt(document.getElementById("model_max_length_cur").value);
|
||||||
included_world_info = [];
|
included_world_info = [];
|
||||||
//clear out the world info included tags
|
//clear out the world info included tags
|
||||||
|
@@ -37,7 +37,7 @@
|
|||||||
<div class="gamescreen" id="gamescreen">
|
<div class="gamescreen" id="gamescreen">
|
||||||
<div id="disconnect_message"><center><h1>Disconnected</h1></center></div>
|
<div id="disconnect_message"><center><h1>Disconnected</h1></center></div>
|
||||||
<div class="gametext" id="Selected Text">
|
<div class="gametext" id="Selected Text">
|
||||||
<span id="story_prompt" class="var_sync_story_prompt var_sync_alt_story_prompt_length rawtext" contenteditable=true onblur="if (getAttribute(this, 'old_text') != this.textContent) {sync_to_server(this);}" onkeydown="detect_enter_text"></span>
|
<span id="story_prompt" class="var_sync_story_prompt var_sync_alt_story_prompt_length var_sync_alt_story_prompt_in_ai rawtext" contenteditable=true onblur="if (getAttribute(this, 'old_text') != this.textContent) {sync_to_server(this);}" onkeydown="detect_enter_text"></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!------------ Sequences --------------------->
|
<!------------ Sequences --------------------->
|
||||||
|
Reference in New Issue
Block a user