# Trabajar con clientes y CRM

## Trabajando con clientes

<mark style="color:rojo;">**LEYENDA:**</mark>

was\_in\_state() | days\_from\_last\_message() | free\_client() | assign\_to\_user() | distribute\_client()| get\_operator() | get\_operator\_name() | delete\_pended\_messages() | set\_note() | add\_unread() | clear\_unread() | unsubscribe()|block\_client() | unblock\_client() | set\_client\_name() | get\_bind\_clients() | get\_current\_pipline\_id()

<details>

<summary>Descripción</summary>

**was\_in\_state(message\_id)**\
comprueba si un cliente estuvo en el estado seleccionado (bloque). Puedes obtener el número del bloque desde el editor.

<figure><img src="/files/65e7ee3121e7d309954c2f56911166c389ab45b7" alt=""><figcaption><p>La línea superior del editor de bloques muestra el número del bloque.</p></figcaption></figure>

**days\_from\_last\_message()**\
determina el número de días desde el último mensaje del cliente. Fue creado para comprobar si entra dentro de la ventana de 24 horas.

Ejemplo: \
`d = days_from_last_message()`

{% hint style="info" %}
Si han pasado más de 30 días desde el último mensaje del cliente, la función devolverá el valor 9999.
{% endhint %}

\
**liberar*****\_*****cliente()**\
desasigna al operador responsable.&#x20;Ejemplo: free\_client()

**assign\_to\_user(email, only\_active)**\
asigna un diálogo a un operador, donde:

1. email - un parámetro de cadena (opcional). Si solo se proporciona el correo electrónico, el diálogo se asignará al operador especificado sin importar su estado actual.&#x20;
2. only\_active - Verdadero o Falso (parámetro opcional). Si se establece en Verdadero, el diálogo se asignará al operador especificado solo si está actualmente de turno.

Ejemplos:

`assign_to_user()` - asigna un diálogo a un operador aleatorio que está actualmente de turno&#x20;

`assign_to_user('correo electrónico del operador')` - asigna un diálogo al operador sin importar su estado

`assign_to_user('correo electrónico del operador', True)` - asigna un diálogo al operador especificado solo si está actualmente de turno

**distribute\_client()**\
asigna un diálogo al operador según la configuración de autodistribución. \
Ejemplo:  `distribute_client()`

**get\_operator**()\
recupera el correo electrónico de un operador responsable

Ejemplo: `get_operator()`&#x20;

Puede usarse para asignar tareas a un operador responsable o para comprobar si existe. Si no hay un operador responsable, devolverá None.

**get\_operator\_name**()\
recupera el nombre del operador responsable

Ejemplo:  `get_operator_name()`&#x20;

Puede usarse para mostrar información a un cliente. Si no hay un operador responsable, devolverá None. Si el operador no tiene un nombre asignado, devolverá su correo electrónico.

**delete\_pended\_messages()**\
elimina todos los mensajes programados para el cliente actual. De forma predeterminada, también elimina los mensajes creados por las **"No cancelar"** flechas. Para conservar los mensajes de las **"No cancelar"** flechas, pasa el parámetro False: delete\_pended\_messages(False).

**set\_note(comment)**\
añade un comentario a un diálogo.

Ejemplo: **`set_note`**`('Volver a hacer')`

**add\_unread(count)**\
marca un diálogo con un cliente como no leído

El parámetro count puede omitirse o establecerse en 1; en este caso, el diálogo con el cliente mostrará un indicador de +1 mensaje no leído.

<div data-with-frame="true"><figure><img src="/files/1ff7b7dc872d6295d149e4a5f45a318146d7c387" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/a8f75e7b0e9b5420ec1c1c1cfd109f4afc62ef02" alt="" width="375"><figcaption></figcaption></figure></div>

Si se pasa cualquier otro número, se mostrará en la **"Clientes"** sección como el número de mensajes no leídos de un cliente.

<div data-with-frame="true"><figure><img src="/files/28ef4070076695699720b4294ac702f8252c7085" alt="" width="563"><figcaption></figcaption></figure></div>

**clear\_unread()**\
marca un diálogo como leído

