Open WebUI Pipelines (Middleware & Guardrails) în Open WebUI & RAG Local

Extensibilitate și Arhitectură Open WebUI 0.3.30+ / Pipelines 0.1+

Construirea de plugin-uri Python ca middleware modular pentru filtrarea prompturilor, cenzură, guardrails și injectare dinamică de date înainte de LLM.

Configurare & comandă
Pipeline Framework (Open WebUI Valves & Filters)

Open WebUI nu este doar o interfață vizuală frumoasă pentru Ollama sau vLLM, ci un ecosistem complet extensibil prin framework-ul Pipelines. Un Pipeline funcționează ca un server middleware Python independent (sau integrat) care interceptează fluxul de date dintre utilizator și modelul de limbaj.

Pipelines suportă două tipuri majore de procesare: Filters (care pot modifica mesajele de intrare – de exemplu anonimizarea datelor personale PII, blocarea atacurilor de tip prompt injection sau traducerea automată) și Manifolds (care pot conecta surse externe precum baze de date, API-uri interne sau motoare de căutare web custom).

Fiecare pipeline expune o secțiune de configurare grafică direct în interfața web numită Valves (supape), permițând administratorilor să ajusteze pragurile de sensibilitate, cheile de API sau comportamentul filtrului fără a edita codul sursă sau a reporni containerul.

Sintaxă, opțiuni și concepte cheie

Opțiune / Concept Descriere practică
Pipeline Class Clasa Python de bază care implementează metodele `inlet` (pre-procesare) și `outlet` (post-procesare).
inlet(body, user) Metoda executată înainte ca mesajul să fie trimis către LLM; poate opri cererea sau curăța promptul.
outlet(body, user) Metoda executată după ce LLM-ul a generat răspunsul, utilă pentru filtrarea de securitate post-generare.
Valves (pydantic BaseModel) Clasa de proprietăți configurabile grafic de către utilizator din panoul Admin.
PII Anonymization Caz clasic de pipeline care detectează CNP-uri, carduri bancare și emailuri și le înlocuiește cu măști generice.

Exemple practice și comenzi

Exemplul 1: Filtru Python de anonimizare PII înainte ca datele să părăsească mașina locală

Codul complet al unui pipeline simplu ce maschează adresele de email înainte de apelul LLM.

from pydantic import BaseModel, Field
import re

class Pipeline:
    class Valves(BaseModel):
        enabled: bool = Field(default=True, description="Activează mascare PII")
        replacement: str = Field(default="[EMAIL-PROTEJAT]", description="Textul de înlocuire")

    def __init__(self):
        self.valves = self.Valves()

    async def inlet(self, body: dict, user: dict = None) -> dict:
        if not self.valves.enabled:
            return body
        
        # Maschează toate adresele de email din mesajele utilizatorului
        email_regex = r'[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+'
        for msg in body.get("messages", []):
            if msg["role"] == "user":
                msg["content"] = re.sub(email_regex, self.valves.replacement, msg["content"])
        return body

Rezultat & Impact

Orice email tastat în chat ajunge la modelul de limbaj complet anonimizat.

Greșeli frecvente și bune practici

  • Scrierea de operații blocante sincrone de rețea (ex. `requests.get`) în interiorul metodelor `inlet`/`outlet`, blocând tot event loop-ul asincron al Open WebUI.
  • Modificarea structurii dict-ului `body` fără a respecta schema cerută de OpenAI API, ducând la erori de tip 500 în interfața web.

Ghiduri și noțiuni înrudite