Javier-Jimenez99's picture
Actualizar README.md con secciones de demostración y arquitectura, y mejorar la interfaz de usuario en app.py para manejar bloques HTML. También se corrigen comentarios y traducciones en obr.py y test.py.
18f4e71
import gradio as gr
from tools.general import (
letter_counter,
prime_factors,
roll_dice,
coin_flip,
)
from tools.obr import (
create_shape,
create_token,
game_state,
move_item,
delete_item,
fill_fog,
clear_fog,
add_token_light,
animate_token_viewport,
insert_map,
clean_map
)
from tools.test import test_function
from dotenv import load_dotenv
import os
import re
load_dotenv()
with open("README.md", "r", encoding="utf-8") as f:
readme = f.read()
if readme.startswith("---"):
parts = readme.split("---", 2)
if len(parts) >= 3:
readme = parts[2]
html_blocks = re.findall(r'```html\n(.*?)\n```', readme, re.DOTALL)
for i, html_block in enumerate(html_blocks):
readme = readme.replace(f"```html\n{html_block}\n```", f"{{HTML_BLOCK_{i}}}")
with gr.Blocks() as intro_demo:
parts = re.split(r'({HTML_BLOCK_\d+})', readme)
for part in parts:
if part.startswith("{HTML_BLOCK_"):
block_idx = int(part.replace("{HTML_BLOCK_", "").replace("}", ""))
gr.HTML(html_blocks[block_idx])
else:
if part.strip():
gr.Markdown(part)
# === GRADIO INTERFACE ===
demo = gr.TabbedInterface(
[
intro_demo, gr.Interface(
test_function,
[
gr.Textbox(label="Tab ID"),
],
gr.JSON(label="Test Results"),
title="OBR Test Window",
description="This window demonstrates all available OwlBear Rodeo functionalities.",
api_name=False
),
gr.Interface(letter_counter, [gr.Textbox(), gr.Textbox()], gr.Textbox(), api_name="letter_counter"),
gr.Interface(prime_factors, gr.Number(), gr.JSON(), api_name="prime_factors"),
gr.Interface(roll_dice, [gr.Number(label="Faces"), gr.Number(label="Rolls")], gr.JSON(), api_name="roll_dice"),
gr.Interface(coin_flip, gr.Number(label="Flips"), gr.JSON(), api_name="coin_flip"),
gr.Interface(
create_shape,
[
gr.Number(label="width"),
gr.Number(label="height"),
gr.Number(label="X"),
gr.Number(label="Y"),
gr.Textbox(label="Shape Type"),
gr.Textbox(label="Color (hex, e.g., #ff0000)"),
gr.Textbox(label="Stroke Color (hex, e.g., #ff0000)"),
gr.Textbox(label="Tab ID"),
],
gr.JSON(),
api_name="create_shape"
),
gr.Interface(
create_token,
[
gr.Textbox(label="Name"),
gr.Textbox(label="Type"),
gr.Number(label="X"),
gr.Number(label="Y"),
gr.Number(label="Size"),
gr.Textbox(label="Tab ID")
],
gr.JSON(),
api_name="create_token"
),
gr.Interface(
game_state,
gr.Textbox(label="Tab ID"),
gr.JSON(),
api_name=False # Removed because it is forced
),
gr.Interface(
move_item,
[
gr.Textbox(label="Tab ID"),
gr.Textbox(label="Item ID"),
gr.Number(label="X"),
gr.Number(label="Y")
],
gr.JSON(),
api_name="move_item"
),
gr.Interface(
delete_item,
[
gr.Textbox(label="Tab ID"),
gr.Textbox(label="Item ID")
],
gr.JSON(),
api_name="delete_item"
),
gr.Interface(
fill_fog,
[
gr.Textbox(label="Tab ID"),
],
gr.JSON(),
api_name="fill_fog"
),
gr.Interface(
clear_fog,
[
gr.Textbox(label="Tab ID"),
],
gr.JSON(),
api_name="clear_fog"
),
gr.Interface(
add_token_light,
[
gr.Textbox(label="Tab ID"),
gr.Textbox(label="Token ID"),
gr.Number(label="Radius")
],
gr.JSON(),
api_name="add_token_light"
),
gr.Interface(
animate_token_viewport,
[
gr.Textbox(label="Tab ID"),
gr.Textbox(label="Token ID")
],
gr.JSON(),
api_name="animate_token_viewport"
),
gr.Interface(
insert_map,
[
gr.Textbox(label="Tab ID"),
gr.Textbox(label="Map Name")
],
gr.JSON(),
api_name="insert_map"
),
gr.Interface(
clean_map,
[
gr.Textbox(label="Tab ID")
],
gr.JSON(),
api_name="clean_map"
)
], [
"🧙‍♂️ Introduction",
"🧪 Tests",
"Letter Counter",
"Prime Factors",
"Roll Dice",
"Coin Flip",
"Create Shape",
"Create Token",
"Game State",
"Move Item",
"Delete Item",
"Fill Fog",
"Clear Fog",
"Add Token Light",
"Animate Token Viewport",
"Insert Map",
"Clean Map"
]
)
demo.launch(mcp_server=True,server_port=int(os.getenv("GRADIO_PORT", 7860)),ssl_verify=False)