Backend:
- Character model: add brand_voice, target_audience, business_goals,
products_services, content_rules (JSON do/dont), hashtag_profiles (JSON)
- Content generation: inject full character context into LLM system prompt
(voice, audience, goals, products, rules)
- Hashtag generation: merge always-on tags from profile with AI-generated tags
- Schema: update CharacterBase and CharacterUpdate with new fields
Frontend:
- CharacterForm: new sections "Identità e Voce", "Regole Contenuti",
"Profili Hashtag" with dedicated editors
- RulesEditor: do/don't list with add/remove
- HashtagProfileEditor: per-platform tabs, fixed hashtags + max generated count
- All fields loaded on edit, saved on submit
DB migration: 6 new columns added to characters table
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add explicit instruction to LLM: never write framework labels (PROBLEMA,
AGITAZIONE, SOLUZIONE, etc.) — use them as invisible narrative structure only
- Replace static hashtag chips with HashtagEditor component:
- Click hashtag to edit inline
- Click X to remove
- Input field to add new hashtags
- Save button to persist changes to DB
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add 'brief' field to GenerateContentRequest schema
- Pass brief from router to generate_post_text service
- Inject brief as mandatory instructions in LLM prompt with highest priority
- Return structured error when LLM provider/API key not configured
- Show dedicated warning banner with link to Settings when API key missing
Fixes: content ignoring editorial brief, unhelpful API key error messages
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Redesign Settings: Testi, Immagini, Video, Voiceover — sezioni separate
- Ogni sezione ha dropdown provider + API key + campo opzionale modello
- Opzione "Personalizzato" con campo Base URL libero per qualsiasi servizio
- LLM: aggiunto OpenRouter + provider custom OpenAI-compatible
- Backend: OpenAICompatibleProvider unifica OpenAI/OpenRouter/custom
- Router content: passa llm_base_url a get_llm_provider
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>