File size: 11,119 Bytes
5b0ea37
 
 
 
 
 
 
 
e7a91a5
 
9d647cb
2a3f243
9d647cb
628d4bf
2a3f243
 
 
9d647cb
628d4bf
 
 
 
2a3f243
5b0ea37
 
0369d1c
 
 
 
5b0ea37
3837095
5b0ea37
3837095
0369d1c
 
5b0ea37
 
 
 
2a3f243
0369d1c
3837095
2a3f243
 
628d4bf
9d647cb
 
8278ce8
67dc374
8f393c2
67dc374
8278ce8
 
67dc374
 
 
 
8278ce8
67dc374
 
 
8278ce8
 
 
 
 
67dc374
 
 
 
 
 
8278ce8
 
 
 
 
67dc374
8f393c2
67dc374
8278ce8
 
67dc374
8278ce8
 
67dc374
 
 
 
 
 
 
8f393c2
67dc374
8278ce8
67dc374
 
 
8278ce8
 
 
 
 
67dc374
8278ce8
67dc374
 
8278ce8
67dc374
 
8278ce8
 
 
67dc374
 
8278ce8
67dc374
 
 
 
 
 
8278ce8
67dc374
8278ce8
67dc374
8278ce8
67dc374
8278ce8
67dc374
8278ce8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8e57583
 
de9c311
8e57583
 
 
 
 
 
2a3f243
 
 
0369d1c
2a3f243
 
0369d1c
2a3f243
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d647cb
2a3f243
0369d1c
 
 
e7a91a5
 
 
 
0369d1c
e7a91a5
46d228c
e7a91a5
0369d1c
 
 
 
 
 
9d647cb
0369d1c
 
 
2a3f243
0369d1c
 
9d647cb
0369d1c
 
 
2a3f243
5b0ea37
 
e7a91a5
5b0ea37
0d40137
0deb788
5b0ea37
e7a91a5
 
 
5b0ea37
e7a91a5
 
2a3f243
9d647cb
2a3f243
0369d1c
 
 
2a3f243
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
import os
import io
import streamlit as st
from groq import Groq

# Set up Groq client using the environment variable for API key.
client = Groq(api_key=os.environ.get("GROQ_API_KEY"))

# Initialize session state for chat history if it doesn't exist.
if "chat_history" not in st.session_state:
    st.session_state.chat_history = []  # Each item is a dict: {"role": "user"/"assistant", "content": "..."}

def render_assistant_history():
    """Render only the assistant responses from the conversation history with proper line breaks."""
    chat_container = st.container()
    chat_md = ""
    for msg in st.session_state.chat_history:
        if msg["role"] == "assistant":
            # Replace newline characters with <br> for proper line breaks in markdown.
            formatted_content = msg["content"].replace("\n", "<br>")
            chat_md += f"**Assistant:**<br>{formatted_content}<br><br>"
    chat_container.markdown(chat_md, unsafe_allow_html=True)

st.title("Conversation Script Generator Using Groq API")

# ---------------------------
# Initial Conversation Generation Inputs
# ---------------------------
col1, col2, col3 = st.columns(3)
with col1:
    left_speaker = st.text_input("Left Speaker", placeholder="Enter left speaker name")
with col2:
    right_speaker = st.text_input("Right Speaker", placeholder="Enter right speaker name")
with col3:
    contact_name = st.text_input("Contact Name", placeholder="Enter contact name for conversation")

theme = st.text_area("Overall Theme of the Conversation", height=100)
additional_details = st.text_area("Additional Conversation Details (Optional)", height=100)

# Check if all required fields are filled.
is_ready = bool(theme and left_speaker and right_speaker and contact_name)

