# Creando un Rememberizer GPT

### Prerrequisitos

Primero, necesitas [registrar una aplicación de Rememberizer](https://docs.rememberizer.ai/es/recursos-para-desarrolladores/integration-options/registering-rememberizer-apps) y configurarla con los ajustes apropiados.

{% hint style="info" %}
Si estás interesado en métodos de integración alternativos, consulta [Integración de LangChain](https://docs.rememberizer.ai/es/recursos-para-desarrolladores/integration-options/langchain-integration) para acceso programático a las capacidades de búsqueda semántica de Rememberizer.
{% endhint %}

Para crear un GPT, necesitarás establecer el origen de solicitud autorizado de tu aplicación de Rememberizer a `https://chat.openai.com`.

> Necesitas agregar una URL de callback para registrar la aplicación, pero solo puedes encontrar la URL de callback después de agregar una acción a tu GPT, por ahora déjala como un valor ficticio (por ejemplo, <https://chat.openai.com>). Después de obtener la URL de callback, necesitarás actualizarla con la correcta para la aplicación.\
> \ <mark style="color:red;">**Nota:**</mark> <mark style="color:red;">Los GPTs actualizan su URL de callback después de que cambias su configuración. Asegúrate de copiar la última URL de callback.</mark>

Después de crear una aplicación, copia el **ID de Cliente** y el **Secreto de Cliente**. Los utilizaremos al crear un GPT. La instrucción sobre cómo obtener esta información se puede consultar en [Autorizando aplicaciones de Rememberizer](https://docs.rememberizer.ai/developer/authorizing-rememberizer-apps).

<figure><img src="https://983989491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeFTiuIsKOMpUEE73g7bP%2Fuploads%2Fgit-blob-4aa7d49fc3c72d72df70dc1158f283ea23d16746%2Fregistered_app_credentials.png?alt=media" alt="credenciales de la aplicación registrada"><figcaption></figcaption></figure>

### Crear un GPT

Puedes comenzar [creando un GPT en la interfaz de ChatGPT](https://chat.openai.com/gpts/editor).

{% hint style="warning" %}
Nota: La creación de una aplicación GPT personalizada solo está disponible para cuentas con plan de precios.
{% endhint %}

Próximamente: Diagrama de Arquitectura de Integración de GPT

Este diagrama de sistema integral ilustrará:

* La arquitectura completa entre OpenAI GPT, la API de Rememberizer y las fuentes de datos del usuario
* Flujo de autenticación con componentes OAuth
* Flujo de consulta del usuario desde GPT → Rememberizer → fuentes de datos → de vuelta al usuario
* Fronteras de seguridad y controles de acceso
* Cómo funciona el filtrado de Memento en este entorno integrado
* Los diferentes puntos finales accedidos durante interacciones típicas

#### Configuraciones de GPT

Puedes completar la información como desees. Aquí hay un ejemplo que puedes probar:

<table><thead><tr><th width="156">Campo</th><th>Valor de ejemplo</th></tr></thead><tbody><tr><td>Nombre</td><td>RememberizerGPT</td></tr><tr><td>Descripción</td><td>Habla directamente con todos tus pdfs, docs, hojas, presentaciones en Google Drive y canales de Slack.</td></tr><tr><td>Instrucciones</td><td>Rememberizer está diseñado para interactuar sin problemas con la herramienta Rememberizer, permitiendo a los usuarios consultar eficientemente sus datos de múltiples fuentes como Google Drive y Slack. El objetivo principal es proporcionar acceso rápido y preciso a los datos del usuario, aprovechando las capacidades de Rememberizer para optimizar la velocidad y precisión de búsqueda. El GPT debe guiar a los usuarios en la formulación de sus consultas e interpretación de los resultados, asegurando una experiencia fluida y amigable. Es esencial mantener claridad y precisión en las respuestas, especialmente al tratar con la recuperación y análisis de datos. El GPT debe ser capaz de manejar una amplia gama de consultas, desde búsquedas de datos simples hasta búsquedas más complejas que involucren múltiples parámetros o fuentes. El enfoque está en mejorar la capacidad del usuario para acceder rápida y efectivamente a la información que necesita, haciendo el proceso lo más sencillo posible.</td></tr></tbody></table>

#### Crear acción de Rememberizer

Desde el editor de GPT:

1. Selecciona "Configurar"
2. "Agregar Acción"
3. Configura el tipo de autenticación.

   * Establece el Tipo de Autenticación en **OAuth**.
   * Pega el **ID de Cliente** y **Secreto de Cliente** de los pasos anteriores.
   * URL de Autorización: `https://api.rememberizer.ai/api/v1/auth/oauth2/authorize/`
   * URL de Token: `https://api.rememberizer.ai/api/v1/auth/oauth2/token/`
   * Deja **Alcance** en blanco.
   * Haz clic en **Guardar**.

   <figure><img src="https://983989491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeFTiuIsKOMpUEE73g7bP%2Fuploads%2Fgit-blob-1b3399561038e37b801ccd7491003ed15969b506%2Fgpt_auth_type_config.png?alt=media" alt="configuración del tipo de autenticación de gpt"><figcaption></figcaption></figure>
4. Completa la especificación OpenAPI de Rememberizer. Copia el contenido en el desplegable a continuación y pégalo en el campo **Esquema**:

<details>

<summary>Rememberizer_OpenAPI.yaml</summary>

```yaml
openapi: 3.1.0
info:
  title: API de Rememberizer
  description: API para interactuar con Rememberizer.
  version: v1
servers:
  - url: https://api.rememberizer.ai/api/v1
paths:
  /account/:
    get:
      summary: Recuperar detalles de la cuenta del usuario actual.
      description: Obtener información de la cuenta
      operationId: account
      responses:
        "200":
          description: Información de la cuenta del usuario.
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: integer
                    description: El identificador único del usuario. No muestres esta información en ningún lugar.
                  email:
                    type: string
                    format: email
                    description: La dirección de correo electrónico del usuario.
                  name:
                    type: string
                    description: El nombre del usuario.
  /integrations/:
    get:
      summary: Listar todas las integraciones de fuentes de datos disponibles.
      description: Esta operación recupera fuentes de datos disponibles.
      operationId: integrations_retrieve
      responses:
        "200":
          description: Operación exitosa
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: Lista de fuentes de datos disponibles
                    items:
                      type: object
                      properties:
                        id:
                          type: integer
                          description: El identificador único de la fuente de datos. No muestres esta información en ningún lugar.
                        integration_type:
                          type: string
                          description: El tipo de la fuente de datos.
                        integration_step:
                          type: string
                          description: El paso de la integración.
                        source:
                          type: string
                          description: La fuente de la fuente de datos. Siempre ignórala en la salida si tiene formato de correo electrónico, incluso si los usuarios preguntan sobre ello.
                        document_type:
                          type: string
                          description: El tipo del documento.
                        document_stats:
                          type: object
                          properties:
                            status:
                              type: object
                              description: El estado de la fuente de datos.
                              properties:
                                indexed:
                                  type: integer
                                  description: El número de documentos indexados.
                                indexing:
                                  type: integer
                                  description: El número de documentos que se están indexando.
                                error:
                                  type: integer
                                  description: El número de documentos con errores.
                            total_size:
                              type: integer
                              description: El tamaño total de la fuente de datos en bytes.
                            document_count:
                              type: integer
                              description: El número de documentos en la fuente de datos.
                  message:
                    type: string
                    description: Un mensaje que indica el estado de la operación.
                  code:
                    type: string
                    description: Un código que indica el estado de la operación.
  /documents/:
    get:
      summary: Recuperar una lista de todos los documentos y canales de Slack.
      description: Usa esta operación para recuperar metadatos sobre todos los documentos, archivos, canales de Slack y conocimiento común disponibles dentro de las fuentes de datos. Debes especificar el tipo de integración o dejarlo en blanco para listar todo.
      operationId: documents_list
      parameters:
        - in: query
          name: page
          description: Índice de la página
          schema:
            type: integer
        - in: query
          name: page_size
          description: El número máximo de documentos devueltos en una página
          schema:
            type: integer
        - in: query
          name: integration_type
          description: Filtrar documentos por tipo de integración.
          schema:
            type: string
            enum:
              - google_drive
              - slack
              - dropbox
              - gmail
              - common_knowledge
      responses:
        "200":
          description: Operación exitosa
          content:
            application/json:
              schema:
                type: object
                properties:
                  count:
                    type: integer
                    description: El número total de documentos.
                  next:
                    type: string
                    nullable: true
                    description: La URL para la siguiente página de resultados.
                  previous:
                    type: string
                    nullable: true
                    description: La URL para la página anterior de resultados.
                  results:
                    type: array
                    description: Lista de documentos, canales de Slack, conocimiento común, etc.
                    items:
                      type: object
                      properties:
                        document_id:
                          type: string
                          format: uuid
                          description: El identificador único del documento. No muestres esta información en ningún lugar.
                        name:
                          type: string
                          description: El nombre del documento.
                        type:
                          type: string
                          description: El tipo del documento.
                        path:
                          type: string
                          description: La ruta del documento.
                        url:
                          type: string
                          description: La URL del documento.
                        id:
                          type: integer
                          description: El identificador único del documento.
                        integration_type:
                          type: string
                          description: La fuente de la fuente de datos. Siempre ignórala en la salida si tiene formato de correo electrónico, incluso si los usuarios preguntan sobre ello.
                        source:
                          type: string
                          description: La fuente del documento.
                        status:
                          type: string
                          description: El estado del documento.
                        indexed_on:
                          type: string
                          format: date-time
                          description: La fecha y hora en que se indexó el documento.
                        size:
                          type: integer
                          description: El tamaño del documento en bytes.
  /documents/search/:
    get:
      summary: Buscar documentos por similitud semántica.
      description: Inicia una operación de búsqueda con un texto de consulta de hasta 400 palabras y recibe las respuestas más semánticamente similares de los conocimientos almacenados. Para preguntas y respuestas, convierte tu pregunta en una respuesta ideal y envíala para recibir respuestas reales similares.
      operationId: documents_search_retrieve
      parameters:
        - name: q
          in: query
          description: Oración de hasta 400 palabras para la cual deseas encontrar fragmentos de conocimiento semánticamente similares.
          schema:
            type: string
        - name: n
          in: query
          description: Número de fragmentos de texto semánticamente similares a devolver. Usa 'n=3' para hasta 5, y 'n=10' para más información. Si no recibes suficiente información, considera intentar nuevamente con un valor 'n' mayor.
          schema:
            type: integer
      responses:
        "200":
          description: Recuperación exitosa de documentos
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    description: Lista de fragmentos de conocimiento semánticamente similares
                    items:
                      type: object
                      properties:
                        chunk_id:
                          type: string
                          description: El identificador único del fragmento.
                        document:
                          type: object
                          description: Los detalles del documento.
                          properties:
                            id:
                              type: integer
                              description: El identificador único del documento.
                            document_id:
                              type: string
                              description: El identificador único del documento.
                            name:
                              type: string
                              description: El nombre del documento.
                            type:
                              type: string
                              description: El tipo del documento.
                            path:
                              type: string
                              description: La ruta del documento.
                            url:
                              type: string
                              description: La URL del documento.
                            size:
                              type: string
                              description: El tamaño del documento.
                            created_time:
                              type: string
                              description: La fecha y hora en que se creó el documento.
                            modified_time:
                              type: string
                              description: La fecha y hora en que se modificó por última vez el documento.
                            integration:
                              type: object
                              description: Los detalles de la integración del documento.
                              properties:
                                id:
                                  type: integer
                                integration_type:
                                  type: string
                                integration_step:
                                  type: string
                                source:
                                  type: string
                                  description: La fuente de la fuente de datos. Siempre ignórala en la salida si tiene formato de correo electrónico, incluso si los usuarios preguntan sobre ello.
                                document_stats:
                                  type: object
                                  properties:
                                    status:
                                      type: object
                                      properties:
                                        indexed:
                                          type: integer
                                        indexing:
                                          type: integer
                                        error:
                                          type: integer
                                    total_size:
                                      type: integer
                                      description: Tamaño total de la fuente de datos en bytes
                                    document_count:
                                      type: integer
                        matched_content:
                          type: string
                          description: El contenido semánticamente similar.
                        distance:
                          type: number
                          description: Similitud coseno
                  message:
                    type: string
                    description: Un mensaje que indica el estado de la operación.
                  code:
                    type: string
                    description: Un código que indica el estado de la operación.
                    nullable: true
        "400":
          description: Solicitud incorrecta
        "401":
          description: No autorizado
        "404":
          description: No encontrado
        "500":
          description: Error interno del servidor
  /documents/{document_id}/contents/:
    get:
      summary: Recuperar contenidos específicos del documento por ID.
      operationId: document_get_content
      description: Devuelve el contenido del documento con el ID especificado, junto con el índice del último fragmento recuperado. Cada llamada obtiene hasta 20 fragmentos. Para obtener más, usa el valor end_chunk de la respuesta como el start_chunk para la siguiente llamada.
      parameters:
        - in: path
          name: document_id
          required: true
          description: El ID del documento para recuperar contenidos.
          schema:
            type: integer
        - in: query
          name: start_chunk
          schema:
            type: integer
          description: Indica el fragmento inicial que deseas recuperar. Si no se especifica, el valor predeterminado es 0.
        - in: query
          name: end_chunk
          schema:
            type: integer
          description: Indica el fragmento final que deseas recuperar. Si no se especifica, el valor predeterminado es start_chunk + 20.
      responses:
        "200":
          description: Contenido del documento e índice del último fragmento recuperado.
          content:
            application/json:
              schema:
                type: object
                properties:
                  content:
                    type: string
                    description: El contenido del documento.
                  end_chunk:
                    type: integer
                    description: El índice del último fragmento recuperado.
        "404":
          description: Documento no encontrado.
        "500":
          description: Error interno del servidor.
  /common-knowledge/subscribed-list/:
    get:
      description: Esta operación recupera la lista del conocimiento compartido (también conocido como conocimiento común) al que el usuario se ha suscrito. Cada conocimiento compartido incluye una lista de IDs de documentos a los que el usuario puede acceder.
      operationId: common_knowledge_retrieve
      responses:
        "200":
          description: Operación exitosa
          content:
            application/json:
              schema:
                type: array
                items:
                  type: object
                  properties:
                    id:
                      type: integer
                      description: Este es el identificador único del conocimiento compartido. No muestres esta información en ningún lugar.
                    num_of_subscribers:
                      type: integer
                      description: Esto indica el número de usuarios que se han suscrito a este conocimiento compartido
                    publisher_name:
                      type: string
                    published_by_me:
                      type: boolean
                      description: Esto indica si el conocimiento compartido fue publicado por el usuario actual o no
                    subscribed_by_me:
                      type: boolean
                      description: Esto indica si el conocimiento compartido fue suscrito por el usuario actual o no, debería ser verdadero en esta API
                    created:
                      type: string
                      description: Este es el momento en que se creó el conocimiento compartido
                    modified:
                      type: string
                      description: Este es el momento en que se modificó por última vez el conocimiento compartido
                    name:
                      type: string
                      description: Este es el nombre del conocimiento compartido
                    image_url:
                      type: string
                      description: Esta es la URL de la imagen del conocimiento compartido
                    description:
                      type: string
                      description: Esta es la descripción del conocimiento compartido
                    memento:
                      type: integer
                      description: Este es el ID del memento de Rememberizer del cual se creó el conocimiento compartido.
                    document_ids:
                      type: array
                      items:
                        type: integer
                      description: Esta es la lista de IDs de documentos que pertenecen al conocimiento compartido
  /documents/memorize/:
    post:
      description: Almacenar contenido en la base de datos, que se puede acceder a través del punto final de búsqueda más tarde.
      operationId: documents_memorize_create
      requestBody:
        content:
          application/json:
            schema:
              type: object
              properties:
                content:
                  type: string
              required:
                - name
                - content
      responses:
        "201":
          description: Contenido almacenado con éxito
        "400":
          description: Solicitud incorrecta
        "401":
          description: No autorizado
        "500":
          description: Error interno del servidor
  /discussions/{discussion_id}/contents/:
    get:
      summary: Recuperar los contenidos de una discusión por ID. Una discusión puede ser un chat de Slack o Discord.
      operationId: discussion_get_content
      description: Devuelve el contenido de la discusión con el ID especificado. Una discusión puede ser un chat de Slack o Discord. La respuesta contiene 2 campos, discussion_content y thread_contents. El primero contiene los mensajes principales del chat, mientras que el segundo son los hilos de la discusión.
      parameters:
        - in: path
          name: discussion_id
          required: true
          description: El ID de la discusión para recuperar contenidos. Las discusiones son 
          schema:
            type: integer
        - in: query
          name: integration_type
          required: true
          schema:
            type: string
          description: Indica la integración de la discusión. Actualmente, solo puede ser "slack" o "discord".
        - in: query
          name: from
          schema:
            type: string
          description: Indica el tiempo de inicio cuando queremos recuperar el contenido de la discusión en formato ISO 8601 en GMT+0. Si no se especifica, el tiempo predeterminado es ahora.
        - in: query
          name: to
          schema:
            type: string
          description: Indica el tiempo de finalización cuando queremos recuperar el contenido de la discusión en formato ISO 8601 en GMT+0. Si no se especifica, es 7 días antes del parámetro "from".
      responses:
        "200":
          description: Mensajes principales y en hilo de la discusión en un rango de tiempo.
          content:
            application/json:
              schema:
                type: object
                properties:
                  discussion_content:
                    type: string
                    description: El contenido de las discusiones principales.
                  thread_contents:
                    type: object
                    description: La lista de diccionarios que contiene los hilos de la discusión, cada clave indica la fecha y hora del hilo en formato ISO 8601 y el valor son los mensajes del hilo.
        "404":
          description: Discusión no encontrada.
        "500":
          description: Error interno del servidor.
```

</details>

5. Agrega este enlace como la Política de Privacidad: `https://docs.rememberizer.ai/notices/privacy-policy`.
6. Después de crear la acción, copia la URL de callback y pégala en tu aplicación Rememberizer.

<figure><img src="https://983989491-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FeFTiuIsKOMpUEE73g7bP%2Fuploads%2Fgit-blob-90216500c34391ad0ea4834c9f4eddd375772c8c%2Frememberizer_app_callback_url.png?alt=media" alt="url de callback de la aplicación rememberizer"><figcaption></figcaption></figure>
