From 16e4aa73f74e75eaae5cbde8b7db8f72f4f9266a Mon Sep 17 00:00:00 2001 From: tth37 Date: Wed, 30 Apr 2025 01:13:31 +0800 Subject: [PATCH] Add tutorials for external web search --- docs/tutorials/web-search/external.md | 132 +++++++++++++++++++++ static/images/tutorial_external_search.png | Bin 0 -> 32697 bytes 2 files changed, 132 insertions(+) create mode 100644 docs/tutorials/web-search/external.md create mode 100644 static/images/tutorial_external_search.png diff --git a/docs/tutorials/web-search/external.md b/docs/tutorials/web-search/external.md new file mode 100644 index 0000000..7d450c3 --- /dev/null +++ b/docs/tutorials/web-search/external.md @@ -0,0 +1,132 @@ +--- +sidebar_position: 17 +title: "External" +--- + +:::warning +This tutorial is a community contribution and is not supported by the Open WebUI team. It serves only as a demonstration on how to customize Open WebUI for your specific use case. Want to contribute? Check out the contributing tutorial. +::: + +## External Web Search API + +This option allows you to connect Open WebUI to your own self-hosted web search API endpoint. This is useful if you want to: + +* Integrate a search engine not natively supported by Open WebUI. +* Implement custom search logic, filtering, or result processing. +* Use a private or internal search index. + +### Open WebUI Setup + +1. Navigate to the Open WebUI `Admin Panel`. +2. Go to the `Settings` tab and then select `Web Search`. +3. Toggle `Enable Web Search` to the on position. +4. Set `Web Search Engine` from the dropdown menu to `external`. +5. Fill `External Search URL` with the full URL of your custom search API endpoint (e.g., `http://localhost:8000/search` or `https://my-search-api.example.com/api/search`). +6. Fill `External Search API Key` with the secret API key required to authenticate with your custom search endpoint. Leave blank if your endpoint doesn't require authentication (not recommended for public endpoints). +7. Click `Save`. + +![Open WebUI Admin panel showing External Search config](/images/tutorial_external_search.png) + +### API Specification + +Open WebUI will interact with your `External Search URL` as follows: + +* **Method:** `POST` +* **Headers:** + * `Content-Type: application/json` + * `Authorization: Bearer ` +* **Request Body (JSON):** + ```json + { + "query": "The user's search query string", + "count": 5 // The maximum number of search results requested + } + ``` + * `query` (string): The search term entered by the user. + * `count` (integer): The suggested maximum number of results Open WebUI expects. Your API can return fewer results if necessary. + +* **Expected Response Body (JSON):** + Your API endpoint *must* return a JSON array of search result objects. Each object should have the following structure: + ```json + [ + { + "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): The direct URL to the search result. + * `title` (string): The title of the web page. + * `snippet` (string): A descriptive text snippet from the page content relevant to the query. + + If an error occurs or no results are found, your endpoint should ideally return an empty JSON array `[]`. + +### Example Implementation (Python/FastAPI) + +Here is a simple example of a self-hosted search API using Python with FastAPI and the `duckduckgo-search` library. + +```python +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) +``` \ No newline at end of file diff --git a/static/images/tutorial_external_search.png b/static/images/tutorial_external_search.png new file mode 100644 index 0000000000000000000000000000000000000000..e932b314db3b73d2462fe6c630d5cd49ef5a1bbf GIT binary patch literal 32697 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 a`*^%tk*nH$XRHQ)&9$|+Ic2qc+dlxW`?hre literal 0 HcmV?d00001