**unsubscribe()**\
Función para darse de baja de los mensajes del bot. Se proporciona un ejemplo [en este artículo.](/doc/es/envios-comerciales/darse-de-baja-del-bot.md)&#x20; Para el cliente dado de baja, aparecerá un símbolo — un mensaje rojo con una cruz.

<div data-with-frame="true"><figure><img src="/files/4c9fffc108c52e91aba887d2077684948bb61593" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/41e637641d634c47e56293886daed2867e153119" alt="" width="375"><figcaption></figcaption></figure></div>

{% hint style="info" %}
**¡Importante!**

El **La calculadora se ejecuta primero**, y solo después se envía el mensaje.

Por lo tanto, si necesitas enviar un mensaje final como **"Has sido dado de baja del bot"** o **"Has sido bloqueado"**, debes usar un proceso de dos pasos:

1. **Primero, envía un bloque** que contenga el mensaje final.
2. **Luego, envía un bloque vacío** que contenga la función de darse de baja/bloquear.

**Si intentas hacer ambas cosas en un solo bloque, el mensaje no se enviará.**
{% endhint %}

<div data-with-frame="true"><figure><img src="/files/7c5169824e01d2b65fd2b870882252c2d591de73" alt="" width="563"><figcaption></figcaption></figure></div>

Si colocas la `unsubscribe()` función en la calculadora del mismo bloque que tu mensaje, el mensaje **no se enviará**, y el sistema mostrará un error.

<div data-with-frame="true"><figure><img src="/files/57e155a095a5ba2d7a92ff996ccef9fa09f8f55f" alt="" width="563"><figcaption></figcaption></figure></div>

**block\_client()**\
bloquea a un cliente para que no envíe mensajes al bot. Los mensajes programados previamente desde el bot también se cancelarán. Sin embargo, seguirá siendo posible enviar mensajes al cliente directamente desde el diálogo en la **"Clientes"** sección

<div data-with-frame="true"><figure><img src="/files/c177f093108e792329397523edbe6194849c95fa" alt="" width="563"><figcaption></figcaption></figure></div>

Un cliente bloqueado tendrá una marca — un icono de candado rojo.

<div data-with-frame="true"><figure><img src="/files/63d45b3647741f4eeee8b3cf8610ba163fdfe6ba" alt="" width="563"><figcaption></figcaption></figure></div>

**unblock\_client()**\
desbloquea al cliente. El cliente podrá interactuar con el bot nuevamente y continuar con las cadenas de mensajes.

**set\_client\_name(name)**\
cambia el nombre del cliente. Pasa el nombre del cliente como una cadena entre comillas dobles. También puedes usar una variable que contenga el nombre del cliente, por ejemplo: set\_client\_name("Juan Smith")

**get\_bind\_clients()**\
una función sin parámetros que devuelve un array de IDs de clientes vinculados al cliente actual.

**get\_current\_pipline\_id()**\
una función sin parámetros que devuelve el ID del embudo en el que se encuentra actualmente el cliente.

Si el trato del cliente está en la etapa "sin procesar", devuelve None.

</details>

## Trabajando con tareas&#x20;

{% hint style="success" %}
Las funciones que trabajan con tareas devuelven el estado de la operación como **True o el ID de la tarea en caso de éxito. En caso de fallo, devuelven False o None.**
{% endhint %}

{% hint style="info" %}
MaviBot utiliza el formato de fecha **"dd.mm.aaaa"** y el formato de hora **"HH:MM"**.
{% endhint %}

create\_task() | update\_task() | done\_task() | delete\_task()

<details>

<summary>Descripción</summary>

**create\_task(email, name, date\_srok, description, time\_srok)** – crea una tarea

Parámetros:\ <mark style="color:rojo;">**!**</mark>**&#x20;correo electrónico** - correo electrónico de la persona responsable\ <mark style="color:rojo;">**!**</mark>**&#x20;name** - nombre de la tarea\ <mark style="color:rojo;">**!**</mark>**&#x20;date\_srok** - fecha de vencimiento, fecha\ <mark style="color:rojo;">**!**</mark>**&#x20;description** - descripción de la tarea\
**time\_srok** - hora de vencimiento, hora

**update\_task(task\_id,email, name, date\_srok, description, time\_srok)** - actualiza una tarea

