Expand router into reproducible local AI platform

This commit is contained in:
Mikei386
2026-08-20 12:56:53 +02:00
parent a84220725a
commit 0e4a9de5ba
34 changed files with 2584 additions and 31 deletions
+30
View File
@@ -0,0 +1,30 @@
# Lokale Websuche
SearXNG übernimmt die Metasuche. TinySearch normalisiert, crawlt und rankt die
Ergebnisse lokal. Nur die Web-MCP-Fassade wird dem Modell angeboten; die
generischen TinySearch-Werkzeuge bleiben intern.
## Installation
1. `searxng-settings.example.yml` nach `searxng-settings.yml` kopieren.
2. `CHANGE_ME_GENERATE_RANDOM_SECRET` durch einen zufälligen Wert ersetzen.
3. `tinysearch_config.json` prüfen.
4. `docker compose up -d` ausführen.
5. TinySearch bleibt ausschließlich über `127.0.0.1:8000` erreichbar.
Die Containerimages sind per Digest festgeschrieben. Upgrades erfolgen nur
bewusst nach Test von Suche, Crawling, Quellenbindung und Kontextgröße.
`web_search_mcp.py` ist die kompakte, für kleinere Modelle optimierte Fassade.
Sie bietet nur `web_search`, `web_compare`, `web_shop` und `web_research` an
und verwendet für GitHub und Hugging Face zusätzlich strukturierte APIs.
## Modellfreundliche Vorgaben
- kurze Suche: maximal fünf Ergebnisse
- Recherche: maximal vier gecrawlte Seiten und acht Evidenz-Chunks
- höchstens zwei Chunks je Quelle
- Seitenlimit 6000 Tokens, Chunkziel 300 Tokens
- externe Inhalte immer als nicht vertrauenswürdig markieren
- GitHub und Hugging Face bevorzugt über strukturierte öffentliche APIs
- Preise erst nach Prüfung der tatsächlichen Händlerseite als bestätigt melden
+45
View File
@@ -0,0 +1,45 @@
name: local-ai-web-search
services:
searxng:
image: searxng/searxng@sha256:e45d5894bfaa0bf8773b9f283795ae57f1c15ddb29c8cecb70b3665b0ce9ec60
restart: unless-stopped
volumes:
- ./searxng-settings.yml:/etc/searxng/settings.yml:ro
networks: [search]
healthcheck:
test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1:8080/healthz"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
security_opt: ["no-new-privileges:true"]
tinysearch:
image: marcellm01/tinysearch@sha256:5a03d5a1f1b0fabe48f2a26e05db4a84bcb611106a57ec51e42db4549976aa9c
restart: unless-stopped
ports:
- "127.0.0.1:8000:8000"
shm_size: "1gb"
volumes:
- tinysearch-models:/data/models
- ./tinysearch_config.json:/config/tinysearch_config.json:ro
environment:
MCP_TRANSPORT: streamable-http
MCP_HOST: 0.0.0.0
MCP_PORT: 8000
TINYSEARCH_CONFIG_PATH: /config/tinysearch_config.json
TINYSEARCH_SEARCH_BACKEND: searxng
SEARXNG_URL: http://searxng:8080/search
depends_on:
searxng:
condition: service_healthy
networks: [search]
security_opt: ["no-new-privileges:true"]
networks:
search:
driver: bridge
volumes:
tinysearch-models:
@@ -0,0 +1,22 @@
use_default_settings: true
general:
instance_name: "Local AI Search"
debug: false
search:
safe_search: 0
autocomplete: ""
default_lang: "de"
formats: [html, json]
server:
secret_key: "CHANGE_ME_GENERATE_RANDOM_SECRET"
limiter: false
image_proxy: false
bind_address: "0.0.0.0"
port: 8080
outgoing:
request_timeout: 8.0
max_request_timeout: 15.0
@@ -0,0 +1,31 @@
{
"search_backend": "searxng",
"search_backend_url": "http://searxng:8080/search",
"search_backend_fallback": true,
"search_region": "de-de",
"search_max_results": 5,
"scrape_max_tokens": 1200,
"search_top_k": 15,
"search_dense_weight": 0.5,
"search_max_results_to_keep": 4,
"chunk_dense_weight": 0.5,
"chunk_max_results_to_keep": 8,
"chunk_rank_oversample": 3,
"chunk_dedupe_jaccard_threshold": 0.92,
"chunk_max_per_source_url": 2,
"max_concurrent_crawls": 3,
"pipeline_timeout_seconds": 90.0,
"crawl_fit_markdown_mode": "bm25",
"crawl_fit_min_chars": 200,
"crawl_bm25_threshold": 1.5,
"crawl_bm25_language": "german",
"crawl_max_chunk_tokens": 300,
"crawl_overlap_tokens": 40,
"crawl_max_page_tokens": 6000,
"embedding_backend": "onnx",
"embedding_model": "fast",
"dense_document_embed_batch_size": 32,
"encoding_name": "embedding",
"blocked_domains": [],
"trace_path": ""
}
File diff suppressed because it is too large Load Diff