This commit is contained in:
retoor 2026-01-29 03:19:55 +01:00
parent 4971d36204
commit 15bfaa777b

View File

@ -31,140 +31,84 @@ def _format_results_as_markdown(query: str, results: List[Dict]) -> str:
return output
router = APIRouter()
cache = Cache(settings.CACHE_DB_PATH)
exa = ExaClient()
openrouter = OpenRouterClient()
renderer = MarkdownRenderer()
@router.get("/", response_class=HTMLResponse)
async def home(request: Request):
return request.state.templates.TemplateResponse("home.html", {"request": request})
@router.get("/ai", response_class=HTMLResponse)
async def search_ai(request: Request, q: str = Query(""), num: int = 10):
query = q.strip() if q else ""
if not query:
return request.state.templates.TemplateResponse("home.html", {"request": request})
logger.info(f"AI search request for: '{query}' (num={num})")
try:
cached = cache.get(query, "ai", num)
if cached:
logger.info(f"Cache hit for AI search: '{query}'")
markdown_answer = cached.get("markdown_answer", "")
html_answer = renderer.render(markdown_answer)
search_results = cached.get("search_results", [])
search_type = cached.get("search_type", "web")
else:
logger.info(f"Cache miss for AI search: '{query}'. Fetching from Exa.")
try:
search_data = exa.answer_ai(query, num)
search_results = search_data.get("results", [])
search_type = search_data.get("search_type", "web")
if not search_results:
logger.warning(f"No results found from Exa for: '{query}'")
raise Exception("No results found from Exa")
logger.info(f"Generating AI answer with OpenRouter for: '{query}'")
markdown_answer = await openrouter.format_results_as_markdown(query, search_results)
html_answer = renderer.render(markdown_answer)
cache.set(query, "ai", num, {
"html_answer": html_answer,
"search_results": search_results,
"search_type": search_type,
"markdown_answer": markdown_answer
})
except Exception as e:
logger.error(f"AI search failed, falling back to web search for: '{query}'. Error: {e}")
# Fallback to standard web search
fallback_results = exa.search_web(query, num)
markdown_answer = _format_results_as_markdown(query, fallback_results)
@ -199,7 +143,6 @@ async def search_ai(request: Request, q: str = Query(""), num: int = 10):
{"request": request, "error": "An internal error occurred. Please try again."}
)
@router.get("/api/ai")
async def api_ai(q: str = Query(""), num: int = Query(10)):
query = q.strip() if q else ""
@ -232,9 +175,9 @@ async def api_ai(q: str = Query(""), num: int = Query(10)):
search_type = search_data.get("search_type", "web")
if not search_results:
raise Exception("No results found from Exa")
raise Exception("No results found from Exa")
markdown_answer = await openrouter.format_results_as_markdown(query, search_results)
markdown_answer = await openrouter.format_results_as_markdown(query, search_results)
html_answer = renderer.render(markdown_answer)
result = {
@ -272,7 +215,6 @@ async def api_ai(q: str = Query(""), num: int = Query(10)):
content={"error": "Internal server error", "detail": str(e)}
)
@router.get("/search", response_class=HTMLResponse)
async def search_web(request: Request, q: str = Query(""), num: int = 10):
query = q.strip() if q else ""
@ -302,7 +244,6 @@ async def search_web(request: Request, q: str = Query(""), num: int = 10):
{"request": request, "error": "Search failed. Please try again."}
)
@router.get("/images", response_class=HTMLResponse)
async def search_images(request: Request, q: str = Query(""), num: int = 20):
query = q.strip() if q else ""
@ -329,7 +270,6 @@ async def search_images(request: Request, q: str = Query(""), num: int = 20):
{"request": request, "error": "Image search failed. Please try again."}
)
@router.get("/api/search")
async def api_search(q: str = Query(""), num: int = Query(10)):
query = q.strip() if q else ""
@ -355,7 +295,6 @@ async def api_search(q: str = Query(""), num: int = Query(10)):
content={"error": "Internal server error", "detail": str(e)}
)
@router.get("/api/images")
async def api_images(q: str = Query(""), num: int = Query(20)):
query = q.strip() if q else ""
@ -381,7 +320,6 @@ async def api_images(q: str = Query(""), num: int = Query(20)):
content={"error": "Internal server error", "detail": str(e)}
)
@router.get("/api/mixed")
async def api_mixed(q: str = Query(...), num: int = Query(10)):
if not q.strip():