"Use when organizing a camera photo folder and reviewing JPGs aesthetically: separate RAW files and videos into subfolders, score original JPG photos with one fixed vision-model prompt, export CSV/XLSX/PDF review artifacts, and copy full-quality JPGs into rating folders without modifying originals."
Resources
2Install
npx skillscat add kilimiaosix/agent-skills/photo-review-workflow Install via the SkillsCat registry.
Photo Review Workflow
What This Skill Does
Use this skill for photo-shoot folders that contain original camera JPGs plus RAW/video sidecars. It preserves originals, organizes non-JPG files, evaluates only original JPG files with a fixed multimodal prompt, exports review tables, and optionally copies full-quality JPGs into rating folders for Finder browsing.
The bundled script is:
scripts/llm_photo_review.pyDefault Workflow
- Resolve the real photo directory. On macOS, Finder "图片" is usually
~/Pictures. - Create
raw/and move RAW extensions there:.RAF,.RAW,.CR2,.CR3,.NEF,.ARW,.DNG,.RW2,.ORF,.SRW. - Create
视频/and move.MOVfiles there. - Score only original JPG files, normally
DSCF*.JPG; ignore generated contact sheets, CSV/XLSX/PDF files, RAW, and videos. - Use one fixed prompt for every image. Do not tune the prompt per image or per scene.
- Export:
llm_aesthetic_review.csvllm_aesthetic_review.xlsxllm_aesthetic_review_top_200.pdfllm_aesthetic_review_summary.txtllm_aesthetic_review.status.json
- Copy full-quality JPGs into rating folders only after scoring is complete.
Scoring Command
Use any Python 3 interpreter that has Pillow, ReportLab, and pandas/openpyxl-style dependencies installed:
PY=python3For an OpenAI-compatible endpoint:
OPENAI_API_KEY="..." \
OPENAI_BASE_URL="https://your-openai-compatible-endpoint/v1" \
OPENAI_MODEL="gpt-5.4-mini" \
$PY scripts/llm_photo_review.py \
--photos-dir /path/to/photos \
--output-prefix llm_aesthetic_review \
--max-side 384 \
--jpeg-quality 70 \
--workers 4 \
--timeout 120 \
--max-retries 3Notes:
- Include
/v1inOPENAI_BASE_URLfor OpenAI-compatible endpoints. - If large image requests disconnect, reduce
--max-sideto384and--jpeg-qualityto70. - The script supports resume by default: existing CSV rows are skipped.
--no-resumeforces a fresh run.--skip-errorsskips files listed in the errors CSV.--pdf-onlyregenerates CSV/PDF artifacts from existing rows without API calls.
Fixed Prompt Intent
The script asks the model to act as a strict photography editor for street, travel documentary, and everyday images. Scores are aesthetic selection scores, not technical quality scores.
Core dimensions:
- subject and reason to look
- composition and visual form
- moment and story
- light and color
- editing/cropping potential
- technical floor, without over-rewarding sharp ordinary photos
Expected scoring is strict. A folder may have no A/B images; still use relative rank for selection.
Rating Folder Copy
After scoring, copy originals by file copy, not image re-encoding. Use a folder such as 按评分分类/ under the photo directory.
Recommended folder grouping:
按评分分类/
C_可留/
C_一般/
D_一般/
D_淘汰/
E_淘汰/Recommended filename:
999-score_scoreXXX_rankXXXX_GRADE_ORIGINAL.JPGExample:
925_score074_rank0001_C_DSCF1568.JPG999-score makes Finder name-sort place higher scores first while preserving the original filename for lookup.
Validation
Before final response, verify:
- source original JPG count equals scored row count
- no missing source files
- copied JPG count equals scored row count when rating folders are requested
- status JSON shows
pending: 0 - unresolved errors are zero or clearly reported
Do not report API keys in final output or save them into skill files.