kai-api-gateway / debug_hf_widget.py
KiWA001's picture
Fix TTS and HF Widget issues
97ee402
#!/usr/bin/env python3
"""
Debug script to inspect Hugging Face model page widget structure
"""
import asyncio
from playwright.async_api import async_playwright
HF_USERNAME = "one@bo5.store"
HF_PASSWORD = "Zzzzz1$."
async def inspect_widget():
"""Navigate to a model page and inspect the widget HTML structure."""
print("🔍 Inspecting HF Model Widget Structure...\n")
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False) # Visible for debugging
context = await browser.new_context(
viewport={"width": 1920, "height": 1080},
user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36"
)
page = await context.new_page()
# Navigate to a model page with widget
model_url = "https://huggingface.co/moonshotai/Kimi-K2.5"
print(f"1. Navigating to {model_url}...")
await page.goto(model_url, timeout=60000)
await asyncio.sleep(3)
# Check if login is needed
login_btn = await page.query_selector('a[href*="login"], button:has-text("Log in")')
if login_btn:
print("2. Login required, logging in...")
await page.goto("https://huggingface.co/login", timeout=30000)
await page.fill('input[name="username"]', HF_USERNAME)
await page.fill('input[name="password"]', HF_PASSWORD)
await page.click('button[type="submit"]')
await asyncio.sleep(3)
await page.goto(model_url, timeout=30000)
await asyncio.sleep(3)
else:
print("2. Already logged in")
# Accept cookies if present
try:
cookie_btn = await page.wait_for_selector('button:has-text("Accept all")', timeout=3000)
if cookie_btn:
await cookie_btn.click()
await asyncio.sleep(1)
print("3. Accepted cookies")
except:
print("3. No cookie banner")
# Scroll down to find the widget
print("4. Scrolling to find widget...")
await page.evaluate("window.scrollTo(0, document.body.scrollHeight * 0.5)")
await asyncio.sleep(2)
# Take screenshot
await page.screenshot(path="/tmp/hf_widget_debug.png", full_page=False)
print("5. Screenshot saved to /tmp/hf_widget_debug.png")
# Inspect the page structure
print("\n📋 Analyzing page structure...\n")
# Look for widget containers
widgets = await page.query_selector_all('[class*="widget"], [class*="inference"], [data-target*="Widget"]')
print(f"Found {len(widgets)} potential widget elements")
# Get HTML structure around the widget area
page_structure = await page.evaluate("""
() => {
const results = {
iframes: document.querySelectorAll('iframe').length,
textareas: [],
inputs: [],
chatContainers: [],
allWidgets: []
};
// Find all textareas
document.querySelectorAll('textarea').forEach((el, i) => {
results.textareas.push({
index: i,
placeholder: el.placeholder,
className: el.className,
id: el.id,
parentClass: el.parentElement?.className?.substring(0, 100)
});
});
// Find elements with 'chat' or 'message' in class
document.querySelectorAll('[class*="chat" i], [class*="message" i]').forEach((el, i) => {
if (i < 10) { // Limit output
results.chatContainers.push({
tag: el.tagName,
className: el.className,
text: el.textContent?.substring(0, 100)
});
}
});
// Find all elements with 'widget' in class or data attributes
document.querySelectorAll('[class*="widget" i], [data-target*="Widget" i], [class*="inference" i]').forEach((el, i) => {
if (i < 10) {
results.allWidgets.push({
tag: el.tagName,
className: el.className?.substring(0, 200),
dataTarget: el.getAttribute('data-target'),
innerHTML: el.innerHTML?.substring(0, 500)
});
}
});
return results;
}
""")
print("\n--- TEXTAREAS ---")
for ta in page_structure['textareas']:
print(f" [{ta['index']}] Placeholder: '{ta['placeholder']}'")
print(f" Class: {ta['className']}")
print(f" Parent: {ta['parentClass']}")
print()
print("\n--- CHAT/MESSAGE ELEMENTS ---")
for el in page_structure['chatContainers']:
print(f" Tag: {el['tag']}")
print(f" Class: {el['className']}")
print(f" Text: {el['text']}")
print()
print("\n--- WIDGET ELEMENTS ---")
for el in page_structure['allWidgets']:
print(f" Tag: {el['tag']}")
print(f" Class: {el['className']}")
print(f" Data-target: {el['dataTarget']}")
print(f" HTML Preview: {el['innerHTML']}")
print()
print(f"\n--- IFRAMES ---")
print(f"Found {page_structure['iframes']} iframes on page")
# Try to find and interact with input
print("\n🎯 Attempting to find chat input...")
input_found = False
# Try common selectors
selectors = [
'textarea[placeholder*="chat" i]',
'textarea[placeholder*="message" i]',
'textarea[placeholder*="ask" i]',
'[class*="chat"] textarea',
'[class*="widget"] textarea',
'[data-target*="Chat"] textarea',
'[contenteditable="true"]',
]
for sel in selectors:
try:
el = await page.wait_for_selector(sel, timeout=2000)
if el:
print(f"✅ Found input with selector: {sel}")
input_found = True
# Try to type a test message
await el.fill("Hello, this is a test")
await asyncio.sleep(1)
print("✅ Typed test message")
# Look for send button
send_btn = await page.query_selector('button[type="submit"], button:has-text("Send"), [class*="send"]')
if send_btn:
print("✅ Found send button")
else:
print("⚠️ No send button found, trying Enter key...")
await page.keyboard.press("Enter")
break
except Exception as e:
print(f"❌ Selector failed: {sel} - {e}")
if not input_found:
print("❌ Could not find chat input with any selector")
print("\n⏳ Waiting 10 seconds so you can inspect the browser...")
await asyncio.sleep(10)
await browser.close()
print("\n✅ Debug complete!")
if __name__ == "__main__":
asyncio.run(inspect_widget())