Return the full-resolution image URL from image_search (#3990)

`image_search` set both `image_url` and `thumbnail_url` to the DDGS result's
`thumbnail` field, so the tool never returned the full-resolution image even
though its docstring/usage_hint promise reference-quality images (and a result
with no `thumbnail` returned an empty `image_url`). DDGS `.images()` exposes the
full-res source under the separate `image` key — read that for `image_url`,
matching the serper/brave providers which keep image vs thumbnail distinct.

Adds a regression test.
This commit is contained in:
Daoyuan Li 2026-07-09 20:08:30 -07:00 committed by GitHub
parent b06372b812
commit eb8eec21ce
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 1 deletions

View File

@ -119,7 +119,7 @@ def image_search_tool(
normalized_results = [
{
"title": r.get("title", ""),
"image_url": r.get("thumbnail", ""),
"image_url": r.get("image", ""),
"thumbnail_url": r.get("thumbnail", ""),
}
for r in results

View File

@ -0,0 +1,28 @@
import json
from unittest.mock import MagicMock, patch
from deerflow.community.image_search.tools import image_search_tool
def test_image_search_uses_full_image_url_not_thumbnail():
# Regression: `image_url` must expose the full-resolution `image` from the DDGS result,
# not the low-res `thumbnail` (both fields were previously set to `thumbnail`).
fake_results = [
{
"title": "a cat",
"image": "https://example.com/full.jpg",
"thumbnail": "https://example.com/thumb.jpg",
}
]
cfg = MagicMock()
cfg.get_tool_config.return_value = None
with (
patch("deerflow.community.image_search.tools._search_images", return_value=fake_results),
patch("deerflow.community.image_search.tools.get_app_config", return_value=cfg),
):
output = json.loads(image_search_tool.invoke({"query": "a cat"}))
result = output["results"][0]
assert result["image_url"] == "https://example.com/full.jpg"
assert result["thumbnail_url"] == "https://example.com/thumb.jpg"