{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":615831293,"defaultBranch":"master","name":"aicomedy","ownerLogin":"younesbram","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2023-03-18T20:00:08.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/43382860?v=4","public":true,"private":false,"isOrgOwned":false},"refInfo":{"name":"","listCacheKey":"v0:1679169773.0","currentOid":""},"activityList":{"items":[{"before":"21085ff84307d506a4f800ec267955c57c295e16","after":"9eaac8e931fae9c6e00882265c8277204217796c","ref":"refs/heads/master","pushedAt":"2024-08-30T22:55:09.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update app.py","shortMessageHtmlLink":"Update app.py"}},{"before":"385205745254003b24de87feb2edd4f50a9e87b1","after":"21085ff84307d506a4f800ec267955c57c295e16","ref":"refs/heads/master","pushedAt":"2024-08-30T22:52:16.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update app.py","shortMessageHtmlLink":"Update app.py"}},{"before":"cc5561ac470d9dd7ef005a586c2756f639d0bd31","after":"385205745254003b24de87feb2edd4f50a9e87b1","ref":"refs/heads/master","pushedAt":"2024-08-30T22:48:22.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update app.py","shortMessageHtmlLink":"Update app.py"}},{"before":"4dac168e97bfa2a9ed2aa87d792026fa865a2731","after":"cc5561ac470d9dd7ef005a586c2756f639d0bd31","ref":"refs/heads/master","pushedAt":"2024-08-30T22:39:59.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update requirements.txt","shortMessageHtmlLink":"Update requirements.txt"}},{"before":"5bcb8ba0e95aa114a53de1bb9cdb25169399aac0","after":"4dac168e97bfa2a9ed2aa87d792026fa865a2731","ref":"refs/heads/master","pushedAt":"2024-08-30T22:38:49.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update app.py","shortMessageHtmlLink":"Update app.py"}},{"before":"910da833fb900756828b271229f21d0cd8cd860f","after":"5bcb8ba0e95aa114a53de1bb9cdb25169399aac0","ref":"refs/heads/master","pushedAt":"2024-07-01T17:57:09.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"Update README.md","shortMessageHtmlLink":"Update README.md"}},{"before":"d7dcbb68c9121bddacfed18b0aa863961793e4db","after":"910da833fb900756828b271229f21d0cd8cd860f","ref":"refs/heads/master","pushedAt":"2024-05-24T20:38:58.000Z","pushType":"push","commitsCount":1,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"fix","shortMessageHtmlLink":"fix"}},{"before":"55e9f1b81fc7b4b322e894eb42277c902c56529a","after":"d7dcbb68c9121bddacfed18b0aa863961793e4db","ref":"refs/heads/master","pushedAt":"2024-05-24T20:15:04.000Z","pushType":"force_push","commitsCount":0,"pusher":{"login":"younesbram","name":"Younes Brahimi","path":"/younesbram","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/43382860?s=80&v=4"},"commit":{"message":"import os\nfrom dotenv import load_dotenv\nimport streamlit as st\nimport openai\nfrom PIL import Image\nimport requests\nfrom io import BytesIO\nimport base64\nfrom groq import Groq\n\nload_dotenv()\n\nopenai_api_key = st.secrets[\"OPENAI_API_KEY\"]\nelevenlabs_api_key = st.secrets[\"EV_API_KEY\"]\ngroq_api_key = st.secrets[\"GROQ_API_KEY\"]\njerry_voice = st.secrets[\"JERRY_VOICE\"]\nkramer_voice = st.secrets[\"KRAMER_VOICE\"]\ngeorge_voice = st.secrets[\"GEORGE_VOICE\"]\nlarry_david_voice = st.secrets[\"LARRY_DAVID_VOICE\"]\nelaine_voice = st.secrets[\"ELAINE_VOICE\"]\nnewman_voice = st.secrets[\"NEWMAN_VOICE\"]\nleon_voice = st.secrets[\"LEON_VOICE\"]\njeff_voice = st.secrets[\"JEFF_VOICE\"]\n\nif not groq_api_key:\n raise ValueError(\"GROQ_API_KEY environment variable not set\")\n\nst.set_page_config(\n page_title=\"AI Skit Generator\",\n page_icon=\"๐\",\n initial_sidebar_state=\"expanded\",\n menu_items={\n \"Get Help\": \"https://www.github.com/younesbram/aicomedy\",\n \"Report a bug\": \"https://www.younes.ca/contact\",\n \"About\": \"# AI Skit Generator\\nAn app that uses AI to generate hilarious skits!\",\n },\n)\n\nclient = Groq(api_key=groq_api_key)\n\nif 'script' not in st.session_state:\n st.session_state['script'] = None\nif 'intro_audio' not in st.session_state:\n st.session_state['intro_audio'] = None\nif 'outro_audio' not in st.session_state:\n st.session_state['outro_audio'] = None\n\ndef generate_joke_with_groq(topic, characters):\n messages = [\n {\"role\": \"system\",\n \"content\": f\"You never give emotions in the script or pauses or descriptors or laughs. NO (pauses) NO (smirks) NO (laughs) NO ANY OF THAT ONLY THE TEXT!!!! You are an extremely funny and sarcastic comedian writer that knows Larry David and Jerry Seinfeld's writing styles, tasked with preserving {', '.join(characters)} jokes and delivering the same style punchlines in your short skits. You will respond in a script that includes {', '.join(characters)}.\"},\n {\"role\": \"user\",\n \"content\": f\"The topic is: {topic}. Please obey newlines and DONT give ANY descriptors only Character: speech for the ENTIRE script only with the characters selected. Nothing else or else the system bugs. Only respond as previous instructions and be extremely funny, like genius comedy. Do not add any extra characters. Do not add any descriptors like (pauses) or (excitedly) NO MATTER WHAT! because I will be programmatically generating voice clips from the script. So anything like (sarcastically) or ANYTHING like that will destroy our whole moat and program. Take this seriously. INCLUDE EVERY CHARACTER SELECTED . {', '.join(characters)}\"},\n ]\n\n stream = client.chat.completions.create(\n messages=messages,\n model=\"llama3-8b-8192\",\n temperature=0.420,\n max_tokens=1024,\n top_p=1,\n stop=None,\n stream=True,\n )\n\n generated_text = \"\"\n for chunk in stream:\n if chunk.choices[0].delta.content:\n generated_text += chunk.choices[0].delta.content\n st.session_state['script'] = generated_text\n return generated_text\n\ndef generate_joke(topic, characters, use_gpt4=False, image_data=None):\n if use_gpt4 and image_data:\n st.info(\"Generating script with GPT-4 Vision. This might take a few moments... API costs aren't free, you know! Consider following my [@didntdrinkwater](https://twitter.com/didntdrinkwater) and GitHub: [@younesbram](https://www.github.com/younesbram) as a form of compensation. ๐ \")\n img_str = base64.b64encode(image_data).decode('utf-8')\n messages = [\n {\"role\": \"system\",\n \"content\": f\"You are an extremely funny and sarcastic comedian writer that knows Larry David and Jerry Seinfeld's writing styles, tasked with preserving {', '.join(characters)} jokes and delivering the same style punchlines in your short skits. You will respond in a script that includes {', '.join(characters)}.\"},\n {\"role\": \"user\",\n \"content\": f\"The topic is: {topic}. Only respond as previous instructions and be extremely funny, like genius comedy. Reply only with character names that I gave you followed by their script (make the responses deeply affected by the character's portrayed personality on their respective shows). Do not add any extra characters or descriptors or anything like sarcastically or laughs or whatever, ONLY the text to be voiced..\"},\n {\"role\": \"user\",\n \"content\": [\n {\"type\": \"text\", \"text\": \"Please use the following image as context.\"},\n {\"type\": \"image_url\", \"image_url\": {\"url\": f\"data:image/jpeg;base64,{img_str}\"}}\n ]}\n ]\n\n data = {\n \"model\": \"gpt-4o\",\n \"messages\": messages,\n \"temperature\": 0.66666666666666666666666420,\n }\n\n api_url = \"https://api.openai.com/v1/chat/completions\"\n headers = {\n \"Content-Type\": \"application/json\",\n \"Authorization\": f\"Bearer {openai_api_key}\"\n }\n response = requests.post(api_url, headers=headers, json=data)\n\n try:\n response_data = response.json()\n generated_text = response_data['choices'][0]['message']['content']\n st.session_state['script'] = generated_text\n st.write(\"Generated script with image context:\")\n st.write(generated_text)\n return generated_text\n except KeyError as e:\n st.error(f\"Failed to generate script: {response_data}\")\n return \"\"\n else:\n return generate_joke_with_groq(topic, characters)\n\ndef create_video_html(video_path_webm, video_path_mp4, width=None, height=None):\n width_attribute = f'width=\"{width}\"' if width else \"\"\n height_attribute = f'height=\"{height}\"' if height else \"\"\n return f\"\"\"\n \n