Parámetros:\ <mark style="color:rojo;">**!**</mark>**&#x20;task\_id**- ID de la tarea\ <mark style="color:rojo;">**!**</mark>**&#x20;correo electrónico** - correo electrónico de la persona responsable\ <mark style="color:rojo;">**!**</mark>**&#x20;name** - nombre de la tarea\ <mark style="color:rojo;">**!**</mark>**&#x20;date\_srok** - fecha de vencimiento, fecha\ <mark style="color:rojo;">**!**</mark>**&#x20;description** - descripción de la tarea\
**time\_srok** - hora de vencimiento, hora

**done\_task(task\_id)**- marca una tarea como completada

Parámetros:\ <mark style="color:rojo;">**!**</mark>**&#x20;task\_id**- ID de la tarea

**delete\_task(task\_id)** – elimina una tarea

Parámetros:\ <mark style="color:rojo;">**!**</mark>**&#x20;task\_id**- ID de la tarea

</details>

<details>

<summary>Ejemplos</summary>

Vamos a crear una tarea para el operador:

<div data-with-frame="true"><figure><img src="/files/f48bdbf9dedbc9e6977701c6542a2a8234d3d81c" alt="" width="563"><figcaption></figcaption></figure></div>

Actualiza la fecha de vencimiento y la descripción.

<div data-with-frame="true"><figure><img src="/files/84d8bc7c3ed1c41bb4d0e5cb93126dfa9fc73e70" alt="" width="563"><figcaption><p>Actualización de la tarea</p></figcaption></figure></div>

Marca la tarea como completada.

<div data-with-frame="true"><figure><img src="/files/86c834fee4456184ca7be91d04d2af6d3f3fc1d4" alt="" width="563"><figcaption><p>Marcado de la tarea como completada</p></figcaption></figure></div>

Eliminación de la tarea

<div data-with-frame="true"><figure><img src="/files/108645b16a5f7cc2d1f5ed70efcfa5ad2e97ed3e" alt="" width="563"><figcaption></figcaption></figure></div>

</details>

<details>

<summary>Ejemplo de código para copiar</summary>

`task_id=create_task('admin@mavibot.ai', 'Test', '22.01.2023', 'tarea de prueba', '08:00') status=delete_task(task_id)`

</details>

## Trabajando con tratos

get\_order\_id() | create\_order() | set\_order\_name() | set\_order\_budget() | get\_active\_orders\_ids() | get\_success\_orders\_ids() | get\_fail\_orders\_ids() | get\_order\_var() | get\_order\_vars() | set\_order\_var() | set\_order\_vars() | move\_order\_to\_next\_state() | set\_order\_status\_success() | set\_order\_status\_fail(order\_id)| get\_state\_id() | change\_state() | get\_order\_id\_by\_var\_value() | latest\_order\_datetime() | count\_client\_orders(), get\_count\_orders() | delete\_order(order\_id)

<details>

<summary>Descripción</summary>

<mark style="color:predeterminado;background-color:blue;">**Obteniendo el ID del trato actual**</mark>

**get\_order\_id()** - devuelve el estado del trato.

<mark style="color:predeterminado;background-color:blue;">**Creando un nuevo trato**</mark>

**create\_order(name, budget, description, client\_name, phone, email, state\_id)**\
El trato activo actualmente en el embudo, junto con sus variables, solo estará disponible en las funciones relacionadas con tratos y en el CRM.\
\
**Parámetros de la función:** \ <mark style="color:rojo;">**!**</mark>**&#x20;name** - (opcional), el nombre del trato. Si no se proporciona, la función se aplica al trato activo actual del cliente.

<mark style="color:rojo;">**!**</mark>**&#x20; budget** - (opcional) el valor del trato. Si no se proporciona, se aplica al trato activo actual.\
Si **budget** no es un número, la función devolverá: **el presupuesto debe ser un número**

**description** - (opcional), la descripción del trato.

Parámetros adicionales para la creación del cliente:

**client\_name** - (opcional) cadena, nombre de un nuevo cliente

**phone** - (opcional) cadena, número de teléfono de un nuevo cliente.

**correo electrónico** - (opcional) cadena, dirección de correo electrónico de un nuevo cliente.

