ChatGPT y Crunchbase API: Cómo Crear un Plugin desde Cero

ChatGPT y Crunchbase API: Cómo Crear un Plugin desde Cero

Descubre cómo crear plugins para ChatGPT en este tutorial completo y paso a paso. Aprende a ampliar las capacidades de ChatGPT utilizando la Crunchbase Basic APIs como servicio de datos.

Como desarrollador, siempre busco formas de ampliar y mejorar las capacidades de las herramientas que utilizo. Recientemente, he estado trabajando con ChatGPT de OpenAI y he descubierto una característica fascinante: los plugins.

Un plugin para ChatGPT es esencialmente una extensión que permite a ChatGPT interactuar con APIs, bases de datos y otros servicios. Esto significa que puedo personalizar y mejorar las respuestas de ChatGPT, permitiéndole proporcionar información más rica y precisa.

Vamos a empezar por el principio pero si quieres ir directamente el resultado, te dejo el repo en GitHub y la máquina virtual en CodeSandbox.

¿Qué son los Plugins para ChatGPT y qué pueden hacer?

Los plugins son herramientas diseñadas específicamente para modelos de lenguaje con la seguridad como principio básico, que ayudan a ChatGPT a acceder a información actualizada, ejecutar cálculos o utilizar servicios de terceros.

Objetivo del Tutorial

El objetivo principal de este tutorial es guiarte a través del proceso de creación de un plugin para ChatGPT que pueda buscar información de empresas utilizando un servicio de terceros, en este caso, la base de datos de empresas y rondas de financiación Crunchbase.

Para lograr este objetivo, vamos a utilizar varias herramientas:

  • Primero, utilizaremos GPT4 en ChatGPT para la generación de código.
  • Además, utilizaremos CodeSandbox para desplegar nuestro plugin.
  • Finalmente, utilizaremos la Crunchbase Basic API para buscar información sobre empresas.

Configuración inicial

Antes de empezar, necesitamos configurar las herramientas:

  • ChatGPT y GPT4: para probar los plugins, necesitarás darte de alta como desarrollador. Sigue estas instrucciones para apuntarte a la lista de espera. Puedes avanzar con el tutorial mientras OpenAI revisa tu solicitud.
  • Crunchbase Basic API: necesitaras un CRUNCHBASE_API_KEY así que primero tienes que darte de alta como usuario (es gratis). Una vez registrado sigue estas instrucciones.

Ve a tu área personal (Account Settings), verás el apartado «Integrations» y ahi, Crunchbase API. Ya puedes generar la API_KEY para acceder a los datos.

Crunchbase API Pantalla de generación de la API_KEY de Crunchbase

Primer paso: crear tu API

En general, los plugins tienen tres elementos principales: tu API, la especificación de la misma para que OpenAI pueda entenderlo y el manifiesto que va a describirla para que ChatGPT pueda usarla. Recuerda que un plugin no es más que una herramienta que ChatGPT puede utilizar así que necesitarás describir correctamente su funcionalidad.

¿Cómo describirías la función básica del plugin (y por tanto de tu API)? En este caso sería algo así:

Company search and lookup application that lets the user to search for companies and retrieve information from them using the Crunchbase API. The search for companies will be based on their name.

Con esta descripción, vamos a pedirle a ChatGPT que nos genere el esqueleto básico de nuestra API para luego mejorarlo. Utilizaremos esta plantilla a la que hemos incorporado la descripción general de nuestra API:

Write a company search and lookup application using FastAPI that lets the user to search for companies and retrieve information from them using the Crunchbase API. The search for companies will be based on their name. Include a '__main__' section which will run this app using uvicorn. The python module where I save this code will be called 'main.py'. In addition to the normal endpoints, include a route '/.well-known/ai-plugin.json which serces (as JSON) the contents of './manifest.json', located in the same directory as 'main.py'. Exclude this endpoint from the OpenAPI spec and don't serve any other static content. The specification of Crunchbase's API is in this swagger https://app.swaggerhub.com/apis-docs/Crunchbase/crunchbase-enterprise_api/1.0.3 You will use the endpoint Search Organizations (POST) to search for companies based on their name and you will fetch the following fields: 'name', 'short-description' and 'website'. The endpoints you will use from this API will be: - Search Organizations (POST): https://app.swaggerhub.com/apis-docs/Crunchbase/crunchbase-enterprise_api/1.0.3#/Search/post_searches_organizations The information with the Organizations' schema is here: https://app.swaggerhub.com/apis-docs/Crunchbase/crunchbase-enterprise_api/1.0.3#/Organization

