nguyenthanhasia's picture
Upload app.py with huggingface_hub
3541e89 verified
"""
Simple OpenAlex API Test Space
"""
import gradio as gr
import requests
import json
import time
from typing import Dict, List, Any
def test_openalex_api(query: str) -> tuple:
"""Test OpenAlex API with different strategies"""
if not query.strip():
return "Please enter a search query", "", ""
results_text = f"πŸ” Testing OpenAlex API with query: '{query}'\n\n"
# Strategy 1: Direct API call
try:
results_text += "=== STRATEGY 1: Direct requests call ===\n"
url = "https://api.openalex.org/works"
params = {
'search': query,
'per-page': 10
}
headers = {
'User-Agent': 'OpenAlexTest/1.0 (mailto:test@example.com)',
'Accept': 'application/json'
}
results_text += f"URL: {url}\n"
results_text += f"Params: {params}\n"
results_text += f"Headers: {headers}\n\n"
response = requests.get(url, params=params, headers=headers, timeout=30)
results_text += f"Status Code: {response.status_code}\n"
results_text += f"Response Headers: {dict(response.headers)}\n\n"
if response.status_code == 200:
data = response.json()
results_count = len(data.get('results', []))
results_text += f"βœ… SUCCESS: Found {results_count} results\n"
if results_count > 0:
first_result = data['results'][0]
results_text += f"First result: {first_result.get('title', 'No title')}\n"
results_text += f"Year: {first_result.get('year', 'Unknown')}\n"
results_text += f"Citations: {first_result.get('citations', 0)}\n\n"
# Return formatted results
formatted_results = json.dumps(data, indent=2)[:2000] + "..." if len(json.dumps(data, indent=2)) > 2000 else json.dumps(data, indent=2)
else:
results_text += f"❌ FAILED: HTTP {response.status_code}\n"
results_text += f"Response: {response.text[:500]}\n\n"
formatted_results = response.text
except Exception as e:
results_text += f"❌ EXCEPTION: {str(e)}\n\n"
formatted_results = str(e)
# Strategy 2: Test with different query formats
test_queries = [
query,
query.replace(' ', '+'),
query.lower(),
' '.join(query.split()[:3]) # First 3 words only
]
results_text += "=== STRATEGY 2: Different query formats ===\n"
for i, test_query in enumerate(test_queries):
try:
results_text += f"\nTest {i+1}: '{test_query}'\n"
response = requests.get(
"https://api.openalex.org/works",
params={'search': test_query, 'per-page': 5},
headers=headers,
timeout=15
)
if response.status_code == 200:
data = response.json()
count = len(data.get('results', []))
results_text += f"βœ… {count} results\n"
if count > 0:
break # Stop at first successful query
else:
results_text += f"❌ HTTP {response.status_code}\n"
except Exception as e:
results_text += f"❌ Error: {str(e)}\n"
# Strategy 3: Test basic connectivity
results_text += "\n=== STRATEGY 3: Basic connectivity test ===\n"
try:
response = requests.get("https://api.openalex.org/", timeout=10)
results_text += f"OpenAlex root endpoint: HTTP {response.status_code}\n"
except Exception as e:
results_text += f"❌ Cannot reach OpenAlex: {str(e)}\n"
# Test other endpoints
try:
response = requests.get("https://httpbin.org/get", timeout=10)
results_text += f"HTTPBin test (internet connectivity): HTTP {response.status_code}\n"
except Exception as e:
results_text += f"❌ No internet connectivity: {str(e)}\n"
return results_text, formatted_results, f"Query tested: {query}"
# Create Gradio interface
with gr.Blocks(title="OpenAlex API Test", theme=gr.themes.Soft()) as app:
gr.Markdown("# πŸ”¬ OpenAlex API Test Space")
gr.Markdown("Test OpenAlex API connectivity and search functionality")
with gr.Row():
with gr.Column():
query_input = gr.Textbox(
label="Search Query",
placeholder="Enter search terms (e.g., 'machine learning', 'climate change')",
value="machine learning"
)
test_btn = gr.Button("πŸ” Test OpenAlex API", variant="primary")
with gr.Row():
with gr.Column():
results_output = gr.Textbox(
label="Test Results",
lines=20,
max_lines=30
)
with gr.Column():
json_output = gr.Textbox(
label="Raw JSON Response",
lines=20,
max_lines=30
)
status_output = gr.Textbox(label="Status", lines=1)
test_btn.click(
fn=test_openalex_api,
inputs=[query_input],
outputs=[results_output, json_output, status_output]
)
# Auto-test on load
app.load(
fn=lambda: test_openalex_api("artificial intelligence"),
outputs=[results_output, json_output, status_output]
)
if __name__ == "__main__":
app.launch()