Veröffentlicht am
E2B

AI-Workflows in E2B-Sandboxes starten: Ein Leitfaden für Anfänger

Post image

In diesem Beitrag untersuchen wir, wie man E2B-Sandboxes einrichtet und DeepSeek AI nutzt, um Python-basierte AI-Workflows auszuführen. Durch die Integration von LLM-gesteuerter Code-Generierung mit den vielseitigen Sandboxes von E2B können Entwickler komplexe Aufgaben wie Datenverarbeitung und Visualisierung effizienter gestalten. Die folgenden Beispiele zeigen Schritt-für-Schritt-Workflows, einschließlich AI-gesteuerter Python-Skripterstellung und der Generierung von Erkenntnissen durch Diagramme.

Was ist E2B?

E2B ist eine Open-Source-Infrastruktur, die es Entwicklern ermöglicht, AI-generierten Code in sicheren, isolierten Sandboxes auszuführen, die in der Cloud gehostet werden. Diese Sandboxes sind leichtgewichtige virtuelle Maschinen (VMs), die in nur ~150 ms gestartet werden können, was sie ideal für Echtzeitanwendungen macht. Egal, ob Sie AI-Datenanalysetools, Coding-Playgrounds oder vollwertige AI-Anwendungen erstellen, E2B bietet die Grundlage, um Ihre Projekte skalierbar, sicher und effizient zu gestalten.

Weitere Details finden Sie in meinem Blogbeitrag Building AI-Powered Applications with E2B Sandboxes.

Einrichten von E2B-Sandboxes

E2B-Sandboxes bieten isolierte, skalierbare Umgebungen, die perfekt für die Ausführung von AI-Anwendungen geeignet sind. Folgen Sie diesen Schritten, um loszulegen:

  1. Registrieren Sie sich für E2B: Erstellen Sie ein Konto auf der E2B-Plattform.
  2. API-Schlüssel einrichten:
  • Generieren Sie einen API-Schlüssel für E2B und setzen Sie ihn als Umgebungsvariable:
export E2B_API_KEY=your_key
  • Generieren Sie einen API-Schlüssel von DeepSeek AI und setzen Sie ihn als Umgebungsvariable:
export DEEPSEEK_API_KEY=your_key
  • Optional: Wenn Sie Mistral als API verwenden möchten, müssen Sie stattdessen diese Umgebungsvariable setzen:
export MISTRAL_API_KEY=your_key

Sobald Ihre Sandbox bereit ist, können Sie mit der Ausführung von Workflows und der Interaktion mit DeepSeek AI fortfahren.

Ausführen von AI-gesteuerten Workflows

Dieser Abschnitt zeigt, wie man AI-gesteuerte Workflows in der E2B-Sandbox-Umgebung ausführt. Das Python-Skript e2b_llm_integration.py integriert AI-Modelle wie DeepSeek und Mistral, um Python-Code zu generieren und auszuführen. Im Folgenden erläutern wir die Funktionalität des Skripts und wie es E2B-Sandboxes für die sichere, isolierte Ausführung nutzt.

Überblick über das Python-Skript

Das Python-Skript, e2b_llm_integration.py, dient als umfassendes Tool zur Generierung und Ausführung von Python-Code mithilfe von AI-Modellen wie Mistral und DeepSeek. Es ermöglicht die Interaktion mit diesen Modellen, indem es Benutzeranfragen akzeptiert, generierten Python-Code abruft und ihn in einer E2B-Sandbox-Umgebung ausführt. Zu den Hauptmerkmalen gehören:

  • Unterstützung für sowohl Mistral- als auch DeepSeek-APIs mit flexibler API-Auswahl.
  • Extraktion von Python-Codeblöcken mithilfe von Regex für eine saubere Ausführung.
  • Unterstützung von Befehlszeilenargumenten zur Angabe von Anfragen, API-Optionen, Ausgabedateipfaden und Eingabedateien.
  • Dateiverwaltung: Das Skript erwartet, dass der generierte Python-Code eine Datei (z. B. ein Diagramm) in der Sandbox-Umgebung erstellt. Nach der Ausführung ruft das Skript diese Datei aus der Sandbox ab und speichert sie im angegebenen lokalen Verzeichnis. Dadurch wird sichergestellt, dass die Ausgabe (z. B. Visualisierungen) außerhalb der Sandbox zugänglich ist.

