twinkle-toes commited on
Commit
787638b
1 Parent(s): de242d3

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +172 -3
app.py CHANGED
@@ -1,7 +1,176 @@
1
  import gradio as gr
 
 
 
2
 
3
- def greet(name):
4
- return "Hello " + name + "!!"
 
 
 
 
5
 
6
- demo = gr.Interface(fn=greet, inputs="text", outputs="text")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7
  demo.launch()
 
1
  import gradio as gr
2
+ import requests
3
+ import json
4
+ from numbers import Real
5
 
6
+ # Not meant to 100% validate a preset. Just enough that the code
7
+ # that renders it won't crash trying to access an invalid key.
8
+ class Validator:
9
+ def __init__(self, obj):
10
+ self.valid = True
11
+ self.obj = obj
12
 
13
+ def validate_key(self, key, ty):
14
+ if key not in self.obj:
15
+ self.valid = False
16
+ return False
17
+ if not isinstance(self.obj[key], ty):
18
+ self.valid = False
19
+ return False
20
+ return True
21
+
22
+ def validate_key_if_present(self, key, ty):
23
+ if key in self.obj and not isinstance(self.obj[key], ty):
24
+ self.valid = False
25
+
26
+ def validate_keys_if_present(self, keys, ty):
27
+ for k in keys:
28
+ self.validate_key_if_present(k, ty)
29
+
30
+ def validate_prompt(self):
31
+ self.validate_key("identifier", bool)
32
+ self.validate_keys_if_present([
33
+ "injection_position",
34
+ "injection_depth",
35
+ ], int)
36
+ self.validate_keys_if_present([
37
+ "name",
38
+ "role",
39
+ "content",
40
+ ], str)
41
+ self.validate_keys_if_present([
42
+ "system_prompt",
43
+ "marker",
44
+ "forbid_overrides",
45
+ ], bool)
46
+
47
+ def validate_prompt_order(self):
48
+ self.validate_key("character_id", str)
49
+ if self.validate_key("order", list):
50
+ for s in self.obj["order"]:
51
+ if not Validator.is_valid_ordering(s):
52
+ self.valid = False
53
+
54
+ def validate_ordering(self):
55
+ self.validate_key("identifier", str)
56
+ self.validate_key("enabled", bool)
57
+
58
+ def validate_preset(self):
59
+ self.validate_keys_if_present([
60
+ "impersonation_prompt",
61
+ "new_chat_prompt",
62
+ "new_group_chat_prompt",
63
+ "new_example_chat_prompt",
64
+ "continue_nudge_prompt",
65
+ "wi_format",
66
+ "scenario_format",
67
+ "personality_format",
68
+ "group_nudge_prompt",
69
+ "assistant_prefill",
70
+ "human_sysprompt_message",
71
+ "continue_postfix",
72
+ ], str)
73
+ self.validate_keys_if_present([
74
+ "claude_use_sysprompt",
75
+ "squash_system_messages",
76
+ "continue_prefill",
77
+ ], bool)
78
+ self.validate_keys_if_present([
79
+ "temperature",
80
+ "frequency_penalty",
81
+ "presence_penalty",
82
+ "count_penalty",
83
+ "top_p",
84
+ "top_k",
85
+ "top_a",
86
+ "min_p",
87
+ "repetition_penalty",
88
+ ], Real)
89
+ self.validate_key_if_present("names_behavior", int)
90
+ known_prompt_ids = set()
91
+ if self.validate_key("prompts", list):
92
+ for prompt in self.obj["prompts"]:
93
+ if not Validator.is_valid_prompt(prompt):
94
+ continue
95
+ known_prompt_ids.add(prompt["identifier"])
96
+ seen_cid0 = False
97
+ if self.validate_key("prompt_order", list):
98
+ for order in self.obj["prompt_order"]:
99
+ if Validator.is_valid_prompt_order(order)
100
+ and order["character_id"] == "0"
101
+ and all(lambda o: o["identifier"] in known_prompt_ids for o in order["order"]):
102
+ seen_cid0 = True
103
+ if not seen_cid0:
104
+ self.valid = False
105
+
106
+ @classmethod
107
+ def is_valid_preset(cls, preset):
108
+ v = cls(preset)
109
+ v.validate_preset()
110
+ return v.valid
111
+
112
+ @classmethod
113
+ def is_valid_prompt(cls, prompt):
114
+ v = cls(prompt)
115
+ v.validate_prompt()
116
+ return v.valid
117
+
118
+ @classmethod
119
+ def is_valid_prompt_order(cls, prompt_order):
120
+ v = cls(prompt_order)
121
+ v.validate_prompt_order()
122
+ return v.valid
123
+
124
+ @classmethod
125
+ def is_valid_ordering(cls, ordering):
126
+ v = cls(ordering)
127
+ v.validate_ordering()
128
+ return v.valid
129
+
130
+ def load_from_file(path):
131
+ with open(path, "r") as f:
132
+ try:
133
+ obj = json.load(f)
134
+ except Exception:
135
+ return None, True
136
+ if not Validator.is_valid_preset(obj):
137
+ return None, True
138
+ return obj, False
139
+
140
+ def load_from_url(url):
141
+ resp = requests.get(url)
142
+ if not resp.ok:
143
+ return None, True
144
+ try:
145
+ obj = json.loads(resp.text)
146
+ except Exception:
147
+ return None, True
148
+ if not Validator.is_valid_preset(obj):
149
+ return None, True
150
+ return obj, False
151
+
152
+ with gr.Blocks() as demo:
153
+ preset_error = gr.State(False)
154
+ preset = gr.State(None)
155
+
156
+ gr.Markdown("# SillyTavern preset viewer")
157
+
158
+ with gr.Tabs() as tabs:
159
+ with gr.TabItem("Upload", id=0):
160
+ file = gr.File(label="Upload a preset (.json)", file_types=[".json"])
161
+ file.input(fn=load_from_file, inputs=[file], outputs=[preset, preset_error])
162
+ url_input = gr.Textbox(label="Enter a URL to a preset (.json) - press Enter to submit")
163
+ url_input.submit(fn=load_from_url, inputs=[url_input], outputs=[preset, preset_error])
164
+ with gr.TabItem("Viewer", id=1):
165
+ @gr.render(inputs=[preset_error, preset])
166
+ def render_preset(preset_error, preset):
167
+ if preset_error:
168
+ gr.Markdown("Error loading preset")
169
+ return
170
+ if preset is None:
171
+ gr.Markdown("No preset loaded, enter a URL or upload a file")
172
+ else:
173
+ gr.Markdown("Preset loaded and validated")
174
+ gr.Json(preset)
175
+
176
  demo.launch()