You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ai_synth/docs/superpowers/specs/2026-03-25-model-split-desi...

84 lines
3.7 KiB
Markdown

# Design: Split Model Selection — Scraping vs Web Search
**Date**: 2026-03-25
**Scope**: Rename ai_model_writing to ai_model_websearch, split admin provider models into scraping and websearch lists
---
## Context
Currently both model dropdowns (research + writing) show the same model list. The pipeline uses different models for different purposes: cheap/fast models for scraping and classification (Phase 1), and more capable models for web search (Phase 2). The model lists should reflect these different roles.
## Changes
### 1. Rename setting column
```sql
ALTER TABLE settings RENAME COLUMN ai_model_writing TO ai_model_websearch;
```
Backend: rename `ai_model_writing``ai_model_websearch` everywhere.
### 2. Split admin_providers models JSONB
Rename `models``models_scraping`. Add `models_websearch`.
Migration updates existing provider data:
**OpenAI:**
```json
{
"models_scraping": [
{"model_id": "gpt-5.4-mini", "display_name": "GPT-5.4 Mini", "is_default": false},
{"model_id": "gpt-5.4-nano", "display_name": "GPT-5.4 Nano", "is_default": false},
{"model_id": "gpt-5-mini", "display_name": "GPT-5 Mini", "is_default": false},
{"model_id": "gpt-5-nano", "display_name": "GPT-5 Nano", "is_default": true}
],
"models_websearch": [
{"model_id": "gpt-5.4", "display_name": "GPT-5.4", "is_default": false},
{"model_id": "gpt-5.4-mini", "display_name": "GPT-5.4 Mini", "is_default": false},
{"model_id": "gpt-5.2", "display_name": "GPT-5.2", "is_default": false},
{"model_id": "gpt-5.1", "display_name": "GPT-5.1", "is_default": true},
{"model_id": "gpt-5-mini", "display_name": "GPT-5 Mini", "is_default": false},
{"model_id": "gpt-5", "display_name": "GPT-5", "is_default": false}
]
}
```
**Gemini:** both arrays get the same models (Gemini 2.5 Pro + Flash).
**Anthropic:** both arrays get the same models (Claude Sonnet 4 + Haiku 3.5).
### 3. Pipeline model usage
- `ai_model` → used for Phase 1 (source scraping, per-article classify/summarize, link extraction)
- `ai_model_websearch` → used for Phase 2 (web search fallback LLM call)
### 4. Config endpoint
`GET /api/v1/config/providers` returns both model arrays per provider so the frontend can populate the correct dropdown.
### 5. Frontend
- Rename "Modele d'ecriture" dropdown label → "Modele de recherche web"
- `ai_model` dropdown populated from `models_scraping`
- `ai_model_websearch` dropdown populated from `models_websearch`
## Files to Modify
- **Create:** migration — rename column + update JSONB (rename `models``models_scraping`, add `models_websearch`)
- **Modify:** `backend/src/models/settings.rs` — rename `ai_model_writing``ai_model_websearch`
- **Modify:** `backend/src/db/settings.rs` — rename in queries
- **Modify:** `backend/src/models/provider.rs` — add `models_websearch` to `AdminProvider` / `ProviderModel` structs
- **Modify:** `backend/src/db/providers.rs` — update queries for new JSONB structure
- **Modify:** `backend/src/handlers/config.rs` — return both model arrays
- **Modify:** `backend/src/handlers/admin.rs` — handle both model arrays in CRUD
- **Modify:** `backend/src/services/synthesis.rs` — rename `model_writing``model_websearch`, use correct model per phase
- **Modify:** `backend/src/services/prompts.rs` — update test fixture
- **Modify:** `CLAUDE.md` — migration count
- **Modify:** `frontend/src/types.ts` — rename field + add models_websearch to provider config type
- **Modify:** `frontend/src/pages/Settings.tsx` — rename dropdown, split model sources
- **Modify:** `frontend/src/i18n/fr.ts` — update label
- **Modify:** `e2e/tests/generation-live.spec.ts` — update settings payload
- **Modify:** `backend/tests/api_syntheses_test.rs` — update settings payload