Befehlszeilenargumente

Das Skript unterstützt die folgenden Befehlszeilenargumente:

  • prompt: Die vom Benutzer bereitgestellte Anfrage für das AI-Modell.
  • --file: Optional; Pfad zu einer Textdatei, die die Anfrage enthält.
  • --api: Optional; Gibt die zu verwendende API an (mistral oder deepseek). Standard ist deepseek.
  • --output: Optional; Lokaler Pfad, um die generierte Datei zu speichern. Standard ist 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()

Wichtige Überlegungen zur Gestaltung von Anfragen für die Code-Generierung

Ein kritischer Aspekt der Anfrage, die für die Code-Generierung verwendet wird, ist die explizite Anweisung an das AI-Modell: "You are a Python coding assistant that only outputs Python code without any explanations or comments." Dies stellt sicher, dass die generierte Ausgabe sauberer, ausführbarer Code ohne überflüssigen Text ist. Darüber hinaus enthält die Anfrage die Anweisung: "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." Dies stellt sicher, dass der generierte Code eigenständig ist und in Umgebungen ausgeführt werden kann, in denen Abhängigkeiten möglicherweise nicht vorinstalliert sind.

Workflow-Beispiele

Im Folgenden finden Sie vier Beispiele, die zeigen, wie die Integration von E2B und DeepSeek AI für Datenverarbeitungs- und Visualisierungsaufgaben genutzt werden kann. Jeder Fall beleuchtet einen anderen Anwendungsfall, von der Analyse von Temperaturtrends bis zur Visualisierung des BIP-Wachstums.

Hinweis: Diese Beispiele wurden mit der DeepSeek-API ausgeführt, und die Ergebnisse für die Mistral-API wurden nicht getestet oder überprüft.

Fall 1: Analyse von Mindesttemperaturtrends

Anfrage: "Laden Sie die CSV-Datei von der bereitgestellten URL herunter, generieren Sie ein Zeitreihendiagramm der Mindesttemperatur in jedem Jahr, umgerechnet in Celsius, und speichern Sie es als JPEG-Datei mit dem Namen 'graph_001.jpg'. Drucken Sie die Größe der generierten Datei. Dies ist das Format der CSV-Datei: ..."

Ausführung: Das Skript hat die CSV-Daten heruntergeladen und verarbeitet, wobei die jährlichen Mindesttemperaturen berechnet wurden. Ein Zeitreihendiagramm wurde generiert, um die Temperaturtrends über die Zeit zu visualisieren, in Celsius umgerechnet und als graph_001.jpg gespeichert.

First graph image
Abbildung 1: Zeitreihendiagramm, das die Trends der Mindesttemperaturen über die Zeit zeigt.

Fall 2: Visualisierung der BIP-Verteilung

Anfrage: "Laden Sie die CSV-Datei von der bereitgestellten URL herunter, lesen und verarbeiten Sie die Daten, und generieren Sie ein Tortendiagramm im JPG-Format, das die BIP-Verteilung der 10 größten Volkswirtschaften für das Jahr 2022 zeigt. Fügen Sie Ländernamen als Beschriftungen im Tortendiagramm hinzu und speichern Sie es als graph_002.jpg. Drucken Sie die Größe der gespeicherten Datei in Bytes. Dies ist das Format der CSV-Datei: ..."

Ausführung: Mit DeepSeek AI hat das Skript die CSV-Daten heruntergeladen und verarbeitet, wobei die Top-10-Volkswirtschaften nach BIP für 2022 identifiziert wurden. Ein Tortendiagramm wurde mit beschrifteten Segmenten generiert, die die BIP-Beiträge darstellen, und als graph_002.jpg gespeichert.

Second graph image
Abbildung 2: Tortendiagramm, das die BIP-Verteilung der Top-10-Volkswirtschaften im Jahr 2022 zeigt.

Fall 3: Analyse globaler Temperaturanomalien

