Search and download images via Google Custom Search API with LLM-powered selection...
Search for images using Google Custom Search API with intelligent scoring and LLM-based selection.
/opt/homebrew/bin/llmStore credentials in .env:
Google-Custom-Search-JSON-API-KEY=your_key
Google-Custom-Search-CX=your_cx
OPENROUTER_API_KEY=your_openrouter_key
Search for a single term:
python3 ~/.claude/skills/google-image-search/scripts/google_image_search.py \
--query "neural interface wearable device" \
--output-dir ./images \
--num-results 5
Process multiple queries from JSON config:
python3 ~/.claude/skills/google-image-search/scripts/google_image_search.py \
--config image_queries.json \
--output-dir ./images \
--llm-select
Create JSON config from a list of terms using LLM:
python3 ~/.claude/skills/google-image-search/scripts/google_image_search.py \
--generate-config \
--terms "AlterEgo wearable" "sEMG electrodes" "BCI headset" \
--output my_queries.json
Extract visual terms from note, find images, and insert below headings:
python3 ~/.claude/skills/google-image-search/scripts/google_image_search.py \
--enrich-note ~/Brains/brain/Research/neural-interfaces.md
This mode:
| Option | Description |
|---|---|
--query TEXT |
Simple single query |
--config FILE |
JSON config for batch |
--generate-config |
Generate config from --terms |
--enrich-note FILE |
Enrich Obsidian note |
--output-dir DIR |
Where to save images |
--urls-only |
Return URLs only, no download |
--llm-select |
Use LLM to pick best image (default: on) |
--no-llm-select |
Disable LLM selection |
--num-results N |
Results per query (default: 5) |
--dry-run |
Show what would be done |
Each entry supports:
{
"id": "unique-id",
"heading": "Display Heading",
"description": "Context for what image to find",
"query": "Google search query",
"numResults": 5,
"selectionCriteria": "What makes a good image",
"requiredTerms": ["must", "have"],
"optionalTerms": ["bonus", "terms"],
"excludeTerms": ["stock", "clipart"],
"preferredHosts": ["official-site.com"],
"selectionCount": 2
}
See references/api_config_reference.md for full documentation.
Images are scored based on:
After scoring, LLM picks the best image from top candidates based on:
The LLM evaluates authenticity, clarity, and relevance for technical audiences.
When in an Obsidian vault:
.obsidian folderAttachments)![[image.png|alt text]]| File | Purpose |
|---|---|
google_image_search.py |
Main entry point |
api.py |
Google Custom Search API |
config.py |
Credentials and config handling |
download.py |
Image download with magic bytes |
evaluate.py |
Keyword-based scoring |
llm_select.py |
LLM selection and term extraction |
obsidian.py |
Vault detection and enrichment |
output.py |
Markdown output generation |