if st.button("Generate Conversation", disabled=not is_ready):
    prompt = f"""
Youe Task is to  generate an engaging script which is a conversation between two people on iMessage for meme purposes.. It should strictly follow a given 
    syntax and should be diverse and creative
Script Structure & Formatting Rules
1️ Contact Name (Title)
At the beginning of the script, define the contact name, appearing at the top of the iMessage screen.
<Contact Name>:<Contact Name>
✅ Example:
Liam (Black Market Electronics Dealer 📱💸):Liam (Black Market Electronics Dealer 📱💸)
2️ Dialogue Format
Each dialogue line follows this format:
<Direction>: <SpeakerName> > <Phrase 1> <Phrase 2> <Phrase 3> <Phrase 4> [Reaction]
Left: Represents the left speaker (User).
Right: Represents the right speaker (Other character).
SpeakerName: A randomly assigned alias (characters do not know their own names).
Phrase Limit: Max 4 phrases per line.
Reaction Cues: Placed at the end of lines, enclosed in square brackets [].
✅ Example:
Left: MysteryGuy> BRO WHY IS MY COMPUTER SPEAKING LATIN??? [shocked]
Right: Liam> Uh… you *might* have summoned something 💀 [suspense_music]
Left: MysteryGuy> SUMMONED WHAT???
Right: Liam> 😶
3️ Bracketed Cues & Sound Effects
Use brackets [ ] for sound effects, reactions, or video cues.
[shocked] → Must be used often
[fart2] → Should be used less
[fortnite] → Should be used less
[get_out] → Must ONLY be used at the end of the conversation
✅ Example:
Right: Max> BRO WHY IS THERE A ROBOT FOLLOWING ME?!! [shocked] 🤖
Left: UnknownDude> Congrats, you just activated *follow mode* 😎
Right: Max> FOLLOW MODE??? TURN IT OFF
Left: UnknownDude> nahhh that's a premium feature 🤣💀 [fortnite]
4️ Image Placeholders
For inserting images, use:
<Direction>: img:<DescriptiveImageName>
✅ Example:
Left: img:ancient_phone_booting_up
Right: Liam> WHY DID MY OLD NOKIA JUST START SCREAMING??? [shocked]
Min. 3 images per script.
Descriptive placeholders must be varied and clear.
5️⃣ Cantina App (Roast Bot Segment)
🚨 Correct Format (ALWAYS THE SAME STRUCTURE)
Right speaker initiates by opening Cantina.
Right speaker asks Roast Bot for help.
Left speaker (ALWAYS Antoni) responds.
Right speaker must repeat what Roast Bot told them to say.
Contact Name Title must reappear after Cantina.
✅ Correct Example:
Cantina: Roast bot:Roast bot pfp == Alex> Let me open the cantina app to talk to Roast bot
Right: Alex> Hey Roast Bot  
Right: Alex> Liam is mad at me for borrowing his Tesla without permission  
Right: Alex> help me roast him  
Left: Antoni> okay  
Left: Antoni> tell him this:  
Left: Antoni> maybe if you had better security, you wouldn’t have to track your car on Find My iPhone.  
Liam (Tesla Rental King ⚡🚗):Liam (Tesla Rental King ⚡🚗)  
Right: Alex> maybe if you had better security, you wouldn’t have to track your car on Find My iPhone.  
🚫 Incorrect Example (DO NOT DO THIS):
Cantina: Roast bot:Roast bot pfp == Liam> Hey Roast Bot, we need your help! My AI fridge is trying to blackmail me! ❌
🔹 Rules:
Left Speaker in Cantina is ALWAYS "Antoni."
Right speaker MUST repeat the roast word-for-word.
The contact name/title must reappear after the Cantina segment.
6️ Brain Rot Hook (MANDATORY)
Every script must begin with an insane, wacky brain rot hook that immediately grabs attention.
✅ Examples:
"WHY DID MY TV JUST ASK ME FOR A PASSWORD???" 📺🔑  
"BRO MY DOG JUST SENT ME A TEXT MESSAGE???" 🐶📲  
"WHY IS MY LANDLORD SELLING MY HOUSE ON FACEBOOK MARKETPLACE???" 🏠💀  
Must be over-the-top and chaotic.
Encourages immediate engagement.
7️ Escalation & Progression
The story must escalate into chaos but stay coherent:
Start Crazy → Get Crazier → End With a Punchline or Twist
Use sudden twists and reveals to maintain engagement.
The final line should be either a funny resolution or an abrupt exit.
✅ Example Progression:
🚀 Crazy Hook:
"BRO WHY DID MY PHONE JUST ORDER A UBER ON ITS OWN???" 🚗💨
🔥 Escalation:
"Wait… it’s taking me somewhere???"
🎭 Insane Event:
"THE DESTINATION IS *AREA 51*??? 💀"
🤯 Twist:
"The driver is an AI and won’t let me out."
🏃‍♂️ Dramatic Exit (ALWAYS USE [get_out])
"Left: UnknownDude> Enjoy the ride 😎 [get_out]"
8️⃣ Speaker Name Randomization
🚨 Speakers should NOT know their own names.
Left speaker’s name should always appear as "Unknown Guy" or a random alias.
Right speaker’s name should also be replaced with something generic unless necessary.
The system should NOT recognize them.
✅ Example:
Left: MysteriousCaller> BRO WHO JUST HACKED MY PHONE??? [shocked]
Right: HackerDude> Oh, don’t worry, it's just an update 😎
Left: MysteriousCaller> UPDATE??? BRO WHAT DO YOU MEAN
Right: HackerDude> New feature, remote control access 🤖
9️⃣ Customization Features
Add Speaker Names Manually → Left and Right speakers should be customizable.
Emoji Button → Clicking adds 5 random emojis to any phrase.
Max 9 sound effect commands, with [shocked] used most.
Final Parameters & Instructions
When prompting the AI, specify:
Left Actor = {left_speaker}
Right Actor = {right_speaker}
Theme = {theme} (e.g., “AI Gone Wrong”, “Haunted Electronics”, “Unexpected Legal Trouble”)
Cantina Segment = Required
Minimum 3 images
[shocked] must be frequent, [get_out] must be at the end.
Speaker names are randomized and unknown to them.
📌 Summary
🔹 Title appears at the start and after Cantina.
🔹 Dialogue follows max 4 phrases per line.
🔹 Cantina Roast Bot always follows the same structure.
🔹 Brain rot hook is mandatory.
🔹 Escalates into chaos but remains coherent.
Contact Name: {contact_name}
{contact_name} : {contact_name} in the start
YOU MUST USE CONTACT NAME IN THE TITLE NOT THE SPEAKER NAMES
Left Speaker: {left_speaker}
Left: {left_speaker}> 
for left ones
Right Speaker: {right_speaker}
Right: {right_speaker}> 
for right ones
    """
    if additional_details.strip():
        prompt += f"\nAdditional Details: {additional_details}\n"
    
    # Start the conversation history with the initial prompt.
    st.session_state.chat_history = [{"role": "user", "content": prompt}]
    
    model = "llama-3.3-70b-versatile"
    try:
        chat_completion = client.chat.completions.create(
            messages=st.session_state.chat_history,
            model=model,
            temperature=1.2,
            max_completion_tokens=21890,
        )
        result_text = chat_completion.choices[0].message.content
        if not result_text:
            st.error("The API call did not return any content.")
        else:
            st.success("Conversation generated successfully!")
            st.session_state.chat_history.append({"role": "assistant", "content": result_text})
    except Exception as e:
        st.error(f"An error occurred while calling the API: {e}")

