Spaces:
Runtime error
Runtime error
import os | |
import streamlit as st | |
from langchain.prompts import PromptTemplate | |
from dotenv import load_dotenv | |
import google.generativeai as genai | |
from langchain_google_genai import ChatGoogleGenerativeAI | |
from langchain.prompts import PromptTemplate | |
# Load environment variables from .env file | |
load_dotenv() | |
genai.configure(api_key=os.getenv("GOOGLE_API_KEY")) | |
model_gemini = ChatGoogleGenerativeAI(model="gemini-pro") | |
def model(genre,no_of_characters,location,characters_prompt,hook_prompt,climax_prompt): | |
# here we are creating a template for the prompt | |
main_c = """ | |
Crafting a compelling short film necessitates a concise and straightforward premise, a key ingredient for success when storytelling within the constraints of a limited timeframe. The best short films often feature a main character with a specific goal or a tight deadline, such as two friends embarking on a bike ride, a woman seeking new friendship, or a grieving son delivering a eulogy. With time being a precious commodity, short films cannot afford to delve extensively into character backstories. Instead, filmmakers must discern the essential information required to engage the audience in the hero's journey. | |
Details like an ex-husband may prove extraneous and dilute the impact of the narrative.Moreover, judiciously selecting the number of characters is pivotal. | |
Each character, whether a protagonist, supporting role, or minor part, should serve a purpose directly tied to the central goal. | |
If a character's exclusion doesn't impede the main character's progression, | |
it might be prudent to omit them. Many successful short films unfold within a singular location, not only to streamline the story but also to mitigate budgetary constraints, | |
particularly for independent filmmakers. "Sam Did It," a renowned 10-minute short set entirely in a morgue operating room, exemplifies how a confined space can intensify the storytelling experience. | |
A useful exercise during brainstorming involves formulating a premise and identifying a single location, prompting creators to contemplate whether the entire narrative can unfold within those confines. | |
This approach not only sharpens the focus but also aligns with budget considerations for those contemplating a self-produced project. | |
""" | |
template = main_c +""" | |
write a short film story in {genre} genre with {no_of_characters} characters in {location} location | |
Consider being economical with characters and backstory There are {characters_prompt} characters and their behaviours. This is the hook {hook_prompt} | |
and this is the climax {climax_prompt} | |
""" | |
# here we are creating a prompt using the template and the input variables | |
prompt = PromptTemplate(input_variables=["genre","no_of_characters","location","characters_prompt","hook_prompt","climax_prompt"],template=template) | |
# here we are generating the blog | |
response = model_gemini.invoke(prompt.format(genre=genre,no_of_characters=no_of_characters,location=location,characters_prompt=characters_prompt,hook_prompt=hook_prompt,climax_prompt=climax_prompt)) | |
print(response) | |
return response.content | |
def short_film_story_generator(genre): | |
st.title("Short Film Story Generator") | |
# Prompt for being economical with characters and backstory | |
no_of_characters = st.text_input("How many character do you want? (leave empty for default of 4 characters):") | |
if not no_of_characters: | |
# Default characters if the user leaves it empty | |
no_of_characters = "The story follows four characters who..." | |
# Prompt for minimal locations | |
location = st.text_input("Think about keeping the locations to a minimum. Specify a key location for your short film (leave empty for random location):") | |
if not location: | |
# Default location if the user leaves it empty | |
location = "You can use any location you want" | |
# Prompt for interesting characters | |
characters_prompt = st.text_input("Describe interesting traits or quirks of the main characters:") | |
if not characters_prompt: | |
characters_prompt = "You can use any interesting traits or quirks you want" | |
# Prompt for the hook | |
hook_prompt = st.text_input("Create a hook for your short film:") | |
if not hook_prompt: | |
# Default hook if the user leaves it empty | |
hook_prompt = "You can use any hook you want" | |
# Prompt for the climax | |
climax_prompt = st.text_input("Develop a great climax for your short film:") | |
if not climax_prompt: | |
climax_prompt = "You can use climax you want but should match with the genre" | |
if st.button("Generate Story"): | |
response = model(genre,no_of_characters,location,characters_prompt,hook_prompt,climax_prompt) | |
# Extract the AI's response and display it | |
ai_response = response | |
st.write(f"{ai_response}") | |
if __name__ == "__main__": | |
genres = ["Sci-Fi", "Drama", "Comedy", "Thriller", "Mystery", "Fantasy", "Horror", "Romance", "Action", "Adventure"] | |
# Create a dropdown menu for genres | |
user_genre = st.sidebar.selectbox("Select the genre:", genres, index=genres.index("Sci-Fi")) | |
short_film_story_generator(user_genre) | |