Para crear un cliente, debe proporcionarse al menos el teléfono o el correo electrónico. Si se proporciona el teléfono y no existe ningún cliente con este teléfono en el proyecto, se creará uno nuevo.

Si se proporciona el correo electrónico sin teléfono y no existe ningún cliente con este correo, se creará uno nuevo.

Parámetro adicional:

**state\_id** - número, permite establecer el estado inicial del trato al crearlo

<mark style="color:predeterminado;background-color:blue;">**Establecer o actualizar el nombre del trato**</mark>

**set\_order\_name(name, order\_id)**

**name** - ❗obligatorio, cadena; el nombre del trato

**order\_id** - (opcional) ID del trato. Si no se proporciona, el cambio se aplica al trato activo actual del cliente.

<mark style="color:predeterminado;background-color:blue;">**Establecer o actualizar el presupuesto del trato**</mark>

**set\_order\_budget(budget, order\_id)**

**budget** -❗obligatorio, número; el valor del trato

**order\_id** - (opcional) ID del trato. Si no se proporciona, se aplica al trato activo actual del cliente.

Para usar correctamente order\_id:

1. Puedes especificarlo manualmente: obtén el ID del trato y pásalo como parámetro de la función si quieres dirigirte a un trato específico.

<div data-with-frame="true"><figure><img src="/files/2cf1f797be5c38f13b817ada53f804515ebf494c" alt="" width="375"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/bf0e03fd78870f81046d6790e2bc9d0b8eb267f6" alt="" width="375"><figcaption></figcaption></figure></div>

1. Recupéralo usando la función get\_order\_id(), porque la variable integrada order\_id devuelve el valor en el formato {client\_id}-{order\_id}, lo que puede causar un comportamiento incorrecto.

<mark style="color:predeterminado;background-color:blue;">**Recuperando listas de tratos**</mark> \
((excluyendo tratos archivados, exitosos o fallidos))

**get\_active\_orders\_ids()**&#x20;

<mark style="color:predeterminado;background-color:blue;">**Obtener una lista de IDs de tratos exitosos**</mark>

**get\_success\_orders\_ids()**&#x20;

<mark style="color:predeterminado;background-color:blue;">**Obtener una lista de IDs de tratos fallidos**</mark>

**get\_fail\_orders\_ids()**

<mark style="color:predeterminado;background-color:blue;">**Recuperando el valor de una variable del trato**</mark>

**get\_order\_var(order\_id, variable)**&#x20;

Parámetros:

<mark style="color:rojo;">**!**</mark>**&#x20;order\_id** - ID del trato&#x20;

<mark style="color:rojo;">**!**</mark>**&#x20;variable** - nombre de la variable cuyo valor deseas recuperar

<mark style="color:predeterminado;background-color:blue;">**Recuperando datos del trato**</mark>

**get\_order\_vars(order\_id, names)**&#x20;

Parámetros:

<mark style="color:rojo;">**!**</mark>**&#x20;order\_id** - ID del trato

**names** - un array de nombres de variables a recuperar. Si se omite, la función devuelve todas las variables del trato especificado

La función devuelve un diccionario que contiene las variables enumeradas en el **names** array para el trato identificado por **order\_id**. Si **names** no se proporciona, devuelve un diccionario con todas las variables del trato especificado.

<mark style="color:predeterminado;background-color:blue;">**Añadiendo una variable al trato**</mark>

**set\_order\_var(order\_id, variable, value)**

Parámetros:

<mark style="color:rojo;">**!**</mark>**&#x20;order\_id** - ID del trato

<mark style="color:rojo;">**!**</mark>**&#x20;variable** - el nombre de la variable que se añadirá o actualizará en un trato

{% hint style="warning" %}
Si quieres cambiar los parámetros del trato "name" o "description", usa los nombres de variable "name" o "description" respectivamente.
{% endhint %}

<mark style="color:rojo;">**!**</mark>**&#x20;value** - valor de la variable

<mark style="color:predeterminado;background-color:blue;">**Añadiendo múltiples variables al trato**</mark>

**set\_order\_vars(order\_id, variables\_dict)**&#x20;

Parámetros:

