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. Este artículo te guiará a través del proceso de creación de un plugin desde cero, proporcionándote las herramientas y el conocimiento que necesitas para personalizar y mejorar las respuestas de ChatGPT.

Vamos a empezar por el principio pero si quieres ir directamente el resultado, te dejo el repo en GitHub. Si quieres explorar otras opciones con GPT, échale un vistazo a esta otra página.

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

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.

Por ejemplo, podría crear un plugin que permita a ChatGPT interactuar con una API de pronóstico del tiempo. Esto permitiría a ChatGPT proporcionar respuestas en tiempo real a las preguntas sobre el clima. O podría crear un plugin que permita a ChatGPT interactuar con una base de datos de recetas, lo que permitiría a ChatGPT sugerir recetas basadas en los ingredientes que tengo a mano.

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. GPT4 es una versión avanzada de la tecnología de generación de texto de OpenAI, que puede ser utilizada para generar código en una variedad de lenguajes de programación. Puedes obtener más información sobre GPT-4 en la página de OpenAI.
  • Además, utilizaremos CodeSandbox para desplegar nuestro plugin. CodeSandbox es una plataforma en línea que permite a los desarrolladores crear, compartir y desplegar aplicaciones web. Puedes obtener más información sobre CodeSandbox en su página oficial.
  • Finalmente, como mencioné anteriormente, utilizaremos la Crunchbase Basic API para buscar información sobre empresas. Crunchbase es una plataforma que proporciona información sobre empresas privadas y públicas, incluyendo noticias, inversiones y financiación. Puedes obtener más información sobre la Crunchbase Basic API en su documentación oficial.

En general, vamos a seguir las indicaciones del post de OpenAI sobre Plugins y en particular, el último video.

Configuración inicial

Antes de empezar, necesitamos configurar las herramientas que te contaba:

  • 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:
      • Estos son los endpoints que están disponibles en la versión BASIC. Utilizaremos el «Organization Search«.
      • Los datos que puedes recuperar utilizando la versión BASIC los tienes aquí. Están incluidos dentro del esquema «Organization«.
Crunchbase API
Pantalla de generación de la API_KEY de Crunchbase
  • CodeSandbox: Aquí puedes dar de alta una cuenta gratuita. Si te registras utilizando tu usuario de GitHub, podrás enlazar ambos entornos para desarrollar de forma más ágil. Una vez registrado, puedes duplicar mi máquina virtual para tenerlo todo listo y poder modificar el código de acuerdo a tus necesidades.

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, que lo excluya de las especificaciones openapi y que no sirva ningún contenido estático más.
  • Aquí viene lo interesante, utilizando el plugin WebPilot, le vamos a dar indicaciones de donde tiene información para utilizar la API de Crunchbase: el endpoint POST de Search Organizations y el esquema para que sepa los campos (fields_id) y los operadores que puede utilizar para la consulta.

Pues ya casi lo tenemos. Aquí os dejo un link a toda la conversación que tuve con ChatGPT para generar el código. Tened en cuenta que siempre hay pequeños detalles que ir ajustando pero se lo podemos seguir pidiendo. Si tenéis alguna duda sobre los cambios, dejadme un comentario.

Después de esos ajustes, 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))
    print("\n",data,"\n")
    print(response.json())
    response_data = response.json()
    if response.status_code == 200:
        # Extract the required fields
        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)
        # Convert the extracted data to a JSON string
        extracted_data_json = json.dumps(extracted_data)
        print("\n", extracted_data_json)
        
        return extracted_data_json
        # return response.json()
    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 as a third-party service",
        routes=app.routes,
    ))


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", 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. Recuerda reiniciar la máquina virtual para que se instalen correctamente.

El siguiente paso es actualizar el fichero main.py con el código anterior.

La maquina ya debería estar sirviendo peticiones por lo que podrías utilizar Postman por ejemplo para probarla. La url que deberás utilizar la tienes en la pestaña start:8000 de las herramientas de desarrollo de CodeSandBox.

Si detectáis algún error, sobre todo con las peticiones a Crunchbase, es interesante incluir mensajes a la consola para poder depurar esos errores.

