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]