Git Product home page Git Product logo

openai-project's Introduction

OpenAI - Project

This Repository using OpenAI API to interact with ChatGPT & Dall·E 2. Built with ReactJS and Tailwind CSS

OpenAI Project

Table of Contents

Running on Localhost

  • Clone this repository
git clone https://github.com/armandwipangestu/openai-project
  • Install dependency library
npm i
  • Copy .env.example to .env and fill it with your API
cp .env.example .env
REACT_APP_API_KEY="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
  • Run Application
npm start

How to get API key?

NOTE: Please take care of your API Key as OpenAI limits usage to $18.00 USD

You must first register on the openai website, then click the profile menu and select View API keys

Information

Because my API Key has reached the limit, the input form is disabled

To enable input form and button (to hit the API to OpenAI) give comment the disabled and readOnly attributes on the <textarea> tag and uncomment the onClick attribute on the <button> tag. To enable chatLog give uncomment the loop or map code

  • src/components/ChatGPT/completion.chatgpt.js
2022-12-31_20.56.17.mp4
const Completion = () => {
    ...
      <div className="min-h-screen flex flex-col justify-start">
        <div>
          {/*

            |--------------------------------------------------------------------------
            | NOTE: Give Comment on the Component below to remove information
            |--------------------------------------------------------------------------
            |
            |

          */}
          {/* <Information /> */}

          {/*

            |--------------------------------------------------------------------------
            | NOTE: Give Uncomment on the code below to make work
            |--------------------------------------------------------------------------
            |
            |

          */}

          {chatLog.map((log, i) => (
            <>
              {log.user === "me" && (
                <div
                  className="flex p-5 rounded-lg mb-5 bg-blue-300 border-2 border-black"
                  style={{ boxShadow: "0.4rem 0.4rem 0 #222" }}
                  key={i}
                >
                  <img
                    src="avatar2.png"
                    className="w-8 h-6 mr-2 -ml-1"
                    alt="user"
                  />
                  <div>
                    <span className="text-black mt-5">{log.message}</span>
                  </div>
                </div>
              )}
              {log.user === "gpt" && (
                <div
                  className="flex p-5 bg-yellow-400 rounded-lg mt-5 mb-5 border-2 border-black"
                  style={{ boxShadow: "0.4rem 0.4rem 0 #222" }}
                  key={i}
                >
                  <img
                    src="openai-dark.png"
                    className="w-6 h-6 mr-3"
                    alt="gpt"
                  />
                  <div>
                    <span className="text-black">{log.message}</span>
                  </div>
                </div>
              )}
            </>
          ))}
          {loading && (
            <div className="relative">
              <div
                className="flex p-5 bg-yellow-400 rounded-lg mt-5 mb-5 border-2 border-black"
                style={{ boxShadow: "0.4rem 0.4rem 0 #222" }}
              >
                <img src="openai-dark.png" className="w-6 h-6 mr-3" alt="gpt" />
                <div class="col-3">
                  <div class="snippet" data-title="dot-pulse">
                    <div class="stage">
                      <div class="dot-pulse"></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          )}
        </div>

        <div className="mt-auto flex sticky bottom-5">
          <div
            className={`flex absolute bottom-0 right-0 md:pb-2.5 px-4 py-2.5 rounded-tr-md rounded-br-md ${
              prompt && "bg-black text-white px-4 py-2.5"
            }`}
          >
            <button
              className={`${!prompt && "cursor-not-allowed"}`}
              type="submit"
              //
              // |--------------------------------------------------------------------------
              // | NOTE: Uncomment this attribute 'onClick' to hit API OpenAI
              // |--------------------------------------------------------------------------
              // |
              // |
              //
              onClick={generateCompletion}
            >
              Send
            </button>
          </div>
          <TextareaAutosize
            className="w-full border-2 border-black rounded-md placeholder-gray-500 resize-none py-2 pl-3 pr-10 md:pl-5 outline-none"
            placeholder="Enter your message here"
            style={{ boxShadow: "0.4rem 0.4rem 0 #222" }}
            maxRows={5}
            value={prompt}
            onChange={(e) => setPrompt(e.target.value)}
            //
            // |--------------------------------------------------------------------------
            // | NOTE: Give Comment on the two attributes below to enable input
            // |--------------------------------------------------------------------------
            // |
            // |
            //
            // disabled
            // readOnly
          />
        </div>
      </div>
    ...
}
  • src/components/Dall-E/image.dalle.js