El fichero manisfest.json

Ahora sólo nos quedaría utilizar la plantilla del fichero manisfest.json que indica OpenAI para incluir nuestras adaptaciones. Os recuerdo las buenas prácticas que nos ofrece OpenAI para estas descripciones. En nuestro caso, serían estas:

{
    "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://diegoromero.es/wp-content/uploads/2021/10/cropped-network-icon-3.png",
    "contact_email": "example@example.com",
    "legal_info_url": "https://example.com/legal"
}

Como podeis comprobar, lo principal es que esté correctamente descrito para que el modelo sea capaz de utilizar el plugin (description_for_model). En cuanto al logo, yo he incluido el de mi web para que aparezca correctamente en la interfaz de ChatGPT y se pueda identificar.

Listo. Vamos a comprobar que todo funciona con ChatGPT.

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.

Os dejo un link a la conversación de prueba una vez instalado donde podréis comprobar que, de forma transparente, también es multiidioma sin configurar nada extra.

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 para que pueda ser interpretada correctamente e integrada en la conversación.

A partir de aqui, se pueden expandir las capacidades de búsqueda y recuperación de información no solo de las empresas si no de las rondas de financiación en función de las fechas, inversores, … si dispones de un acceso Enterprise a la API de Crunchbase.

Consideraciones finales

Este ejercicio de exploración con plugins, generación automática de código y APIs de terceros ha sido más que un simple experimento técnico; ha sido una demostración de cómo podemos ampliar y mejorar las capacidades de las herramientas de inteligencia artificial como ChatGPT. Con la ayuda de GPT4, he podido conectar datos de manera efectiva y sencilla, llevando las capacidades de ChatGPT a un nuevo nivel.

Pero lo que hace que este ejercicio sea aún más emocionante es su relevancia y aplicabilidad en el mundo real. Estas capacidades mejoradas no se limitan a ChatGPT; también se extienden a BingChat y al resto del ecosistema de Microsoft ya que ahora serán compatibles entre todas las plataformas. Esto significa que las posibilidades de uso son enormes, abarcando una amplia gama de aplicaciones y contextos.

Microsoft Build Keynote

Además, la integración de librerías como LangChain o LlamaIndex añade otra capa de funcionalidad y flexibilidad. Estas librerías pueden gestionar los plugins, convirtiéndose en herramientas valiosas para el desarrollo de agentes. Esto abre un nuevo mundo de posibilidades, permitiendo la creación de soluciones más sofisticadas y personalizadas.

Desde una perspectiva personal, este ejercicio ha sido una revelación. Me ha mostrado cómo una herramienta como ChatGPT/GPT4 puede potenciar mi productividad y capacidad de innovación de formas que nunca antes había imaginado. Me ha permitido explorar temas que, hasta ahora, parecían estar fuera de mi alcance, como las APIs y los entornos de despliegue. Y lo ha hecho de una manera directa y accesible, eliminando las barreras que solían existir. Con la ayuda de ChatGPT/GPT4, he podido sumergirme en áreas que antes me parecían intimidantes y he descubierto que no sólo puedo entenderlas, sino que también puedo utilizarlas para innovar y crear.

Pero lo que es aún más impresionante es que todo esto ha sido posible gracias a las capacidades de los modelos de lenguaje (LLM, por sus siglas en inglés). Estos modelos no son simplemente herramientas; son asistentes personales y coaches que pueden guiarnos a través de temas complejos y ayudarnos a entender y utilizar tecnologías avanzadas.

En resumen, este ejercicio ha sido más que una demostración técnica; ha sido una experiencia de aprendizaje y crecimiento personal. Me ha mostrado cómo las herramientas de inteligencia artificial pueden ayudarnos a expandir nuestras habilidades y capacidades, y estoy emocionado por explorar aún más las posibilidades que ofrecen.

powered by Crunchbase

Crunchbase BASIC APIs ha sido central en este ejercicio. Hace mucho tiempo que utilizo esta base de datos en mi trabajo. Poner a disposición de todo el mundo unos datos básicos de todas las empresas que siguen para Market & Research Intelligence es de agradecer.