18 KiB
Auto-Population Code Walkthrough
Overview
This document provides a comprehensive code walkthrough of the auto-population feature that fills 30 strategy input fields using onboarding data and AI insights.
Table of Contents
- Flow Overview
- Frontend Flow
- Backend Flow
- Database Tables Used
- Field Mapping
- AI Integration
- API Calls and Subscription Checks
Flow Overview
High-Level Flow
User Clicks "Auto-Populate Fields"
↓
Frontend: AutoPopulationConsentModal (User Consent)
↓
Frontend: strategyBuilderStore.autoPopulateFromOnboarding()
↓
Frontend: API Call to /api/content-planning/enhanced-strategies/onboarding-data
↓
Backend: utility_endpoints.py → get_onboarding_data()
↓
Backend: EnhancedStrategyService._get_onboarding_data()
↓
Backend: DataProcessorService.get_onboarding_data()
↓
Backend: AutoFillService.get_autofill()
↓
Backend: OnboardingDataIntegrationService.process_onboarding_data() (Database Queries)
↓
Backend: AutoFillService.get_autofill() → Normalizers + Transformers
↓
Backend: AIStructuredAutofillService.generate_autofill_fields() (AI Generation)
↓
Backend: AIServiceManager.execute_structured_json_call() (AI API Call)
↓
Backend: Response with 30 fields
↓
Frontend: Store fields in strategyBuilderStore
↓
Frontend: Display fields in ContentStrategyBuilder
Frontend Flow
1. User Consent Modal
File: frontend/src/components/ContentPlanningDashboard/components/AutoPopulationConsentModal.tsx
- Purpose: Explains auto-population to non-technical users (content creators, digital marketers, solopreneurs)
- Features:
- Clear explanation of what auto-population does
- Benefits (Instant Setup, AI-Powered Insights, Your Data Your Control, Always Editable)
- Data sources used (Website Analysis, Research Preferences, Business Details, AI Analysis)
- Two buttons: "Skip Auto-Population" (Cancel) and "Auto-Populate Fields" (Confirm)
2. ContentStrategyBuilder Component
File: frontend/src/components/ContentPlanningDashboard/components/ContentStrategyBuilder.tsx
Key Changes:
- Removed automatic
useEffectthat triggered auto-population on mount - Added consent modal state:
showAutoPopulationConsentModal - Added consent tracking:
autoPopulateConsentAsked(persisted in sessionStorage) - Modal shows on first mount (with 500ms delay for rendering)
- Auto-population only triggers after user clicks "Auto-Populate Fields"
State Management:
const [showAutoPopulationConsentModal, setShowAutoPopulationConsentModal] = useState(false);
const [autoPopulateConsentAsked, setAutoPopulateConsentAsked] = useState(() => {
return sessionStorage.getItem('autoPopulateConsentAsked') === 'true';
});
const [autoPopulateAttempted, setAutoPopulateAttempted] = useState(false);
Consent Handlers:
handleAutoPopulationConsent(): Triggers auto-population, saves consent to sessionStoragehandleAutoPopulationCancel(): Skips auto-population, saves consent to sessionStorage
3. Strategy Builder Store
File: frontend/src/stores/strategyBuilderStore.ts
Function: autoPopulateFromOnboarding(forceRefresh?: boolean)
Steps:
- Global Protection: Checks
isAutoPopulatingflag to prevent multiple simultaneous calls - Validation: Checks if already populated (unless
forceRefresh) - API Call: Calls
contentPlanningApi.getOnboardingData() - Response Processing:
- Extracts
fields,sources,input_data_pointsfrom response - Validates AI generation success (
meta.ai_usedandmeta.ai_overrides_count > 0) - Transforms field values and stores in:
fieldValues: Form dataautoPopulatedFields: Tracking which fields were auto-populatedpersonalizationData: User data usedconfidenceScores: AI confidence scores
- Extracts
- State Update: Updates store with populated fields
API Endpoint: GET /api/content-planning/enhanced-strategies/onboarding-data
Backend Flow
1. API Endpoint
File: backend/api/content_planning/api/content_strategy/endpoints/utility_endpoints.py
Endpoint: GET /onboarding-data
Authentication: Required (get_current_user)
Flow:
- Extracts
user_idfrom authenticated token - Creates
EnhancedStrategyDBServiceandEnhancedStrategyService - Calls
enhanced_service._get_onboarding_data(user_id) - Returns response via
ResponseBuilder.create_success_response()
2. Enhanced Strategy Service
File: backend/api/content_planning/services/enhanced_strategy_service.py
Method: _get_onboarding_data(user_id: int)
Flow:
- Calls
core_service.data_processor_service.get_onboarding_data(user_id) - Returns processed onboarding data
3. Data Processor Service
File: backend/api/content_planning/services/content_strategy/utils/data_processors.py
Class: DataProcessorService
Method: async def get_onboarding_data(user_id: int)
Flow:
- Creates
AutoFillService(db)instance - Calls
service.get_autofill(user_id) - Returns comprehensive onboarding data payload
4. AutoFill Service
File: backend/api/content_planning/services/content_strategy/autofill/autofill_service.py
Class: AutoFillService
Method: async def get_autofill(user_id: int)
Steps:
- Integration: Calls
integration.process_onboarding_data(user_id, db)to collect raw data - Normalization:
normalize_website_analysis(website_raw)normalize_research_preferences(research_raw)normalize_api_keys(api_raw)
- Quality Assessment:
calculate_quality_scores_from_raw()calculate_confidence_from_raw()calculate_data_freshness()
- Transformation: Calls
transform_to_fields()to map to 30 frontend fields - Transparency:
build_data_sources_map()(field → data source mapping)build_input_data_points()(detailed input data points)
- Validation: Validates output structure
- Return: Returns payload with fields, sources, quality scores, confidence levels, data freshness, input data points
Note: This service does NOT use AI. It only transforms existing onboarding data.
5. Onboarding Data Integration Service
File: backend/api/content_planning/services/content_strategy/onboarding/data_integration.py
Class: OnboardingDataIntegrationService
Method: async def process_onboarding_data(user_id: int, db: Session)
Database Queries:
-
Website Analysis:
- Queries
OnboardingSessionfor latest session - Queries
WebsiteAnalysisfor latest analysis - Returns:
website_url,content_goals,target_metrics,performance_metrics,competitors,target_audience,writing_style, etc.
- Queries
-
Research Preferences:
- Queries
ResearchPreferencesfor session - Returns:
research_depth,content_types,target_audience,audience_research,content_preferences, etc.
- Queries
-
API Keys:
- Queries
APIKeyfor user - Returns:
providers,total_keys, available services
- Queries
-
Onboarding Session:
- Queries
OnboardingSessionfor user - Returns:
business_size,budget,team_size,timeline,region, etc.
- Queries
Returns: Integrated data dictionary with all sources
Database Tables Used
1. onboarding_sessions
Columns Used:
user_id(filter)id(join key)updated_at(ordering)business_size,budget,team_size,timeline,region,progress
2. website_analyses
Columns Used:
session_id(join key)updated_at(ordering)website_url,status,content_goals,target_metrics,performance_metrics,competitors,target_audience,writing_style,content_type,content_characteristics,recommended_settings,style_guidelines
3. research_preferences
Columns Used:
session_id(join key)research_depth,content_types,target_audience,audience_research,content_preferences,auto_research,factual_content
4. api_keys
Columns Used:
user_id(filter)provider(aggregation)is_active(filter)
Field Mapping
30 Fields Mapped to Onboarding Data
File: backend/api/content_planning/services/content_strategy/autofill/transformer.py
Function: transform_to_fields()
Business Context (8 fields)
- business_objectives →
website.content_goals - target_metrics →
website.target_metricsorwebsite.performance_metrics - content_budget →
website.content_budgetorsession.budget - team_size →
website.team_sizeorsession.team_size - implementation_timeline →
website.implementation_timelineorsession.timeline - market_share →
website.market_shareor derived fromperformance_metrics - competitive_position →
website.competitors(derived) - performance_metrics →
website.performance_metrics
Audience Intelligence (6 fields)
- content_preferences →
research.content_preferences - consumption_patterns →
research.audience_intelligence.consumption_patterns - audience_pain_points →
research.audience_intelligence.pain_points - buying_journey →
research.audience_intelligence.buying_journey - seasonal_trends → Default:
['Q1: Planning', 'Q2: Execution', 'Q3: Optimization', 'Q4: Review'] - engagement_metrics → Derived from
website.performance_metrics
Competitive Intelligence (5 fields)
- top_competitors →
website.competitors - competitor_content_strategies → Default:
['Educational content', 'Case studies', 'Thought leadership'] - market_gaps →
website.content_gaps - industry_trends →
research.industry_focus - emerging_trends →
research.trend_analysis
Content Strategy (7 fields)
- preferred_formats →
research.content_types - content_mix → Derived from
research.content_typesandwebsite.content_goals - content_frequency →
research.content_calendar.frequency - optimal_timing →
research.content_calendar.timing - quality_metrics → Derived from
website.performance_metrics - editorial_guidelines →
website.style_guidelines - brand_voice →
website.writing_style.toneorsession.brand_voice
Performance & Analytics (4 fields)
- traffic_sources → Derived from
website.performance_metrics - conversion_rates →
website.performance_metrics.conversion_rate - content_roi_targets → Derived from
session.budgetandperformance_metrics - ab_testing_capabilities → Derived from
session.team_size
AI Integration
When AI is Used
File: backend/api/content_planning/services/content_strategy/autofill/ai_refresh.py
Class: AutoFillRefreshService
Critical Clarification: The standard AutoFillService.get_autofill() does NOT use AI. It only transforms existing onboarding data using database queries and simple mappings.
Standard Autofill (Default):
- Uses
AutoFillService.get_autofill()(NO AI) - Database queries only (0 tokens)
- Direct mappings and simple derivations (~80%+ fields)
- Fast (~100-200ms)
- Used in standard "Auto-Populate Fields" flow
AI Autofill (Optional - Refresh Flow):
- Uses
AIStructuredAutofillService.generate_autofill_fields()(WITH AI) - AI generation (3500-5000 tokens per call, up to 15,000 with retries)
- Personalized values for missing/incomplete fields
- Slower (~2-5 seconds per call)
- Used in "Refresh Data (AI)" flow only
AI is used in:
AutoFillRefreshService.build_fresh_payload()(for refresh flows)AIStructuredAutofillService.generate_autofill_fields()(for AI-only generation)
AI Service
File: backend/api/content_planning/services/content_strategy/autofill/ai_structured_autofill.py
Class: AIStructuredAutofillService
Method: async def generate_autofill_fields(user_id: int, context: Dict[str, Any])
Flow:
- Context Summary: Builds personalized context from onboarding data
- Schema: Builds JSON schema for 30 fields
- Prompt: Builds personalized prompt with user's website URL, industry, business size, writing tone, target audience, etc.
- AI Call: Calls
self.ai.execute_structured_json_call()- Service Type:
AIServiceType.STRATEGIC_INTELLIGENCE - Prompt: Personalized prompt with user context
- Schema: JSON schema with 30 field definitions
- Service Type:
- Retry Logic: Up to 2 retries if success rate < 80% or missing fields > 6
- Normalization: Normalizes values (numbers, booleans, select options, arrays)
- Validation: Ensures all 30 fields are populated
- Return: Returns fields with metadata (ai_used, ai_overrides_count, success_rate, attempts)
AI Service Manager
File: backend/services/ai_service_manager.py (referenced but not in content_planning)
Method: execute_structured_json_call()
Flow:
- Gets AI service (via
get_service_manager()) - Calls
main_text_generation()with:- Prompt
- Schema (JSON structure)
- User ID (for subscription checks)
- Subscription Check: Uses
user_idfor pre-flight subscription validation - Pre-flight Check: Validates subscription limits before API call
- API Call: Makes structured JSON call to AI provider (Gemini)
- Response: Returns structured JSON with 30 fields
AI Prompts
File: backend/api/content_planning/services/content_strategy/autofill/ai_structured_autofill.py
Method: _build_prompt(context_summary: Dict[str, Any])
Prompt Structure:
-
Personalized Context:
- User profile (website URL, business size, region)
- Content analysis (writing tone, content type, target demographics)
- Audience insights (pain points, preferences, industry focus)
- AI recommendations (recommended tone, content type, style guidelines)
- Research configuration (research depth, content types, auto research)
- API capabilities (available services, providers)
-
Instructions:
- Generate 30 fields personalized for user's website
- Avoid generic placeholder values
- Use real insights from website analysis
- Make each field specific to user's business
-
Field Examples: Shows example format for all 30 fields
Prompt Length: ~3000-4000 characters (includes context + instructions + examples)
AI Schema
Method: _build_schema()
Schema Structure:
- Type: OBJECT
- Properties: 30 field definitions
- Each field has:
type(STRING/NUMBER/BOOLEAN),description
- Each field has:
- Required: All 30 fields
- Property Ordering:
CORE_FIELDSorder (critical for consistent JSON output)
API Calls and Subscription Checks
API Call Flow
-
Frontend → Backend:
GET /api/content-planning/enhanced-strategies/onboarding-data- Authentication: Required (Bearer token)
- User ID: Extracted from token
-
Backend → Database: Multiple queries (see Database Tables section)
- No API calls, only database queries
-
Backend → AI Service (if using AI):
- Service:
AIServiceManager.execute_structured_json_call() - Provider: Gemini (via
gemini_provider) - Method:
main_text_generation() - Subscription Check: Pre-flight validation using
user_id - Pre-flight Check: Validates subscription limits before API call
- Service:
Subscription and Pre-flight Checks
File: backend/services/ai_service_manager.py (referenced)
Checks Performed:
-
Subscription Validation:
- Checks user's subscription tier
- Validates API usage limits
- Uses
user_idfor subscription lookup
-
Pre-flight Check:
- Validates request before making API call
- Checks rate limits
- Validates token usage estimate
-
Post-call Tracking:
- Tracks token usage
- Updates subscription usage stats
- Records API calls
Number of API Calls
Standard Flow (default - NO AI):
- AI Calls: 0 (NO AI USED)
- API Calls: 0 (only database queries)
- Database Queries: 4-5 (OnboardingSession, WebsiteAnalysis, ResearchPreferences, APIKey)
- Token Usage: 0 tokens
- Speed: ~100-200ms
- Used in: Standard "Auto-Populate Fields" flow
AI-Enhanced Flow (optional - WITH AI - refresh flow only):
- AI Calls: 1-3 (depending on retries)
- Initial call: 1
- Retries (if success rate < 80%): up to 2 more
- Database Queries: 4-5 (same as standard flow)
- AI Provider: Gemini (via
gemini_provider) - Token Usage: 3500-5000 tokens per call (up to 15,000 with retries)
- Speed: ~2-5 seconds per call
- Used in: "Refresh Data (AI)" flow only (optional)
Token Usage
Estimated Tokens per Call:
- Input: ~2000-3000 tokens (prompt + context)
- Output: ~1500-2000 tokens (30 fields JSON)
- Total: ~3500-5000 tokens per call
With Retries (max 2 retries):
- Best Case: 3500-5000 tokens (1 call, 100% success)
- Worst Case: 10500-15000 tokens (3 calls, <80% success each time)
Summary
Key Points
- User Consent: Auto-population now requires explicit user consent via modal
- No Auto-Trigger: Removed automatic
useEffectthat triggered on mount - Database First: Standard autofill uses only database queries (NO AI - 0 tokens)
- AI Optional: AI is only used in refresh flows (NOT standard auto-population)
- 30 Fields: All 30 strategic input fields are mapped from onboarding data
- 80%+ are direct database mappings (no AI needed)
- Standard autofill can fill most fields from database queries
- AI autofill is optional (only for personalization in refresh flows)
- Subscription Checks: All AI calls use
user_idfor subscription and pre-flight checks - Token Usage:
- Standard autofill: 0 tokens (database queries only)
- AI autofill (refresh): 3500-5000 tokens per call (up to 15,000 with retries)
- Architecture: Standard autofill is the default (fast, free). AI autofill is optional (personalized, costs tokens).
Data Sources Priority
- Website Analysis (highest priority)
- Research Preferences
- Onboarding Session
- API Keys (for capabilities only)
- AI Generation (only in refresh flows)
Performance Considerations
- Standard Flow: Fast (database queries only, ~100-200ms)
- AI-Enhanced Flow: Slower (AI API calls, ~2-5 seconds per call)
- Retries: Can add up to 2x-3x latency if retries are needed
- Caching: Onboarding data is cached (TTL: 30 minutes)