Compartir a través de


Sesiones de intérprete de código sin servidor en Azure Container Apps

Las sesiones dinámicas de Azure Container Apps proporcionan a un intérprete de código acceso rápido y escalable. Cada sesión de intérprete de código está totalmente aislada por un límite de Hyper-V y está diseñada para ejecutar código que no es de confianza.

Usos de las sesiones de intérprete de código

Las sesiones de intérprete de código son ideales para escenarios en los que es necesario ejecutar código potencialmente malintencionado o que podría causar daños en el sistema host u otros usuarios, como:

  • Código generado por un modelo de lenguaje de gran tamaño (LLM).
  • Código enviado por un usuario final en una aplicación web o SaaS.

En el caso de los marcos LLM populares, como LangChain, LlamaIndex o Semantic Kernel, puede usar herramientas y complementos para integrar aplicaciones de inteligencia artificial con sesiones de intérprete de código.

Las aplicaciones también se pueden integrar con la sesión de intérprete de código mediante una API de REST. La API le permite:

  • Ejecución de código en una sesión y recuperación de resultados

  • Cargue y descargue archivos en y desde la sesión.

    Puede cargar y descargar archivos de código ejecutables o archivos de datos que el código puede procesar.

Las sesiones de intérprete de código integradas admiten los escenarios de ejecución de código más comunes sin necesidad de administrar la infraestructura ni los contenedores.

Si necesita un control total sobre el entorno de ejecución de código o tiene un escenario diferente que requiere espacios aislados, puede usar sesiones de intérprete de código personalizadas.

Grupo de sesiones de intérprete de código

Para usar sesiones de intérprete de código, necesita un recurso de Azure denominado grupo de sesiones que defina la configuración de las sesiones del intérprete de código.

En el grupo de sesiones, puede especificar la configuración, como el número máximo de sesiones simultáneas y cuánto tiempo puede estar inactiva una sesión antes de que finalice.

Puede crear un grupo de sesiones mediante Azure Portal, la CLI de Azure o plantillas de Azure Resource Manager. Después de crear un grupo de sesiones, puede usar los puntos de conexión de la API de administración del grupo para administrar y ejecutar código dentro de una sesión.

Para obtener más información sobre cómo crear y configurar un grupo de sesiones, consulte Uso de grupos de sesiones.

Ejecución de código en una sesión

Después de crear un grupo de sesiones, la aplicación puede interactuar con las sesiones del grupo mediante una integración con un marco de LLM o mediante los puntos de conexión de la API de administración del grupo directamente.

Identificadores de sesión

Importante

El identificador de sesión es información confidencial que requiere que use un proceso seguro para administrar su valor. Parte de este proceso requiere que la aplicación garantice que cada usuario o inquilino solo tenga acceso a sus propias sesiones.

Si no se protege el acceso a las sesiones, se podría producir un acceso incorrecto o no autorizado a los datos almacenados en las sesiones de los usuarios. Para obtener más información, consulte Identificadores de sesión.

Al interactuar con sesiones de un grupo, se usa un identificador de sesión para hacer referencia a cada sesión Un identificador de sesión es una cadena que define que es única dentro del grupo de sesiones. Si va a compilar una aplicación web, puede usar el identificador del usuario. Si va a crear un bot de chat, puede usar el identificador de conversación.

Si hay una sesión en ejecución con el identificador, se reutiliza la sesión. Si no hay ninguna sesión en ejecución con el identificador, se crea automáticamente una nueva sesión.

Autenticación

La autenticación se controla mediante tokens de Microsoft Entra. Los tokens válidos de Microsoft Entra se generan mediante una identidad que pertenece a los roles ejecutor y colaborador de sesión de Azure ContainerApps en el grupo de sesiones.

Si usa una integración del marco de LLM, el marco controla la generación y administración de tokens. Asegúrate de que la aplicación está configurada con una identidad administrada con las asignaciones de roles necesarias en el grupo de sesiones.

Si usas directamente los puntos de conexión de la API de administración del grupo, debes generar un token e incluirlo en el encabezado Authorization de las solicitudes HTTP. Además de las asignaciones de roles mencionadas anteriormente, el token debe contener una notificación de audiencia (aud) con el valor https://dynamicsessions.io.

Para obtener más información, consulte autenticación y autorización.

Trabajar con archivos

Puede cargar y descargar archivos y enumerar todos los archivos en una sesión de intérprete de código.

Carga de un archivo

Para cargar un archivo en una sesión, envíe una solicitud POST al punto de conexión uploadFile en una solicitud de datos de formulario de varias partes. Incluya los datos del archivo en el cuerpo de la solicitud. El archivo debe incluir un nombre de archivo.

Los archivos cargados se almacenan en el sistema de archivos de la sesión en el directorio /mnt/data.

En el ejemplo siguiente se muestra cómo cargar un archivo en una sesión.

Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <> por valores específicos de la solicitud.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Descargar un archivo

Para descargar un archivo desde el directorio /mnt/data de una sesión, envíe una solicitud GET al punto de conexión file/content/{filename}. La respuesta incluye los datos del archivo.

En el ejemplo siguiente se muestra cómo dar formato a una GET solicitud para descargar un archivo.

Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <> por valores específicos de la solicitud.

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

Enumerar los archivos

Para enumerar los archivos en el directorio /mnt/data de una sesión, envíe una solicitud GET al punto de conexión files.

