A local tool that helps you create Adobe Stock CSV metadata from your photos, one image at a time, with safe resume behavior.
This README is written for photographers who are not deeply technical.
If you can:
- open LM Studio,
- open Terminal,
- copy-paste a command,
you can use this project.
This path uses LM Studio and does not require an OpenAI API key.
You need:
- macOS/Linux
- Python 3.10+
- LM Studio installed
- A vision model loaded in LM Studio (recommended:
qwen/qwen3-vl-8b) - Your images inside
Portfolio/
- Open LM Studio.
- Load a vision model (for example
qwen/qwen3-vl-8b). - Start Local Server.
- Confirm it is reachable at
http://127.0.0.1:1234.
Optional check:
curl http://127.0.0.1:1234/v1/modelsProject folder example:
/Users/administrator/Documents/Kiki/adobe_stock_csv_codex_kit
Copy-paste:
python3 src/adobe_stock_csv_cli.py \
--backend lmstudio \
--lmstudio-host http://127.0.0.1:1234 \
--lmstudio-model qwen/qwen3-vl-8b \
--lmstudio-fallback-model google/gemma-3-4b \
--lmstudio-category-model google/gemma-3-4b \
--portfolio-dir Portfolio \
--output-dir output/lmstudio/qwen-qwen3-vl-8b \
--limit 5After smoke test looks good:
python3 src/adobe_stock_csv_cli.py \
--backend lmstudio \
--lmstudio-host http://127.0.0.1:1234 \
--lmstudio-model qwen/qwen3-vl-8b \
--lmstudio-fallback-model google/gemma-3-4b \
--lmstudio-category-model google/gemma-3-4b \
--portfolio-dir Portfolio \
--output-dir output/lmstudio/qwen-qwen3-vl-8bFor each image, the tool does this safely:
- Analyze 1 image
- Validate metadata
- Append exactly 1 CSV row
- Flush to disk immediately
- Continue
If something fails for one image, the batch continues.
You can stop and run again anytime.
- Already processed filenames are skipped.
- The tool does not restart from zero.
- Failed/uncertain files are logged for manual review.
Inside your selected --output-dir:
adobe_stock_upload.csv(main upload CSV)review_needed.csv(items needing manual review)progress.json(run counters and benchmark summary)run.log(detailed run events)
Sample output view:
This screenshot was captured from this project's generated CSV output.
python3 src/adobe_stock_csv_cli.py \
--output-dir output/lmstudio/qwen-qwen3-vl-8b \
--validate-only \
--validate-lines 5- Safe row-by-row writing
- Resume support for long runs
- Strict CSV validation before write
- Review queue for uncertain rows
- Benchmark visibility (speed and latency)
- Perfect title/keyword/category accuracy for every image
- Zero manual review effort
- Guaranteed Adobe acceptance for every asset
Human review is still expected before final Adobe submission.
- Reopen LM Studio manually.
- Make sure a model is loaded.
- Make sure Local Server is running.
- Re-run the same command; resume will skip completed files.
- Check if model/server is running.
- Check
review_needed.csvfor reasons. - Check
run.logfor error details.
- This can happen with AI models.
- Use
review_needed.csvand your manual pass before upload.
python3 -m pip install .Then use:
adobe-stock-csv --helppipx install .Then use:
adobe-stock-csv --helplmstudio(default)ollamaopenai
Header is always:
Filename,Title,Keywords,Category,ReleasesValidation includes:
- UTF-8, comma-delimited, standard quoting, LF newlines
- Required title and keywords
- Category numeric
1..21 Releasesblank unless explicitly verified
python3 -m unittest -q tests/test_adobe_stock_csv_cli.pyA tiny fixture is provided for wiring checks:
python3 src/adobe_stock_csv_cli.py \
--portfolio-dir fixtures/minimal \
--output-dir /tmp/adobe-stock-csv-fixture-run \
--limit 1 \
--dry-runThese remain public but are internal workflow aids:
AGENTS.mdprompts/
MIT. See LICENSE.
This project is independent and not affiliated with Adobe.
