Spaces:
Runtime error
Runtime error
twinkle-toes
commited on
Commit
•
4f3a32c
1
Parent(s):
56441c0
Update app.py
Browse files
app.py
CHANGED
@@ -108,8 +108,8 @@ class Validator:
|
|
108 |
for order in self.obj["prompt_order"]:
|
109 |
if Validator.is_valid_prompt_order(order) and order["character_id"] == 100001 and all(lambda o: o["identifier"] in known_prompt_ids for o in order["order"]):
|
110 |
seen_cid0 = True
|
111 |
-
if Validator.is_valid_prompt_order_list(self.obj["prompt_order"]) and all(lambda o: o["identifier"] in known_prompt_ids for o in self.obj["prompt_order"]):
|
112 |
-
|
113 |
if not seen_cid0:
|
114 |
self.valid = False
|
115 |
|
@@ -143,6 +143,37 @@ class Validator:
|
|
143 |
v.validate_ordering()
|
144 |
return v.valid
|
145 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
146 |
def load_from_file(path):
|
147 |
with open(path, "r") as f:
|
148 |
try:
|
@@ -150,10 +181,11 @@ def load_from_file(path):
|
|
150 |
except Exception:
|
151 |
raise gr.Error("File is not valid JSON")
|
152 |
return None, True
|
|
|
153 |
if not Validator.is_valid_preset(obj):
|
154 |
raise gr.Error("File is not a valid preset")
|
155 |
return None, True
|
156 |
-
return gr.update(selected=1), obj,
|
157 |
|
158 |
def load_from_url(url):
|
159 |
resp = requests.get(url)
|
@@ -165,10 +197,11 @@ def load_from_url(url):
|
|
165 |
except Exception:
|
166 |
raise gr.Error("URL is not valid JSON")
|
167 |
return None, True
|
|
|
168 |
if not Validator.is_valid_preset(obj):
|
169 |
raise gr.Error("URL is not a valid preset")
|
170 |
return None, True
|
171 |
-
return gr.update(selected=1), obj,
|
172 |
|
173 |
def render_prompt(prompt, enabled=True):
|
174 |
with gr.Accordion(prompt["name"] + ("" if enabled else " (DISABLED)"), open=enabled or prompt.get("marker", False)):
|
@@ -181,20 +214,21 @@ def render_prompt(prompt, enabled=True):
|
|
181 |
gr.Code(prompt["content"], container=False)
|
182 |
|
183 |
with gr.Blocks() as demo:
|
184 |
-
preset_error = gr.State(False)
|
185 |
preset = gr.State(None)
|
|
|
186 |
|
187 |
gr.Markdown("# SillyTavern preset viewer")
|
188 |
|
189 |
with gr.Tabs() as tabs:
|
190 |
with gr.TabItem("Upload", id=0):
|
191 |
file = gr.File(label="Upload a preset (.json)", file_types=[".json"])
|
192 |
-
file.upload(fn=load_from_file, inputs=[file], outputs=[tabs, preset,
|
193 |
url_input = gr.Textbox(label="Enter a URL to a preset (.json) - press Enter to submit")
|
194 |
-
url_input.submit(fn=load_from_url, inputs=[url_input], outputs=[tabs, preset,
|
195 |
with gr.TabItem("Viewer", id=1):
|
196 |
-
@gr.render(inputs=[preset_error, preset])
|
197 |
-
def render_preset(preset_error, preset):
|
198 |
if preset_error:
|
199 |
gr.Markdown("Error loading preset")
|
200 |
return
|
@@ -202,12 +236,15 @@ with gr.Blocks() as demo:
|
|
202 |
gr.Markdown("No preset loaded, enter a URL or upload a file")
|
203 |
else:
|
204 |
gr.Markdown("Preset loaded and validated")
|
|
|
|
|
205 |
prompt_map = {p["identifier"]: p for p in preset["prompts"]}
|
206 |
gr.Markdown("# Preset")
|
207 |
for order in (next(o for o in preset["prompt_order"] if o["character_id"] == 100001)["order"] if isinstance(preset["prompt_order"], list) else preset["prompt_order"]):
|
208 |
prompt = prompt_map[order["identifier"]]
|
209 |
render_prompt(prompt, order["enabled"])
|
210 |
-
|
|
|
211 |
for prompt in prompt_map.values():
|
212 |
render_prompt(prompt)
|
213 |
|
|
|
108 |
for order in self.obj["prompt_order"]:
|
109 |
if Validator.is_valid_prompt_order(order) and order["character_id"] == 100001 and all(lambda o: o["identifier"] in known_prompt_ids for o in order["order"]):
|
110 |
seen_cid0 = True
|
111 |
+
# if Validator.is_valid_prompt_order_list(self.obj["prompt_order"]) and all(lambda o: o["identifier"] in known_prompt_ids for o in self.obj["prompt_order"]):
|
112 |
+
# seen_cid0 = True
|
113 |
if not seen_cid0:
|
114 |
self.valid = False
|
115 |
|
|
|
143 |
v.validate_ordering()
|
144 |
return v.valid
|
145 |
|
146 |
+
def maybe_convert_to_original_format(obj):
|
147 |
+
if obj.get("version") != 1:
|
148 |
+
return obj, False
|
149 |
+
# Synthesize a traditional preset
|
150 |
+
builtin_prompts = [{
|
151 |
+
"name": x[0],
|
152 |
+
"identifier": x[1],
|
153 |
+
"system_prompt": True,
|
154 |
+
"marker": True,
|
155 |
+
} for x in [
|
156 |
+
("Chat Examples", "dialogueExamples"),
|
157 |
+
("Chat History", "chatHistory"),
|
158 |
+
("World Info (after)", "worldInfoAfter"),
|
159 |
+
("World Info (before)", "worldInfoBefore"),
|
160 |
+
("Enhance Definitions", "enhanceDefinitions"),
|
161 |
+
("Char Description", "charDescription"),
|
162 |
+
("Char Personality", "charPersonality"),
|
163 |
+
("Scenario", "scenario"),
|
164 |
+
("Persona Description", "personaDescription"),
|
165 |
+
("JB", "jailbreak"),
|
166 |
+
]]
|
167 |
+
return {
|
168 |
+
"prompts": obj["data"]["prompts"] + builtin_prompts
|
169 |
+
"prompt_order": [{
|
170 |
+
"character_id": 100001,
|
171 |
+
"order": obj["data"]["prompt_order"],
|
172 |
+
}]
|
173 |
+
}, True
|
174 |
+
|
175 |
+
CONVERT_MESSAGE = "This preset was converted from version 1 to the traditional format, there may be inconsistencies."
|
176 |
+
|
177 |
def load_from_file(path):
|
178 |
with open(path, "r") as f:
|
179 |
try:
|
|
|
181 |
except Exception:
|
182 |
raise gr.Error("File is not valid JSON")
|
183 |
return None, True
|
184 |
+
obj, modified = maybe_convert_to_original_format(obj)
|
185 |
if not Validator.is_valid_preset(obj):
|
186 |
raise gr.Error("File is not a valid preset")
|
187 |
return None, True
|
188 |
+
return gr.update(selected=1), obj, CONVERT_MESSAGE if modified else None
|
189 |
|
190 |
def load_from_url(url):
|
191 |
resp = requests.get(url)
|
|
|
197 |
except Exception:
|
198 |
raise gr.Error("URL is not valid JSON")
|
199 |
return None, True
|
200 |
+
obj, modified = maybe_convert_to_original_format(obj)
|
201 |
if not Validator.is_valid_preset(obj):
|
202 |
raise gr.Error("URL is not a valid preset")
|
203 |
return None, True
|
204 |
+
return gr.update(selected=1), obj, CONVERT_MESSAGE if modified else None
|
205 |
|
206 |
def render_prompt(prompt, enabled=True):
|
207 |
with gr.Accordion(prompt["name"] + ("" if enabled else " (DISABLED)"), open=enabled or prompt.get("marker", False)):
|
|
|
214 |
gr.Code(prompt["content"], container=False)
|
215 |
|
216 |
with gr.Blocks() as demo:
|
217 |
+
# preset_error = gr.State(False)
|
218 |
preset = gr.State(None)
|
219 |
+
load_extra = gr.State(None)
|
220 |
|
221 |
gr.Markdown("# SillyTavern preset viewer")
|
222 |
|
223 |
with gr.Tabs() as tabs:
|
224 |
with gr.TabItem("Upload", id=0):
|
225 |
file = gr.File(label="Upload a preset (.json)", file_types=[".json"])
|
226 |
+
file.upload(fn=load_from_file, inputs=[file], outputs=[tabs, preset, load_extra])
|
227 |
url_input = gr.Textbox(label="Enter a URL to a preset (.json) - press Enter to submit")
|
228 |
+
url_input.submit(fn=load_from_url, inputs=[url_input], outputs=[tabs, preset, load_extra])
|
229 |
with gr.TabItem("Viewer", id=1):
|
230 |
+
@gr.render(inputs=[preset_error, preset, load_extra])
|
231 |
+
def render_preset(preset_error, preset, load_extra):
|
232 |
if preset_error:
|
233 |
gr.Markdown("Error loading preset")
|
234 |
return
|
|
|
236 |
gr.Markdown("No preset loaded, enter a URL or upload a file")
|
237 |
else:
|
238 |
gr.Markdown("Preset loaded and validated")
|
239 |
+
if load_extra is not None:
|
240 |
+
gr.Markdown(load_extra)
|
241 |
prompt_map = {p["identifier"]: p for p in preset["prompts"]}
|
242 |
gr.Markdown("# Preset")
|
243 |
for order in (next(o for o in preset["prompt_order"] if o["character_id"] == 100001)["order"] if isinstance(preset["prompt_order"], list) else preset["prompt_order"]):
|
244 |
prompt = prompt_map[order["identifier"]]
|
245 |
render_prompt(prompt, order["enabled"])
|
246 |
+
gr.Markdown("# All prompts")
|
247 |
+
with gr.Accordion("All prompts", open=False):
|
248 |
for prompt in prompt_map.values():
|
249 |
render_prompt(prompt)
|
250 |
|