3.7 KiB
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
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:
{
"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_modeldropdown populated frommodels_scrapingai_model_websearchdropdown populated frommodels_websearch
Files to Modify
- Create: migration — rename column + update JSONB (rename
models→models_scraping, addmodels_websearch) - Modify:
backend/src/models/settings.rs— renameai_model_writing→ai_model_websearch - Modify:
backend/src/db/settings.rs— rename in queries - Modify:
backend/src/models/provider.rs— addmodels_websearchtoAdminProvider/ProviderModelstructs - 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— renamemodel_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