Spaces:
Sleeping
Sleeping
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 | 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 | |
| # --------------------------------------------------------------------------- | |
| # --------------------------------------------------------------------------- | |
| 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 | |
| # --------------------------------------------------------------------------- | |
| # --------------------------------------------------------------------------- | |
| 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 | |
| # --------------------------------------------------------------------------- | |
| # --------------------------------------------------------------------------- | |
| 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 | |
| # --------------------------------------------------------------------------- | |
| # --------------------------------------------------------------------------- | |
| 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] | |