Added Dall-E image generation and stopped execution after 5 ChatGPT tries
This commit is contained in:
parent
512c0352b3
commit
4d5f4e0438
55
app.py
55
app.py
@ -1,6 +1,7 @@
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import random
|
import random
|
||||||
|
import re
|
||||||
from typing import Union
|
from typing import Union
|
||||||
|
|
||||||
import openai
|
import openai
|
||||||
@ -30,7 +31,6 @@ def format_message(message: str) -> list:
|
|||||||
Raises:
|
Raises:
|
||||||
None
|
None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
"role": "system",
|
"role": "system",
|
||||||
@ -55,7 +55,6 @@ def extract_html_from_chatgpt_response(returned_string: str) -> Union[str, None]
|
|||||||
Raises:
|
Raises:
|
||||||
None
|
None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
validator = HTMLParser(strict=True)
|
validator = HTMLParser(strict=True)
|
||||||
try:
|
try:
|
||||||
validator.parse(returned_string)
|
validator.parse(returned_string)
|
||||||
@ -68,7 +67,7 @@ def extract_html_from_chatgpt_response(returned_string: str) -> Union[str, None]
|
|||||||
html = "<html>" + match[1]
|
html = "<html>" + match[1]
|
||||||
html_match = html.split("</html>")
|
html_match = html.split("</html>")
|
||||||
possible_html = html_match[0] + "</html>"
|
possible_html = html_match[0] + "</html>"
|
||||||
if "(topic)" not in possible_html:
|
if "(topic)" not in possible_html and "(slugified_related_topic_name)" not in possible_html:
|
||||||
return possible_html
|
return possible_html
|
||||||
|
|
||||||
|
|
||||||
@ -85,7 +84,6 @@ def get_random_topic() -> str:
|
|||||||
Raises:
|
Raises:
|
||||||
None
|
None
|
||||||
"""
|
"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
completion = openai.ChatCompletion.create(
|
completion = openai.ChatCompletion.create(
|
||||||
model="gpt-3.5-turbo",
|
model="gpt-3.5-turbo",
|
||||||
@ -111,12 +109,41 @@ def get_random_topic() -> str:
|
|||||||
return get_random_topic()
|
return get_random_topic()
|
||||||
|
|
||||||
|
|
||||||
def get_chatgpt_html_response(message: str) -> str:
|
def generate_topic_image(topic: str) -> str:
|
||||||
|
"""
|
||||||
|
Generates an image for the topic
|
||||||
|
|
||||||
|
Args:
|
||||||
|
topic: The topic to generate an image for
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
The URL of the image
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
None
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
completion = openai.ChatCompletion.create(
|
||||||
|
model="gpt-3.5-turbo",
|
||||||
|
messages=format_message(f"Generate a prompt for dall-e about {topic}"),
|
||||||
|
)
|
||||||
|
dalle_prompt = completion.choices[0].message.content
|
||||||
|
|
||||||
|
logging.info(f"The Dall-E prompt is: {dalle_prompt}")
|
||||||
|
|
||||||
|
image = openai.Image.create(prompt=dalle_prompt, n=1, size="256x256")
|
||||||
|
return image["data"][0]["url"]
|
||||||
|
except Exception:
|
||||||
|
generate_topic_image(topic)
|
||||||
|
|
||||||
|
|
||||||
|
def get_chatgpt_html_response(message: str, count: int = 0) -> str:
|
||||||
"""
|
"""
|
||||||
Gets the response from chatgpt
|
Gets the response from chatgpt
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
message: The message to send to chatgpt
|
message: The message to send to chatgpt
|
||||||
|
count: The number of times this function has been called
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
The HTML response from chatgpt
|
The HTML response from chatgpt
|
||||||
@ -124,6 +151,10 @@ def get_chatgpt_html_response(message: str) -> str:
|
|||||||
Raises:
|
Raises:
|
||||||
None
|
None
|
||||||
"""
|
"""
|
||||||
|
count += 1
|
||||||
|
|
||||||
|
if count >= 5:
|
||||||
|
return f"Error! ChatGPT is having problems with this topic: {message}. Try a new one."
|
||||||
|
|
||||||
logging.info(f"The topic to generate is {message}")
|
logging.info(f"The topic to generate is {message}")
|
||||||
|
|
||||||
@ -138,21 +169,27 @@ def get_chatgpt_html_response(message: str) -> str:
|
|||||||
"should be '/infinite?topic=(slugified_related_topic_name)' and the text should be the name of the "
|
"should be '/infinite?topic=(slugified_related_topic_name)' and the text should be the name of the "
|
||||||
"related topic. The name of these topics should not be more than 5 words. Finally, replace "
|
"related topic. The name of these topics should not be more than 5 words. Finally, replace "
|
||||||
"(new_topics) with a 5 links with completely new and random topics to talk about. These links "
|
"(new_topics) with a 5 links with completely new and random topics to talk about. These links "
|
||||||
"should follow the same rules as before. Respond only the code"
|
"should follow the same rules as before. Do not replace (image_source). Respond only the code"
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
except openai.error.RateLimitError:
|
except openai.error.RateLimitError:
|
||||||
return get_chatgpt_html_response(message)
|
return get_chatgpt_html_response(message, count)
|
||||||
|
|
||||||
response = completion.choices[0].message.content
|
response = completion.choices[0].message.content
|
||||||
html = extract_html_from_chatgpt_response(response)
|
html = extract_html_from_chatgpt_response(response)
|
||||||
|
|
||||||
if not html:
|
if not html:
|
||||||
logging.info(f"No HTML was found. The response was {response}. Retrying...")
|
logging.info(f"No HTML was found. The response was {response}. Retrying...")
|
||||||
return get_chatgpt_html_response(message)
|
return get_chatgpt_html_response(message, count)
|
||||||
|
|
||||||
return html
|
pattern = r'src="([^"]*)"'
|
||||||
|
image = generate_topic_image(message)
|
||||||
|
|
||||||
|
logging.info(f"The image is {image}")
|
||||||
|
|
||||||
|
html_with_image = re.sub(pattern, f'src="{image}"', html)
|
||||||
|
return html_with_image
|
||||||
|
|
||||||
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user