VReason-Demo / app.py
EvidenceAIResearch's picture
Upload RadGenome demo Space
7150edc verified
Raw
History Blame Contribute Delete
3.77 kB
#!/usr/bin/env python3
"""Hugging Face Space entrypoint for the RadGenome demo."""
import sys
import os
import gradio_client.utils as gradio_client_utils
import gradio.routes as gradio_routes
from demo_log import build_app, parse_args
def _patch_gradio_json_schema_bug():
"""
Gradio 4.44.x can crash when JSON schema nodes are bool values.
See: https://github.com/gradio-app/gradio/issues/11084
"""
original_get_type = gradio_client_utils.get_type
original_json_schema_to_python_type_top = gradio_client_utils.json_schema_to_python_type
original_json_schema_to_python_type = gradio_client_utils._json_schema_to_python_type
def safe_get_type(schema):
if isinstance(schema, bool):
return "any"
return original_get_type(schema)
def safe_json_schema_to_python_type(schema, defs):
if isinstance(schema, bool):
# JSON Schema allows boolean schemas; gradio_client 1.3.0 crashes on this.
return "Any"
return original_json_schema_to_python_type(schema, defs)
def safe_json_schema_to_python_type_top(schema):
try:
return original_json_schema_to_python_type_top(schema)
except Exception:
return "Any"
gradio_client_utils.get_type = safe_get_type
gradio_client_utils._json_schema_to_python_type = safe_json_schema_to_python_type
gradio_client_utils.json_schema_to_python_type = safe_json_schema_to_python_type_top
def _patch_template_response_compat():
"""
Handle Starlette TemplateResponse signature drift across environments.
"""
original_template_response = gradio_routes.templates.TemplateResponse
def safe_template_response(*args, **kwargs):
# Old-style positional call: TemplateResponse(name_str, context_dict)
# New Starlette interprets this as (request=name_str, name=context_dict),
# causing "unhashable type: 'dict'" when Jinja2 tries to cache on `name`.
if args and isinstance(args[0], str) and len(args) >= 2 and isinstance(args[1], dict):
name = args[0]
context = dict(args[1])
request = context.get("request")
try:
return original_template_response(request=request, name=name, context=context)
except Exception:
return original_template_response(name, context, *args[2:], **kwargs)
if not args and {"request", "name", "context"} <= set(kwargs):
request = kwargs["request"]
name = kwargs["name"]
context = dict(kwargs.get("context") or {})
context.setdefault("request", request)
try:
return original_template_response(request=request, name=name, context=context)
except Exception:
return original_template_response(name, context)
return original_template_response(*args, **kwargs)
gradio_routes.templates.TemplateResponse = safe_template_response
def _build_demo():
# Avoid argparse conflicts if the runtime injects extra CLI flags.
argv_backup = sys.argv
try:
sys.argv = [argv_backup[0]]
args = parse_args()
finally:
sys.argv = argv_backup
_patch_gradio_json_schema_bug()
_patch_template_response_compat()
demo = build_app(args)
return demo, args
demo, _args = _build_demo()
if __name__ == "__main__":
in_hf_space = bool(os.getenv("SPACE_ID") or os.getenv("HF_SPACE_ID"))
# In Spaces runtime, enforce share link creation to avoid localhost access errors.
launch_share = True if in_hf_space else _args.share
demo.launch(
share=launch_share,
server_name=_args.server_name or "0.0.0.0",
server_port=_args.server_port,
)