|
|
|
import streamlit as st |
|
import re |
|
import torch |
|
import requests |
|
from openai import OpenAI |
|
from prompts import SUMMARY_PROMPT, MEME_PROMPT |
|
|
|
IMGFLIP_URL = "https://api.imgflip.com/caption_image" |
|
|
|
|
|
TEMPLATE_IDS = { |
|
"drake hotline bling": "181913649", |
|
"uno draw 25 cards": "217743513", |
|
"bernie asking for support": "222403160", |
|
"disaster girl": "97984", |
|
"waiting skeleton": "109765", |
|
"always has been": "252600902", |
|
"woman yelling at cat": "188390779", |
|
"i bet he's thinking about other women": "110163934", |
|
"one does not simply": "61579", |
|
"success kid": "61544", |
|
"oprah you get a": "28251713", |
|
"hide the pain harold": "27813981", |
|
} |
|
|
|
|
|
client = OpenAI(api_key=st.secrets["OPENAI_API_KEY"]) |
|
|
|
|
|
def call_openai(prompt: str) -> str: |
|
"""Call gpt-4o-mini via the Responses API.""" |
|
response = client.responses.create( |
|
model="gpt-4o-mini", |
|
instructions="You are a helpful assistant", |
|
input=prompt, |
|
) |
|
return response.output_text.strip() |
|
|
|
|
|
def article_to_meme(article_text: str) -> str: |
|
|
|
summary = call_openai(SUMMARY_PROMPT.format(article_text=article_text)) |
|
|
|
|
|
output = call_openai(MEME_PROMPT.format(summary=summary)) |
|
|
|
|
|
match_t = re.search(r"template:\s*(.+)", output, re.IGNORECASE) |
|
match0 = re.search(r"text0:\s*(.+)", output, re.IGNORECASE) |
|
match1 = re.search(r"text1:\s*(.+)", output, re.IGNORECASE) |
|
if not (match_t and match0 and match1): |
|
raise ValueError(f"Parsing failed: {output}") |
|
template = match_t.group(1).strip() |
|
text0 = match0.group(1).strip() |
|
text1 = match1.group(1).strip() |
|
|
|
|
|
tpl_id = TEMPLATE_IDS.get(template.lower()) |
|
if not tpl_id: |
|
raise KeyError(f"Unknown template: {template}") |
|
resp = requests.post( |
|
IMGFLIP_URL, |
|
params={ |
|
"template_id": tpl_id, |
|
"username": st.secrets["IMGFLIP_USERNAME"], |
|
"password": st.secrets["IMGFLIP_PASSWORD"], |
|
"text0": text0, |
|
"text1": text1, |
|
} |
|
) |
|
resp.raise_for_status() |
|
data = resp.json() |
|
if not data.get("success", False): |
|
raise Exception(data.get("error_message")) |
|
|
|
meme_url = data["data"]["url"] |
|
return meme_url |
|
|