mishig's picture
mishig HF Staff
prompt: immediately fetch API schema then ask user what to do
f2e3a42
import os
import httpx
from fastapi import FastAPI, Request
from fastapi.responses import HTMLResponse
app = FastAPI()
HF_TOKEN = os.environ.get("HF_TOKEN", "")
def build_agent_prompt(space_info: dict) -> str:
space_id = space_info.get("id", "")
subdomain = space_info.get("subdomain", "")
description = space_info.get("ai_short_description") or (space_info.get("cardData") or {}).get("short_description")
base_url = f"https://{subdomain}.hf.space"
desc_part = f" ({space_id}: {description})" if description else f" ({space_id})"
return (
f'This is a Hugging Face Space{desc_part}. '
f'Immediately fetch its API schema (GET {base_url}/gradio_api/info) to discover available endpoints, '
f'then ask the user what they want to do. '
f'Call endpoint: POST {base_url}/gradio_api/call/{{endpoint}} {{"data": [...]}} — '
f'Poll result: GET {base_url}/gradio_api/call/{{endpoint}}/{{event_id}} — '
f'auth: Bearer $HF_TOKEN'
)
@app.get("/proxy/{namespace}/{repo}", response_class=HTMLResponse)
async def proxy_space(namespace: str, repo: str, request: Request):
space_id = f"{namespace}/{repo}"
headers = {}
if HF_TOKEN:
headers["Authorization"] = f"Bearer {HF_TOKEN}"
async with httpx.AsyncClient(follow_redirects=True) as client:
# Fetch space info from API
api_resp = await client.get(f"https://huggingface.co/api/spaces/{space_id}", headers=headers)
if api_resp.status_code != 200:
return HTMLResponse(f"<html><body>Space not found: {space_id}</body></html>", status_code=404)
space_info = api_resp.json()
if space_info.get("sdk") != "gradio":
return HTMLResponse(f"<html><body>Only Gradio spaces are supported. This space uses: {space_info.get('sdk')}</body></html>", status_code=400)
# Fetch ai_short_description from semantic search
search_resp = await client.get(
f"https://huggingface.co/api/spaces/semantic-search?q={space_id}&sdk=gradio",
headers=headers,
)
results = search_resp.json() if search_resp.status_code == 200 else []
match = next((r for r in results if r.get("id") == space_id), None)
if match:
space_info["ai_short_description"] = match.get("ai_short_description")
# Fetch the actual space page HTML
page_resp = await client.get(f"https://huggingface.co/spaces/{space_id}", headers=headers)
html = page_resp.text
# Build the meta tag
prompt = build_agent_prompt(space_info)
meta_tag = f'<meta name="agent-instructions" content="{prompt}">'
# Inject meta tag after <head> or at the start
if "<head>" in html:
html = html.replace("<head>", f"<head>\n{meta_tag}", 1)
elif "<HEAD>" in html:
html = html.replace("<HEAD>", f"<HEAD>\n{meta_tag}", 1)
else:
html = f"{meta_tag}\n{html}"
return HTMLResponse(html)
@app.get("/agent-instructions/{namespace}/{repo}")
async def agent_instructions(namespace: str, repo: str):
space_id = f"{namespace}/{repo}"
headers = {}
if HF_TOKEN:
headers["Authorization"] = f"Bearer {HF_TOKEN}"
async with httpx.AsyncClient(follow_redirects=True) as client:
api_resp = await client.get(f"https://huggingface.co/api/spaces/{space_id}", headers=headers)
if api_resp.status_code != 200:
return {"error": f"Space not found: {space_id}"}
space_info = api_resp.json()
if space_info.get("sdk") != "gradio":
return {"error": f"Only Gradio spaces supported. This uses: {space_info.get('sdk')}"}
return {"instructions": build_agent_prompt(space_info)}
@app.get("/", response_class=HTMLResponse)
async def home():
return HTMLResponse("""
<html>
<head><title>Agent Meta Tag Proxy</title></head>
<body style="font-family: sans-serif; max-width: 600px; margin: 40px auto; padding: 0 20px;">
<h1>Agent Meta Tag Proxy</h1>
<p>This Space injects a <code>&lt;meta name="agent-instructions"&gt;</code> tag into Gradio Space pages for AI agent discovery.</p>
<h3>Usage</h3>
<pre>/proxy/{namespace}/{repo}</pre>
<h3>Example</h3>
<a href="/proxy/mrfakename/Z-Image-Turbo">/proxy/mrfakename/Z-Image-Turbo</a>
</body>
</html>
""")