import pathlib # Fix 1: patch gradio_client get_type to handle non-dict schemas p = pathlib.Path("/usr/local/lib/python3.10/site-packages/gradio_client/utils.py") lines = p.read_text().splitlines() new_lines = [] patched1 = False for line in lines: if not patched1 and ' if "const" in schema:' in line: indent = len(line) - len(line.lstrip()) pad = " " * indent new_lines.append(pad + "if not isinstance(schema, dict): return 'string'") patched1 = True new_lines.append(line) p.write_text("\n".join(new_lines) + "\n") print("SUCCESS: get_type patch applied" if patched1 else "WARNING: get_type not found") # Fix 2: patch gradio routes api_info call p2 = pathlib.Path("/usr/local/lib/python3.10/site-packages/gradio/routes.py") lines2 = p2.read_text().splitlines() new_lines2 = [] patched2 = False for line in lines2: if not patched2 and line.strip() == "gradio_api_info = api_info(False)": indent = len(line) - len(line.lstrip()) pad = " " * indent new_lines2.append(pad + "try:") new_lines2.append(pad + " gradio_api_info = api_info(False)") new_lines2.append(pad + "except Exception:") new_lines2.append(pad + " gradio_api_info = {}") patched2 = True print(f"SUCCESS: api_info patch applied") else: new_lines2.append(line) p2.write_text("\n".join(new_lines2) + "\n") print("SUCCESS: api_info patch applied" if patched2 else "WARNING: api_info already patched or not found") # Fix 3: patch TemplateResponse call to strip unhashable globals lines3 = p2.read_text().splitlines() new_lines3 = [] patched3 = False for line in lines3: if not patched3 and "return templates.TemplateResponse(" in line: indent = len(line) - len(line.lstrip()) pad = " " * indent new_lines3.append(pad + "try:") new_lines3.append(pad + " " + line.lstrip()) # find the closing paren across next lines patched3 = True in_template = True new_lines3_template_lines = [line] else: new_lines3.append(line) p2.write_text("\n".join(new_lines3) + "\n") # Simpler approach: patch jinja2 LRUCache to handle unhashable keys p3 = pathlib.Path("/usr/local/lib/python3.10/site-packages/jinja2/utils.py") lines3 = p3.read_text().splitlines() new_lines3 = [] patched3 = False for i, line in enumerate(lines3): new_lines3.append(line) if not patched3 and "rv = self._mapping[key]" in line: # Already added the line, now we need to wrap it # Remove the last line and replace with try/except new_lines3.pop() indent = len(line) - len(line.lstrip()) pad = " " * indent new_lines3.append(pad + "try:") new_lines3.append(pad + " rv = self._mapping[key]") new_lines3.append(pad + "except TypeError:") new_lines3.append(pad + " raise KeyError(key)") patched3 = True print(f"SUCCESS: Jinja2 LRUCache patch applied at line {i}") p3.write_text("\n".join(new_lines3) + "\n") if not patched3: print("WARNING: Jinja2 patch target not found") print("All patches complete")