Publié le
E2B

Lancement de workflows IA dans les sandboxes E2B : Un guide pour débutants

Image de l'article

Dans cet article, nous explorons comment configurer les sandboxes E2B et exploiter DeepSeek AI pour exécuter des workflows alimentés par l'IA en Python. En intégrant la génération de code pilotée par LLM avec les sandboxes polyvalentes d'E2B, les développeurs peuvent rationaliser des tâches complexes comme le traitement et la visualisation de données. Les exemples ci-dessous démontrent des workflows étape par étape, incluant des scripts Python alimentés par l'IA et la génération d'analyses via des graphiques.

Qu'est-ce qu'E2B ?

E2B est une infrastructure open-source qui permet aux développeurs d'exécuter du code généré par l'IA dans des sandboxes sécurisées et isolées hébergées dans le cloud. Ces sandboxes sont des machines virtuelles légères (VMs) qui peuvent être démarrées en seulement ~150ms, ce qui les rend idéales pour des applications en temps réel. Que vous construisiez des outils d'analyse de données alimentés par l'IA, des environnements de codage ou des applications IA complètes, E2B fournit la base pour rendre vos projets évolutifs, sécurisés et efficaces.

Pour plus de détails, consultez mon article de blog sur Construire des applications alimentées par l'IA avec les sandboxes E2B.

Configuration des sandboxes E2B

Les sandboxes E2B fournissent des environnements isolés et évolutifs parfaits pour exécuter des applications IA. Suivez ces étapes pour commencer :

  1. Inscrivez-vous à E2B : Créez un compte sur la plateforme E2B.
  2. Configurez les clés API :
  • Générez une clé API pour E2B et définissez-la comme variable d'environnement :
export E2B_API_KEY=votre_clé
  • Générez une clé API depuis DeepSeek AI et définissez-la comme variable d'environnement :
export DEEPSEEK_API_KEY=votre_clé
  • Optionnel : Si vous choisissez d'utiliser Mistral comme API, vous devrez définir cette variable d'environnement à la place :
export MISTRAL_API_KEY=votre_clé

Une fois votre sandbox prête, vous pouvez procéder à l'exécution des workflows et interagir avec DeepSeek AI.

Exécution de workflows alimentés par l'IA

Cette section démontre comment exécuter des workflows alimentés par l'IA en utilisant l'environnement de sandbox E2B. Le script Python e2b_llm_integration.py s'intègre avec des modèles IA comme DeepSeek et Mistral pour générer et exécuter du code Python. Ci-dessous, nous décomposons la fonctionnalité du script et comment il exploite les sandboxes E2B pour une exécution sécurisée et isolée.

Aperçu du script Python

Le script Python, e2b_llm_integration.py, sert d'outil complet pour générer et exécuter du code Python en utilisant des modèles IA comme Mistral et DeepSeek. Il facilite l'interaction avec ces modèles en acceptant des invites utilisateur, en récupérant le code Python généré et en l'exécutant dans un environnement de sandbox E2B. Les fonctionnalités clés incluent :

  • Support pour les API Mistral et DeepSeek avec une sélection flexible d'API.
  • Extraction de blocs de code Python en utilisant des regex pour une exécution propre.
  • Support des arguments en ligne de commande pour spécifier les invites, les options d'API, les chemins de fichiers de sortie et les fichiers d'entrée.
  • Gestion des fichiers : Le script s'attend à ce que le code Python généré crée un fichier (par exemple, un graphique) dans l'environnement de sandbox. Après l'exécution, le script récupère ce fichier depuis la sandbox et le sauvegarde dans le répertoire local spécifié. Cela garantit que la sortie (par exemple, les visualisations) est accessible en dehors de la sandbox.

Arguments en ligne de commande

Le script supporte les arguments en ligne de commande suivants :

  • prompt : L'invite fournie par l'utilisateur pour le modèle IA.
  • --file : Optionnel ; Chemin vers un fichier texte contenant l'invite.
  • --api : Optionnel ; Spécifiez l'API à utiliser (mistral ou deepseek). Par défaut, c'est deepseek.
  • --output : Optionnel ; Chemin local pour sauvegarder le fichier généré. Par défaut, c'est plot.jpg.
