Back to .md Directory

๐ŸŽฏ Content Brief Enhancement for OpenKeywords

Proposes 10 new data fields and a generation pipeline to turn keyword lists into full content briefs with angles, gaps, and research quotes.

May 2, 2026
0 downloads
0 views
ai prompt gemini
View source

What this file does

Proposes 10 new data fields and a generation pipeline to turn keyword lists into full content briefs with angles, gaps, and research quotes.

When to use it

  • You run a keyword tool that outputs bare keyword lists and want to add writer-ready briefs
  • You need to reduce manual research time for content writers from 45 minutes to 10 minutes per article
  • You already collect SERP and research data and want to enrich it with AI-generated angles and questions
  • You are building an end-to-end content intelligence pipeline that feeds directly into a blog writer

Assumes this stack

PythonGeminiDataForSEOPydanticCSV

๐ŸŽฏ Content Brief Enhancement for OpenKeywords

Problem

Current output gives keywords but not the content intelligence writers need:

  • โŒ No actual research quotes/snippets
  • โŒ No SERP context (what's ranking, what's missing)
  • โŒ No angle/approach suggestions
  • โŒ No specific questions to answer
  • โŒ No target audience pain points

Writers get a keyword list but have to research everything themselves โ†’ defeats the purpose of deep research!


๐Ÿ“Š Proposed New Columns

1. Research Context (research_context)

Type: Optional[str]
Purpose: Actual quotes/snippets from Reddit, Quora, forums

Examples:

{
  "keyword": "why does Google ignore my structured data",
  "research_context": "Reddit user: 'I added schema markup 3 months ago and Google still isn't showing rich results. Tested in schema validator, all valid. What am I missing?'"
}

{
  "keyword": "AEO vs SEO difference",
  "research_context": "Quora: 'Traditional SEO focuses on rankings, but AEO is about being the answer AI assistants cite. Different optimization strategies.'"
}

CSV Export: Truncate to 500 chars, preserve key insights


2. Content Angle (content_angle)

Type: Optional[str]
Purpose: AI-suggested approach/angle for the article

Examples:

{
  "keyword": "best project management software for small teams",
  "content_angle": "Comparison guide with decision matrix - focus on affordability, ease of use, and team size scalability"
}

{
  "keyword": "how to improve team collaboration remotely",
  "content_angle": "Tactical how-to guide with 7 actionable strategies, emphasizing async communication and tool integration"
}

Generation: Single Gemini prompt batch-scores keywords AND suggests angles


3. Target Questions (target_questions)

Type: list[str] (stored as JSON array or comma-separated)
Purpose: Specific questions the article should answer

Examples:

{
  "keyword": "what is AEO optimization",
  "target_questions": [
    "What is the difference between AEO and SEO?",
    "How do AI answer engines like Perplexity work?",
    "What are the key AEO ranking factors?",
    "How do I optimize my content for AI citations?"
  ]
}

Sources:

  • PAA questions from SERP analysis
  • Related questions from research (Reddit/Quora)
  • AI-generated questions based on intent

4. Top Ranking Content (top_ranking_content)

Type: Optional[str]
Purpose: Summary of what's currently ranking (from SERP analysis)

Examples:

{
  "keyword": "best SEO tools 2025",
  "top_ranking_content": "Mostly listicles (10-20 tools). Top 3: comprehensive comparisons with pricing tables. Featured snippet: comparison chart. Missing: AEO-specific tools, AI-powered solutions."
}

Generation: From DataForSEO organic results + featured snippet analysis


5. Content Gap (content_gap)

Type: Optional[str]
Purpose: What's missing from current SERP results (opportunity)

Examples:

{
  "keyword": "SEO for SaaS startups",
  "content_gap": "No content addressing early-stage (pre-PMF) SEO. Most focus on scaling, not foundation-building. No mention of AEO strategies."
}

{
  "keyword": "Google structured data not working",
  "content_gap": "Articles show HOW to add schema but don't explain WHY Google ignores valid markup (crawl budget, trust, content quality)."
}

Generation: AI analyzes top ranking content + research context โ†’ identifies gaps


6. Target Audience Pain Point (audience_pain_point)

Type: Optional[str]
Purpose: Specific pain point this keyword addresses

Examples:

{
  "keyword": "why won't Google index my new pages",
  "audience_pain_point": "Website owners frustrated that new content isn't appearing in search despite submitting sitemap and requesting indexing."
}

Sources:

  • Reddit/Quora research context
  • AI inference from keyword intent
  • Common themes from PAA questions

7. Recommended Word Count (recommended_word_count)

Type: Optional[int]
Purpose: Suggested article length based on SERP competition

