Tabla de contenido
Una vez más aquí. Hoy vengo a dejar una pequeña aplicación Python para utilizar ChatGPT desde la terminal de Ubuntu. Esto es algo que por casualidad me encontré en el canal de Youtube de MoureDev, el cual no conocía, y me encantó. El caso, es que ahí, este fantástico comunicador explicaba de forma sencilla cómo usar ChatGPT desde Python.
Después de verme el vídeo de tan solo 9 minutos, me pregunté si no podría ampliar un poco más el script que mostraba en el vídeo (por simple curiosidad). Pues todo esto, y mucho más, que se va a ver en el código que vamos a ver a continuación, se puede consultar en la página de documentación de la aplicación ChatGPT. Además, también me va a servir para conocer una alternativa diferente para interactuar con ChatGPT a las que mencionaba en el artículo ChatGPT: Clientes de Escritorio y complementos para navegadores.
Crear una API KEY para utilizar ChatGPT
Antes de meterse a crear aplicación alguna, es necesario disponer de una API KEY. Para conseguirla, será necesario crear una cuenta en OpenAI. Cuando tengamos creada la cuenta, bastará con acceder con nuestras credenciales, y veremos algo como lo que se muestra en la siguiente captura:
Como se puede ver, si desplegamos el menú de la parte superior derecha, veremos en el desplegable la opción View API Keys. La cual nos llevará a la siguiente pantalla.
Y en esta pantalla solo tendremos que pulsar sobre el botón «Create new secret Key» para generar la API Key que nos hará falta más adelante. Esta es importante guardarla a mano.
Un vistazo a esta aplicación Python para utilizar ChatGPT
Una vez que disponemos de nuestra API Key, ya podemos dirigirnos a nuestro editor favorito y comenzar a escribir el código de la aplicación Python para utilizar ChatGPT.
El código que vamos a ver a con tinuación es un programa de consola, el cual implementa un asistente de chat basado en GPT-3, utilizando la API de OpenAI para generar respuestas a las entradas del usuario.
La aplicación presenta una tabla de comandos disponibles al usuario, lo que permitirá realizar acciones como; iniciar una nueva conversación, borrar la conversación actual, buscar en Google, enviar un correo electrónico y exportar la conversación actual a un archivo de texto. Además, hay un comando para mostrar el historial de mensajes, y otro para mostrar el listado de comandos en cualquier momento de la conversación.
La opción para enviar un email, hay que configurarla con los datos del servidor que queramos utilizar. Hay que mencionar que en algunos casos será necesario realizar una configuración adicional en el servidor que vayamos a utilizar, para que nos permita enviar correos desde esta aplicación.
El programa se ejecuta en un bucle mientras espera que el usuario escriba un mensaje, y luego utiliza la API de OpenAI para generar una respuesta (con más o menos sentido). Las respuestas generadas se imprimen en la consola. Además estos se agrega cada mensaje del usuario y del asistente a una lista de mensajes para mantener el historial de la conversación. El historial de la conversación también se puede exportar a un archivo de texto.
El código de la aplicación
import openai import typer import webbrowser from rich.console import Console from rich.prompt import Prompt from rich import print from rich.table import Table from smtplib import SMTP, SMTP_SSL from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart # Configuración de la consola console = Console() def main(): openai.api_key = "XXXXXXXXXXXXXXXXXXXXXXX" # La API KEY se genera en https://platform.openai.com/ # Se imprime el título y se muestra una tabla con los comandos disponibles console.print("💬 [bold red]Una aplicación ChatGPT creada con Python[/bold red] 💬\n") table = Table(title="Comandos disponibles", show_header=True, header_style="bold green") table.add_column("Comando") table.add_column("Descripción") table.add_row("🆕 [bold]new[/bold]", "Crear una nueva conversación") table.add_row("🗑️ [bold]clear[/bold]", "Eliminar los mensajes de la conversación de la pantalla") table.add_row("✅ [bold]export[/bold]", "Exportar la conversación actual a un archivo de texto") table.add_row("📧 [bold]send_email[/bold]", "Enviar un correo electrónico") table.add_row("🔎 [bold]search[/bold]", "Buscar directamente en google") table.add_row("📜 [bold]history[/bold]", "Mostrar el historial de mensajes") table.add_row("🤖 [bold]help[/bold]", "Muestra esta tabla de comandos en cualquier momento de la conversación") table.add_row("👋 [bold]exit[/bold]", "Salir de la aplicación") console.print(table) # Contexto del asistente context = {"role": "system", "content": "Esto es una aplicación Python."} messages = [context] while True: content = __prompt() # Comandos .... # Si el usuario escribe "new", se crea una nueva conversación if content.lower() == "new": print("🆕 Se ha creado una nueva conversación 🆕") messages = [context] content = __prompt() continue # Si el usuario escribe export, se exporta la conversación actual a un archivo de texto elif content.lower() == "export": export_conversation(messages) console.print("✅ Conversación exportada correctamente ✅\n") continue # Si el usuario escribe "search", se le pide qué término quiere buscar y se abre una pestaña en el navegador con los resultados elif content.lower() == "search": term = typer.prompt("¿Qué quieres buscar en google?") url = f"https://www.google.com/search?q={term}" webbrowser.open_new_tab(url) console.print(f"🔎 Buscando '{term}' en el navegador web 🔎\n") continue # Si el usuario escribe "clear", se eliminan todos los mensajes excepto el mensaje inicial del sistema elif content.lower() == "clear": console.clear() console.print("🗑️ Conversación actual eliminada 🗑️\n") continue # Si el usuario escribe "send_mail", se llama a la función send_email con los parámetros necesarios elif content.lower() == "send_email": to_address = Prompt.ask("Escribe la dirección de correo electrónico del destinatario") subject = Prompt.ask("Escribe el asunto del correo electrónico") body = Prompt.ask("Escribe el cuerpo del correo electrónico") send_email(to_address, subject, body) continue # Agregar un bloque de código en el bucle principal que maneje el comando "history" elif content.lower() == "history": show_history(messages) continue # Si el usuario escribe "help", se imprime una lista con los comandos disponibles elif content.lower() == "help": console.print(table) continue # saltar la llamada a la API de OpenAI y la respuesta messages.append({"role": "user", "content": content}) response = openai.ChatCompletion.create( model="gpt-3.5-turbo", # El motor que vamos a utilizar, podríamos cambiarlo por text-davinci-002 messages=messages, max_tokens=2048, temperature=1, # un valor menor equivale a respuestas más conservadoras, un valor mayor dará respuestas más aleatorias e impredecibles n=1, stop=None, presence_penalty=0.5, frequency_penalty=0.5,) response_content = response.choices[0].message.content messages.append({"role": "assistant", "content": response_content}) print(f"[bold red]> [/bold red] [green]{response_content}[/green]") # Función para guardar la conversación en el archivo conversacion.txt, machacando el contenido anterior def export_conversation(messages): with open("conversacion.txt", "w") as file: for message in messages: file.write(f"{message['role']}: {message['content']}\n") # Función para mostrar el historial de mensajes def show_history(messages): console.print("\nHistorial de mensajes:") for message in messages: role = message["role"] content = message["content"] if role == "system": console.print(f"[bold blue]{role}:[/bold blue] {content}") elif role == "user": console.print(f"[bold green]{role}:[/bold green] {content}") else: console.print(f"[bold red]{role}:[/bold red] {content}") console.print() # Función para enviar correos electrónicos. Es necesario añadir los valores correspondientes de la cuenta que queramos utilizar def send_email(to_address, subject, body): from_address = 'XXXXXXX' password = 'XXXXXXX' smtp_server = 'XXXXXXXXXXX' smtp_port = 465 # Crear el objeto MIME message = MIMEMultipart() message['From'] = from_address message['To'] = to_address message['Subject'] = subject # Agregar el cuerpo del correo electrónico message.attach(MIMEText(body, 'plain')) # Establecer la conexión con el servidor SMTP smtp_server = SMTP(smtp_server, smtp_port) smtp_server.starttls() smtp_server.login(from_address, password) # Enviar el correo electrónico smtp_server.send_message(message) # Cerrar la conexión smtp_server.quit() console.print(f"📧 El correo electrónico ha sido enviado a {to_address} 📧\n") # Función para generar el prompt que se enviará a OpenAI def generate_prompt(messages): prompt = "" for message in messages: if message["role"] == "system": prompt += message["content"] + "\n" elif message["role"] == "user": prompt += f"Usuario: {message['content']}\n" else: prompt += f"{message['content']}\n" return prompt def __prompt() -> str: prompt = typer.prompt("\nEscribe tu pregunta") if prompt == "exit": exit = typer.confirm("¿Estás seguro de que quieres salir?") if exit: print("👋 ¡Hasta pronto! ✋") raise typer.Abort() return __prompt() return prompt if __name__ == "__main__": typer.run(main)
Una vez guardado todo dentro del archivo, que en mi caso llamé index.py, solo hay que lanzarlo desde la terminal con Python. En mi caso, como tengo varias versiones de Python, utilicé:
python3.11 index.py
Esta aplicación, además de dejarla aquí colgada, también la he subido a un repositorio en GitHub, desde donde se puede consultar el mismo código que aparece aquí.
Quiero decir antes de terminar, que la aplicación funcionó correctamente en Ubuntu 22.04, pero supongo que funcionará en cualquier lugar en el que Python esté instalado. Si algunos de los imports no los reconoce, será necesario instalarlo mediante PIP. El código creo que es bastante claro, y si alguien con tan pocos conocimientos como yo en Python ha podido interactuar con ChatGPT desde la terminal, no dudo que mucha gente podrá mejorar mucho la aplicación.