# Release Process

## Snapshot-Based Model Data

LLM Models packages a pre-built snapshot at `priv/llm_db/snapshot.json`.

### Snapshot Structure

V2 schema uses nested providers with embedded models:

```json
{
  "version": 2,
  "generated_at": "2025-11-06T14:23:45.123456Z",
  "providers": {
    "openai": {
      "id": "openai",
      "name": "OpenAI",
      "base_url": "https://api.openai.com/v1",
      "models": {
        "gpt-4": {
          "id": "gpt-4",
          "provider": "openai",
          "name": "GPT-4",
          "capabilities": {...},
          "limits": {...},
          "cost": {...}
        }
      }
    }
  }
}
```

### Runtime Loading

```elixir
# Reads from priv/llm_db/snapshot.json
{:ok, _} = LLMDB.load()
```

Compile-time embed (zero runtime IO):

```elixir
# config/config.exs
config :llm_db, compile_embed: true
```

Snapshot is inlined into BEAM bytecode during compilation. Requires recompilation on snapshot changes.

## Updating Model Data

### 1. Pull Remote Sources

```bash
$ mix llm_db.pull
Pulling from configured sources...
✓ ModelsDev: 450 models cached at priv/llm_db/cache/models_dev.json
```

### 2. Build Snapshot

```bash
$ mix llm_db.build
$ mix llm_db.build --install
```

**Outputs**:

1. `_build/llm_db/snapshot/snapshot.json` - Canonical snapshot artifact
2. `_build/llm_db/snapshot/snapshot-meta.json` - Snapshot metadata
3. `priv/llm_db/snapshot.json` - Installed packaged snapshot when `--install` is used

### 3. Publish Snapshot Catalog Assets

```bash
$ mix llm_db.snapshot.publish
$ mix llm_db.history.rebuild --publish
```

This publishes immutable snapshot releases plus the mutable `catalog-index`
assets: `latest.json`, `snapshot-index.json`, `history.tar.gz`, and `history-meta.json`.

## Versioning and Tagging

Date-based versioning: `YYYY.M.D`

### Update Version

```bash
$ mix llm_db.version
Updated version to 2025.11.6 in mix.exs
```

Updates `@version` in `mix.exs`.

### Generate Changelog and Tag

```bash
$ mix git_ops.release
Analyzing commits since last release...
Updating CHANGELOG.md...
Creating git tag v2025.11.6...
```

1. Parses conventional commits since last tag
2. Updates `CHANGELOG.md`
3. Creates git tag `v2025.11.6`

### Push Tag

```bash
$ git push && git push --tags
```

CI triggers on tag push: Hex.pm publish, GitHub release, HexDocs publish.

## Snapshot Format

### V2 Schema

```json
{
  "version": 2,
  "generated_at": "ISO8601 timestamp",
  "providers": {
    "provider_atom_as_string": {
      "id": "provider_atom_as_string",
      "name": "Provider Name",
      "base_url": "https://...",
      "env": {...},
      "doc": "https://...",
      "extra": {...},
      "models": {
        "model_id": {
          "id": "model_id",
          "provider": "provider_atom_as_string",
          "name": "Model Name",
          "capabilities": {...},
          "limits": {...},
          "cost": {...},
          "modalities": {...},
          "deprecated": false,
          "aliases": [...],
          "extra": {...}
        }
      }
    }
  }
}
```

**Runtime-only indexes** (rebuilt during `LLMDB.load/1`):
- `providers_by_id`
- `models_by_key`
- `models_by_provider`
- `aliases_by_key`

## Release Triggers

1. Upstream data changes (new models, pricing, capabilities)
2. Schema changes (new fields, modality types)
3. Provider additions
4. Taxonomy updates
5. Metadata corrections

## Release Checklist

- [ ] `mix llm_db.pull`
- [ ] `mix llm_db.build`
- [ ] `mix test`
- [ ] Verify `mix llm_db.build --check --install`
- [ ] Commit snapshot and generated files
- [ ] `mix llm_db.version`
- [ ] `mix git_ops.release`
- [ ] Review `CHANGELOG.md`
- [ ] `git push && git push --tags`

## Automated Release

```bash
$ mix llm_db.pull && \
  mix llm_db.build && \
  mix test && \
  mix llm_db.version && \
  mix git_ops.release && \
  git push && \
  git push --tags
```

Or via mix alias:

```elixir
defp aliases do
  [
    release: [
      "llm_db.pull",
      "llm_db.build",
      "test",
      "llm_db.version",
      "git_ops.release"
    ]
  ]
end
```

```bash
$ mix release
$ git push && git push --tags
```

## Snapshot Versions

- **v1**: Flat lists (deprecated)
- **v2**: Nested providers with models (current)

## Snapshot Size

Current: ~1.2 MB (400 models × 12 providers)

**Optimization options**:
1. Filter deprecated models at build time
2. gzip compression (transparent in BEAM)
3. Split by provider (on-demand load)
4. Remove `:extra` fields

## Schema Evolution Signals

- New capability types (e.g., "video generation")
- New cost models (e.g., "per-character")
- New modality types (e.g., "3d", "code")
- Provider-specific features becoming common

**Schema changes require updates to**:
1. Source adapters (ModelsDev transform)
2. Validation schemas (Zoi definitions)
3. Documentation (capability lists)

## Related Guides

- [Schema System](schema-system.md)
- [Sources and Engine](sources-and-engine.md)
- [Using the Data](using-the-data.md)
