Spaces:
Sleeping
Sleeping
from langchain_google_genai import GoogleGenerativeAI | |
from langchain_core.prompts import ChatPromptTemplate | |
from langchain.chains import LLMChain | |
class SocialMediaAgents: | |
PLATFORM_LIMITS = { | |
"twitter": {"chars": 280, "words": None}, | |
"instagram": {"chars": None, "words": 400}, | |
"linkedin": {"chars": None, "words": 600}, | |
"facebook": {"chars": None, "words": 1000} | |
} | |
def __init__(self, api_key: str): | |
"""Initialize the agent with a Google API key.""" | |
self.llm = GoogleGenerativeAI(model="gemini-1.5-flash", google_api_key=api_key) | |
def _create_chain(self, template: str) -> LLMChain: | |
"""Create an LLM chain with the given prompt template.""" | |
prompt = ChatPromptTemplate.from_template(template) | |
return LLMChain(llm=self.llm, prompt=prompt) | |
def _enforce_limits(self, text: str, platform: str) -> str: | |
"""Enforce platform-specific character or word limits.""" | |
limits = self.PLATFORM_LIMITS[platform.lower()] | |
if limits["chars"] and len(text) > limits["chars"]: | |
return text[:limits["chars"]-3] + "..." | |
if limits["words"]: | |
words = text.split() | |
if len(words) > limits["words"]: | |
return " ".join(words[:limits["words"]]) + "..." | |
return text | |
# def twitter_transform(self, title: str, description: str) -> dict: | |
# """Transform content for Twitter.""" | |
# link = "https://www.eye-on.ai/podcast-archive" | |
# template = """Transform this into a Twitter post (280 characters max): | |
# - Attention-grabbing message | |
# - 1-2 relevant hashtags | |
# - Essential information only | |
# Format output EXACTLY like this: | |
# New Title: [transformed title] | |
# --- | |
# New Description: [transformed description] | |
# add this line after descripttion and make link clickable listen to full podcast on {link} | |
# Original Content: | |
# Title: {title} | |
# Description: {description}""" | |
# chain = self._create_chain(template) | |
# response = chain.invoke({"title": title, "description": description, "link": link}) | |
def twitter_transform(self, title: str, description: str,link:str) -> dict: | |
"""Transform content for Twitter with a clickable link and within 280 characters.""" | |
template = """ | |
Transform this into a Twitter post (max 280 characters total): | |
- Create an attention-grabbing single-line tweet using key info from the title and description | |
- Include 1-2 relevant hashtags | |
- End with this line exactly: Listen to full podcast: {link} | |
- Ensure the ENTIRE result is no more than 280 characters TOTAL (including the link line) | |
- if character more than 280 characters manage limit and exclude description character | |
- Don't short {link} i want full link | |
Return in this format: | |
New Title: [transformed title] | |
--- | |
New Description: [tweet content] | |
Original Content: | |
Title: {title} | |
Description: {description} | |
""" | |
chain = self._create_chain(template) | |
response = chain.invoke({"title": title, "description": description, "link": link}) | |
parts = response['text'].split('---') | |
result = { | |
"new_title": parts[0].replace('New Title:', '').strip(), | |
"new_description": parts[1].replace('New Description:', '').strip() | |
} | |
combined_text = f"{result['new_title']} {result['new_description']}" | |
limited_text = self._enforce_limits(combined_text, "twitter") | |
if len(limited_text) < len(combined_text): | |
result['new_title'] = "" | |
result['new_description'] = limited_text | |
return result | |
def instagram_transform(self, title: str, description: str) -> dict: | |
"""Transform content for Instagram.""" | |
template = """Transform this into an Instagram post (400 words max): | |
- Catchy title with relevant emojis | |
- Engaging description | |
- 3-5 relevant hashtags | |
Format output EXACTLY like this: | |
New Title: [transformed title] | |
--- | |
New Description: [transformed description] | |
Original Content: | |
Title: {title} | |
Description: {description}""" | |
chain = self._create_chain(template) | |
response = chain.invoke({"title": title, "description": description}) | |
parts = response['text'].split('---') | |
result = { | |
"new_title": parts[0].replace('New Title:', '').strip(), | |
"new_description": parts[1].replace('New Description:', '').strip() | |
} | |
result['new_description'] = self._enforce_limits(result['new_description'], "instagram") | |
return result | |
def linkedin_transform(self, title: str, description: str,link) -> dict: | |
"""Transform content for LinkedIn.""" | |
template = """Transform this into a LinkedIn post (600 words max): | |
- Professional title | |
- Detailed description with business insights | |
- 2-3 relevant hashtags | |
- Professional tone | |
- End with this line exactly: Listen to full podcast: {link} | |
- Don't change link format and words. | |
- Ensure the ENTIRE result is no more than 600 words TOTAL (including the link line) | |
- if character more than 600 words manage limit and exclude description character | |
Format output EXACTLY like this: | |
New Title: [transformed title] | |
--- | |
New Description: [transformed description] | |
Original Content: | |
Title: {title} | |
Description: {description}""" | |
chain = self._create_chain(template) | |
response = chain.invoke({"title": title, "description": description, "link": link}) | |
parts = response['text'].split('---') | |
result = { | |
"new_title": parts[0].replace('New Title:', '').strip(), | |
"new_description": parts[1].replace('New Description:', '').strip() | |
} | |
result['new_description'] = self._enforce_limits(result['new_description'], "linkedin") | |
return result | |
def facebook_transform(self, title: str, description: str) -> dict: | |
"""Transform content for Facebook.""" | |
template = """Transform this into a Facebook post (1000 words max): | |
- Engaging title | |
- Conversational description | |
- Call to action for engagement | |
- 1-2 relevant hashtags | |
Format output EXACTLY like this: | |
New Title: [transformed title] | |
--- | |
New Description: [transformed description] | |
Original Content: | |
Title: {title} | |
Description: {description}""" | |
chain = self._create_chain(template) | |
response = chain.invoke({"title": title, "description": description}) | |
parts = response['text'].split('---') | |
result = { | |
"new_title": parts[0].replace('New Title:', '').strip(), | |
"new_description": parts[1].replace('New Description:', '').strip() | |
} | |
result['new_description'] = self._enforce_limits(result['new_description'], "facebook") | |
return result |