Advanced Content Hyper-Personalization Implementation
This commit is contained in:
@@ -317,8 +317,8 @@ class PersonaAnalysisService:
|
||||
def _build_persona_analysis_prompt(self, onboarding_data: Dict[str, Any]) -> str:
|
||||
"""Build the main persona analysis prompt."""
|
||||
|
||||
website_analysis = onboarding_data.get("website_analysis", {})
|
||||
research_prefs = onboarding_data.get("research_preferences", {})
|
||||
website_analysis = onboarding_data.get("website_analysis", {}) or {}
|
||||
research_prefs = onboarding_data.get("research_preferences", {}) or {}
|
||||
|
||||
prompt = f"""
|
||||
PERSONA GENERATION TASK: Create a comprehensive writing persona based on user onboarding data.
|
||||
@@ -328,7 +328,7 @@ ONBOARDING DATA ANALYSIS:
|
||||
Website Analysis:
|
||||
- URL: {website_analysis.get('website_url', 'Not provided')}
|
||||
- Writing Style: {json.dumps(website_analysis.get('writing_style', {}), indent=2)}
|
||||
- Content Characteristics: {json.dumps(website_analysis.get('content_characteristics', {}), indent=2)}
|
||||
- Content Characteristics: {json.dumps(website_analysis.get('content_characteristics', {}) or {}, indent=2)}
|
||||
- Target Audience: {json.dumps(website_analysis.get('target_audience', {}), indent=2)}
|
||||
- Content Type: {json.dumps(website_analysis.get('content_type', {}), indent=2)}
|
||||
- Style Patterns: {json.dumps(website_analysis.get('style_patterns', {}), indent=2)}
|
||||
@@ -521,8 +521,8 @@ Generate a platform-optimized persona adaptation that maintains brand consistenc
|
||||
linguistic_fingerprint=core_persona.get("linguistic_fingerprint", {}),
|
||||
platform_adaptations={"platforms": list(platform_personas.keys())},
|
||||
onboarding_session_id=onboarding_data.get("session_info", {}).get("session_id"),
|
||||
source_website_analysis=onboarding_data.get("website_analysis"),
|
||||
source_research_preferences=onboarding_data.get("research_preferences"),
|
||||
source_website_analysis=onboarding_data.get("website_analysis") or {},
|
||||
source_research_preferences=onboarding_data.get("research_preferences") or {},
|
||||
ai_analysis_version="gemini_v1.0",
|
||||
confidence_score=core_persona.get("confidence_score", 0.0)
|
||||
)
|
||||
|
||||
@@ -1,202 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
"""
|
||||
Test script for the persona generation system.
|
||||
Tests the complete flow from onboarding data to persona creation.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import os
|
||||
import json
|
||||
from datetime import datetime
|
||||
|
||||
# Add the backend directory to the Python path
|
||||
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
|
||||
|
||||
from loguru import logger
|
||||
|
||||
def test_persona_system():
|
||||
"""Test the complete persona generation system."""
|
||||
|
||||
logger.info("🧪 Testing Persona Generation System")
|
||||
|
||||
try:
|
||||
# Test 1: Check database models
|
||||
logger.info("📊 Test 1: Checking database models...")
|
||||
from models.persona_models import WritingPersona, PlatformPersona, PersonaAnalysisResult
|
||||
logger.info("✅ Persona models imported successfully")
|
||||
|
||||
# Test 2: Check service initialization
|
||||
logger.info("🔧 Test 2: Testing service initialization...")
|
||||
from services.persona_analysis_service import PersonaAnalysisService
|
||||
persona_service = PersonaAnalysisService()
|
||||
logger.info("✅ PersonaAnalysisService initialized successfully")
|
||||
|
||||
# Test 3: Create sample onboarding data
|
||||
logger.info("📝 Test 3: Creating sample onboarding data...")
|
||||
sample_onboarding_data = create_sample_onboarding_data()
|
||||
logger.info("✅ Sample onboarding data created")
|
||||
|
||||
# Test 4: Test core persona generation
|
||||
logger.info("🤖 Test 4: Testing core persona generation...")
|
||||
core_persona = persona_service._generate_core_persona(sample_onboarding_data)
|
||||
|
||||
if "error" in core_persona:
|
||||
logger.error(f"❌ Core persona generation failed: {core_persona['error']}")
|
||||
return False
|
||||
else:
|
||||
logger.info("✅ Core persona generated successfully")
|
||||
logger.info(f" Persona Name: {core_persona.get('identity', {}).get('persona_name', 'N/A')}")
|
||||
logger.info(f" Archetype: {core_persona.get('identity', {}).get('archetype', 'N/A')}")
|
||||
logger.info(f" Confidence: {core_persona.get('confidence_score', 0)}%")
|
||||
|
||||
# Test 5: Test platform adaptations
|
||||
logger.info("📱 Test 5: Testing platform adaptations...")
|
||||
platforms = ["twitter", "linkedin", "blog"]
|
||||
|
||||
for platform in platforms:
|
||||
platform_persona = persona_service._generate_single_platform_persona(
|
||||
core_persona, platform, sample_onboarding_data
|
||||
)
|
||||
|
||||
if "error" in platform_persona:
|
||||
logger.warning(f"⚠️ {platform} persona generation failed: {platform_persona['error']}")
|
||||
else:
|
||||
logger.info(f"✅ {platform} persona generated successfully")
|
||||
|
||||
# Test 6: Test data sufficiency calculation
|
||||
logger.info("📊 Test 6: Testing data sufficiency calculation...")
|
||||
data_sufficiency = persona_service._calculate_data_sufficiency(sample_onboarding_data)
|
||||
logger.info(f"✅ Data sufficiency calculated: {data_sufficiency}%")
|
||||
|
||||
logger.info("🎉 All persona system tests completed successfully!")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Persona system test failed: {str(e)}")
|
||||
return False
|
||||
|
||||
def create_sample_onboarding_data():
|
||||
"""Create realistic sample onboarding data for testing."""
|
||||
|
||||
return {
|
||||
"session_info": {
|
||||
"session_id": 1,
|
||||
"current_step": 6,
|
||||
"progress": 100.0,
|
||||
"started_at": datetime.utcnow().isoformat()
|
||||
},
|
||||
"website_analysis": {
|
||||
"id": 1,
|
||||
"website_url": "https://techstartup.example.com",
|
||||
"writing_style": {
|
||||
"tone": "professional",
|
||||
"voice": "authoritative",
|
||||
"complexity": "intermediate",
|
||||
"engagement_level": "high"
|
||||
},
|
||||
"content_characteristics": {
|
||||
"sentence_structure": "varied",
|
||||
"vocabulary": "technical",
|
||||
"paragraph_organization": "logical",
|
||||
"average_sentence_length": 15.2
|
||||
},
|
||||
"target_audience": {
|
||||
"demographics": ["startup founders", "tech professionals", "investors"],
|
||||
"expertise_level": "intermediate",
|
||||
"industry_focus": "technology"
|
||||
},
|
||||
"content_type": {
|
||||
"primary_type": "blog",
|
||||
"secondary_types": ["case_study", "tutorial"],
|
||||
"purpose": "educational"
|
||||
},
|
||||
"style_patterns": {
|
||||
"common_phrases": ["let's dive in", "the key insight", "bottom line"],
|
||||
"sentence_starters": ["Here's the thing:", "The reality is", "Consider this:"],
|
||||
"rhetorical_devices": ["metaphors", "data_points", "examples"]
|
||||
},
|
||||
"style_guidelines": {
|
||||
"tone_guidelines": "Maintain professional but approachable tone",
|
||||
"structure_guidelines": "Use clear headings and bullet points",
|
||||
"voice_guidelines": "Confident and knowledgeable without being condescending"
|
||||
},
|
||||
"status": "completed"
|
||||
},
|
||||
"research_preferences": {
|
||||
"id": 1,
|
||||
"research_depth": "Comprehensive",
|
||||
"content_types": ["blog", "case_study", "whitepaper"],
|
||||
"auto_research": True,
|
||||
"factual_content": True,
|
||||
"writing_style": {
|
||||
"tone": "professional",
|
||||
"voice": "authoritative",
|
||||
"complexity": "intermediate"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def test_gemini_structured_response():
|
||||
"""Test Gemini structured response functionality."""
|
||||
|
||||
logger.info("🔬 Testing Gemini Structured Response")
|
||||
|
||||
try:
|
||||
from services.llm_providers.gemini_provider import gemini_structured_json_response
|
||||
|
||||
# Simple test schema
|
||||
test_schema = {
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"test_field": {"type": "string"},
|
||||
"confidence": {"type": "number"}
|
||||
},
|
||||
"required": ["test_field", "confidence"]
|
||||
}
|
||||
|
||||
test_prompt = "Generate a test response with test_field='Hello World' and confidence=95.5"
|
||||
|
||||
response = gemini_structured_json_response(
|
||||
prompt=test_prompt,
|
||||
schema=test_schema,
|
||||
temperature=0.1,
|
||||
max_tokens=1024
|
||||
)
|
||||
|
||||
if "error" in response:
|
||||
logger.error(f"❌ Gemini test failed: {response['error']}")
|
||||
return False
|
||||
else:
|
||||
logger.info(f"✅ Gemini structured response test successful: {response}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"❌ Gemini test error: {str(e)}")
|
||||
return False
|
||||
|
||||
def run_comprehensive_test():
|
||||
"""Run comprehensive test of the persona system."""
|
||||
|
||||
logger.info("🚀 Starting Comprehensive Persona System Test")
|
||||
|
||||
# Test 1: Gemini functionality
|
||||
gemini_works = test_gemini_structured_response()
|
||||
|
||||
# Test 2: Persona system
|
||||
persona_works = test_persona_system()
|
||||
|
||||
# Summary
|
||||
logger.info("📋 Test Summary:")
|
||||
logger.info(f" Gemini Structured Response: {'✅ PASS' if gemini_works else '❌ FAIL'}")
|
||||
logger.info(f" Persona Generation System: {'✅ PASS' if persona_works else '❌ FAIL'}")
|
||||
|
||||
if gemini_works and persona_works:
|
||||
logger.info("🎉 All tests passed! Persona system is ready for production.")
|
||||
return True
|
||||
else:
|
||||
logger.error("❌ Some tests failed. Please check the logs and fix issues.")
|
||||
return False
|
||||
|
||||
if __name__ == "__main__":
|
||||
success = run_comprehensive_test()
|
||||
sys.exit(0 if success else 1)
|
||||
Reference in New Issue
Block a user