Spaces:
Sleeping
Sleeping
kwabs22
commited on
Commit
·
94b8cb6
1
Parent(s):
482bc30
Load config fixed
Browse files
app.py
CHANGED
@@ -1,5 +1,6 @@
|
|
1 |
import gradio as gr
|
2 |
import random
|
|
|
3 |
|
4 |
# Default configuration template
|
5 |
default_config = {
|
@@ -105,19 +106,6 @@ def generate_story_and_timeline():
|
|
105 |
|
106 |
#-----------------------------------------------------------------------------------------------------------------------------------
|
107 |
|
108 |
-
class GameState:
|
109 |
-
def __init__(self, description, choices, transitions, conditions=None, npcs=None, consequences=None):
|
110 |
-
self.description = description
|
111 |
-
self.choices = choices
|
112 |
-
self.transitions = transitions
|
113 |
-
self.conditions = conditions if conditions else {}
|
114 |
-
self.npcs = npcs if npcs else []
|
115 |
-
self.consequences = consequences if consequences else {}
|
116 |
-
|
117 |
-
def apply_consequence(self, choice, player):
|
118 |
-
if choice in self.consequences:
|
119 |
-
self.consequences[choice](player)
|
120 |
-
|
121 |
class Player:
|
122 |
def __init__(self):
|
123 |
self.inventory = []
|
@@ -136,78 +124,78 @@ class Player:
|
|
136 |
# Define the states
|
137 |
all_states = {
|
138 |
'village': {
|
139 |
-
'start':
|
140 |
-
"You wake up in a small village. You hear a rumor about a lost treasure.",
|
141 |
-
['explore village', 'gather supplies', 'rest'],
|
142 |
-
{'explore village': 'village_rumor', 'gather supplies': 'village_supplies', 'rest': 'village_start'},
|
143 |
-
consequences
|
144 |
'gather supplies': lambda player: player.add_item('basic supplies')
|
145 |
}
|
146 |
-
|
147 |
-
'rumor':
|
148 |
-
"You hear more details about the treasure hidden in the ancient ruins nearby.",
|
149 |
-
['decide to go', 'ignore'],
|
150 |
-
{'decide to go': 'village_supplies', 'ignore': 'village_start'},
|
151 |
-
consequences
|
152 |
'decide to go': lambda player: player.update_knowledge('treasure location')
|
153 |
}
|
154 |
-
|
155 |
-
'supplies':
|
156 |
-
"You gather supplies for your journey.",
|
157 |
-
['head to forest', 'stay in village'],
|
158 |
-
{'head to forest': 'forest_forest', 'stay in village': 'village_start'}
|
159 |
-
|
160 |
},
|
161 |
'forest': {
|
162 |
-
'forest':
|
163 |
-
"You enter the dense forest, heading towards the ruins.",
|
164 |
-
['travel further', 'return to village'],
|
165 |
-
{'travel further': 'ruins_ruins', 'return to village': 'village_start'}
|
166 |
-
|
167 |
},
|
168 |
'ruins': {
|
169 |
-
'ruins':
|
170 |
-
"You reach the ancient ruins. The entrance is dark and eerie.",
|
171 |
-
['enter ruins', 'return to forest'],
|
172 |
-
{'enter ruins': 'ruins_explore', 'return to forest': 'forest_forest'}
|
173 |
-
|
174 |
-
'explore':
|
175 |
-
"You explore the ruins, encountering traps and puzzles.",
|
176 |
-
['solve puzzle', 'avoid traps'],
|
177 |
-
{'solve puzzle': 'ruins_hiddenPassage', 'avoid traps': 'ruins_ruins'}
|
178 |
-
|
179 |
-
'hiddenPassage':
|
180 |
-
"You solve a challenging puzzle and unlock a hidden passage.",
|
181 |
-
['enter passage', 'go back'],
|
182 |
-
{'enter passage': 'ruins_treasureRoom', 'go back': 'ruins_explore'}
|
183 |
-
|
184 |
-
'treasureRoom':
|
185 |
-
"You enter the treasure room and find the treasure chest.",
|
186 |
-
['take treasure', 'leave'],
|
187 |
-
{'take treasure': 'ruins_celebrate', 'leave': 'ruins_ruins'},
|
188 |
-
consequences
|
189 |
'take treasure': lambda player: player.add_item('treasure')
|
190 |
}
|
191 |
-
|
192 |
-
'celebrate':
|
193 |
-
"You celebrate your discovery and decide to bring the treasure back to the village.",
|
194 |
-
['return to village'],
|
195 |
-
{'return to village': 'village_return'}
|
196 |
-
|
197 |
},
|
198 |
'village_return': {
|
199 |
-
'village_return':
|
200 |
-
"You return to the village with the treasure and share it with the villagers.",
|
201 |
-
['end adventure'],
|
202 |
-
{'end adventure': 'end_end'}
|
203 |
-
|
204 |
},
|
205 |
'end': {
|
206 |
-
'end':
|
207 |
-
"Your adventure ends here. The villagers are grateful and everyone's lives improve.",
|
208 |
-
[],
|
209 |
-
{}
|
210 |
-
|
211 |
}
|
212 |
}
|
213 |
|
@@ -215,7 +203,7 @@ def validate_transitions(all_states):
|
|
215 |
errors = []
|
216 |
for location, states in all_states.items():
|
217 |
for state_key, state in states.items():
|
218 |
-
for transition_key, transition_state in state
|
219 |
# Check if the transition is to another location
|
220 |
if transition_state in all_states:
|
221 |
trans_location, trans_state = transition_state, 'start' # Assuming 'start' state for new locations
|
@@ -231,29 +219,35 @@ def validate_transitions(all_states):
|
|
231 |
return errors
|
232 |
|
233 |
path_errors = validate_transitions(all_states)
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
-
|
239 |
|
240 |
class GameSession:
|
241 |
-
def __init__(self):
|
242 |
self.player = Player()
|
243 |
-
self.current_location =
|
244 |
-
self.current_state =
|
245 |
self.game_log = []
|
246 |
|
247 |
def make_choice(self, choice_index):
|
248 |
state = all_states[self.current_location][self.current_state]
|
249 |
-
if 0 <= choice_index < len(state
|
250 |
-
choice = state
|
251 |
-
next_state = state
|
252 |
|
253 |
self.game_log.append(f"You chose: {choice}")
|
254 |
-
self.game_log.append(state
|
255 |
|
256 |
-
state
|
|
|
|
|
|
|
|
|
|
|
|
|
257 |
|
258 |
if '_' in next_state:
|
259 |
self.current_location, self.current_state = next_state.split('_')
|
@@ -266,11 +260,11 @@ class GameSession:
|
|
266 |
|
267 |
def get_current_state_info(self):
|
268 |
state = all_states[self.current_location][self.current_state]
|
269 |
-
choices = [f"{idx + 1}. {choice}" for idx, choice in enumerate(state
|
270 |
-
return state
|
271 |
|
272 |
-
def start_game():
|
273 |
-
game_session = GameSession()
|
274 |
description, choices, game_log = game_session.get_current_state_info()
|
275 |
return description, choices, game_log, game_session
|
276 |
|
@@ -279,11 +273,56 @@ def make_choice(choice, game_session):
|
|
279 |
description, choices, game_log = game_session.get_current_state_info()
|
280 |
return description, choices, "Please select a choice before proceeding.", game_session
|
281 |
|
282 |
-
choice_index =
|
283 |
result = game_session.make_choice(choice_index)
|
284 |
|
285 |
return result[0], gr.update(choices=result[1]), result[2], game_session
|
286 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
287 |
initgameinfo = start_game()
|
288 |
|
289 |
|
@@ -368,26 +407,28 @@ with gr.Blocks() as demo:
|
|
368 |
gr.HTML("Some Kinds of game skeletons ideas - Timelines, Graph as State machine paths, Economy ecosystem")
|
369 |
gr.HTML("One prompt to be used to test models - <br>Please make 10 python lists for the types of media files and their purposes in a game and then use those lists to random generate a timeline of 20 items when the function is called <br>Great next suggest ways to improve this function to create better timelines")
|
370 |
with gr.Tab("Generate Timeline"):
|
371 |
-
gr.
|
372 |
-
|
373 |
-
|
374 |
-
|
375 |
-
|
376 |
-
|
377 |
-
|
378 |
-
|
379 |
-
|
380 |
-
|
381 |
-
|
382 |
-
|
|
|
383 |
with gr.Row():
|
384 |
with gr.Column(scale=2):
|
385 |
gr.Markdown("# Text-based Adventure Game")
|
|
|
386 |
description = gr.Textbox(label="Current Situation", lines=4, value=initgameinfo[0])
|
387 |
choices = gr.Radio(label="Your Choices", choices=initgameinfo[1])
|
388 |
submit_btn = gr.Button("Make Choice")
|
389 |
game_log = gr.Textbox(label="Game Log", lines=20, value=initgameinfo[2])
|
390 |
-
game_session = gr.State(value=initgameinfo[3])
|
391 |
submit_btn.click(
|
392 |
make_choice,
|
393 |
inputs=[choices, game_session],
|
@@ -395,10 +436,16 @@ with gr.Blocks() as demo:
|
|
395 |
)
|
396 |
with gr.Column(scale=1):
|
397 |
gr.Markdown("# Debugging")
|
398 |
-
gr.Textbox(label="Path Errors", lines=4, value=path_errors)
|
399 |
with gr.Accordion("Config (Game Spoiler)", open=False):
|
400 |
-
custom_config = gr.Textbox(label="", value=all_states, lines=8)
|
401 |
-
custom_configbtn = gr.Button("Load
|
|
|
|
|
|
|
|
|
|
|
|
|
402 |
|
403 |
|
404 |
with gr.Tab("Asset Generation"):
|
@@ -415,6 +462,7 @@ with gr.Blocks() as demo:
|
|
415 |
gr.HTML("Images Generation Portraits = https://huggingface.co/spaces/okaris/omni-zero")
|
416 |
gr.HTML("Images Generation General = https://huggingface.co/spaces/stabilityai/stable-diffusion-3-medium, https://huggingface.co/spaces/PixArt-alpha/PixArt-Sigma, https://huggingface.co/spaces/stabilityai/stable-diffusion, https://www.craiyon.com/, https://huggingface.co/spaces/prodia/sdxl-stable-diffusion-xl")
|
417 |
gr.HTML("Images Generation Posters with text - https://huggingface.co/spaces/GlyphByT5/Glyph-SDXL-v2")
|
|
|
418 |
gr.HTML("SVG Generation = Coding models - ")
|
419 |
gr.HTML("Placeholder for huggingface spaces that can assist <br> https://huggingface.co/spaces/gokaygokay/Florence-2 <br>")
|
420 |
gr.HTML("Placeholder for models small enough to run on cpu here in this space that can assist")
|
|
|
1 |
import gradio as gr
|
2 |
import random
|
3 |
+
import json
|
4 |
|
5 |
# Default configuration template
|
6 |
default_config = {
|
|
|
106 |
|
107 |
#-----------------------------------------------------------------------------------------------------------------------------------
|
108 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
109 |
class Player:
|
110 |
def __init__(self):
|
111 |
self.inventory = []
|
|
|
124 |
# Define the states
|
125 |
all_states = {
|
126 |
'village': {
|
127 |
+
'start': {
|
128 |
+
"description": "You wake up in a small village. You hear a rumor about a lost treasure.",
|
129 |
+
"choices": ['explore village', 'gather supplies', 'rest'],
|
130 |
+
"transitions": {'explore village': 'village_rumor', 'gather supplies': 'village_supplies', 'rest': 'village_start'},
|
131 |
+
"consequences": {
|
132 |
'gather supplies': lambda player: player.add_item('basic supplies')
|
133 |
}
|
134 |
+
},
|
135 |
+
'rumor': {
|
136 |
+
"description": "You hear more details about the treasure hidden in the ancient ruins nearby.",
|
137 |
+
"choices": ['decide to go', 'ignore'],
|
138 |
+
"transitions": {'decide to go': 'village_supplies', 'ignore': 'village_start'},
|
139 |
+
"consequences": {
|
140 |
'decide to go': lambda player: player.update_knowledge('treasure location')
|
141 |
}
|
142 |
+
},
|
143 |
+
'supplies': {
|
144 |
+
"description": "You gather supplies for your journey.",
|
145 |
+
"choices": ['head to forest', 'stay in village'],
|
146 |
+
"transitions": {'head to forest': 'forest_forest', 'stay in village': 'village_start'}
|
147 |
+
},
|
148 |
},
|
149 |
'forest': {
|
150 |
+
'forest': {
|
151 |
+
"description": "You enter the dense forest, heading towards the ruins.",
|
152 |
+
"choices": ['travel further', 'return to village'],
|
153 |
+
"transitions": {'travel further': 'ruins_ruins', 'return to village': 'village_start'}
|
154 |
+
},
|
155 |
},
|
156 |
'ruins': {
|
157 |
+
'ruins': {
|
158 |
+
"description": "You reach the ancient ruins. The entrance is dark and eerie.",
|
159 |
+
"choices": ['enter ruins', 'return to forest'],
|
160 |
+
"transitions": {'enter ruins': 'ruins_explore', 'return to forest': 'forest_forest'}
|
161 |
+
},
|
162 |
+
'explore': {
|
163 |
+
"description": "You explore the ruins, encountering traps and puzzles.",
|
164 |
+
"choices": ['solve puzzle', 'avoid traps'],
|
165 |
+
"transitions": {'solve puzzle': 'ruins_hiddenPassage', 'avoid traps': 'ruins_ruins'}
|
166 |
+
},
|
167 |
+
'hiddenPassage': {
|
168 |
+
"description": "You solve a challenging puzzle and unlock a hidden passage.",
|
169 |
+
"choices": ['enter passage', 'go back'],
|
170 |
+
"transitions": {'enter passage': 'ruins_treasureRoom', 'go back': 'ruins_explore'}
|
171 |
+
},
|
172 |
+
'treasureRoom': {
|
173 |
+
"description": "You enter the treasure room and find the treasure chest.",
|
174 |
+
"choices": ['take treasure', 'leave'],
|
175 |
+
"transitions": {'take treasure': 'ruins_celebrate', 'leave': 'ruins_ruins'},
|
176 |
+
"consequences": {
|
177 |
'take treasure': lambda player: player.add_item('treasure')
|
178 |
}
|
179 |
+
},
|
180 |
+
'celebrate': {
|
181 |
+
"description": "You celebrate your discovery and decide to bring the treasure back to the village.",
|
182 |
+
"choices": ['return to village'],
|
183 |
+
"transitions": {'return to village': 'village_return'}
|
184 |
+
},
|
185 |
},
|
186 |
'village_return': {
|
187 |
+
'village_return': {
|
188 |
+
"description": "You return to the village with the treasure and share it with the villagers.",
|
189 |
+
"choices": ['end adventure'],
|
190 |
+
"transitions": {'end adventure': 'end_end'}
|
191 |
+
},
|
192 |
},
|
193 |
'end': {
|
194 |
+
'end': {
|
195 |
+
"description": "Your adventure ends here. The villagers are grateful and everyone's lives improve.",
|
196 |
+
"choices": [],
|
197 |
+
"transitions": {}
|
198 |
+
},
|
199 |
}
|
200 |
}
|
201 |
|
|
|
203 |
errors = []
|
204 |
for location, states in all_states.items():
|
205 |
for state_key, state in states.items():
|
206 |
+
for transition_key, transition_state in state['transitions'].items():
|
207 |
# Check if the transition is to another location
|
208 |
if transition_state in all_states:
|
209 |
trans_location, trans_state = transition_state, 'start' # Assuming 'start' state for new locations
|
|
|
219 |
return errors
|
220 |
|
221 |
path_errors = validate_transitions(all_states)
|
222 |
+
if path_errors:
|
223 |
+
for error in path_errors:
|
224 |
+
print(error)
|
225 |
+
else:
|
226 |
+
print("All transitions are valid.")
|
227 |
|
228 |
class GameSession:
|
229 |
+
def __init__(self, starting_location='village', starting_state='start'):
|
230 |
self.player = Player()
|
231 |
+
self.current_location = starting_location
|
232 |
+
self.current_state = starting_state
|
233 |
self.game_log = []
|
234 |
|
235 |
def make_choice(self, choice_index):
|
236 |
state = all_states[self.current_location][self.current_state]
|
237 |
+
if 0 <= choice_index < len(state['choices']):
|
238 |
+
choice = state['choices'][choice_index]
|
239 |
+
next_state = state['transitions'][choice]
|
240 |
|
241 |
self.game_log.append(f"You chose: {choice}")
|
242 |
+
self.game_log.append(state['description'])
|
243 |
|
244 |
+
if 'consequences' in state and choice in state['consequences']:
|
245 |
+
if state['consequences'][choice]:
|
246 |
+
state['consequences'][choice](self.player)
|
247 |
+
else:
|
248 |
+
# Handle empty consequence, e.g., log a message or provide a default action
|
249 |
+
print(f"No consequence for choice: {choice}")
|
250 |
+
# You can add any default action here if needed
|
251 |
|
252 |
if '_' in next_state:
|
253 |
self.current_location, self.current_state = next_state.split('_')
|
|
|
260 |
|
261 |
def get_current_state_info(self):
|
262 |
state = all_states[self.current_location][self.current_state]
|
263 |
+
choices = [f"{idx + 1}. {choice}" for idx, choice in enumerate(state['choices'])]
|
264 |
+
return state['description'], choices, "\n".join(self.game_log)
|
265 |
|
266 |
+
def start_game(starting_location='village', starting_state='start'):
|
267 |
+
game_session = GameSession(starting_location, starting_state)
|
268 |
description, choices, game_log = game_session.get_current_state_info()
|
269 |
return description, choices, game_log, game_session
|
270 |
|
|
|
273 |
description, choices, game_log = game_session.get_current_state_info()
|
274 |
return description, choices, "Please select a choice before proceeding.", game_session
|
275 |
|
276 |
+
choice_index = int(choice.split('.')[0]) - 1
|
277 |
result = game_session.make_choice(choice_index)
|
278 |
|
279 |
return result[0], gr.update(choices=result[1]), result[2], game_session
|
280 |
|
281 |
+
def load_game(custom_config=None):
|
282 |
+
global all_states
|
283 |
+
if custom_config:
|
284 |
+
try:
|
285 |
+
new_config = json.loads(custom_config)
|
286 |
+
|
287 |
+
all_states = new_config
|
288 |
+
|
289 |
+
# Determine the starting location and state
|
290 |
+
starting_location = next(iter(all_states.keys()))
|
291 |
+
starting_state = next(iter(all_states[starting_location].keys()))
|
292 |
+
|
293 |
+
game_session = GameSession(starting_location, starting_state)
|
294 |
+
description, choices, game_log = game_session.get_current_state_info()
|
295 |
+
new_path_errors = validate_transitions(all_states)
|
296 |
+
|
297 |
+
return gr.update(value=f"Custom configuration loaded successfully! \n{new_path_errors}"), game_log, description, gr.update(choices=choices), game_session, gr.update(value=custom_config)
|
298 |
+
except json.JSONDecodeError as e:
|
299 |
+
# Get the line number and column of the error
|
300 |
+
lineno, colno = e.lineno, e.colno
|
301 |
+
|
302 |
+
# Get the problematic line
|
303 |
+
lines = custom_config.split('\n')
|
304 |
+
error_line = lines[lineno - 1] if lineno <= len(lines) else ""
|
305 |
+
|
306 |
+
# Create a pointer to the error location
|
307 |
+
pointer = ' ' * (colno - 1) + '^'
|
308 |
+
|
309 |
+
error_message = f"Invalid JSON format in custom configuration:\n"
|
310 |
+
error_message += f"Error at line {lineno}, column {colno}:\n"
|
311 |
+
error_message += f"{error_line}\n"
|
312 |
+
error_message += f"{pointer}\n"
|
313 |
+
error_message += f"Error details: {str(e)}"
|
314 |
+
|
315 |
+
return gr.update(value=error_message), gr.update(), gr.update(), None, gr.update(value=custom_config)
|
316 |
+
except Exception as e:
|
317 |
+
return gr.update(value=f"Error loading custom configuration: {str(e)}"), gr.update(), gr.update(), None, gr.update(value=custom_config)
|
318 |
+
|
319 |
+
# If no custom config, start with the default configuration
|
320 |
+
starting_location = next(iter(all_states.keys()))
|
321 |
+
starting_state = next(iter(all_states[starting_location].keys()))
|
322 |
+
game_session = GameSession(starting_location, starting_state)
|
323 |
+
description, choices, game_log = game_session.get_current_state_info()
|
324 |
+
return description, gr.update(choices=choices), game_log, game_session, gr.update()
|
325 |
+
|
326 |
initgameinfo = start_game()
|
327 |
|
328 |
|
|
|
407 |
gr.HTML("Some Kinds of game skeletons ideas - Timelines, Graph as State machine paths, Economy ecosystem")
|
408 |
gr.HTML("One prompt to be used to test models - <br>Please make 10 python lists for the types of media files and their purposes in a game and then use those lists to random generate a timeline of 20 items when the function is called <br>Great next suggest ways to improve this function to create better timelines")
|
409 |
with gr.Tab("Generate Timeline"):
|
410 |
+
with gr.Tab("Without Asset generation consideration"):
|
411 |
+
gr.Markdown("# Story and Timeline Generator")
|
412 |
+
gr.Markdown("Click the button to generate a random timeline and story based on UI elements and story events.")
|
413 |
+
|
414 |
+
with gr.Row():
|
415 |
+
timeline_output = gr.Textbox(label="Timeline", lines=20)
|
416 |
+
story_output = gr.Textbox(label="Generated Story", lines=20)
|
417 |
+
|
418 |
+
generate_button = gr.Button("Generate Story and Timeline")
|
419 |
+
generate_button.click(generate_story_and_timeline, inputs=[], outputs=[timeline_output, story_output])
|
420 |
+
with gr.Tab("Asset generation considered"):
|
421 |
+
gr.HTML("placeholder")
|
422 |
+
with gr.Tab("Test Example State Machine"):
|
423 |
with gr.Row():
|
424 |
with gr.Column(scale=2):
|
425 |
gr.Markdown("# Text-based Adventure Game")
|
426 |
+
|
427 |
description = gr.Textbox(label="Current Situation", lines=4, value=initgameinfo[0])
|
428 |
choices = gr.Radio(label="Your Choices", choices=initgameinfo[1])
|
429 |
submit_btn = gr.Button("Make Choice")
|
430 |
game_log = gr.Textbox(label="Game Log", lines=20, value=initgameinfo[2])
|
431 |
+
game_session = gr.State(value=initgameinfo[3])
|
432 |
submit_btn.click(
|
433 |
make_choice,
|
434 |
inputs=[choices, game_session],
|
|
|
436 |
)
|
437 |
with gr.Column(scale=1):
|
438 |
gr.Markdown("# Debugging")
|
439 |
+
error_box = gr.Textbox(label="Path Errors", lines=4, value=path_errors)
|
440 |
with gr.Accordion("Config (Game Spoiler)", open=False):
|
441 |
+
custom_config = gr.Textbox(label="Custom Configuration (JSON)", value=json.dumps(all_states, default=lambda o: o.__dict__, indent=2), lines=8)
|
442 |
+
custom_configbtn = gr.Button("Load Custom Config")
|
443 |
+
|
444 |
+
custom_configbtn.click(
|
445 |
+
load_game,
|
446 |
+
inputs=[custom_config],
|
447 |
+
outputs=[error_box, game_log, description, choices, game_session, custom_config]
|
448 |
+
)
|
449 |
|
450 |
|
451 |
with gr.Tab("Asset Generation"):
|
|
|
462 |
gr.HTML("Images Generation Portraits = https://huggingface.co/spaces/okaris/omni-zero")
|
463 |
gr.HTML("Images Generation General = https://huggingface.co/spaces/stabilityai/stable-diffusion-3-medium, https://huggingface.co/spaces/PixArt-alpha/PixArt-Sigma, https://huggingface.co/spaces/stabilityai/stable-diffusion, https://www.craiyon.com/, https://huggingface.co/spaces/prodia/sdxl-stable-diffusion-xl")
|
464 |
gr.HTML("Images Generation Posters with text - https://huggingface.co/spaces/GlyphByT5/Glyph-SDXL-v2")
|
465 |
+
gr.HTML("Images Generation Very Specific position and shape - https://huggingface.co/spaces/linoyts/scribble-sdxl-flash")
|
466 |
gr.HTML("SVG Generation = Coding models - ")
|
467 |
gr.HTML("Placeholder for huggingface spaces that can assist <br> https://huggingface.co/spaces/gokaygokay/Florence-2 <br>")
|
468 |
gr.HTML("Placeholder for models small enough to run on cpu here in this space that can assist")
|