"""
Script Name: e2b_llm_integration.py

Description:
This script facilitates the generation and execution of Python code using AI models such as Mistral and DeepSeek. It accepts a user-provided prompt, sends it to the specified model (default is DeepSeek), retrieves the generated code, and executes it within a sandboxed environment provided by E2B. The script supports both Mistral and DeepSeek APIs, allowing for flexible API selection, output file path specification, and input prompt sourcing from either direct input or a text file.

Key Features:
- Extracts Python code blocks from the model's response using regex.
- Executes the generated code in a secure, sandboxed environment using E2B.
- Supports command-line arguments for user prompts, API selection, output file paths, and input prompt files.

Usage:
- Default API (DeepSeek):
  python e2b_llm_integration.py "<your prompt>"

- Specify API:
  python e2b_llm_integration.py "<your prompt>" --api <mistral|deepseek>

- Specify output file path:
  python e2b_llm_integration.py "<your prompt>" --output <path/to/output/file>

- Use a prompt from a text file:
  python e2b_llm_integration.py --file <path/to/prompt_file.txt>

Dependencies:
- Python 3.6+
- mistralai: Python client for the Mistral API.
- e2b-code-interpreter: Python client for the E2B Sandbox API.
- openai: Python client for the OpenAI API, used for DeepSeek.

Environment Variables:
- MISTRAL_API_KEY: API key for accessing the Mistral API.
- DEEPSEEK_API_KEY: API key for accessing the DeepSeek API.
- E2B_API_KEY: API key for accessing the E2B Sandbox API.

Arguments:
- prompt (str): User prompt for the AI model.
- --file (str): Optional; Path to a text file containing the prompt.
- --api (str): Optional; Specify the API to use ('mistral' or 'deepseek'). Default is 'deepseek'.
- --output (str): Optional; Local path to save the generated file. Default is 'plot.jpg'.

Version: 1.0.0
"""

import os
import sys
import re
import logging
import argparse
from typing import Optional

from mistralai import Mistral
from e2b_code_interpreter import Sandbox
from openai import OpenAI

logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s")

class CodeGenerator:
    """
    A class to handle the generation of Python code using specified AI models.

    Attributes:
        api_option (str): The API to use for code generation ('mistral' or 'deepseek').
        prompt (str): The user-provided prompt for code generation.
        api_key (str): The API key for accessing the specified API.
    """
    def __init__(self, api_option: str, prompt: str):
        """
        Initializes the CodeGenerator with the specified API option and prompt.

        Args:
            api_option (str): The API to use for code generation ('mistral' or 'deepseek').
            prompt (str): The user-provided prompt for code generation.
        """
        self.api_option = api_option
        self.prompt = prompt
        self.api_key = os.environ.get("MISTRAL_API_KEY" if api_option == "mistral" else "DEEPSEEK_API_KEY")
        if not self.api_key:
            print(f"Error: The environment variable {'MISTRAL_API_KEY' if api_option == 'mistral' else 'DEEPSEEK_API_KEY'} is not set.")
            sys.exit(1)

    def get_client(self):
        """
        Returns a client instance for the specified API.

        Returns:
            An instance of the client for the specified API.
        """
        if self.api_option == "mistral":
            return Mistral(api_key=self.api_key)
        elif self.api_option == "deepseek":
            return OpenAI(api_key=self.api_key, base_url="https://api.deepseek.com")

    def generate_code(self):
        """
        Generates Python code based on the user-provided prompt using the specified API.

        Returns:
            str: The generated Python code.
        """
        client = self.get_client()
        system_prompt = (
            """
You are a Python coding assistant that only outputs Python code without any explanations or comments. For all modules or packages you use in the script, do not assume the packages are installed. Include the necessary installation commands before the import statements. This is an example for the module SomeClass:

import subprocess
import sys

try:
    from some_module import SomeClass
except ImportError:
    subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'some_module'])
    from some_module import SomeClass

You will be asked to create a method and call it. The call to the method has to be with if __name__ == "__main__":

Document well the method in the header including:
- Arguments
- Purpose of the method
- Return values

Very important: write the Python code like this:
```python
code
```
            """
        )

        try:
            if self.api_option == "mistral":
                response = client.chat.complete(
                    model="codestral-latest",
                    messages=[
                        {"role": "system", "content": system_prompt},
                        {"role": "user", "content": self.prompt}
                    ],
                    temperature=0.0
                )
            elif self.api_option == "deepseek":
                response = client.chat.completions.create(
                    model="deepseek-chat",
                    messages=[
                        {"role": "system", "content": system_prompt},
                        {"role": "user", "content": self.prompt}
                    ],
                    stream=False,
                    temperature=0.0
                )
            return response.choices[0].message.content.strip()
        except Exception as e:
            print(f"Error communicating with {self.api_option.capitalize()} API: {e}")
            sys.exit(1)