Examples:

{
  "keyword": "what is SEO",  # High competition, definitive guide needed
  "recommended_word_count": 2500
}

{
  "keyword": "how to add meta description in WordPress",  # Simple how-to
  "recommended_word_count": 800
}

Logic:

  • Simple how-to (transactional): 600-1000 words
  • Commercial comparison: 1500-2000 words
  • Question/informational: 1200-1800 words
  • Competitive commercial: 2000-3000 words
  • Based on average word count of top 5 results

8. Internal Linking Opportunities (internal_links)

Type: list[str] (related keywords from same cluster)
Purpose: Suggest related articles to link to

Examples:

{
  "keyword": "best project management software",
  "internal_links": [
    "project management for remote teams",
    "agile project management tools",
    "project management software pricing"
  ]
}

Generation: From semantic clustering + same cluster keywords


9. Featured Snippet Opportunity (fs_opportunity_type)

Type: Optional[str]
Purpose: What type of featured snippet to target

Values:

  • "paragraph" - Definition/explanation
  • "list" - Steps/tips (numbered or bulleted)
  • "table" - Comparison/data
  • "none" - No featured snippet on SERP
  • "video" - Video result (consider video content)

Examples:

{
  "keyword": "how to optimize for AEO",
  "fs_opportunity_type": "list",
  "target_questions": ["What are the steps to optimize for AEO?"]
}

10. Quotes for Social Proof (expert_quotes)

Type: Optional[str]
Purpose: Expert quotes or stats from research to include

Examples:

{
  "keyword": "AEO statistics 2025",
  "expert_quotes": "Gartner predicts 30% of searches will be zero-click by 2026. Source: Reddit r/SEO discussion citing Gartner report."
}

๐Ÿ—๏ธ Implementation Strategy

Phase 1: Data Collection Enhancement

A. Enhance researcher.py - Capture Research Context

# In _parse_keywords_response()
valid_keywords.append({
    "keyword": keyword_text,
    "intent": kw.get("intent", "informational"),
    "source": kw.get("source", "research"),
    "context": kw.get("context", ""),  # โœ… Already exists!
    # NEW: Store actual quote/snippet
    "research_snippet": kw.get("snippet", ""),
    "research_url": kw.get("url", ""),
})

Modify research prompts to extract:

  • Direct quotes from discussions
  • URLs where found
  • Specific pain points mentioned

B. Enhance serp_analyzer.py - Capture SERP Intelligence

@dataclass
class SerpFeatures:
    # ... existing fields ...
    
    # NEW FIELDS
    top_ranking_summaries: list[str] = field(default_factory=list)
    avg_word_count: int = 0
    common_content_types: list[str] = field(default_factory=list)  # ["listicle", "how-to", "comparison"]
    content_gap_notes: str = ""

Extract from DataForSEO organic results:

  • Meta descriptions โ†’ summarize what's ranking
  • URL patterns โ†’ identify content types
  • Title patterns โ†’ common angles

C. Add Content Intelligence Generator

# New file: openkeywords/content_intelligence.py

class ContentIntelligenceGenerator:
    """
    Generate content briefs with angles, questions, and gaps.
    
    Takes keywords + research + SERP data โ†’ produces actionable content brief.
    """
    
    async def enrich_keywords(
        self, 
        keywords: list[Keyword],
        research_data: dict,
        serp_data: dict,
    ) -> list[EnrichedKeyword]:
        """
        Batch process keywords to add content intelligence.
        
        Uses single Gemini prompt to generate:
        - Content angle
        - Target questions (from PAA + research)
        - Content gaps
        - Pain points
        - Recommended word count
        """

Phase 2: Update Data Model

# openkeywords/models.py

class Keyword(BaseModel):
    # ... existing fields ...
    
    # CONTENT BRIEF FIELDS
    research_context: Optional[str] = Field(
        default=None, 
        description="Actual quote/snippet from research (Reddit, Quora, etc.)"
    )
    content_angle: Optional[str] = Field(
        default=None,
        description="Suggested approach/angle for the article"
    )
    target_questions: list[str] = Field(
        default_factory=list,
        description="Specific questions the article should answer"
    )
    top_ranking_content: Optional[str] = Field(
        default=None,
        description="Summary of what's currently ranking on SERP"
    )
    content_gap: Optional[str] = Field(
        default=None,
        description="What's missing from current SERP results"
    )
    audience_pain_point: Optional[str] = Field(
        default=None,
        description="Specific pain point this keyword addresses"
    )
    recommended_word_count: Optional[int] = Field(
        default=None,
        description="Suggested article length based on competition"
    )
    internal_links: list[str] = Field(
        default_factory=list,
        description="Related keywords to link to (from same cluster)"
    )
    fs_opportunity_type: Optional[str] = Field(
        default=None,
        description="Featured snippet type to target: paragraph, list, table, video"
    )
    expert_quotes: Optional[str] = Field(
        default=None,
        description="Expert quotes or stats from research"
    )