<mark style="color:rojo;">**!**</mark>**&#x20;order\_id** - ID del trato.&#x20;

<mark style="color:rojo;">**!**</mark>**&#x20;variables\_dict** - un diccionario de variables

<mark style="color:predeterminado;background-color:blue;">**Moviéndose al siguiente estado del embudo**</mark>

**move\_order\_to\_next\_state(order\_id)**&#x20;

Parámetros:\
**order\_id** - ID del trato. Si no se especifica, se moverá el trato activo actual.\
El orden de los estados del trato se define según la secuencia establecida en MavibotCRM.

<mark style="color:predeterminado;background-color:blue;">**Recuperando la etapa del embudo en MavibotCRM**</mark>

**get\_state\_id(client\_id, order\_id)** \
También puedes copiar el ID del estado del embudo directamente desde la **"Configuración del estado"**.

Parámetros:

**order\_id -** ID del trato del cliente

Puedes llamar a la función con o sin el **order\_id** parámetro. Si se omite order\_id, la función devolverá el ID del estado del embudo para el trato activo actual.

Para el uso correcto de order\_id:

1. Puedes especificarlo manualmente obteniendo el ID del trato y pasándolo como parámetro de la función cuando quieras dirigirte a un trato específico.
2. Recupéralo usando la función get\_order\_id(), porque la variable integrada order\_id devuelve un valor en el formato {client\_id}-{order\_id}, lo que puede causar un comportamiento incorrecto.

<mark style="color:predeterminado;background-color:blue;">**Moviendo un lead a través del embudo de MavibotCRM por ID de estado**</mark>

**change\_state(state\_id, order\_id)**&#x20;

Parámetros:\ <mark style="color:rojo;">**!**</mark> **state\_id -** ID del estado del embudo\
**order\_id (** opcional) -  el ID del trato a mover a través del embudo. Si se omite, se moverá el trato activo actual.

<mark style="color:predeterminado;background-color:blue;">**Obteniendo el ID del trato por nombre y valor de variable**</mark>

get\_order\_id\_by\_var\_value(var\_name, var\_value, client\_id)

Parámetros:\ <mark style="color:rojo;">!</mark> var\_name - nombre de la variable\ <mark style="color:rojo;">!</mark> var\_value - valor de la variable;\
client\_id - (opcional) ID del trato del cliente; por defecto es el ID del cliente en el bot

<mark style="color:predeterminado;background-color:blue;">**Obteniendo la fecha y hora del último trato**</mark>

latest\_order\_datetime(client\_id, dt\_fmt)

Parámetros:\
client\_id - (opcional) el ID del trato del cliente; por defecto es el ID del cliente en el bot;\
df\_fmt - (opcional) formato para la fecha y hora devueltas; el valor predeterminado es "%d.%m.%y %H:%M"

<mark style="color:predeterminado;background-color:blue;">**Obteniendo el número de tratos del cliente**</mark>

count\_client\_orders(client\_id, state\_id, get\_all, active)

Parámetros:\
client\_id -  (opcional) el ID del trato del cliente; por defecto es el ID del cliente en el bot;\
state\_id - (opcional) el ID del estado del trato en el embudo;\
get\_all - (opcional) bandera de filtro para el parámetro active; el valor predeterminado es 1 (el filtrado por active está deshabilitado);\
active - se usa solo cuando get\_all es 0; filtra los tratos activos; el valor predeterminado es 1 (devuelve solo tratos activos);

<mark style="color:predeterminado;background-color:blue;">**Obtener el recuento de tratos en un estado específico**</mark>

get\_count\_orders(id) - devuelve el número de tratos que actualmente están en un estado específico del embudo por ID de estado.

La función toma un solo parámetro:

<mark style="color:rojo;">**!**</mark> id - el ID del estado del trato.&#x20;

Ejemplo de uso de la función:

<div data-with-frame="true"><figure><img src="/files/0079d1ef5e675309d5c46dc16c90533c8e2f4491" alt="" width="375"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/5087178e5a0d7b8f088767a02dce22d176e54df9" alt="" width="375"><figcaption></figcaption></figure></div>

El ID de la etapa se puede encontrar en la configuración.

