feat: parallelize lookup (Wiki+SearXNG) and include Wikipedia thumbnails

Runs the Wikipedia summary and SearXNG search concurrently and returns
both when available, so current-event questions aren't masked by a
generic role article from Wikipedia. When the Wikipedia summary includes
a thumbnail, it is cached through the existing image pipeline and
surfaced as an embeddable markdown snippet alongside the extract.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-04-17 22:44:42 -04:00
parent 8db6b4d230
commit 9a252c8dde
4 changed files with 172 additions and 49 deletions
+13 -1
View File
@@ -12,11 +12,21 @@ _TIMEOUT = 5.0
_USER_AGENT = "FabledAssistant/1.0 (https://fabledsword.com)"
def _extract_thumbnail(data: dict) -> str:
"""Prefer the 320px thumbnail (kinder to cache/bandwidth) over originalimage."""
thumb = data.get("thumbnail", {}).get("source", "")
if thumb:
return thumb
return data.get("originalimage", {}).get("source", "")
async def wiki_summary(query: str) -> dict | None:
"""Fetch a Wikipedia summary for a given title/query.
Does a direct title lookup via the REST v1 summary endpoint.
Returns a dict with title, extract, and url on success; None on any failure.
Returns a dict with title, extract, url, and thumbnail_url on success;
thumbnail_url is an empty string when the article has no image.
Returns None on any failure.
"""
title = url_quote(query.replace(" ", "_"))
url = f"{_SUMMARY_URL}/{title}"
@@ -37,6 +47,7 @@ async def wiki_summary(query: str) -> dict | None:
"title": data.get("title", query),
"extract": extract,
"url": data.get("content_urls", {}).get("desktop", {}).get("page", ""),
"thumbnail_url": _extract_thumbnail(data),
}
except Exception as exc:
logger.debug("wiki_summary failed for %r: %s", query, exc)
@@ -91,6 +102,7 @@ async def wiki_search(query: str, limit: int = 3) -> list[dict]:
"url": sdata.get("content_urls", {})
.get("desktop", {})
.get("page", ""),
"thumbnail_url": _extract_thumbnail(sdata),
}
)
except Exception as exc: