> ## Documentation Index
> Fetch the complete documentation index at: https://evolink.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Interfaz de todos los modelos GLM - Referencia completa de Chat Completions

> - Llama a los modelos de la serie GLM mediante el protocolo OpenAI Chat Completions, eligiendo el modelo concreto con el parámetro `model`
- Procesamiento síncrono que devuelve el contenido de la conversación en tiempo real
- **Conversación de texto**: conversación contextual de uno o varios turnos; `glm-5.3-flash` admite además entrada de imagen
- **Indicación del sistema**: personaliza el rol y el comportamiento de la IA mediante un mensaje `role=system`
- **Pensamiento profundo**: `thinking.type` controla la cadena de pensamiento y `reasoning_effort` ajusta la intensidad del razonamiento; el razonamiento se devuelve en `reasoning_content`
- **Streaming**: se admiten respuestas en flujo SSE (`stream=true`)
- **Llamadas a herramientas**: se admiten Function Calling y búsqueda web (`web_search`, hasta 128 herramientas)
- **Salida estructurada**: activa el modo JSON mediante `response_format`

**Sobre las respuestas en streaming**: con `stream=true`, los resultados llegan por Server-Sent Events, con cada mensaje en el formato `data: {JSON}` y el flujo terminando con `data: [DONE]`. Cada fragmento (`ChatCompletionChunk`) incluye `id`, `created`, `model`, `choices` y, opcionalmente, `usage` y `content_filter`; dentro, `choices[].delta` devuelve de forma incremental `role` / `content` / `reasoning_content` / `tool_calls`, y `choices[].finish_reason` indica el motivo de finalización en el último fragmento.

<Note>
  **BaseURL**: La BaseURL predeterminada es `https://direct.evolink.ai`, que ofrece mejor compatibilidad con los modelos de texto y las conexiones de larga duración. `https://api.evolink.ai` es el endpoint principal para los servicios multimodales y sirve como dirección de respaldo para los modelos de texto.
</Note>

<Note>
  **El control del pensamiento varía según el modelo**: `glm-5.3` y `glm-5.3-flash` piensan siempre y no se pueden desactivar; en `reasoning_effort` surten efecto los tres niveles `low` / `high` / `max` y los demás se degradan automáticamente al nivel disponible más cercano (`xhigh` → `max`, `medium` → `high`, `minimal` / `none` → `low`, que sigue pensando y se factura como salida). `glm-5.2` puede desactivar el pensamiento con `thinking.type: "disabled"` y admite más niveles de razonamiento. Consulta las descripciones de los campos `thinking` y `reasoning_effort` para más detalle.
</Note>

<Note>
  **Entrada de imagen**: solo la admite `glm-5.3-flash`, mediante bloques de contenido `image_url` dentro de `messages[].content[]`. Enviar bloques de imagen a otro modelo devuelve un error.
</Note>


## OpenAPI

````yaml es/api-manual/language-series/glm/chat-completions/chat-completions-reference.json POST /v1/chat/completions
openapi: 3.1.0
info:
  title: Interfaz de todos los modelos GLM - Referencia completa de Chat Completions
  description: >-
    Referencia completa de la API para llamar a los modelos de texto Zhipu GLM
    mediante la API Chat Completions compatible con OpenAI.


    **Modelos incluidos**: `glm-5.3`, `glm-5.3-flash`, `glm-5.2` (se seleccionan
    con el parámetro `model`)


    **Capacidades comunes**:

    - Ventana de contexto de 1M tokens, hasta **131.072 tokens** (128K) de
    salida, con un mínimo recomendado de **1.024 tokens**

    - Pensamiento profundo: `thinking` controla la cadena de pensamiento y
    `reasoning_effort` ajusta la intensidad del razonamiento; el razonamiento se
    devuelve en `reasoning_content`

    - Llamadas a herramientas: Function Calling y búsqueda web (hasta 128
    herramientas)

    - Streaming: respuestas en flujo SSE

    - Salida estructurada: los formatos de respuesta `text` y `json_object`

    - Caché de contexto: caché implícita de prefijo que aciertan automáticamente
    las solicitudes repetidas con el mismo prefijo, reflejada en
    `usage.prompt_tokens_details.cached_tokens`


    **Las diferencias entre modelos** (control del pensamiento, entrada de
    imagen) se describen más abajo en los campos `model` y `thinking` /
    `reasoning_effort`.
  license:
    name: MIT
  version: 1.0.0
servers:
  - url: https://direct.evolink.ai
    description: Producción (recomendado)
  - url: https://api.evolink.ai
    description: URL alternativa
security:
  - bearerAuth: []
tags:
  - name: Generación de chat
    description: Endpoints relacionados con la generación de chat de IA