st.markdown("### Generated Conversation Script")
render_assistant_history()

# ---------------------------
# Chat Interface for Revisions
# ---------------------------
st.markdown("---")
st.header("Chat & Modify Conversation Script")

with st.form(key="chat_form", clear_on_submit=True):
    user_message = st.text_area("Enter your revision request (e.g., modify the script)", height=100)
    submit_chat = st.form_submit_button("Send")

if submit_chat and user_message.strip():
    # Retrieve the last assistant-generated script for context.
    last_script = ""
    for msg in reversed(st.session_state.chat_history):
        if msg["role"] == "assistant":
            last_script = msg["content"]
            break
    # Build a revision prompt including context and user request.
    revision_prompt = f"""Revision Request: {user_message}

Context: The current conversation script is as follows:

{last_script}

Please revise the script to incorporate the requested changes. Do not simply repeat the same content—update it with new, modified details reflecting the user's instructions.
"""
    st.session_state.chat_history.append({"role": "user", "content": revision_prompt})
    
    model = "llama-3.3-70b-versatile"
    try:
        chat_completion = client.chat.completions.create(
            messages=st.session_state.chat_history,
            model=model,
            temperature=1.2,
            max_completion_tokens=21890,
        )
        reply = chat_completion.choices[0].message.content
        st.session_state.chat_history.append({"role": "assistant", "content": reply})
        st.success("Response received!")
    except Exception as e:
        st.error(f"An error occurred while calling the API: {e}")

st.markdown("### Updated Conversation Script")
render_assistant_history()

# ---------------------------
# Download Option for the Latest Assistant Script
# ---------------------------
if st.session_state.chat_history:
    last_response = ""
    for msg in reversed(st.session_state.chat_history):
        if msg["role"] == "assistant":
            last_response = msg["content"]
            break
    if last_response:
        txt_bytes = last_response.encode("utf-8")
        txt_io = io.BytesIO(txt_bytes)
        st.download_button(
            label="Download Latest Assistant Script as TXT",
            data=txt_io,
            file_name="conversation_script.txt",
            mime="text/plain"
        )