Zum Hauptinhalt springen

Extern

Warnung

Dieses Tutorial ist ein Community-Beitrag und wird vom Open WebUI-Team nicht unterstützt. Es dient lediglich als Demonstration, wie Open WebUI für Ihren spezifischen Anwendungsfall angepasst werden kann. Möchten Sie beitragen? Schauen Sie sich das Tutorial zum Beitragen an.

Externe Web-Such-API

Diese Option ermöglicht es Ihnen, Open WebUI mit Ihrem eigenen selbst gehosteten Web-Such-API-Endpunkt zu verbinden. Dies ist nützlich, wenn Sie

  • Eine Suchmaschine integrieren möchten, die von Open WebUI nicht nativ unterstützt wird.
  • Benutzerdefinierte Suchlogik, Filterung oder Ergebnisverarbeitung implementieren möchten.
  • Einen privaten oder internen Suchindex verwenden möchten.

Open WebUI Setup

  1. Navigieren Sie zum Admin Panel von Open WebUI.
  2. Gehen Sie zum Tab Einstellungen und wählen Sie dann Web-Suche.
  3. Schalten Sie Web-Suche aktivieren auf Ein.
  4. Wählen Sie aus dem Dropdown-Menü Web-Suchmaschine die Option extern.
  5. Füllen Sie Externe Such-URL mit der vollständigen URL Ihres benutzerdefinierten Such-API-Endpunkts aus (z. B. https://:8000/search oder https://my-search-api.example.com/api/search).
  6. Füllen Sie Externer Such-API-Schlüssel mit dem geheimen API-Schlüssel aus, der zur Authentifizierung bei Ihrem benutzerdefinierten Suchendpunkt erforderlich ist. Lassen Sie dieses Feld leer, wenn Ihr Endpunkt keine Authentifizierung benötigt (nicht empfohlen für öffentliche Endpunkte).
  7. Klicken Sie auf Speichern.

Open WebUI Admin panel showing External Search config

API-Spezifikation

Open WebUI wird wie folgt mit Ihrer Externen Such-URL interagieren:

  • Methode: POST

  • Header

    • Content-Type: application/json
    • Authorization: Bearer <IHR_EXTERNER_SUCH_API_SCHLÜSSEL>
  • Request Body (JSON)

    {
    "query": "The user's search query string",
    "count": 5 // The maximum number of search results requested
    }
    • query (string): Der vom Benutzer eingegebene Suchbegriff.
    • count (integer): Die vorgeschlagene maximale Anzahl von Ergebnissen, die Open WebUI erwartet. Ihre API kann bei Bedarf weniger Ergebnisse zurückgeben.
  • Erwarteter Response Body (JSON): Ihr API-Endpunkt muss ein JSON-Array von Suchergebnisobjekten zurückgeben. Jedes Objekt sollte die folgende Struktur haben:

    [
    {
    "link": "URL of the search result",
    "title": "Title of the search result page",
    "snippet": "A brief description or snippet from the search result page"
    },
    {
    "link": "...",
    "title": "...",
    "snippet": "..."
    }
    // ... potentially more results up to the requested count
    ]
    • link (string): Die direkte URL zum Suchergebnis.
    • title (string): Der Titel der Webseite.
    • snippet (string): Ein beschreibender Textausschnitt aus dem Seiteninhalt, der für die Abfrage relevant ist.

    Wenn ein Fehler auftritt oder keine Ergebnisse gefunden werden, sollte Ihr Endpunkt idealerweise ein leeres JSON-Array [] zurückgeben.

Beispielimplementierung (Python/FastAPI)

Hier ist ein einfaches Beispiel für eine selbst gehostete Such-API mit Python, FastAPI und der Bibliothek duckduckgo-search.

import uvicorn
from fastapi import FastAPI, Header, Body, HTTPException
from pydantic import BaseModel
from duckduckgo_search import DDGS

EXPECTED_BEARER_TOKEN = "your_secret_token_here"

app = FastAPI()


class SearchRequest(BaseModel):
query: str
count: int


class SearchResult(BaseModel):
link: str
title: str | None
snippet: str | None


@app.post("/search")
async def external_search(
search_request: SearchRequest = Body(...),
authorization: str | None = Header(None),
):
expected_auth_header = f"Bearer {EXPECTED_BEARER_TOKEN}"
if authorization != expected_auth_header:
raise HTTPException(status_code=401, detail="Unauthorized")

query, count = search_request.query, search_request.count

results = []
try:
with DDGS() as ddgs:
search_results = ddgs.text(
query, safesearch="moderate", max_results=count, backend="lite"
)

results = [
SearchResult(
link=result["href"],
title=result.get("title"),
snippet=result.get("body"),
)
for result in search_results
]

except Exception as e:
print(f"Error during DuckDuckGo search: {e}")

return results


if __name__ == "__main__":
uvicorn.run("main:app", host="0.0.0.0", port=8888)