paths:
  /v1/chat/completions:
    post:
      tags:
        - Generación de chat
      summary: Completado de chat GLM (todos los modelos, compatible con OpenAI)
      description: >-
        - Llama a los modelos de la serie GLM mediante el protocolo OpenAI Chat
        Completions, eligiendo el modelo concreto con el parámetro `model`

        - Procesamiento síncrono que devuelve el contenido de la conversación en
        tiempo real

        - **Conversación de texto**: conversación contextual de uno o varios
        turnos; `glm-5.3-flash` admite además entrada de imagen

        - **Indicación del sistema**: personaliza el rol y el comportamiento de
        la IA mediante un mensaje `role=system`

        - **Pensamiento profundo**: `thinking.type` controla la cadena de
        pensamiento y `reasoning_effort` ajusta la intensidad del razonamiento;
        el razonamiento se devuelve en `reasoning_content`

        - **Streaming**: se admiten respuestas en flujo SSE (`stream=true`)

        - **Llamadas a herramientas**: se admiten Function Calling y búsqueda
        web (`web_search`, hasta 128 herramientas)

        - **Salida estructurada**: activa el modo JSON mediante
        `response_format`


        **Sobre las respuestas en streaming**: con `stream=true`, los resultados
        llegan por Server-Sent Events, con cada mensaje en el formato `data:
        {JSON}` y el flujo terminando con `data: [DONE]`. Cada fragmento
        (`ChatCompletionChunk`) incluye `id`, `created`, `model`, `choices` y,
        opcionalmente, `usage` y `content_filter`; dentro, `choices[].delta`
        devuelve de forma incremental `role` / `content` / `reasoning_content` /
        `tool_calls`, y `choices[].finish_reason` indica el motivo de
        finalización en el último fragmento.
      operationId: createChatCompletionGLM
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ChatCompletionRequest'
            examples:
              simple_text:
                summary: Conversación de texto de un solo turno
                value:
                  model: glm-5.3
                  messages:
                    - role: user
                      content: Preséntate, por favor
              multi_turn:
                summary: Conversación de múltiples turnos (comprensión del contexto)
                value:
                  model: glm-5.3
                  messages:
                    - role: user
                      content: ¿Qué es Python?
                    - role: assistant
                      content: Python es un lenguaje de programación de alto nivel...
                    - role: user
                      content: ¿Cuáles son sus ventajas?
              system_prompt:
                summary: Uso de indicaciones de sistema
                value:
                  model: glm-5.3
                  messages:
                    - role: system
                      content: >-
                        Eres un asistente profesional de programación en Python.
                        Responde las preguntas con un lenguaje conciso.
                    - role: user
                      content: ¿Cómo se lee un archivo?
              deep_thinking:
                summary: >-
                  Activar el pensamiento profundo y ajustar la intensidad del
                  razonamiento
                value:
                  model: glm-5.3
                  messages:
                    - role: user
                      content: >-
                        Un granjero tiene que cruzar un río con un lobo, una
                        oveja y una col, y solo puede llevar una cosa cada vez.
                        ¿Cómo cruza con seguridad?
                  thinking:
                    type: enabled
                  reasoning_effort: max
              function_calling:
                summary: Llamada a herramientas (Function Calling)
                value:
                  model: glm-5.3
                  messages:
                    - role: user
                      content: ¿Qué tiempo hace hoy en Pekín?
                  tools:
                    - type: function
                      function:
                        name: get_weather
                        description: >-
                          Consulta el clima en tiempo real de una ciudad
                          específica
                        parameters:
                          type: object
                          properties:
                            city:
                              type: string
                              description: 'Nombre de la ciudad, por ejemplo: Pekín'
                          required:
                            - city
                  tool_choice: auto
              web_search:
                summary: Activar la herramienta de búsqueda web
                value:
                  model: glm-5.3
                  messages:
                    - role: user
                      content: >-
                        Busca las noticias de inteligencia artificial de la
                        última semana
                  tools:
                    - type: web_search
                      web_search:
                        enable: true
                        count: 10
                        search_recency_filter: oneWeek
                description: >-
                  Cuando el modelo determina que necesita internet, busca
                  automáticamente y los resultados se incorporan al contexto
                  para el razonamiento. Los resultados se facturan como tokens
                  de entrada y el servicio de búsqueda se factura aparte por
                  llamada (consulta la página de precios); si el modelo no
                  activa la búsqueda, no se genera ningún cargo por búsqueda.
              json_mode:
                summary: Salida estructurada en JSON
                value:
                  model: glm-5.3
                  messages:
                    - role: system
                      content: >-
                        Devuelve la salida en formato JSON, con los dos campos
                        name y age.
                    - role: user
                      content: Juan, 28 años
                  response_format:
                    type: json_object
              streaming:
                summary: Salida en streaming (SSE)
                value:
                  model: glm-5.3
                  messages:
                    - role: user
                      content: Escribe un poema corto sobre la primavera
                  stream: true
              disable_thinking_glm52_only:
                summary: Desactivar el pensamiento profundo (solo glm-5.2)
                value:
                  model: glm-5.2
                  messages:
                    - role: user
                      content: Resume la teoría de la relatividad en una frase.
                  thinking:
                    type: disabled
                description: >-
                  Solo `glm-5.2` puede desactivar el pensamiento. Enviar
                  `thinking.type: "disabled"` a `glm-5.3` o `glm-5.3-flash`
                  devuelve un error — usa `reasoning_effort: "low"` en su lugar.
              low_effort:
                summary: >-
                  Reducir el coste de pensamiento (alternativa a desactivar el
                  pensamiento en la serie glm-5.3)
                description: >-
                  La serie `glm-5.3` no puede desactivar el pensamiento; usa
                  `reasoning_effort: "low"` para reducir la intensidad de
                  razonamiento al mínimo.
                value:
                  model: glm-5.3
                  messages:
                    - role: user
                      content: Explica HTTP en una frase
                  thinking:
                    type: enabled
                  reasoning_effort: low
                  max_tokens: 1024
              vision_flash:
                summary: Entrada de imagen (solo glm-5.3-flash)
                description: >-
                  `glm-5.3-flash` admite visión de forma nativa; las imágenes se
                  envían mediante bloques de contenido `image_url`, con una URL
                  pública o una URL de datos Base64.
                value:
                  model: glm-5.3-flash
                  messages:
                    - role: user
                      content:
                        - type: text
                          text: ¿Qué hay en esta imagen?
                        - type: image_url
                          image_url:
                            url: https://example.com/photo.jpg
                  max_tokens: 1024
      responses:
        '200':
          description: Completado de chat generado exitosamente
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ChatCompletionResponse'
        '400':
          description: Parámetros de solicitud no válidos
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 400
                  message: Invalid request parameters
                  type: invalid_request_error
        '401':
          description: No autorizado, token inválido o expirado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 401
                  message: Invalid or expired token
                  type: authentication_error
        '402':
          description: Cuota insuficiente, se requiere recarga
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 402
                  message: Insufficient quota
                  type: insufficient_quota_error
                  fallback_suggestion: https://evolink.ai/dashboard/billing
        '403':
          description: Acceso denegado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 403
                  message: Access denied for this model
                  type: permission_error
                  param: model
        '404':
          description: Recurso no encontrado
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 404
                  message: Specified model not found
                  type: not_found_error
                  param: model
                  fallback_suggestion: glm-5.3
        '429':
          description: Límite de frecuencia de solicitudes excedido
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 429
                  message: Rate limit exceeded
                  type: rate_limit_error
                  fallback_suggestion: retry after 60 seconds
        '500':
          description: Error interno del servidor
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 500
                  message: Internal server error
                  type: internal_server_error
                  fallback_suggestion: try again later
        '502':
          description: Error del servicio upstream
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 502
                  message: Upstream AI service unavailable
                  type: upstream_error
                  fallback_suggestion: try different model
        '503':
          description: Servicio temporalmente no disponible
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                error:
                  code: 503
                  message: Service temporarily unavailable
                  type: service_unavailable_error
                  fallback_suggestion: retry after 30 seconds
