Update.
This commit is contained in:
parent
4971d36204
commit
15bfaa777b
@ -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():
|
||||
|
||||
Loading…
Reference in New Issue
Block a user