Search providers: SearXNG and Brave with ranking #67

Member

Maestro task: 10c25cb5-3774-419c-87e1-3f87a3d1391d (Feature 10 - Recipe Grounding and Photos).

Done-condition

internal/recipes defines SearchProvider.Search(ctx, query, n) -> []Candidate{url,title,snippet}; a SearXNG implementation calls {MEALQUEST_SEARXNG_URL}/search?q=...&format=json&categories=general (internal URL allowed for this configured endpoint only); a Brave implementation calls the Brave Web Search API with the decrypted key; queries get ' recipe' appended when absent; ranking fetches/extracts top candidates and scores by title token similarity to the dish name plus completeness (ingredients, image, steps, minutes), rejecting candidates missing ingredients or image. httptest tests cover both providers' parsing, error mapping and ranking order. Go quality floor passes.

Evidence

  • internal/recipes search providers + ranking; gofmt/vet/go test -race/build pass; no new dependency.
  • Reuses the fetcher and JSON-LD extractor and the harness Normalize/Similar.
Maestro task: 10c25cb5-3774-419c-87e1-3f87a3d1391d (Feature 10 - Recipe Grounding and Photos). ## Done-condition internal/recipes defines SearchProvider.Search(ctx, query, n) -> []Candidate{url,title,snippet}; a SearXNG implementation calls {MEALQUEST_SEARXNG_URL}/search?q=...&format=json&categories=general (internal URL allowed for this configured endpoint only); a Brave implementation calls the Brave Web Search API with the decrypted key; queries get ' recipe' appended when absent; ranking fetches/extracts top candidates and scores by title token similarity to the dish name plus completeness (ingredients, image, steps, minutes), rejecting candidates missing ingredients or image. httptest tests cover both providers' parsing, error mapping and ranking order. Go quality floor passes. ## Evidence - internal/recipes search providers + ranking; gofmt/vet/go test -race/build pass; no new dependency. - Reuses the fetcher and JSON-LD extractor and the harness Normalize/Similar.
dev_agent added 1 commit 2026-10-05 13:19:37 -04:00
Add SearXNG and Brave recipe search providers with ranking
CI / ci (push) Successful in 1m35s
CI / ci (pull_request) Successful in 1m36s
26928b538b
recipes.SearchProvider.Search(ctx, query, n) returns []Candidate{URL,
Title, Snippet}, appending " recipe" when the query lacks the word.
SearXNG calls {MEALQUEST_SEARXNG_URL}/search?q=…&format=json&categories=general
directly (the configured endpoint may be internal); Brave calls the Web
Search API with the key decrypted from recipe_search_settings. Redirects
are not followed; 401/403, 429, other non-2xx and malformed bodies map to
distinct errors.

recipes.Rank fetches and extracts the top 5 candidates, rejects those
without ingredients or an image, and scores the rest by
harness.Similarity of the recipe title to the dish name plus
completeness (ingredients, image, steps, minutes). harness.Similarity
exposes the existing Jaccard score used by Similar.

Maestro task 10c25cb5-3774-419c-87e1-3f87a3d1391d.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
overseer added 1 commit 2026-10-05 13:19:38 -04:00
Add SearXNG and Brave recipe search providers with ranking
CI / ci (push) Successful in 1m35s
CI / ci (pull_request) Successful in 1m36s
26928b538b
recipes.SearchProvider.Search(ctx, query, n) returns []Candidate{URL,
Title, Snippet}, appending " recipe" when the query lacks the word.
SearXNG calls {MEALQUEST_SEARXNG_URL}/search?q=…&format=json&categories=general
directly (the configured endpoint may be internal); Brave calls the Web
Search API with the key decrypted from recipe_search_settings. Redirects
are not followed; 401/403, 429, other non-2xx and malformed bodies map to
distinct errors.

recipes.Rank fetches and extracts the top 5 candidates, rejects those
without ingredients or an image, and scores the rest by
harness.Similarity of the recipe title to the dish name plus
completeness (ingredients, image, steps, minutes). harness.Similarity
exposes the existing Jaccard score used by Similar.

Maestro task 10c25cb5-3774-419c-87e1-3f87a3d1391d.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
review_agent requested changes 2026-10-05 13:22:34 -04:00
Dismissed
review_agent left a comment
Member

Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.

Independent Codex gpt-6-sol review: CHANGES_REQUIRED for this exact commit.
overseer added 1 commit 2026-10-05 13:31:07 -04:00
Reject malformed search bodies and report unranked candidates
CI / ci (push) Successful in 1m35s
CI / ci (pull_request) Successful in 1m35s
01523f634b
SearXNG now requires a results array and Brave requires "type": "search"
with a results array in any web object, so `{}` is ErrSearchResponse
instead of an empty search. Rank no longer drops failed candidates: it
returns the ranked ones with ErrCandidatesUnranked joined with each
unranked candidate's URL and reason, or ErrNoUsableRecipe when none rank.
Adds an HTTPS ranking test through the SSRF-safe Fetcher.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
review_agent left a comment
Member

Independent Codex gpt-6-sol review: APPROVED for this exact commit.

Independent Codex gpt-6-sol review: APPROVED for this exact commit.
approver_agent merged commit 2fb7807af3 into feature/cebed295-8c05-453b-807b-8078dcd8d250-recipe-grounding 2026-10-05 13:41:49 -04:00
Sign in to join this conversation.
No Reviewers
No labels
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Maniacs_Mansion/MealQuest#67