68 lines
2.1 KiB
Python
68 lines
2.1 KiB
Python
import os
|
|
import json
|
|
from pydantic import BaseModel, HttpUrl
|
|
from datetime import datetime
|
|
from dotenv import load_dotenv
|
|
from openai import AsyncOpenAI
|
|
|
|
load_dotenv()
|
|
|
|
OPENAI_API_KEY = os.getenv('OPENAI_API_KEY')
|
|
|
|
openai_client = AsyncOpenAI(api_key=OPENAI_API_KEY)
|
|
|
|
class GenerateInput(BaseModel):
|
|
requestId: str
|
|
url: HttpUrl
|
|
title: str
|
|
content: str
|
|
timestamp: int
|
|
|
|
config = {
|
|
'type': 'event',
|
|
'name': 'TwitterGenerate',
|
|
'description': 'Generates Twitter content',
|
|
'subscribes': ['generate-content'],
|
|
'emits': ['twitter-schedule'],
|
|
'input': GenerateInput.model_json_schema(),
|
|
'flows': ['content-generation']
|
|
}
|
|
|
|
async def handler(input, context):
|
|
try:
|
|
with open("prompts/twitter-prompt.txt", "r", encoding='utf-8') as f:
|
|
twitterPromptTemplate = f.read()
|
|
|
|
twitterPrompt = twitterPromptTemplate.replace('{{title}}', input['title']).replace('{{content}}', input['content'])
|
|
|
|
context.logger.info("🔄 Twitter content generation started...")
|
|
|
|
twitter_content = await openai_client.chat.completions.create(
|
|
model="gpt-4o",
|
|
messages=[{'role': 'user', 'content': twitterPrompt}],
|
|
temperature=0.7,
|
|
max_tokens=2000,
|
|
response_format={'type': 'json_object'}
|
|
)
|
|
|
|
try:
|
|
twitter_content = json.loads(twitter_content.choices[0].message.content)
|
|
except Exception:
|
|
twitter_content = {'text': twitter_content.choices[0].message.content}
|
|
|
|
context.logger.info(f"🎉 Twitter content generated successfully!")
|
|
|
|
await context.emit({
|
|
'topic': 'twitter-schedule',
|
|
'data': {
|
|
'requestId': input['requestId'],
|
|
'url': input['url'],
|
|
'title': input['title'],
|
|
'content': twitter_content,
|
|
'generatedAt': datetime.now().isoformat(),
|
|
'originalUrl': input['url']
|
|
}
|
|
})
|
|
except Exception as e:
|
|
context.logger.error(f"❌ Content generation failed: {e}")
|
|
raise e |