Automatiza la Gestión de Tickets en React 18 con Outputs Estructurados de OpenAI

julioleiva

Julio Leiva Díaz

Posted on August 29, 2024

Automatiza la Gestión de Tickets en React 18 con Outputs Estructurados de OpenAI

En este tutorial, vamos a ver cómo integrar la nueva funcionalidad de Outputs Estructurados (Structured Outputs) de OpenAI en una aplicación de ticketing construida con React 18. Esta integración permitirá generar y asignar tickets de soporte automáticamente, basándote en las entradas de los usuarios.

Configuración del Backend con Node.js y OpenAI

Primero, configuraremos el backend usando Node.js y la API de OpenAI para manejar la generación y asignación automática de tickets.

Instalación de Dependencias

Asegúrate de tener instaladas las dependencias necesarias:

npm install express openai dotenv
Enter fullscreen mode Exit fullscreen mode

Configuración de OpenAI

Crea un archivo openai.js y configura la API de OpenAI para generar tickets basados en la entrada del usuario y asignarlos automáticamente a miembros del equipo.

// openai.js
import OpenAI from 'openai';

const openai = new OpenAI({
  apiKey: process.env.OPENAI_API_KEY // Asegúrate de tener tu API key en un archivo .env
});

// Simulación de una base de datos de miembros del equipo
const teamMembers = [
  { name: 'Alice', role: 'Support', available: true },
  { name: 'Bob', role: 'Support', available: true },
  { name: 'Charlie', role: 'Support', available: false },
];

const schema = {
  type: 'object',
  properties: {
    title: { type: 'string' },
    description: { type: 'string' },
    priority: { type: 'string', enum: ['low', 'medium', 'high'] },
    assigned_to: { type: ['string', 'null'] },
    status: { type: 'string', enum: ['open', 'in_progress', 'closed'] }
  },
  required: ['title', 'description', 'priority', 'status'],
  additionalProperties: false
};

// Función para asignar tickets automáticamente basado en disponibilidad
async function assignTicket(priority) {
  const availableMember = teamMembers.find(member => member.available);
  return availableMember ? availableMember.name : null;
}

async function generateTicket(userInput) {
  const completion = await openai.chat.completions.create({
    model: 'gpt-4o-2024-08-06',
    messages: [
      { role: 'system', content: 'You are a support ticket assistant.' },
      { role: 'user', content: userInput }
    ],
    response_format: {
      type: 'json_schema',
      json_schema: schema
    }
  });

  let ticket = completion.choices[0]?.message?.parsed || null;

  if (ticket) {
    // Asignar automáticamente el ticket
    ticket.assigned_to = await assignTicket(ticket.priority);
  }

  return ticket;
}

export { generateTicket };
Enter fullscreen mode Exit fullscreen mode

Configura el Servidor Express

Ahora, configura un servidor básico con Express para manejar las solicitudes desde tu frontend React.

// server.js
import express from 'express';
import { generateTicket } from './openai';

const app = express();
app.use(express.json());

app.post('/api/generate-ticket', async (req, res) => {
  const { userInput } = req.body;
  const ticket = await generateTicket(userInput);
  res.json({ ticket });
});

app.listen(3001, () => {
  console.log('Server running on http://localhost:3001');
});
Enter fullscreen mode Exit fullscreen mode

Configuración del Frontend en React 18

En el frontend, vamos a construir una sencilla interfaz en React 18 que permita a los usuarios describir su problema y generar un ticket automáticamente.

Componente de React

Crea un componente TicketingApp.js para gestionar la interfaz de usuario.

// TicketingApp.jsx
import React, { useState } from 'react';

function TicketingApp() {
  const [userInput, setUserInput] = useState('');
  const [ticket, setTicket] = useState(null);

  const handleSubmit = async (e) => {
    e.preventDefault();
    const response = await fetch('/api/generate-ticket', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({ userInput })
    });
    const data = await response.json();
    setTicket(data.ticket);
  };

  return (
    <div>
      <h1>Ticketing System</h1>
      <form onSubmit={handleSubmit}>
        <textarea
          value={userInput}
          onChange={(e) => setUserInput(e.target.value)}
          placeholder="Describe your issue..."
        />
        <button type="submit">Generate Ticket</button>
      </form>

      {ticket && (
        <div>
          <h2>Generated Ticket</h2>
          <p><strong>Title:</strong> {ticket.title}</p>
          <p><strong>Description:</strong> {ticket.description}</p>
          <p><strong>Priority:</strong> {ticket.priority}</p>
          <p><strong>Status:</strong> {ticket.status}</p>
          {ticket.assigned_to && <p><strong>Assigned to:</strong> {ticket.assigned_to}</p>}
        </div>
      )}
    </div>
  );
}

export default TicketingApp;
Enter fullscreen mode Exit fullscreen mode

Integración en tu Proyecto React

Asegúrate de incluir TicketingApp en tu proyecto React:

// App.jsx
import React from 'react';
import TicketingApp from './TicketingApp';

function App() {
  return (
    <div className="App">
      <TicketingApp />
    </div>
  );
}

export default App;
Enter fullscreen mode Exit fullscreen mode

Conclusión

Este es solo el comienzo; trata ahora de ecalar la app expandiendo la lógica de asignación, añadiendo manejo de errores...

💖 💪 🙅 🚩
julioleiva
Julio Leiva Díaz

Posted on August 29, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related