Phase 3: Update CSV/JSON Export

# Update to_csv() in GenerationResult
def to_csv(self, filepath: str) -> None:
    """Export keywords with full content brief to CSV"""
    with open(filepath, "w", newline="", encoding="utf-8") as f:
        writer = csv.writer(f)
        writer.writerow([
            # Core fields
            "keyword", "intent", "score", "cluster", "volume", "difficulty",
            # Content brief fields
            "content_angle", "research_context", "target_questions", 
            "content_gap", "audience_pain_point", "recommended_word_count",
            "top_ranking_content", "fs_opportunity_type", "internal_links",
            # Metadata
            "source", "aeo_opportunity", "has_featured_snippet", "has_paa"
        ])
        
        for kw in self.keywords:
            writer.writerow([
                kw.keyword,
                kw.intent,
                kw.score,
                kw.cluster_name or "",
                kw.volume,
                kw.difficulty,
                # Brief fields
                kw.content_angle or "",
                (kw.research_context or "")[:500],  # Truncate for CSV
                "; ".join(kw.target_questions),
                kw.content_gap or "",
                kw.audience_pain_point or "",
                kw.recommended_word_count or "",
                (kw.top_ranking_content or "")[:300],
                kw.fs_opportunity_type or "",
                "; ".join(kw.internal_links[:5]),
                # Metadata
                kw.source,
                kw.aeo_opportunity,
                kw.has_featured_snippet,
                kw.has_paa,
            ])

Phase 4: Update Generation Pipeline

# In generator.py, after clustering:

# NEW STEP: Enrich with content intelligence
if config.enable_content_brief:  # New flag
    logger.info("Generating content briefs...")
    from .content_intelligence import ContentIntelligenceGenerator
    
    brief_generator = ContentIntelligenceGenerator(api_key=self.api_key)
    enriched_keywords = await brief_generator.enrich_keywords(
        keywords=filtered_keywords,
        research_data=research_results,  # From earlier step
        serp_data=serp_analyses,  # From earlier step
    )
    
    filtered_keywords = enriched_keywords

๐ŸŽจ Example Output

Current Output (Basic)

keyword,intent,score,cluster,volume,difficulty
"best project management software",commercial,92,Product Comparison,1200,45
"how to improve team collaboration",question,85,How-To Guides,890,32

Enhanced Output (With Content Brief)

keyword,intent,score,cluster,volume,difficulty,content_angle,research_context,target_questions,content_gap,audience_pain_point,recommended_word_count,fs_opportunity_type,internal_links

"best project management software",commercial,92,Product Comparison,1200,45,"Comparison guide with decision matrix focusing on team size, budget, and key features","Reddit r/startups: 'We tried 5 PM tools as a 10-person startup. Asana was overkill, Trello too simple. Ended up with ClickUp - perfect middle ground.'","What is the best project management software for small teams?; How much does project management software cost?; What features should I look for?","Most reviews cover enterprise tools. Missing: detailed comparison for 5-15 person teams with limited budget.","Small team leads overwhelmed by complex tools designed for enterprises, need simple but powerful solution.",1800,table,"project management for startups; free project management tools; agile project management"

"how to improve team collaboration",question,85,How-To Guides,890,32,"Tactical how-to guide with 7 actionable strategies for remote teams","Quora: 'Our remote team feels disconnected. Slack messages get lost, no one knows what others are working on. Need practical advice not theory.'","How can remote teams collaborate better?; What tools improve team collaboration?; How to keep remote teams aligned?","Existing content is theory-heavy. Missing: specific async communication workflows, tool integration examples.","Remote team managers struggling with disconnection and information silos, need concrete processes.",1200,list,"remote team management; async communication tools; team collaboration software"

๐Ÿš€ CLI Usage

# Enable content briefs
openkeywords generate \
  --company "Acme Software" \
  --industry "B2B SaaS" \
  --with-research \
  --with-serp \
  --with-content-brief \  # NEW FLAG
  --output keywords_with_briefs.csv

# The CSV now has everything a writer needs!

๐Ÿ’ก Benefits for Content Writers

Before (Current)

Writer receives: "best project management software"
Writer must:
1. Research what's ranking โœ…
2. Analyze SERP gaps โœ…
3. Find user pain points โœ…
4. Determine article angle โœ…
5. Identify questions to answer โœ…
6. Research word count โœ…
7. Find quotes/stats โœ…