def extract_code_block(content: str) -> Optional[str]:
    """
    Extracts a Python code block from the given text data using regex.

    Args:
        content (str): The text data containing a Python code block.

    Returns:
        Optional[str]: The extracted Python code block, or None if not found.
    """
    if not content:
        logging.warning("Content is empty or None.")
        return None

    match = re.search(r'\`\`\`python(.*?)\`\`\`', content, re.DOTALL)
    if match:
        return match.group(1).strip()  # Return the Python code without the backticks
    logging.warning("No Python code block found in the content.")
    return None

def main():
    """
    Main function to parse command-line arguments, generate code, and execute it in a sandboxed environment.
    """
    # Command-line argument parsing
    parser = argparse.ArgumentParser(description="Generate and execute Python code using AI models.")
    group = parser.add_mutually_exclusive_group(required=True)
    group.add_argument("prompt", type=str, nargs="?", help="Prompt for the AI model.")
    group.add_argument("--file", type=str, help="Path to a text file containing the prompt.")
    parser.add_argument(
        "--api", type=str, choices=["mistral", "deepseek"], default="deepseek",
        help="Specify the API to use (default: deepseek)."
    )
    parser.add_argument(
        "--output", type=str, default="plot.jpg",
        help="Optional: Local path to save the file (default: plot.jpg)."
    )
    args = parser.parse_args()

    # Check for E2B_API_KEY environment variable
    if not os.environ.get("E2B_API_KEY"):
        print("Error: The environment variable E2B_API_KEY is not set.")
        sys.exit(1)

    # Read the prompt from the provided argument or file
    if args.file:
        try:
            with open(args.file, 'r') as file:
                prompt = file.read().strip()
        except Exception as e:
            print(f"Error reading the prompt file: {e}")
            sys.exit(1)
    else:
        prompt = args.prompt

    api_option = args.api
    local_file_path = args.output
    sandbox_filename = os.path.basename(local_file_path)  # Extract only the filename for the sandbox

    print("Input Prompt:")
    print(prompt)
    print(f"Using model: {api_option.capitalize()}")
    print(f"Local file path: {local_file_path}")

    # Generate code
    code_generator = CodeGenerator(api_option, prompt)
    raw_code = code_generator.generate_code()
    code = extract_code_block(raw_code)
    if not code:
        print("Error: Received empty code from the model.")
        sys.exit(1)

    print("Generated Code:")
    print("----------------")
    print("```python")
    print(code)
    print("```")
    print("----------------\n")

    # Execute code in E2B Sandbox
    try:
        with Sandbox() as sandbox:
            execution = sandbox.run_code(code)
            result = execution.text
            logs = execution.logs

            try:
                # Attempt to download file from the sandbox
                content = sandbox.files.read(f"/home/user/{sandbox_filename}", format="bytes")

                # Write file to the specified local path
                with open(local_file_path, "wb") as file:
                    file.write(content)

                logging.info(f"File successfully downloaded and saved to {local_file_path}")
            except Exception as e:
                logging.error(f"Failed to download file from sandbox: {e}")

    except Exception as e:
        logging.error(f"Error executing code in Sandbox: {e}")
        sys.exit(1)

    logging.info("Execution Output:")
    logging.info("Stdout Logs:")
    for log in logs.stdout:
        logging.info(log)
    logging.info("Stderr Logs:")
    for log in logs.stderr:
        logging.info(log)

    logging.info("Execution Result:")
    logging.info(result)

if __name__ == "__main__":
    main()

Considérations clés pour la conception des invites dans la génération de code

Un aspect critique de l'invite utilisée pour la génération de code est l'instruction explicite au modèle IA : "You are a Python coding assistant that only outputs Python code without any explanations or comments." Cela garantit que la sortie générée est un code propre et exécutable sans texte superflu. De plus, l'invite inclut l'instruction : "For all modules or packages you use in the script, do not assume the packages are installed. Include the necessary installation commands before the import statements." Cela garantit que le code généré est autonome et peut être exécuté dans des environnements où les dépendances ne sont pas pré-installées.

Exemples de workflows

Ci-dessous, quatre exemples démontrent comment utiliser l'intégration d'E2B et DeepSeek AI pour des tâches de traitement et de visualisation de données. Chaque cas met en lumière un cas d'utilisation différent, de l'analyse des tendances de température à la visualisation de la croissance du PIB.

Remarque : Ces exemples ont été exécutés en utilisant l'API DeepSeek, et les résultats pour l'API Mistral n'ont pas été testés ou vérifiés.

Cas 1 : Analyse des tendances des températures minimales

Invite : "Téléchargez le fichier CSV à partir de l'URL fournie, générez un graphique en série temporelle de la température minimale chaque année, convertie en Celsius, et enregistrez-le sous forme de fichier JPEG nommé 'graph_001.jpg'. Affichez la taille du fichier généré. Voici le format du fichier CSV : ..."

