diff --git a/assets/buildspace-logo.png b/assets/buildspace-logo.png index 030570a..2000b80 100644 Binary files a/assets/buildspace-logo.png and b/assets/buildspace-logo.png differ diff --git a/package.json b/package.json index a4d9a30..6cac4f8 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "lint": "next lint" }, "dependencies": { - "@chakra-ui/react": "^2.4.1", "@emotion/react": "^11.10.5", "@emotion/styled": "^11.10.5", "eslint": "8.27.0", diff --git a/pages/_app.js b/pages/_app.js index b19eb75..e139a05 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -1,11 +1,6 @@ -import { ChakraProvider } from '@chakra-ui/react'; - +import './styles.css'; const App = ({ Component, pageProps }) => { - return ( - - - - ); + return ; }; export default App; diff --git a/pages/api/generate.js b/pages/api/generate.js index f3f4fcc..a0c3515 100644 --- a/pages/api/generate.js +++ b/pages/api/generate.js @@ -6,15 +6,35 @@ const configuration = new Configuration({ const openai = new OpenAIApi(configuration); +const basePromptPrefix = + 'Help me write lyrics in the style of Drake, Canadian Rapper\n'; +const finalPromptPrefix = 'Take the lyrics below and generate 5 song titles:\n'; + const generateAction = async (req, res) => { - const completion = await openai.createCompletion({ + // Run first prompt + const baseCompletion = await openai.createCompletion({ model: 'text-davinci-002', - prompt: req.body.input, + prompt: `${basePromptPrefix}${req.body.input}`, temperature: 0.7, + max_tokens: 2048, }); - const choice = completion.data.choices.pop(); - res.status(200).json({ choice }); + const baseChoice = baseCompletion.data.choices.pop(); + + // Run second prompt with prefix + const finalPrompt = `${finalPromptPrefix}${req.body.input}${baseChoice.text}`; + console.log(finalPrompt); + + const prefixCompletion = await openai.createCompletion({ + model: 'text-davinci-002', + prompt: finalPrompt, + temperature: 0.7, + max_tokens: 2048, + }); + + const finalChoice = prefixCompletion.data.choices.pop(); + + res.status(200).json({ baseChoice, finalChoice }); }; export default generateAction; diff --git a/pages/index.js b/pages/index.js index 8365435..aac220c 100644 --- a/pages/index.js +++ b/pages/index.js @@ -1,21 +1,10 @@ import { useCallback, useEffect, useState } from 'react'; import Image from 'next/image'; -import { - Box, - Text, - Flex, - VStack, - Textarea, - Link, - Kbd, - Spinner, - HStack, -} from '@chakra-ui/react'; import buildspaceLogo from '../assets/buildspace-logo.png'; const Home = () => { const [input, setInput] = useState(''); - const [finishReason, setFinishReason] = useState(''); + const [output, setOutput] = useState(''); const [isGenerating, setIsGenerating] = useState(false); const onChange = (event) => { @@ -33,150 +22,69 @@ const Home = () => { }); const data = await response.json(); - const { choice } = data; + const { baseChoice, finalChoice } = data; + + setOutput( + `Song Titles:${finalChoice.text}\n\nLyrics:\n${input}${baseChoice.text}` + ); setIsGenerating(false); - - setFinishReason(choice.finish_reason); - - if (choice.finish_reason === 'stop') { - console.log('end of the completion!'); - } - - setInput((prevState) => { - return prevState + choice.text; - }); }, [input]); - useEffect(() => { - const scratchPadText = localStorage.getItem('scratchpad'); - setInput(scratchPadText); - }, []); - - useEffect(() => { - const keydownHandler = async (event) => { - if ((event.metaKey || event.ctrlKey) && event.code === 'Enter') { - event.preventDefault(); - await generateAction(); - } - localStorage.setItem('scratchpad', input); - }; - - window.addEventListener('keydown', keydownHandler); - - return () => { - window.removeEventListener('keydown', keydownHandler); - }; - }, [input, generateAction]); - return ( - - - - - - Scratchpad - - - Write your own song, movie script, or anime in 2 minutes. - - - - {isGenerating && ( - - - - )} - {!isGenerating && finishReason === 'stop' && ( - - - Keep writing to generate more! - - - )} - + + + + Scratchpad + + Write your first song in the style of your favorite artist. + + + + - - - Press ctrl or{' '} - cmd +{' '} - enter to have your AI writer to help - you generate the rest! - - - - - + + - - - build on{' '} - - buildspace - - - - - - + {isGenerating ? ( + + + + + + + ) : ( + Generate + )} + + + + + build on + + buildspace + + + + ); }; diff --git a/pages/styles.css b/pages/styles.css new file mode 100644 index 0000000..265011f --- /dev/null +++ b/pages/styles.css @@ -0,0 +1,161 @@ +body { + margin: 0; + font-family: SF Pro Display, Inter, serif; +} + +.root { + display: flex; + min-height: 100vh; + background-color: #fff; + font-family: SF Pro Display, + serif; +} + +.container { + display: flex; + width: 100%; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.content { + display: flex; + flex-direction: column; + width: 50%; + height: 100%; + color: #000; + justify-content: center; + align-items: center; +} + +.header { + display: flex; + flex-direction: column; + align-items: center; +} + +.header-title { + font-weight: bold; + font-size: 2.5rem; + margin: 0; + padding-top: 1em; + letter-spacing: -0.04em; +} + +.header-subtitle { + text-align: center; + font-size: 1rem; +} + +.text-container { + display: flex; + justify-content: center; + align-items: center; + width: 100% +} + +.text-area { + font-family: SF Pro Display, + serif; + color: #000; + width: 100%; + height: 400px; + font-size: 14px; + border-radius: 5px; + margin-left: 10px; + margin-right: 10px; + padding: 5px; + background-color: #EDF2F7; + border-color: rgba(118, 118, 118, 0.3); + border-width: 2px; +} + +.text-area-output { + position: relative; +} + +.generate-button { + width: 40%; + font-family: Inter, + sans-serif; + border-radius: 5px; + padding-top: 10px; + padding-bottom: 10px; + padding-left: 10px; + padding-right: 10px; + margin-top: 20px; + border-style: none; + cursor: pointer; + font-weight: bold; + font-size: 14px; +} + +.generate-button p { + margin: 0; +} + +.generate-button:disabled { + background-color: #d2d2d2; +} + +.footer { + display: flex; + align-items: center; + justify-content: center; + padding: 10px; +} + +.footer p { + padding-left: 5px; +} + +.footer a { + text-decoration: none; + font-weight: 500; + color:#63b3ed; + padding-left: 5px; +} + + /* Loading ring animation */ +.lds-ring { + display: inline-block; + position: relative; + width: 20px; + height: 20px; +} + +.lds-ring div { + box-sizing: border-box; + display: block; + position: absolute; + width: 18px; + height: 18px; + margin: 4px; + border: 2px solid #000; + border-radius: 50%; + animation: lds-ring 1.2s cubic-bezier(0.5, 0, 0.5, 1) infinite; + border-color: #000 transparent transparent transparent; +} + +.lds-ring div:nth-child(1) { + animation-delay: -0.45s; +} + +.lds-ring div:nth-child(2) { + animation-delay: -0.3s; +} + +.lds-ring div:nth-child(3) { + animation-delay: -0.15s; +} + +@keyframes lds-ring { + 0% { + transform: rotate(0deg); + } + + 100% { + transform: rotate(360deg); + } +} \ No newline at end of file
Scratchpad
+ Write your first song in the style of your favorite artist. +
Generate
build on