Time: 45-60 minutes of research per article

After (With Briefs)

Writer receives full brief:
- Keyword: "best project management software"
- Angle: "Comparison for 5-15 person teams with budget constraints"
- Pain point: "Overwhelmed by enterprise tools"
- Questions to answer: [list of 4 specific questions]
- Gap: "No detailed SMB comparison"
- Word count: 1800 words
- Type: Comparison table + narrative
- Research: [actual Reddit quotes]
- Internal links: [3 related topics]

Time: 10 minutes to review brief, straight to writing

Time saved: 35-50 minutes per article

๐ŸŽฏ Implementation Priority

P0 (Must Have)

  1. โœ… research_context - Capture actual research quotes
  2. โœ… content_angle - AI-generated angle/approach
  3. โœ… target_questions - From PAA + research
  4. โœ… content_gap - What's missing from SERP

P1 (High Value)

  1. โœ… audience_pain_point - From research analysis
  2. โœ… recommended_word_count - Based on competition
  3. โœ… top_ranking_content - SERP summary
  4. โœ… fs_opportunity_type - Featured snippet targeting

P2 (Nice to Have)

  1. โš ๏ธ internal_links - From clustering (low effort)
  2. โš ๏ธ expert_quotes - Requires deeper extraction

๐Ÿ”ง Technical Considerations

Cost Impact

  • Current: ~$0.02 per 50 keywords (generation + scoring)
  • With briefs: ~$0.05 per 50 keywords (+ 1 batch enrichment call)
  • Net: +150% cost, but saves 40+ min of manual research per article

Token Usage

  • Enrichment prompt: ~500 tokens per keyword
  • Batch 10 keywords per prompt: ~5,000 tokens per batch
  • For 50 keywords: ~25,000 tokens = ~$0.03

Performance

  • Enrichment can run in parallel with clustering
  • Add ~10-15 seconds to total pipeline time
  • Acceptable tradeoff for content team value

๐Ÿ“ฆ Configuration

class GenerationConfig(BaseModel):
    # ... existing fields ...
    
    # NEW
    enable_content_brief: bool = Field(
        default=False,
        description="Generate full content briefs with angles, questions, gaps"
    )
    brief_detail_level: str = Field(
        default="standard",
        description="Brief detail: minimal, standard, detailed"
    )

๐ŸŽฌ Next Steps

  1. Enhance research data capture - Modify researcher.py to extract quotes/URLs
  2. Enhance SERP data capture - Modify serp_analyzer.py to summarize top content
  3. Create content intelligence module - New content_intelligence.py with enrichment logic
  4. Update data models - Add new fields to Keyword model
  5. Update export functions - CSV/JSON with new columns
  6. Add CLI flag - --with-content-brief
  7. Test end-to-end - Generate keywords with full briefs
  8. Document usage - Update README with examples

๐Ÿค” Discussion Points

  1. Should we use separate columns or nested JSON?

    • CSV: Flatten everything (easier for Google Sheets import)
    • JSON: Nested objects (cleaner but harder for non-devs)
    • Recommendation: Both - flatten for CSV, nest for JSON
  2. How much research context to store?

    • Full quotes: Can be 500+ chars
    • Truncate to 300 chars for CSV?
    • Store full in JSON?
    • Recommendation: Store full, truncate on CSV export
  3. Should content briefs be opt-in or default?

    • Default: Better UX but higher cost
    • Opt-in: Cheaper but users might not know about it
    • Recommendation: Opt-in with clear documentation
  4. Integration with blog-writer pipeline?

    • Should openkeywords output feed directly into blog-writer?
    • Would eliminate manual keyword brief creation
    • Recommendation: Yes - next phase integration

This transforms openkeywords from a keyword tool into a content intelligence platform. ๐Ÿš€

What's inside

10 proposed fields with examples, 4 implementation phases with code snippets, 1 example CSV output, CLI flag, cost analysis, and discussion points

Change this for your project

  • Replace scailetech/openventure-old with your own repository name
  • Replace openkeywords with your own package name throughout the file
  • Replace Acme Software and B2B SaaS in the CLI example with your own company and industry
  • Replace Gemini with your own AI model if you use a different provider

Where it goes

Keep it in your repository where the agent or team that needs it will read it.

Worth borrowing

  • Batch enrichment via a single AI prompt to generate multiple brief fields at once, reducing per-keyword cost
  • Dual export strategy: flatten for CSV (easier for spreadsheets) and nest for JSON (cleaner for programmatic use)
  • Priority tiers (P0, P1, P2) to stage implementation by value and effort

Related Documents