Anfrage: "Laden Sie die CSV-Datei von der bereitgestellten URL herunter, generieren Sie ein Zeitreihendiagramm der jährlichen globalen Temperaturanomalien im JPG-Format und speichern Sie es in einer lokalen Datei mit dem Namen 'graph_003.jpg'. Drucken Sie die Größe der generierten Datei. Dies ist das Format der CSV-Datei: ..."

Ausführung: Das Skript hat die CSV-Daten heruntergeladen und verarbeitet, wobei die jährlichen globalen Temperaturanomalien über die Zeit visualisiert wurden. Ein Zeitreihendiagramm wurde generiert und als graph_003.jpg gespeichert.

Third graph image
Abbildung 3: Zeitreihendiagramm, das die jährlichen globalen Temperaturanomalien zeigt.

Fall 4: Analyse der US-BIP-Wachstumstrends

Anfrage: "Laden Sie die Datei von der bereitgestellten URL herunter. Entpacken Sie sie und verarbeiten Sie die relevante CSV-Datei, wobei Sie diejenigen ausschließen, die mit 'Metadata' beginnen. Generieren Sie ein Diagramm mit dem jährlichen prozentualen BIP-Wachstum in den Vereinigten Staaten von 2008 bis 2021, fügen Sie Ländernamen als Beschriftungen hinzu. Speichern Sie das Diagramm als 'graph_004.jpg' und überprüfen Sie seine Existenz, indem Sie die Dateigröße in Bytes drucken. Fügen Sie Trace-Logs zur Fehlerbehebung bei der Dateiverwaltung und den Datenverarbeitungsschritten hinzu. Dies ist das Format der CSV-Datei: ..."

Ausführung: Das Skript hat das Herunterladen, Entpacken und Verarbeiten der Daten bewältigt, einschließlich einer ordnungsgemäßen Fehlerbehandlung und Trace-Protokollierung. Das jährliche BIP-Wachstum für die Vereinigten Staaten wurde berechnet und in einem beschrifteten Diagramm visualisiert, das nach Überprüfung seiner Existenz und Größe als graph_004.jpg gespeichert wurde.

Fourth graph image
Abbildung 4: Liniendiagramm, das das jährliche BIP-Wachstum in den Vereinigten Staaten von 2008 bis 2021 zeigt.

Schlussfolgerungen

Die Integration von E2B-Sandboxes mit DeepSeek AI bietet eine robuste Lösung für die Ausführung von AI-gesteuerten Python-Workflows, wie die vier oben genannten Beispiele zeigen. Jedes Beispiel hat erfolgreich genaue Visualisierungen generiert, was die Effektivität dieses Ansatzes für Datenverarbeitungs- und Visualisierungsaufgaben unterstreicht. Bei der Wahl zwischen Cloud- und lokalen Sandboxes sollten jedoch folgende Punkte berücksichtigt werden:

  1. Kosten: Cloud-Sandboxes wie E2B sind skalierbar, können aber höhere Kosten verursachen, während lokale Sandboxes kosteneffizienter, aber weniger skalierbar sind.
  2. Sicherheit: Lokale Sandboxes halten Daten in kontrollierten Umgebungen, während Cloud-Sandboxes eine robuste Verschlüsselung und Zugriffsverwaltung erfordern.
  3. Skalierbarkeit: Cloud-Sandboxes zeichnen sich durch Skalierbarkeit und Zusammenarbeit aus, während lokale Sandboxes besser für sichere, kleinere Projekte geeignet sind.

Wählen Sie basierend auf den Anforderungen Ihres Projekts: Cloud für Skalierbarkeit und Zusammenarbeit oder lokal für Sicherheit und Kosteneffizienz. Die Berücksichtigung dieser Faktoren gewährleistet eine optimale Produktivität und Sicherheit in Ihren Workflows.


Hat Ihnen dieser Beitrag gefallen? Fanden Sie ihn hilfreich? Hinterlassen Sie gerne einen Kommentar unten, um Ihre Gedanken mitzuteilen oder Fragen zu stellen. Ein GitHub-Konto ist erforderlich, um an der Diskussion teilzunehmen.

Weiterlesen

Ähnliche Beiträge