Metadata-Version: 2.4
Name: slide-vision
Version: 0.2.0
Summary: Enrich markdown slide decks with images
Project-URL: Homepage, https://github.com/michael-borck/slide-vision
Project-URL: Repository, https://github.com/michael-borck/slide-vision
Project-URL: Issues, https://github.com/michael-borck/slide-vision/issues
Author-email: Michael Borck <michael.borck@curtin.edu.au>
License: MIT
Keywords: ai,cli,images,markdown,presentation,slides
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: End Users/Desktop
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Multimedia
Classifier: Topic :: Text Processing :: Markup :: Markdown
Requires-Python: >=3.10
Requires-Dist: httpx>=0.25
Requires-Dist: pyyaml>=6.0
Requires-Dist: rich>=13.0
Requires-Dist: typer[all]>=0.9
Provides-Extra: dev
Requires-Dist: basedpyright; extra == 'dev'
Requires-Dist: openai>=1.0; extra == 'dev'
Requires-Dist: pytest-cov; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Requires-Dist: ruff; extra == 'dev'
Provides-Extra: openai
Requires-Dist: openai>=1.0; extra == 'openai'
Description-Content-Type: text/markdown

# slide-vision

Enrich markdown slide decks with images — from local folders, DALL-E 3, Pexels, or Unsplash.

## Install

```bash
pip install slide-vision
# With DALL-E support:
pip install slide-vision[openai]
```

## Quick start

```bash
# Create config
slide-vision init

# Enrich a slide deck (uses configured providers)
slide-vision enrich presentation.md

# Skip all APIs — just produce image prompts
slide-vision enrich presentation.md --source none

# Use local images + Pexels fallback
slide-vision enrich presentation.md --source local,pexels --local-dir ./images/

# Also produce a .zip
slide-vision enrich presentation.md --zip
```

## Pre-process local images

Use `scan` to AI-rename your local images for better keyword matching:

```bash
slide-vision scan ./my-images/ --provider openai --dry-run
slide-vision scan ./my-images/ --provider openai
```

## Output structure

```
presentation-enriched/
├── presentation.md    # enriched markdown with image tags
├── images/            # all sourced images
└── prompts.md         # AI prompts for slides without images (if any)
```

## API keys

| Provider | Environment variable |
|---|---|
| DALL-E 3 | `OPENAI_API_KEY` |
| Pexels | `PEXELS_API_KEY` |
| Unsplash | `UNSPLASH_ACCESS_KEY` |

Check status: `slide-vision providers`

## Custom providers

Bring your own image source or vision model — no fork required.

**Quickest: a `module:Attribute` import spec.** Point `--source` (or `scan --provider`)
at any importable object. An image provider just needs a `get_image(slide, output_dir)`
method; a vision provider is any `callable(path) -> str`.

```bash
# Your own image provider class
slide-vision enrich deck.md --source mypkg.providers:MyProvider

# Mix it with builtins — first hit wins
slide-vision enrich deck.md --source local,mypkg.providers:MyProvider --local-dir ./img

# Your own vision model for scan
slide-vision scan ./img/ --provider mypkg.vision:describe
```

**Image provider contract** (implements the `ImageProvider` protocol):

```python
from slide_vision.providers.base import ImageResult

class MyProvider:
    name = "mine"
    def is_available(self) -> bool: ...
    def get_image(self, slide, output_dir) -> ImageResult | None: ...
```

**Publishable plugins (entry points).** Ship a package that registers under
`slide_vision.providers` (images) or `slide_vision.vision_providers` (scan); once
installed it's usable by name and shows up in `slide-vision providers`:

```toml
[project.entry-points."slide_vision.providers"]
gemini = "slide_vision_gemini:GeminiProvider"

[project.entry-points."slide_vision.vision_providers"]
claude = "slide_vision_claude:describe"
```

**Programmatic registration** (in your own scripts):

```python
from slide_vision.providers.factory import register_provider
from slide_vision.scanner import register_vision_provider

register_provider("mine", lambda ctx: MyProvider())
register_vision_provider("mine", lambda path: "a caption")
```
