key_word_Fast_API / models /schemas.py
ihtesham0345's picture
fix: add generic cross-map fields (core_keywords, viral_hashtags, strategy_tips, content_titles) to all platform response models so they survive FastAPI's response_model filter
91c8715
Raw
History Blame Contribute Delete
7.58 kB
from pydantic import BaseModel, Field
from typing import List, Optional
# ---------------------------------------------------------------------------
# Existing generic SEO
# ---------------------------------------------------------------------------
class KeywordData(BaseModel):
keyword: str
search_volume: str
competition: str
relevance: int
class HashtagData(BaseModel):
tag: str
post_count: str
class SEORequest(BaseModel):
content: str
class SEOResponse(BaseModel):
core_keywords: List[KeywordData]
related_phrases: List[str]
viral_hashtags: List[HashtagData]
strategy_tips: List[str]
content_titles: List[str]
target_audience: str
error: Optional[str] = None
# ---------------------------------------------------------------------------
# YouTube
# ---------------------------------------------------------------------------
class VideoTitle(BaseModel):
title: str
expected_ctr: str
class YouTubeResponse(BaseModel):
video_titles: List[VideoTitle]
tags: List[str]
description_template: str
thumbnail_ideas: List[str]
best_posting_time: str
engagement_strategies: List[str]
competition_gap_analysis: str
error: Optional[str] = None
core_keywords: Optional[List[KeywordData]] = None
related_phrases: Optional[List[str]] = None
viral_hashtags: Optional[List[HashtagData]] = None
strategy_tips: Optional[List[str]] = None
content_titles: Optional[List[str]] = None
hashtags: Optional[List[str]] = None
# ---------------------------------------------------------------------------
# Instagram
# ---------------------------------------------------------------------------
class CaptionData(BaseModel):
caption: str
tone: str
class HashtagSets(BaseModel):
small: List[str]
medium: List[str]
large: List[str]
class ContentIdeas(BaseModel):
reels: List[str]
carousels: List[str]
stories: List[str]
class InstagramResponse(BaseModel):
captions: List[CaptionData]
hashtag_sets: HashtagSets
content_ideas: ContentIdeas
best_posting_time: str
growth_strategies: List[str]
error: Optional[str] = None
core_keywords: Optional[List[KeywordData]] = None
related_phrases: Optional[List[str]] = None
viral_hashtags: Optional[List[HashtagData]] = None
strategy_tips: Optional[List[str]] = None
content_titles: Optional[List[str]] = None
hashtags: Optional[List[str]] = None
# ---------------------------------------------------------------------------
# LinkedIn
# ---------------------------------------------------------------------------
class PostDraft(BaseModel):
headline: str
body: str
hook: str
post_type: str = "text"
call_to_action: Optional[str] = None
media_suggestion: Optional[str] = None
class LinkedInResponse(BaseModel):
post_drafts: List[PostDraft]
hashtags: List[str]
article_topics: List[str]
thought_leadership_angles: List[str]
engagement_prompts: List[str] = []
target_audience_tags: List[str] = []
best_posting_time: str
industry_insights: str
error: Optional[str] = None
core_keywords: Optional[List[KeywordData]] = None
related_phrases: Optional[List[str]] = None
viral_hashtags: Optional[List[HashtagData]] = None
strategy_tips: Optional[List[str]] = None
content_titles: Optional[List[str]] = None
class LinkedInPostRequest(BaseModel):
content: str
draft_index: int = 0
access_token: str = ""
linkedin_urn: str = ""
class LinkedInPostResponse(BaseModel):
success: bool
post_url: Optional[str] = None
message: str
error: Optional[str] = None
# ---------------------------------------------------------------------------
# Facebook
# ---------------------------------------------------------------------------
class PostIdea(BaseModel):
type: str
content: str
class FacebookResponse(BaseModel):
post_ideas: List[PostIdea]
engagement_hooks: List[str]
hashtags: List[str]
ad_copy_suggestions: List[str]
best_posting_time: str
page_growth_tips: List[str]
error: Optional[str] = None
core_keywords: Optional[List[KeywordData]] = None
related_phrases: Optional[List[str]] = None
viral_hashtags: Optional[List[HashtagData]] = None
strategy_tips: Optional[List[str]] = None
content_titles: Optional[List[str]] = None
# ---------------------------------------------------------------------------
# X / Twitter
# ---------------------------------------------------------------------------
class TweetThread(BaseModel):
tweets: List[str]
theme: str
class TwitterResponse(BaseModel):
tweet_threads: List[TweetThread]
viral_hooks: List[str]
hashtags: List[str]
best_posting_time: str
engagement_tactics: List[str]
error: Optional[str] = None
core_keywords: Optional[List[KeywordData]] = None
related_phrases: Optional[List[str]] = None
viral_hashtags: Optional[List[HashtagData]] = None
strategy_tips: Optional[List[str]] = None
content_titles: Optional[List[str]] = None
# ---------------------------------------------------------------------------
# TikTok
# ---------------------------------------------------------------------------
class VideoConcept(BaseModel):
hook: str
script_snippet: str
sound_suggestion: str
class TikTokResponse(BaseModel):
video_concepts: List[VideoConcept]
trending_angles: List[str]
hashtags: List[str]
best_posting_time: str
viral_strategies: List[str]
error: Optional[str] = None
core_keywords: Optional[List[KeywordData]] = None
related_phrases: Optional[List[str]] = None
viral_hashtags: Optional[List[HashtagData]] = None
strategy_tips: Optional[List[str]] = None
content_titles: Optional[List[str]] = None
# ---------------------------------------------------------------------------
# Pinterest
# ---------------------------------------------------------------------------
class PinIdea(BaseModel):
title: str
description: str
keyword_focus: str
class PinterestResponse(BaseModel):
pin_ideas: List[PinIdea]
board_organization: List[str]
seo_keywords: List[str]
best_posting_time: str
traffic_strategies: List[str]
error: Optional[str] = None
core_keywords: Optional[List[KeywordData]] = None
related_phrases: Optional[List[str]] = None
viral_hashtags: Optional[List[HashtagData]] = None
strategy_tips: Optional[List[str]] = None
content_titles: Optional[List[str]] = None
hashtags: Optional[List[str]] = None
# ---------------------------------------------------------------------------
# Grammar Correction
# ---------------------------------------------------------------------------
class GrammarRequest(BaseModel):
text: str
class GrammarCorrection(BaseModel):
original: str
corrected: str
error_type: str
explanation: str
class GrammarIssue(BaseModel):
issue_type: str
location: str
suggestion: str
class GrammarResponse(BaseModel):
original_text: str
corrected_text: str
corrections: List[GrammarCorrection]
issues: List[GrammarIssue]
grammar_score: int = Field(default=85, ge=0, le=100)
readability_score: str
word_count: int
sentence_count: int
tone: str
style_suggestions: List[str]
error: Optional[str] = None
class BatchResponse(BaseModel):
platform_results: dict
error: Optional[str] = None
class BatchRequest(BaseModel):
content: str
platforms: List[str]