A continuación, debes introducir la función en la calculadora de la siguiente manera:

<div data-with-frame="true"><figure><img src="/files/09ae29227092f504dcf4671df23265b79739424e" alt="" width="563"><figcaption></figcaption></figure></div>

Al probar el bot, la respuesta del bot consistirá en el número de tratos en el estado especificado por el valor pasado a la función.

<mark style="color:predeterminado;background-color:blue;">**Eliminación de un trato**</mark>

delete\_order(order\_id) — elimina un trato en **MaviBotCRM**.

order\_id - (opcional) el ID del trato a eliminar. Si se omite, se eliminará el trato más reciente.&#x20;

</details>

<details>

<summary>Ejemplos</summary>

Todas las funciones son sencillas de usar.\
Por ejemplo, vamos a crear un nuevo trato y enviar su número al cliente:

<div data-with-frame="true"><figure><img src="/files/d7cbafdafeb9fe5d66dde414e5811259497dd5d5" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/49f889e895b069509af674290c904b6e819f1b79" alt="" width="563"><figcaption><p>Registro de solicitud del cliente</p></figcaption></figure></div>

Puedes obtener el ID del trato activo actual del cliente usando la función get\_order\_id(), o recuperar la lista completa de los tratos del cliente usando get\_active\_orders\_ids().

<div data-with-frame="true"><figure><img src="/files/1bd029a9d41085f8294eb27b956b4e82bfb85dc0" alt="" width="563"><figcaption><p>Obteniendo el ID del trato activo actual</p></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/e6433b434fc96e40e5fe91c66b42f708384852d9" alt="" width="563"><figcaption></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/6dd6fc3e5f44fa6f9014de821db672f55b810d6c" alt="" width="563"><figcaption><p>Obteniendo la lista de tratos activos</p></figcaption></figure></div>

<div data-with-frame="true"><figure><img src="/files/919d5aa7133d312f4d78db952f4745124db379a7" alt="" width="563"><figcaption></figcaption></figure></div>

</details>

<details>

<summary>Ejemplo de código para copiar</summary>

<pre><code><strong>/* Crear un nuevo trato */
</strong>oid = create_order()

/*Recuperar el ID del trato activo del cliente*/
oid = get_order_id()

/*Recuperar la lista de tratos activos*/
res = get_active_orders_ids()

/*Añadir o actualizar una sola variable en el trato*/
res = set_order_var('40630', 'обновлено', '#{current_date}')

vars = {"VAR1": "V111", "VAR2": "V222"}
res2 = set_order_vars('40630', vars)

ovar = get_order_vars('40630')
</code></pre>

</details>

### <mark style="color:predeterminado;background-color:blue;">**Estableciendo una etiqueta de trato exitoso**</mark>

set\_order\_status\_success()

{% tabs %}
{% tab title="Descripción" %}
**set\_order\_status\_success(order\_id)**&#x20;

Parámetros:

**order\_id** - el ID del trato. Si el parámetro no se especifica, la etiqueta se establecerá para el trato activo actual.
{% endtab %}
{% endtabs %}

### <mark style="color:predeterminado;background-color:blue;">**Estableciendo una etiqueta de trato fallido**</mark>&#x20;

set\_order\_status\_fail()

{% tabs %}
{% tab title="Descripción" %}
**set\_order\_status\_fail(order\_id)**&#x20;

Parámetros:

**order\_id** - el ID del trato. Si el parámetro no se especifica, la etiqueta se establecerá para el trato activo actual.
{% endtab %}
{% endtabs %}

### <mark style="color:predeterminado;background-color:blue;">**Estableciendo una etiqueta de trato archivado**</mark> &#x20;

set\_order\_status\_archive()

{% tabs %}
{% tab title="Descripción" %}
**set\_order\_status\_archive(order\_id)**&#x20;

Parámetros:

**order\_id** - el ID del trato. Si el parámetro no se especifica, la etiqueta se establecerá para el trato activo actual.
{% endtab %}

{% tab title="Ejemplos" %}
/\*Archivar el trato activo actual\*/

`res_arh = set_order_status_archive()`
{% endtab %}
{% endtabs %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.mavibot.ai/doc/es/chatbot/functions/calculadora/crm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