En el ejemplo siguiente se muestra cómo enumerar los archivos en el directorio de una sesión.

Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <> por valores específicos de la solicitud.

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

La respuesta contiene una lista de archivos en la sesión.

En la lista siguiente se muestra un ejemplo del tipo de respuesta que puede esperar al solicitar el contenido de la sesión.

{
    "$id": "1",
    "value": [
        {
            "$id": "2",
            "properties": {
                "$id": "3",
                "filename": "test1.txt",
                "size": 16,
                "lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
            }
        },
        {
            "$id": "4",
            "properties": {
                "$id": "5",
                "filename": "test2.txt",
                "size": 17,
                "lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
            }
        }
    ]
}

Seguridad

Las sesiones de intérprete de código están diseñadas para ejecutar código que no es de confianza en entornos aislados, lo que garantiza que las aplicaciones y los datos permanecen protegidos.

Integraciones del marco de LLM

En lugar de usar directamente la API de administración del grupo de sesiones, los marcos de LLM siguientes proporcionan integraciones con sesiones de intérprete de código:

marco Paquete Guía
LangChain Pitón: langchain-azure-dynamic-sessions Tutorial
LlamaIndex Pitón: llama-index-tools-azure-code-interpreter Tutorial
Kernel semántico Python: semantic-kernel (versión 0.9.8-b1 o cualquier versión posterior) Tutorial

Puntos de conexión de API de administración

Si no usa una integración de marco de LLM, puede interactuar directamente con el grupo de sesiones mediante los puntos de conexión de la API de administración.

Ejecución de un código en una sesión

Para ejecutar código en una sesión, envíe una solicitud POST al punto de conexión code/execute con el código que se va a ejecutar en el cuerpo de la solicitud.

El siguiente ejemplo imprime Hello, world! en Python.

Antes de enviar la solicitud, reemplace los marcadores de posición entre los corchetes <> por los valores adecuados para el grupo de sesiones y el identificador de sesión.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <token>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "print('Hello, world!')"
    }
}

Para reutilizar una sesión, especifique el mismo identificador de sesión en las solicitudes posteriores.

Carga de un archivo en una sesión

Para cargar un archivo en una sesión, envíe una solicitud POST al punto de conexión uploadFile en una solicitud de datos de formulario de varias partes. Incluya los datos del archivo en el cuerpo de la solicitud. El archivo debe incluir un nombre de archivo.

Los archivos cargados se almacenan en el sistema de archivos de la sesión en el directorio /mnt/data.

Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <> por valores específicos de la solicitud.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/upload?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
Authorization: Bearer <token>

------WebKitFormBoundary7MA4YWxkTrZu0gW
Content-Disposition: form-data; name="file"; filename="<FILE_NAME_AND_EXTENSION>"
Content-Type: application/octet-stream

(data)
------WebKitFormBoundary7MA4YWxkTrZu0gW--

Nota:

El límite de carga de archivos de 128MB. Si se supera, se puede devolver un HTTP 413.

Descarga de un archivo desde una sesión

Para descargar un archivo desde el directorio /mnt/data de una sesión, envíe una solicitud GET al punto de conexión file/content/{filename}. La respuesta incluye los datos del archivo.

Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <> por valores específicos de la solicitud.

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files/content/<FILE_NAME_AND_EXTENSION>?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

Enumeración de los archivos de una sesión

Para enumerar los archivos en el directorio /mnt/data de una sesión, envíe una solicitud GET al punto de conexión files.

Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <> por valores específicos de la solicitud.

GET https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/files?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Authorization: Bearer <TOKEN>

La respuesta contiene una lista de archivos en la sesión.

En la lista siguiente se muestra un ejemplo del tipo de respuesta que puede esperar al solicitar el contenido de la sesión.

{
    "$id": "1",
    "value": [
        {
            "$id": "2",
            "properties": {
                "$id": "3",
                "filename": "test1.txt",
                "size": 16,
                "lastModifiedTime": "2024-05-02T07:21:07.9922617Z"
            }
        },
        {
            "$id": "4",
            "properties": {
                "$id": "5",
                "filename": "test2.txt",
                "size": 17,
                "lastModifiedTime": "2024-05-02T07:21:08.8802793Z"
            }
        }
    ]
}

Paquetes preinstalados

Las sesiones de intérprete de código de Python incluyen paquetes de Python populares, como NumPy, pandas y scikit-learn.

Para generar la lista de paquetes preinstalados, llame al punto de conexión code/execute con el código siguiente.

Antes de enviar la solicitud, reemplace los marcadores de posición entre corchetes <> por valores específicos de la solicitud.

POST https://<REGION>.dynamicsessions.io/subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP>/sessionPools/<SESSION_POOL_NAME>/identifier/<SESSION_ID>/code/execute?api-version=2024-02-02-preview&identifier=<SESSION_ID>
Content-Type: application/json
Authorization: Bearer <TOKEN>

{
    "properties": {
        "codeInputType": "inline",
        "executionType": "synchronous",
        "code": "import pkg_resources\n[(d.project_name, d.version) for d in pkg_resources.working_set]"
    }
}

Registro

Las sesiones de intérprete de código no admiten el registro directamente. La aplicación que interactúa con las sesiones puede registrar solicitudes en la API de administración del grupo de sesiones y sus respuestas.

Facturación

Las sesiones de intérprete de código se facturan en función de la duración de cada sesión. Para obtener más información, vea Facturación.

Pasos siguientes