Daily Art engine: museum-guide blurb (grounded LLM) + extracted palette
- daily_art gains blurb + palette columns (idempotent migration). - art._palette: Pillow median-cut to ~5 hex colors from the cached image (best- effort → [] on any failure). art._blurb: a warm 2-3 sentence "what you're looking at" note grounded in the Met catalogue (title/artist/bio/date/medium/ classification/culture/tags). Prompt leans on context/significance and the title+tags for subject — explicitly NOT asserting literal composition (figure counts/poses) it can't see, since the model can't view the image. Markdown stripped from the output. - pick_daily generates both (client optional → blurb skipped when absent); cycle + art CLI pass an LLM client. /api/art/today exposes blurb + palette. - Backfilled the last 3 days on host (Veteran / Magnolia Vase / Bierstadt). - scripts/art_blurb_palette_backfill.py for in-place backfill (no re-pick). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -23,6 +23,8 @@ def client(tmp_path, monkeypatch):
|
||||
"VALUES ('2026-06-21','met',10154,'Lander''s Peak','Bierstadt','1863','Oil','Paintings',"
|
||||
"'Gift','https://met/10154','10154.jpg','https://met/full.jpg',1)"
|
||||
)
|
||||
c.execute("UPDATE daily_art SET blurb=?, palette=? WHERE object_id=10154",
|
||||
("A luminous western vista.", '["#7fb4cf", "#c79a3c"]'))
|
||||
c.commit(); c.close()
|
||||
cache.mkdir(parents=True, exist_ok=True)
|
||||
(cache / "10154.jpg").write_bytes(b"\xff\xd8\xff" + b"x" * 5000) # web-large display copy
|
||||
@@ -43,3 +45,5 @@ def test_today_exposes_full_res_url(client):
|
||||
assert a["image_url"] == "/api/art/image/10154"
|
||||
assert a["image_url_large"] == "/api/art/image/10154?size=full"
|
||||
assert a["license"] == "Public Domain (CC0)" and a["museum"] == "The Met"
|
||||
assert a["blurb"] == "A luminous western vista."
|
||||
assert a["palette"] == ["#7fb4cf", "#c79a3c"] # parsed from stored JSON
|
||||
|
||||
Reference in New Issue
Block a user