Vamos a ver qué le hemos pedido:

  • En primer lugar, le hemos descrito el objeto de la tarea y los requerimientos básicos para utilizar FastAPI y Crunchbase.
  • Le hemos indicado que el código estará en un fichero «main.py» y que será servido con «uvicorn».
  • Siguiendo las especificaciones de OpenAI, le pedimos que el fichero manifest.json sea servido en la url que indica OpenAI, es decir, /.well-known/ai-plugin.json.

Aquí os dejo el código que utilizaremos en CodeSandbox:

from fastapi import FastAPI, HTTPException
from fastapi.responses import JSONResponse
from fastapi.openapi.utils import get_openapi
from pydantic import BaseModel
import requests
import json
import os

app = FastAPI()

class Company(BaseModel):
    name: str

@app.post("/search")
async def search_company(company: Company):
    user_key = os.getenv('CRUNCHBASE_API_KEY')
    url = f"https://api.crunchbase.com/api/v4/searches/organizations?user_key={user_key}"
    
    data = {
        "field_ids": ["name", "short_description", "website_url", "image_url"],
        "query": [
            {
                "type": "predicate",
                "field_id": "identifier",
                "operator_id": "contains",
                "values": [company.name]
            }
        ],
        "limit": 5
    }
    
    response = requests.post(url, data=json.dumps(data))
    if response.status_code == 200:
        response_data = response.json()
        extracted_data = []
        for entity in response_data['entities']:
            extracted_entity = {
                'company_name': entity['properties'].get('name', None),
                'description': entity['properties'].get('short_description', None),
                'website_url': entity['properties'].get('website_url', None),
                'image_url': entity['properties'].get('image_url', None),
            }
            extracted_data.append(extracted_entity)
        return extracted_data
    else:
        raise HTTPException(status_code=400, detail="Unable to fetch data from Crunchbase API")

@app.get("/.well-known/ai-plugin.json", include_in_schema=False)
async def read_manifest():
    try:
        with open('./manifest.json', 'r') as file:
            data = json.load(file)
            return JSONResponse(content=data)
    except FileNotFoundError:
        raise HTTPException(status_code=404, detail="manifest.json not found")

@app.get("/openai.json")
async def get_openapi_json():
    return JSONResponse(get_openapi(
        title="API for Crunchbase ChatGPT Plugin",
        version="0.9.0",
        description="Sample API exposing an enterprise search endpoint using Crunchbase's Basic API",
        routes=app.routes,
    ))

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

Desplegando al API en CodeSandbox

Una vez registrado en la plataforma, bastará con que crees una nueva máquina basada en Python. Una vez que ha terminado de desplegarse, tendrás acceso a los ficheros. Lo primero, tienes que incluir en requirements.txt las librerías que necesitamos: fastapi, uvicorn y requests.

CodeSandbox Deploy

La maquina ya debería estar sirviendo peticiones por lo que podrías utilizar Postman por ejemplo para probarla.

Postman Test

El fichero manifest.json

Ahora sólo nos quedaría utilizar la plantilla del fichero manifest.json para incluir nuestras adaptaciones.

{
  "schema_version": "v1",
  "name_for_human": "Crunchbase Plugin",
  "name_for_model": "crunchbase_plugin",
  "description_for_human": "Company information search provided by Crunchbase Basic API (name, description, website and image)",
  "description_for_model": "Plugin for company information search. You can search for companies by name and the information retrieved is their name, description, website and image.",
  "auth": {
    "type": "none"
  },
  "api": {
    "type": "openapi",
    "url": "/openai.json"
  },
  "logo_url": "https://data.crunchbase.com/docs/crunchbase-basic-getting-started",
  "contact_email": "",
  "legal_info_url": ""
}

Instalación del plugin con ChatGPT

Si todo ha ido bien, ahora solo es necesario proporcionar la URL de la máquina virtual donde esta corriendo nuestra API en el Plugin Store del interfaz de ChatGPT. Aquí tenéis la secuencia.

Paso 1 Paso 2 Paso 3 Paso 4 Paso 5 Paso 6 Paso 7 Paso 8 Paso 9

Próximos pasos

Como habéis podido ver, el proceso de crear un plugin es sencillo. La complejidad está en la gestión de la información que sirve la API de datos y como está se presenta a la interfaz de ChatGPT.

Consideraciones finales

Este ejercicio de exploración ha sido una demostración de cómo podemos ampliar las capacidades de la IA. Con la ayuda de GPT4, he podido conectar datos de manera efectiva y sencilla.

powered by Crunchbase

Powered by Crunchbase

Crunchbase BASIC APIs ha sido central en este ejercicio. Hace mucho tiempo que utilizo esta base de datos en mi trabajo.