DEV Community

Tom Yahav
Tom Yahav

Posted on

AI‑Enhanced React: Build Your First Chatbot in less than 10 Minutes 🚀

Want a hands-on tutorial that shows you exactly how to build a React chatbot powered by OpenAI? Let’s dive in!


🧰 Why Do This?

  • Adds real AI interaction capability to your front-end.
  • Teaches prompt chaining and handling context.
  • Great portfolio piece and learning experience.

🔧 What You’ll Need

  1. OpenAI API key
  2. Node.js & npm or yarn
  3. Create React App or Vite setup

1. Set Up Your React Project

npx create-react-app ai-chatbot
cd ai-chatbot
npm install openai
Enter fullscreen mode Exit fullscreen mode

2. Secure Your API Key

Create .env.local:

REACT_APP_OPENAI_KEY=your_api_key_here
Enter fullscreen mode Exit fullscreen mode

⚠️ Never commit this file.


3. Create a Simple Backend Proxy

Since we don’t want to expose API keys in the client, create a quick Express server:

npm install express openai dotenv

// server.js
import express from 'express'
import OpenAI from 'openai'
import 'dotenv/config'

const app = express()
app.use(express.json())
const openai = new OpenAI({ apiKey: process.env.OPENAI_KEY })

app.post('/chat', async (req, res) => {
  const { messages } = req.body
  const resp = await openai.chat.completions.create({
    model: 'gpt-3.5-turbo',
    messages,
  })
  res.json({ reply: resp.choices[0].message.content })
})

app.listen(6000, () => console.log('API ready!'))
Enter fullscreen mode Exit fullscreen mode

4. Connect Front‑end Chat UI

In src/App.js:

import React, { useState } from 'react'

function App() {
  const [msg, setMsg] = useState('')
  const [history, setHistory] = useState([])

  const sendMsg = async () => {
    const userMsg = { role: 'user', content: msg }
    const updated = [...history, userMsg]
    setHistory(updated)
    setMsg('')

    const resp = await fetch('/chat', {
      method: 'POST',
      headers: {'Content-Type':'application/json'},
      body: JSON.stringify({ messages: updated })
    }).then(r => r.json())

    setHistory([...updated, { role: 'assistant', content: resp.reply }])
  }

  return (
    <div>
      {history.map((m,i) =>
        <div key={i} className={m.role}>{m.content}</div>
      )}
      <input value={msg} onChange={e => setMsg(e.target.value)} />
      <button onClick={sendMsg}>Send</button>
    </div>
  )
}

export default App
Enter fullscreen mode Exit fullscreen mode

5. Improve the UX

  • Add a system message for personality
  • Show loading state
  • Add auto-scroll to the bottom
  • Style the chat bubbles

✅ Customizing Tips

  • Switch model to gpt-4 if you have access.
  • Stream responses for a “typewriter effect” (like this tutorial suggests)
  • Consider deploying the Express server with Vercel or Heroku.

👏 What You’ve Built

You now have a chat interface that:

  • Takes input from the user
  • Sends prompts (with conversation history) to OpenAI
  • Receives and displays AI responses

All in a modern React app with clean separation of front/back-end logic.


🚀 What’s Next?

  • Add message persistence (localStorage or a DB)
  • Improve accessibility and UX
  • Integrate with React frameworks like Next.js
  • Deploy your chatbot and show it off!

Top comments (0)