GlobalInsight / app.py
eaglelandsonce's picture
Update app.py
bb55413 verified
raw
history blame
6.37 kB
import streamlit as st
import requests
import os
import base64
import random
import io
# Assuming anthropic is a package for interacting with AI models like Claude
# Placeholder for the actual package import and setup
from anthropic import Anthropic
def image_to_base64(image):
"""Convert the image file to base64."""
return base64.b64encode(open(image, "rb").read()).decode("utf-8")
def get_media_type(image_name):
"""Get the media type of the uploaded image based on its file extension."""
if image_name.lower().endswith(".jpg") or image_name.lower().endswith(".jpeg"):
return "image/jpeg"
elif image_name.lower().endswith(".png"):
return "image/png"
else:
return None
def describe_image(image_path, api_key):
"""Send the image to Claude for description."""
image_base64 = image_to_base64(image_path)
media_type = get_media_type(image_path)
client = Anthropic(api_key=api_key)
message = client.messages.create(
model="claude-3-opus-20240229",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": media_type,
"data": image_base64,
},
},
{
"type": "text",
"text": "Describe this image. Provide a summary"
}
],
}
],
)
return message.content
def generate_scene_prompts(movie_topic):
actions = [
"begins their journey in",
"encounters a mysterious character in",
"discovers a hidden secret within",
"faces a daunting challenge in",
"finds a crucial clue leading to the next adventure in",
"unravels a complex puzzle in",
"is forced to make a critical decision at",
"unearths an ancient artifact in",
"befriends an unlikely ally within",
"witnesses a breathtaking phenomenon in"
]
action1 = random.choice(actions)
action2 = random.choice(list(set(actions) - {action1}))
scene1 = f"{movie_topic} - Scene 1: Our hero {action1} the setting, marking the start of their adventure."
scene2 = f"{movie_topic} - Scene 2: As the story progresses, the hero {action2}, moving closer to their goal."
return [scene1, scene2]
def generate_next_scene_prompt(description1, description2, api_key):
client = Anthropic(api_key=api_key)
combined_description = f"Based on these events: {description1} and then {description2}, imagine and describe what happens next in the story. RETURN A SUMMARIZED VERSION LESS THAN 1000 Characters"
message = client.messages.create(
model="claude-3-opus-20240229",
max_tokens=1024,
messages=[{"role": "user", "content": combined_description}]
)
# Speculative: Assuming the Message object has a method or property to get content
if hasattr(message, 'content'):
continuation = message.content # If .content is directly accessible
elif hasattr(message, 'get_content'):
continuation = message.get_content() # If there's a method named get_content
else:
continuation = "Unable to generate continuation. Check the 'Message' object structure."
return continuation
def generate_and_save_image(api_key, text_prompts):
url = "https://api.stability.ai/v1/generation/stable-diffusion-xl-1024-v1-0/text-to-image"
images = []
for text_prompt in text_prompts:
body = {
"steps": 20,
"width": 1024,
"height": 1024,
"seed": random.randint(0, 2**32),
"cfg_scale": 5,
"samples": 1,
"text_prompts": [
{
"text": text_prompt,
"weight": 1
},
{
"text": "blurry, bad",
"weight": -1
}
],
}
headers = {
"Accept": "application/json",
"Content-Type": "application/json",
"Authorization": f"Bearer {api_key}",
}
response = requests.post(url, headers=headers, json=body)
if response.status_code != 200:
raise Exception("Non-200 response: " + str(response.text))
data = response.json()
out_dir = "./out"
if not os.path.exists(out_dir):
os.makedirs(out_dir)
for i, image in enumerate(data["artifacts"]):
image_path = os.path.join(out_dir, f'txt2img_{text_prompt[:10]}_{image["seed"]}.png')
with open(image_path, "wb") as f:
f.write(base64.b64decode(image["base64"]))
images.append(image_path)
return images
def main():
st.title("Claude 3 Opus Generated Scenes")
stability_api_key = st.text_input("Enter your Stability API Key:", type="password")
claude_api_key = st.text_input("Enter your Claude API Key:", type="password")
movie_topic = st.text_input("Enter a movie topic", value="A mysterious forest adventure")
if st.button("Generate Scenes"):
if not stability_api_key or not claude_api_key:
st.error("Please enter valid API keys.")
return
text_prompts = generate_scene_prompts(movie_topic)
images = generate_and_save_image(stability_api_key, text_prompts)
cols = st.columns(2)
with cols[0]:
st.image(images[0], caption="Scene 1")
description1 = describe_image(images[0], claude_api_key)
st.write(description1)
with cols[1]:
st.image(images[1], caption="Scene 2")
description2 = describe_image(images[1], claude_api_key)
st.write(description2)
next_scene_prompt = generate_next_scene_prompt(description1, description2, claude_api_key)
st.write(next_scene_prompt)
image_projected = generate_and_save_image(stability_api_key, str(next_scene_prompt))
for image_path in image_projected:
st.image(image_path, caption="Projected Image")
if __name__ == "__main__":
main()