2022-12-31_20.59.31.mp4
const Image = () => {
    ...
      <div className="min-h-screen flex flex-col justify-start">
        <div className="">
          {/*

            |--------------------------------------------------------------------------
            | NOTE: Give Comment on the Component below to remove information
            |--------------------------------------------------------------------------
            |
            |

          */}
          {/* <Information /> */}

          {/*

            |--------------------------------------------------------------------------
            | NOTE: Give Uncomment on the code below to make work
            |--------------------------------------------------------------------------
            |
            |

          */}

          {chatLog.map((d, i) => (
            <>
              {d.user === "me" && (
                <div
                  className="flex p-5 rounded-lg mt-5 mb-5 bg-blue-300 border-2 border-black"
                  style={{ boxShadow: "0.4rem 0.4rem 0 #222" }}
                  key={i}
                >
                  <img
                    src="avatar2.png"
                    className="w-8 h-6 mr-2 -ml-1"
                    alt="user"
                  />
                  <div>
                    <span className="text-black">{d.message}</span>
                  </div>
                </div>
              )}
              {d.user === "dall-e" && (
                <div className="grid grid-cols-1 md:grid-cols-5 gap-4 mb-5">
                  {d.message.map((res, i) => {
                    return (
                      <React.Fragment key={i}>
                        <button
                          onClick={() => {
                            setShowModal(true);
                            setModalUrl(res.url);
                          }}
                        >
                          <img
                            className="max-w-lg rounded-sm w-full h-48 md:hover:h-44 border-2 border-black"
                            style={{ boxShadow: "0.4rem 0.4rem 0 #222" }}
                            src={res.url}
                            alt={`${i}`}
                          />
                        </button>
                      </React.Fragment>
                    );
                  })}
                  <Modals
                    onClose={handleOnClose}
                    visible={showModal}
                    url={modalUrl}
                    name={prompt}
                  />
                </div>
              )}
            </>
          ))}
          {loading && (
            <div className="relative">
              <div
                className="flex p-5 bg-yellow-400 rounded-lg mt-5 mb-5 border-2 border-black"
                style={{ boxShadow: "0.4rem 0.4rem 0 #222" }}
              >
                <img
                  src="openai-dark.png"
                  className="w-6 h-6 mr-3 rounded-lg"
                  alt="gpt"
                />
                <div className="col-3">
                  <div className="snippet" data-title="dot-pulse">
                    <div className="stage">
                      <div className="dot-pulse"></div>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          )}
        </div>
        {!showModal && (
          <div className="mt-auto flex flex-col sticky bottom-5 justify-start align-start">
            <div className="mb-2 text-gray-600 text-xs md:text-sm">
              Start with a detailed description
              <button
                className="ml-1 border-2 border-black px-2.5 py-1 rounded-md text-black bg-green-400 hover:bg-green-500 text-xs"
                style={{ boxShadow: "0.2rem 0.2rem 0 #222" }}
                //
                // |--------------------------------------------------------------------------
                // | NOTE: Uncomment this attribute 'onClick' to hit Generate a Surprise
                // |--------------------------------------------------------------------------
                // |
                // |
                //
                onClick={generateSurprise}
              >
                Surprise me
              </button>
            </div>
            <div
              className={`flex absolute bottom-0 right-0 md:pb-2.5 px-4 py-2.5 rounded-tr-md rounded-br-md ${
                prompt && "bg-black text-white px-4 py-2.5"
              }`}
            >
              <button
                className={`${!prompt && "cursor-not-allowed"}`}
                type="submit"
                //
                // |--------------------------------------------------------------------------
                // | NOTE: Uncomment this attribute 'onClick' to hit API OpenAI
                // |--------------------------------------------------------------------------
                // |
                // |
                //
                onClick={generateImage}
              >
                Generate
              </button>
            </div>
            <TextareaAutosize
              className="w-full border-2 border-black rounded-md placeholder-gray-500 resize-none py-2 pl-3 pr-10 md:pl-5 outline-none"
              placeholder="Enter your message here"
              style={{ boxShadow: "0.4rem 0.4rem 0 #222" }}
              maxRows={5}
              value={prompt}
              onChange={(e) => setPrompt(e.target.value)}
              //
              // |--------------------------------------------------------------------------
              // | NOTE: Give Comment on the two attributes below to enable input
              // |--------------------------------------------------------------------------
              // |
              // |
              //
              // disabled
              // readOnly
            />
          </div>
        )}
      </div>
    ...
};

Demo

  • ChatGPT
chatgpt.mp4
  • Dall-E
dalle-clideo.mp4

openai-project's People

Contributors

armandwipangestu avatar bimaryan avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.