components:
  schemas:
    ChatCompletionRequest:
      type: object
      required:
        - model
        - messages
      properties:
        model:
          type: string
          description: >
            Modelo a invocar:


            | ID del modelo | Posicionamiento | Control del pensamiento |
            Entrada de imagen |

            |---|---|---|---|

            | `glm-5.3` | Modelo insignia, con avances generalizados en
            ingeniería de software compleja y tareas de agente y una mejora
            notable en programación frente a la generación anterior; contexto de
            1M | Piensa siempre y no se puede desactivar; en `reasoning_effort`
            solo surten efecto `low` / `high` / `max`, los demás niveles se
            degradan automáticamente | No compatible |

            | `glm-5.3-flash` | Modelo multimodal ligero con arquitectura
            híbrida de atención dispersa y lineal, coste muy bajo y visión
            nativa; contexto de 1M | Igual que `glm-5.3` | **Compatible**,
            consulta el campo `messages` |

            | `glm-5.2` | Insignia de la generación anterior, razonamiento
            complejo y contexto muy largo; contexto de 1M | Se puede desactivar
            con `thinking.type: "disabled"`; `reasoning_effort` admite los 7
            niveles | No compatible |
          enum:
            - glm-5.3
            - glm-5.3-flash
            - glm-5.2
          default: glm-5.3
          example: glm-5.3
        messages:
          type: array
          description: >-
            Lista de mensajes de la conversación, contiene la información de
            contexto completa de la conversación actual


            Admite cuatro roles: `system`, `user`, `assistant`, `tool`. Los
            mensajes con diferentes roles tienen distintas estructuras de
            campos; selecciona el rol correspondiente para verlas. Debe contener
            al menos 1 mensaje y no puede contener únicamente mensajes de
            sistema o del asistente.
          items:
            oneOf:
              - $ref: '#/components/schemas/SystemMessage'
              - $ref: '#/components/schemas/UserMessage'
              - $ref: '#/components/schemas/AssistantRequestMessage'
              - $ref: '#/components/schemas/ToolMessage'
            discriminator:
              propertyName: role
              mapping:
                system:
                  $ref: '#/components/schemas/SystemMessage'
                user:
                  $ref: '#/components/schemas/UserMessage'
                assistant:
                  $ref: '#/components/schemas/AssistantRequestMessage'
                tool:
                  $ref: '#/components/schemas/ToolMessage'
          minItems: 1
        stream:
          type: boolean
          description: >-
            Si se debe activar el modo de salida en streaming


            - `false`: el modelo genera la respuesta completa y la devuelve de
            una sola vez (predeterminado), adecuado para textos cortos y
            procesamiento por lotes

            - `true`: devuelve la respuesta en fragmentos en tiempo real
            mediante Server-Sent Events (SSE), adecuado para chat y textos
            largos; al finalizar el stream se devuelve `data: [DONE]`
          default: false
          example: false
        thinking:
          type: object
          description: Controla si se activa la cadena de pensamiento (Chain of Thought)
          properties:
            type:
              type: string
              description: >-
                Interruptor de la cadena de pensamiento


                - `enabled`: activar el pensamiento profundo (comportamiento
                predeterminado de todos los modelos)

                - `disabled`: desactivar el pensamiento profundo, el modelo
                responde directamente


                **Solo `glm-5.2` admite `disabled`.** `glm-5.3` y
                `glm-5.3-flash` piensan siempre y devuelven un error si se envía
                `disabled`.


                Para reducir el coste de pensamiento en la serie `glm-5.3`, usa
                `reasoning_effort: "low"` en su lugar.


                **Migración desde `glm-5.2`**: si tu código fija `thinking.type:
                "disabled"`, debes cambiarlo a `"enabled"` antes de pasar a
                `glm-5.3` (añadiendo `reasoning_effort: "low"` si quieres menos
                coste de pensamiento); de lo contrario, la solicitud falla
                directamente.


                Ten en cuenta que ambos campos se tratan de forma **distinta**:
                un nivel de `reasoning_effort` no admitido por la serie se
                degrada automáticamente y no da error, mientras que
                `thinking.type` es un interruptor explícito — `disabled` siempre
                da error y nunca se reescribe en silencio. Por eso no basta con
                cambiar `reasoning_effort` de `none` a `low`: también hay que
                cambiar `thinking.type`.
              enum:
                - enabled
                - disabled
              default: enabled
            clear_thinking:
              type: boolean
              description: >-
                Si se debe eliminar el `reasoning_content` de los turnos
                históricos de la conversación


                - `true` (predeterminado): ignora/elimina el `reasoning_content`
                de los turnos históricos y usa solo el contenido no relacionado
                con el razonamiento (texto visible para el usuario/asistente,
                llamadas a herramientas y resultados, etc.) como contexto, lo
                que reduce la longitud del contexto y el costo

                - `false`: conserva el `reasoning_content` de los turnos
                históricos y lo proporciona al modelo junto con el contexto
                (Preserved Thinking); en este caso, debes transferir en
                `messages` el `reasoning_content` histórico de forma **completa,
                sin modificar y en el orden original**, ya que la ausencia, el
                recorte, la reescritura o el reordenamiento degradan los
                resultados o impiden que tenga efecto

                - Nota: este parámetro solo afecta al pensamiento histórico
                entre turnos, no cambia si el turno actual produce pensamiento
              default: true
              example: true
        reasoning_effort:
          type: string
          description: >-
            Controla la intensidad de razonamiento del modelo; solo surte efecto
            con `thinking` activado y su valor predeterminado es `max`


            **Los valores admitidos varían según el modelo**:


            | Valor | `glm-5.3` / `glm-5.3-flash` | `glm-5.2` |

            |---|---|---|

            | `max` | Razonamiento profundo (predeterminado) | Razonamiento
            profundo |

            | `high` | Razonamiento reforzado | Razonamiento reforzado |

            | `low` | Razonamiento ligero | Equivale a `high` |

            | `xhigh` | Degradado a `max` | Equivale a `max` |

            | `medium` | Degradado a `high` | Equivale a `high` |

            | `minimal` | Degradado a `low` (sigue pensando) | Renuncia a pensar
            |

            | `none` | Degradado a `low` (sigue pensando) | Renuncia a pensar |


            La serie `glm-5.3` piensa siempre y solo surten efecto realmente los
            tres niveles `low` / `high` / `max`; los otros cuatro no dan error,
            sino que se degradan automáticamente al nivel disponible más cercano
            (`xhigh` → `max`, `medium` → `high`, `minimal` / `none` → `low`).


            **La serie `glm-5.3` no puede desactivar el pensamiento.** Enviar
            `minimal` o `none` solo lo baja al nivel mínimo `low`: el modelo
            sigue generando tokens de pensamiento, **facturados a la tarifa de
            salida**. Si envías estos dos niveles para ahorrar, ten en cuenta
            que esto difiere de `glm-5.2`: en `glm-5.2` sí se renuncia realmente
            a pensar.


            Para tareas complejas como la programación se recomienda `max`.
          enum:
            - max
            - xhigh
            - high
            - medium
            - low
            - minimal
            - none
          default: max
          example: max
        do_sample:
          type: boolean
          description: >-
            Si se debe activar la estrategia de muestreo


            - `true` (predeterminado): usa `temperature` / `top_p` para el
            muestreo aleatorio, con una salida más variada

            - `false`: siempre selecciona la palabra de mayor probabilidad
            (decodificación voraz), con una salida más determinista; en este
            caso, `temperature` y `top_p` se ignoran


            Para tareas que requieren coherencia y reproducibilidad (como la
            generación de código o la traducción), se recomienda establecerlo en
            `false`
          default: true
          example: true
        temperature:
          type: number
          format: float
          description: >-
            Temperatura de muestreo, controla la aleatoriedad y la creatividad
            de la salida


            **Notas**:

            - Rango: `[0.0, 1.0]`, limitado a dos decimales

            - Valores más altos (p. ej. 0.8): más aleatorio y creativo, adecuado
            para la escritura creativa

            - Valores más bajos (p. ej. 0.2): más estable y determinista,
            adecuado para preguntas factuales y generación de código

            - Valor predeterminado: `1.0`


            **Recomendación**: no ajustes `temperature` y `top_p`
            simultáneamente
          minimum: 0
          maximum: 1
          default: 1
          example: 1
        top_p:
          type: number
          format: float
          description: >-
            Parámetro de muestreo por núcleo (Nucleus Sampling), es una
            alternativa al muestreo por `temperature`


            **Notas**:

            - Rango: `[0.01, 1.0]`, limitado a dos decimales

            - El modelo solo considera los tokens candidatos cuya probabilidad
            acumulada alcanza `top_p`; por ejemplo, 0.1 significa considerar
            solo los tokens del primer 10 % de probabilidad

            - Los valores más pequeños producen una salida más enfocada y
            coherente; los valores más grandes aumentan la diversidad

            - Valor predeterminado: `0.95`


            **Recomendación**: no ajustes `temperature` y `top_p`
            simultáneamente
          minimum: 0.01
          maximum: 1
          default: 0.95
          example: 0.95
        max_tokens:
          type: integer
          description: >-
            Límite máximo de tokens de salida del modelo


            **Nota**:

            - La serie GLM admite hasta **131.072 tokens** (128K) de longitud de
            salida; se recomienda no bajar de `1024`

            - Con `thinking` activado, los tokens de la cadena de pensamiento
            también cuentan para este límite

            - Si la generación se trunca por `length`, prueba a subir este valor
          minimum: 1
          maximum: 131072
          example: 1024
        tools:
          type: array
          description: >-
            Lista de herramientas que el modelo puede invocar


            **Nota**:

            - Se admiten la llamada a funciones (`function`) y la búsqueda web
            (`web_search`)

            - Hasta 128 funciones

            - De ellas, `web_search` se **factura aparte por llamada** cuando la
            búsqueda ocurre realmente; las demás herramientas no tienen coste
            adicional
          items:
            oneOf:
              - $ref: '#/components/schemas/FunctionTool'
              - $ref: '#/components/schemas/WebSearchTool'
            discriminator:
              propertyName: type
              mapping:
                function:
                  $ref: '#/components/schemas/FunctionTool'
                web_search:
                  $ref: '#/components/schemas/WebSearchTool'
          maxItems: 128
        tool_choice:
          type: string
          description: >-
            Controla la forma en que el modelo elige qué función invocar


            **Notas**: solo tiene efecto cuando el tipo de herramienta es
            `function`, y de forma predeterminada solo admite `auto` (el modelo
            decide automáticamente si invoca una herramienta)
          enum:
            - auto
          default: auto
          example: auto
        stop:
          type: array
          description: >-
            Lista de palabras de parada


            **Notas**:

            - Cuando el texto generado por el modelo encuentra la cadena
            especificada, detiene la generación de inmediato (la palabra de
            parada en sí no se incluye en el texto devuelto)

            - Actualmente solo se admite una única palabra de parada, con el
            formato `["stop_word1"]`, por ejemplo `["Human:"]`
          items:
            type: string
          maxItems: 4
          example:
            - 'Human:'
        response_format:
          type: object
          description: >-
            Especifica el formato de salida de la respuesta del modelo,
            predeterminado `text`


            **Notas**:

            - `{ "type": "json_object" }` activa el modo JSON, y el modelo
            devuelve datos en formato JSON válido, adecuado para escenarios como
            la extracción de datos estructurados

            - Al usar el modo JSON, se recomienda solicitar explícitamente la
            salida en JSON en el mensaje `system` o `user`
          required:
            - type
          properties:
            type:
              type: string
              description: |-
                Tipo de formato de salida

                - `text`: salida de texto plano (predeterminado)
                - `json_object`: salida en formato JSON
              enum:
                - text
                - json_object
              default: text
        request_id:
          type: string
          description: >-
            Identificador único de la solicitud


            **Notas**:

            - Lo transfiere el cliente, con una longitud de 6 a 64 caracteres;
            se recomienda usar el formato UUID para garantizar la unicidad

            - Si no se proporciona, la plataforma lo genera automáticamente
          minLength: 6
          maxLength: 64
          example: req-7f3a2c1e8b9d4f0a
        user_id:
          type: string
          description: >-
            Identificador único del usuario final


            **Notas**: longitud de 6 a 128 caracteres; se recomienda usar un
            identificador único que no contenga información sensible, lo que
            ayuda a la plataforma a supervisar y detectar comportamientos
            abusivos
          minLength: 6
          maxLength: 128
          example: user-abc123456
    ChatCompletionResponse:
      type: object
      properties:
        id:
          type: string
          description: '`ID` de la tarea'
          example: chatcmpl-a6613b56-c61c-94ba-9a9f-43d4cdc7d77a
        object:
          type: string
          description: Tipo de respuesta
          enum:
            - chat.completion
          example: chat.completion
        request_id:
          type: string
          description: >-
            `ID` de la solicitud (se devuelve cuando se proporciona `request_id`
            en la solicitud)
          example: req-7f3a2c1e8b9d4f0a
        created:
          type: integer
          description: Hora de creación de la solicitud, marca de tiempo `Unix` (segundos)
          example: 1777021417
        model:
          type: string
          description: Nombre del modelo
          example: glm-5.3
        choices:
          type: array
          description: Lista de respuestas del modelo
          items:
            $ref: '#/components/schemas/Choice'
        usage:
          $ref: '#/components/schemas/Usage'
        web_search:
          type: array
          description: >-
            Información relacionada con la búsqueda web, se devuelve al usar la
            herramienta `web_search` y obtener resultados de búsqueda
          items:
            $ref: '#/components/schemas/WebSearchResult'
        content_filter:
          type: array
          description: Información relacionada con la seguridad del contenido
          items:
            $ref: '#/components/schemas/ContentFilter'
    ErrorResponse:
      type: object
      properties:
        error:
          type: object
          properties:
            code:
              type: integer
              description: Código de error de estado HTTP
            message:
              type: string
              description: Descripción del error
            type:
              type: string
              description: Tipo de error
            param:
              type: string
              description: Nombre del parámetro relacionado
            fallback_suggestion:
              type: string
              description: Sugerencia cuando ocurre un error
    SystemMessage:
      title: System Message
      type: object
      required:
        - role
        - content
      properties:
        role:
          type: string
          enum:
            - system
          description: Identificador de rol, fijo como `system`
        content:
          type: string
          description: >-
            Contenido de la indicación de sistema, usado para definir el rol y
            el comportamiento de la IA
    UserMessage:
      title: User Message
      type: object
      required:
        - role
        - content
      properties:
        role:
          type: string
          enum:
            - user
          description: Identificador de rol, fijo como `user`
        content:
          description: >-
            Contenido del mensaje del usuario.


            - **Cadena**: texto plano, admitido por todos los modelos

            - **Matriz de bloques de contenido**: texto e imágenes mezclados,
            **solo compatible con `glm-5.3-flash`**


            Enviar bloques de contenido de imagen a `glm-5.3` o `glm-5.2`
            devuelve un error.
          oneOf:
            - type: string
              title: Texto plano
              description: Contenido del mensaje en texto plano
              example: Hola, preséntate, por favor
            - type: array
              title: Matriz de bloques de contenido (solo glm-5.3-flash)
              description: >-
                Texto e imágenes mezclados. Las imágenes se envían mediante
                bloques `image_url`, con una URL pública (recomendada) o una URL
                de datos Base64; para varias imágenes, usa varios bloques
                `image_url`.
              items:
                $ref: '#/components/schemas/ContentPart'
    AssistantRequestMessage:
      title: Assistant Message
      type: object
      description: Mensaje del asistente, puede contener llamadas a herramientas
      required:
        - role
      properties:
        role:
          type: string
          enum:
            - assistant
          description: Identificador de rol, fijo como `assistant`
        content:
          type:
            - string
            - 'null'
          description: >-
            Contenido del mensaje del asistente


            **Notas**: se usa para pasar respuestas históricas del asistente en
            conversaciones de múltiples turnos; cuando hay `tool_calls`,
            normalmente es `null`
        reasoning_content:
          type:
            - string
            - 'null'
          description: >-
            Contenido de la cadena de pensamiento histórica


            **Notas**: solo se necesita cuando `thinking.clear_thinking=false`
            (Preserved Thinking), y consiste en devolver tal cual el
            `reasoning_content` de la respuesta del turno anterior; de forma
            predeterminada (`clear_thinking=true`) no es necesario devolverlo
        tool_calls:
          type: array
          description: >-
            Lista de llamadas a herramientas


            Se usa para pasar información histórica de llamadas a herramientas
            en conversaciones de múltiples turnos; cuando se proporciona este
            campo, `content` normalmente está vacío
          items:
            type: object
            required:
              - id
              - type
            properties:
              id:
                type: string
                description: ID de la llamada a la herramienta
              type:
                type: string
                enum:
                  - function
                  - web_search
                description: Tipo de herramienta
              function:
                type: object
                description: >-
                  Información de la llamada a la función, no está vacía cuando
                  `type` es `function`
                required:
                  - name
                  - arguments
                properties:
                  name:
                    type: string
                    description: Nombre de la función
                  arguments:
                    type: string
                    description: Argumentos de la función (cadena en formato JSON)
    ToolMessage:
      title: Tool Message
      type: object
      required:
        - role
        - content
      properties:
        role:
          type: string
          enum:
            - tool
          description: Identificador de rol, fijo como `tool`
        content:
          type: string
          description: Contenido del resultado devuelto por la llamada a la herramienta
        tool_call_id:
          type: string
          description: >-
            Indica el `ID` de la llamada a la herramienta a la que corresponde
            este mensaje (corresponde al `id` devuelto en `tool_calls` del
            mensaje assistant)
    FunctionTool:
      title: Herramienta Function
      type: object
      required:
        - type
        - function
      additionalProperties: false
      properties:
        type:
          type: string
          enum:
            - function
          default: function
          description: Tipo de herramienta, fijo como `function`
        function:
          type: object
          required:
            - name
            - description
            - parameters
          properties:
            name:
              type: string
              description: >-
                Nombre de la función a invocar


                **Notas**: debe estar compuesto por caracteres `a-z`, `A-Z`,
                `0-9`, o incluir guiones bajos y guiones; longitud máxima de 64
                caracteres
              minLength: 1
              maxLength: 64
              pattern: ^[a-zA-Z0-9_-]+$
            description:
              type: string
              description: >-
                Descripción de la funcionalidad de la función, para que el
                modelo decida cuándo y cómo invocarla
            parameters:
              type: object
              description: >-
                Parámetros de entrada de la función, descritos como un objeto
                JSON Schema
    WebSearchTool:
      title: Herramienta Web Search (búsqueda web)
      type: object
      required:
        - type
        - web_search
      additionalProperties: false
      properties:
        type:
          type: string
          enum:
            - web_search
          default: web_search
          description: Tipo de herramienta, fijo como `web_search`
        web_search:
          type: object
          required:
            - enable
          properties:
            enable:
              type: boolean
              description: >-
                Si se debe activar la función de búsqueda; al activarla,
                establécela en `true`
              default: false
            search_query:
              type: string
              description: >-
                Palabras clave personalizadas que fuerzan la activación de la
                búsqueda
            search_intent:
              type: boolean
              description: >-
                Si se debe realizar el reconocimiento de la intención de
                búsqueda, se ejecuta de forma predeterminada


                - `true`: ejecuta el reconocimiento de la intención de búsqueda
                y, si hay intención de búsqueda, realiza la búsqueda

                - `false`: omite el reconocimiento de intención y ejecuta la
                búsqueda directamente
            count:
              type: integer
              description: >-
                Número de resultados devueltos, en el rango `1-50`, con `10` por
                defecto.


                La cantidad influye directamente en el coste: los resultados se
                incorporan a `prompt_tokens` y se facturan a la tarifa de
                entrada, y un valor de `50` puede llevar una sola solicitud a
                decenas de miles de tokens de entrada. A menos que necesites
                realmente una cobertura más amplia, mantén el valor
                predeterminado.
              minimum: 1
              maximum: 50
              default: 10
            search_domain_filter:
              type: string
              description: >-
                Lista blanca de dominios que limita los resultados de búsqueda
                (p. ej. `www.example.com`)
            search_recency_filter:
              type: string
              description: >-
                Limita el rango temporal de los resultados de búsqueda,
                predeterminado `noLimit`
              enum:
                - oneDay
                - oneWeek
                - oneMonth
                - oneYear
                - noLimit
              default: noLimit
            content_size:
              type: string
              description: >-
                Controla la cantidad de palabras del resumen de la página web,
                predeterminado `medium`


                - `medium`: devuelve información de resumen, suficiente para las
                necesidades básicas de razonamiento

                - `high`: maximiza el contexto, con información más detallada
              enum:
                - medium
                - high
              default: medium
            result_sequence:
              type: string
              description: >-
                Posición en la que se devuelven los resultados de búsqueda
                (antes o después de la respuesta del modelo), predeterminado
                `after`
              enum:
                - before
                - after
              default: after
            search_result:
              type: boolean
              description: >-
                Indica si se devuelven los detalles de las fuentes de búsqueda
                en la respuesta; el valor predeterminado es `false`.


                Con `true`, la respuesta incluye en el nivel superior una matriz
                `web_search` con las fuentes recuperadas en esta solicitud
                (título, enlace, fuente del medio, fecha de publicación,
                resumen, etc.); con el valor predeterminado, ese campo no
                aparece en la respuesta.


                Este parámetro solo afecta al contenido de la respuesta: no
                influye ni en si se ejecuta la búsqueda ni en la facturación.
              default: false
              example: true
            require_search:
              type: boolean
              description: >-
                Si se debe forzar que la respuesta se base en los resultados de
                búsqueda, predeterminado `false`
              default: false
            search_prompt:
              type: string
              description: >-
                `Prompt` para personalizar el procesamiento de los resultados de
                búsqueda; si no se transfiere, se usa la plantilla
                predeterminada
      description: >-
        Herramienta de búsqueda web. Una vez activada, el modelo puede buscar en
        internet cuando lo necesite e incorporar los resultados al contexto.


        **Facturación**: la parte de los resultados incorporada al contexto
        cuenta como `prompt_tokens` a la tarifa de entrada; el servicio de
        búsqueda se **factura aparte por llamada** y se liquida al margen del
        consumo de tokens — consulta la página de precios. El modelo decide si
        activa la búsqueda según la intención detectada, y si no se activa
        ninguna búsqueda no se genera este cargo.
    Choice:
      type: object
      properties:
        index:
          type: integer
          description: Índice del resultado
          example: 0
        message:
          $ref: '#/components/schemas/AssistantMessage'
        finish_reason:
          type: string
          description: >-
            Motivo de finalización del razonamiento


            - `stop`: finalización natural o activación de una palabra de parada

            - `tool_calls`: el modelo invocó una función (llamada a herramienta)

            - `length`: se alcanzó el límite de longitud de tokens

            - `sensitive`: el contenido fue bloqueado por la auditoría de
            seguridad (evalúa y decide si retirar el contenido público)

            - `network_error`: anomalía en el razonamiento del modelo

            - `model_context_window_exceeded`: se superó la ventana de contexto
            del modelo
          enum:
            - stop
            - tool_calls
            - length
            - sensitive
            - network_error
            - model_context_window_exceeded
          example: stop
    Usage:
      type: object
      description: Estadísticas de uso de tokens devueltas al finalizar la llamada
      properties:
        prompt_tokens:
          type: integer
          description: Número de tokens de la entrada del usuario
          example: 24
        completion_tokens:
          type: integer
          description: >-
            Número de tokens de la salida (incluida la parte de la cadena de
            pensamiento `reasoning_tokens`)
          example: 346
        total_tokens:
          type: integer
          description: Número total de tokens = prompt_tokens + completion_tokens
          example: 370
        prompt_tokens_details:
          type: object
          description: Desglose detallado de los tokens de entrada
          properties:
            cached_tokens:
              type: integer
              description: >-
                Número de tokens de entrada servidos desde la caché de contexto.


                La serie GLM usa una **caché implícita de prefijo**: las
                solicitudes repetidas con el mismo prefijo la aciertan
                automáticamente, sin parámetros adicionales; la parte acertada
                se factura a la tarifa de caché, bastante inferior a la tarifa
                de entrada sin acierto. La primera solicitud devuelve 0 y, a
                partir de ahí, las solicitudes con el mismo prefijo aciertan.
              example: 0
        completion_tokens_details:
          type: object
          description: Desglose detallado de los tokens de salida
          properties:
            reasoning_tokens:
              type: integer
              description: >-
                Número de tokens producidos por la cadena de pensamiento
                (pensamiento profundo), contabilizados en `completion_tokens`
              example: 321
    WebSearchResult:
      type: object
      description: Resultado individual de la búsqueda web
      properties:
        icon:
          type: string
          description: Icono del sitio web de origen
        title:
          type: string
          description: Título del resultado de búsqueda
        link:
          type: string
          description: Enlace de la página web del resultado de búsqueda
        media:
          type: string
          description: >-
            Nombre de la fuente del medio de la página web del resultado de
            búsqueda
        publish_date:
          type: string
          description: Fecha de publicación del sitio web
        content:
          type: string
          description: Contenido de texto citado de la página web del resultado de búsqueda
        refer:
          type: string
          description: Número del superíndice
    ContentFilter:
      type: object
      description: Información de seguridad del contenido
      properties:
        role:
          type: string
          description: |-
            Etapa en la que se aplica la seguridad

            - `assistant`: razonamiento del modelo
            - `user`: entrada del usuario
            - `history`: contexto histórico
          enum:
            - assistant
            - user
            - history
        level:
          type: integer
          description: Grado de gravedad `0-3`, `0` indica el más grave y `3` indica leve
          minimum: 0
          maximum: 3
    ContentPart:
      title: Content Part
      type: object
      description: >-
        Bloque de contenido multimodal. **Solo `glm-5.3-flash` admite bloques de
        imagen.**
      required:
        - type
      properties:
        type:
          type: string
          enum:
            - text
            - image_url
          description: |-
            Tipo de bloque de contenido

            - `text`: texto
            - `image_url`: imagen (solo `glm-5.3-flash`)
        text:
          type: string
          description: Contenido de texto, obligatorio cuando `type=text`
          example: ¿Qué hay en esta imagen?
        image_url:
          type: object
          description: Contenido de la imagen, obligatorio cuando `type=image_url`
          required:
            - url
          properties:
            url:
              type: string
              description: >-
                Dirección de la imagen. Se admite una URL HTTPS pública
                (recomendada) o una URL de datos Base64
                (`data:image/png;base64,...`)
              example: https://example.com/photo.jpg
    AssistantMessage:
      type: object
      properties:
        role:
          type: string
          description: Rol de la conversación actual, predeterminado `assistant`
          enum:
            - assistant
          example: assistant
        content:
          type:
            - string
            - 'null'
          description: >-
            Contenido de texto de la conversación


            **Notas**: puede ser `null` al invocar herramientas (`tool_calls`);
            de lo contrario, devuelve el contenido de la respuesta del modelo
          example: >-
            ¡Hola! Soy GLM-5.3 y puedo ayudarte con conversación, razonamiento,
            redacción, código y muchas otras tareas.
        reasoning_content:
          type: string
          description: >-
            Contenido de la cadena de pensamiento


            **Notas**: se devuelve cuando `thinking` está activado, y registra
            el proceso de razonamiento del modelo
          example: Primero déjame analizar este problema...
        tool_calls:
          type: array
          description: >-
            Información de las llamadas a herramientas generadas (se devuelve
            cuando el modelo decide invocar una herramienta)
          items:
            type: object
            properties:
              id:
                type: string
                description: Identificador único de la llamada a la herramienta
              type:
                type: string
                description: Tipo de llamada a la herramienta
                enum:
                  - function
              function:
                type: object
                description: >-
                  Información de la llamada a la función (incluye el nombre de
                  la función generado y los argumentos en formato JSON)
                properties:
                  name:
                    type: string
                    description: Nombre de la función generado
                  arguments:
                    type: string
                    description: >-
                      Cadena en formato JSON de los argumentos de la llamada a
                      la función; valida los argumentos antes de invocar la
                      función
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: >-
        ##Todas las API requieren autenticación con Bearer Token##


        **Obtener la API Key:**


        Visita la [página de gestión de API
        Keys](https://evolink.ai/dashboard/keys) para obtener tu API Key


        **Añadir al encabezado de la solicitud:**

        ```

        Authorization: Bearer YOUR_API_KEY

        ```

````