Exécution : Le script a téléchargé et traité les données CSV, calculant les températures minimales annuelles. Un graphique en série temporelle a été généré pour visualiser les tendances de température au fil du temps, converti en Celsius, et enregistré sous graph_001.jpg.

Première image de graphique
Figure 1 : Graphique en série temporelle montrant les tendances des températures minimales au fil du temps.

Cas 2 : Visualisation de la distribution du PIB

Invite : "Téléchargez le fichier CSV à partir de l'URL fournie, lisez et traitez les données, et générez un graphique en camembert au format JPG montrant la distribution du PIB des 10 plus grandes économies pour l'année 2022. Incluez les noms des pays comme étiquettes dans le graphique et enregistrez-le sous graph_002.jpg. Affichez la taille du fichier enregistré en octets. Voici le format du fichier CSV : ..."

Exécution : En utilisant DeepSeek AI, le script a téléchargé et traité les données CSV, identifiant les 10 plus grandes économies par PIB pour 2022. Un graphique en camembert a été généré avec des segments étiquetés représentant les contributions au PIB et enregistré sous graph_002.jpg.

Deuxième image de graphique
Figure 2 : Graphique en camembert montrant la distribution du PIB des 10 plus grandes économies en 2022.

Cas 3 : Analyse des anomalies de température mondiale

Invite : "Téléchargez le fichier CSV à partir de l'URL fournie, générez un graphique en série temporelle des anomalies annuelles de température mondiale au format JPG, et enregistrez-le dans un fichier local nommé 'graph_003.jpg'. Affichez la taille du fichier généré. Voici le format du fichier CSV : ..."

Exécution : Le script a téléchargé et traité les données CSV, visualisant les anomalies annuelles de température mondiale au fil du temps. Un graphique en série temporelle a été généré et enregistré sous graph_003.jpg.

Troisième image de graphique
Figure 3 : Graphique en série temporelle montrant les anomalies annuelles de température mondiale.

Cas 4 : Analyse des tendances de croissance du PIB des États-Unis

Invite : "Téléchargez le fichier à partir de l'URL fournie. Décompressez-le et traitez le fichier CSV pertinent, en excluant ceux commençant par 'Metadata'. Générez un graphique avec la croissance en pourcentage du PIB des États-Unis d'une année sur l'autre de 2008 à 2021, en ajoutant les noms des pays comme étiquettes. Enregistrez le graphique sous 'graph_004.jpg' et vérifiez son existence, en affichant la taille du fichier en octets. Incluez des logs de trace pour le dépannage des étapes de gestion des fichiers et de traitement des données. Voici le format du fichier CSV : ..."

Exécution : Le script a géré le téléchargement, la décompression et le traitement des données, y compris la gestion des erreurs et les logs de trace. La croissance du PIB des États-Unis d'une année sur l'autre a été calculée et visualisée dans un graphique étiqueté, qui a été enregistré sous graph_004.jpg après vérification de son existence et de sa taille.

Quatrième image de graphique
Figure 4 : Graphique en ligne montrant la croissance du PIB des États-Unis d'une année sur l'autre de 2008 à 2021.

Conclusions

L'intégration des sandboxes E2B avec DeepSeek AI offre une solution robuste pour exécuter des workflows Python alimentés par l'IA, comme démontré par les quatre cas ci-dessus. Chaque exemple a généré avec succès des visualisations précises, mettant en évidence l'efficacité de cette approche pour les tâches de traitement et de visualisation de données. Cependant, lors du choix entre les sandboxes cloud et locales, considérez les éléments suivants :

  1. Coût : Les sandboxes cloud comme E2B sont évolutives mais peuvent entraîner des coûts plus élevés, tandis que les sandboxes locales sont économiques mais moins évolutives.
  2. Sécurité : Les sandboxes locales gardent les données dans des environnements contrôlés, tandis que les sandboxes cloud nécessitent une gestion robuste de l'accès et du chiffrement.
  3. Évolutivité : Les sandboxes cloud excellent en termes d'évolutivité et de collaboration, tandis que les sandboxes locales sont mieux adaptées pour des projets sécurisés à plus petite échelle.

Choisissez en fonction des besoins de votre projet : cloud pour l'évolutivité et la collaboration, ou local pour la sécurité et l'efficacité des coûts. L'équilibre de ces facteurs garantit une productivité et une sécurité optimales dans vos workflows.


Vous avez apprécié cet article ? Vous l'avez trouvé utile ? N'hésitez pas à laisser un commentaire ci-dessous pour partager vos réflexions ou poser des questions. Un compte GitHub est requis pour participer à la discussion.

Continuer la lecture

Articles similaires