feat: rich character profiles — brand voice, target, rules, hashtag profiles

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>
This commit is contained in:
Michele
2026-04-04 16:34:25 +02:00
parent 8629d145a8
commit befa8b4adc
5 changed files with 290 additions and 14 deletions

View File

@@ -48,6 +48,13 @@ class Character(Base):
niche = Column(String(200), nullable=False)
topics = Column(JSON, default=list)
tone = Column(Text)
# Rich profile fields
brand_voice = Column(Text, nullable=True) # how the character communicates (long description)
target_audience = Column(Text, nullable=True) # who reads the content
business_goals = Column(Text, nullable=True) # why they create content
products_services = Column(Text, nullable=True) # what they offer
content_rules = Column(JSON, default=dict) # {"do": [...], "dont": [...]}
hashtag_profiles = Column(JSON, default=dict) # per-platform hashtag config
visual_style = Column(JSON, default=dict)
social_accounts = Column(JSON, default=dict)
affiliate_links = Column(JSON, default=list)