Linkedin_Content_Generator / post_generator.py
d221's picture
Upload 6 files
75a787e verified
from langchain_groq import ChatGroq
import os
from dotenv import load_dotenv
import pandas as pd
import json
class FewShotPosts:
def __init__(self, file_path="processed_posts.json"):
self.df = None
self.unique_tags = None
self.load_posts(file_path)
def load_posts(self, file_path):
with open(file_path, encoding="utf-8") as f:
posts = json.load(f)
self.df = pd.json_normalize(posts)
self.df['length'] = self.df['line_count'].apply(self.categorize_length)
all_tags = self.df['tags'].apply(lambda x: x).sum()
self.unique_tags = list(set(all_tags))
def get_filtered_posts(self, length, language, tag):
df_filtered = self.df[
(self.df['tags'].apply(lambda tags: tag in tags)) &
(self.df['language'] == language) &
(self.df['length'] == length)
]
return df_filtered.to_dict(orient='records')
def categorize_length(self, line_count):
if line_count < 5:
return "Short"
elif 5 <= line_count <= 10:
return "Medium"
else:
return "Long"
def get_tags(self):
return self.unique_tags
load_dotenv()
few_shot = FewShotPosts()
def get_length_str(length):
if length == "Short":
return "1 to 5 lines"
elif length == "Medium":
return "6 to 10 lines"
elif length == "Long":
return "11 to 15 lines"
elif length == "Extra Long":
return "16 to 20 lines"
else:
return "6 to 10 lines"
def generate_post(length, language, tag, model_name="llama-3.3-70b-versatile", custom_context=""):
prompt = get_prompt(length, language, tag, custom_context)
llm_instance = ChatGroq(groq_api_key=os.getenv("GROQ_API_KEY"), model_name=model_name)
response = llm_instance.invoke(prompt)
return response.content
def get_prompt(length, language, tag, custom_context=""):
length_str = get_length_str(length)
prompt = f"""
Generate a LinkedIn post using the below information. No preamble.
1) Topic: {tag}
2) Length: {length_str}
3) Language: {language}
If Language is Hinglish then it means it is a mix of Hindi and English.
The script for the generated post should always be English.
"""
# Add custom context if provided
if custom_context.strip():
prompt += f"\nUse the following additional knowledge or context about the topic:\n{custom_context}\n"
# Optionally include few-shot examples
examples = few_shot.get_filtered_posts(length, language, tag)
if len(examples) > 0:
prompt += "\n4) Use the writing style as per the following examples:"
for i, post in enumerate(examples):
post_text = post['text']
prompt += f"\n\nExample {i+1}:\n{post_text}"
if i == 1: # limit to 2 examples
break
return prompt
if __name__ == "__main__":
print(generate_post("Medium", "English", "Mental Health", custom_context="Remember to mention the importance of daily meditation."))