Schlanker lokaler Assistent mit Multi-Provider-Support: Ollama (lokal/remote), Google Gemini API, OpenAI API (GPT-4o, DALL-E, o-Serie), DeepSeek API (V3, R1), Anthropic API (Claude), Claude Code CLI. Agent-Dateien (optional AGENTS.md, SOUL, IDENTITY, TOOLS, USER), Modellwechsel per /model MODELLNAME oder Alias, Token-Auth, kleines Memory, minimalistisches Web-UI und CLI.
Voraussetzungen: Python 3.10 oder neuer, Modul venv (z.B. Debian: apt install python3 python3-venv python3-pip). Das Install-Skript prüft das vor dem Start.
cd /pfad/zum/projekt
./install.sh
source venv/bin/activateSystem-Pakete: Das Install-Skript versucht zu Beginn automatisch, System-Pakete zu installieren (python3, python3-venv, python3-pip, libolm-dev für Matrix-E2EE). Dafür sind ggf. Rechte nötig (z. B. sudo ./install.sh). Schlägt die Installation fehl, die genannten Pakete manuell installieren und ./install.sh erneut ausführen.
Systemweit verfügbar machen (optional): Damit miniassistant ohne venv-Aktivierung aus jeder Shell aufrufbar ist:
sudo ln -s /pfad/zum/projekt/venv/bin/miniassistant /usr/local/bin/miniassistantOptional: Init-Skript (sysvinit) oder systemd installieren:
# sysvinit (z. B. Debian ohne systemd)
./install.sh --init
sudo service miniassistant start
# systemd
./install.sh --systemd
sudo systemctl daemon-reload
sudo systemctl enable --now miniassistantÄhnlich wie bei OpenClaw – geführt über CLI oder später Web:
miniassistant configDurchlauf: Ollama-URL, num_ctx, Bind (localhost oder 0.0.0.0), Port, Agent-Verzeichnis, Standard-Modell, optional SearXNG-URL. Config landet in ~/.config/miniassistant/config.yaml oder im Projekt als miniassistant.yaml.
Unter providers.ollama.options können alle von Ollama unterstützten ModelOptions gesetzt werden (werden bei jedem Chat-Request mitgeschickt):
- temperature (float): Zufälligkeit (niedriger = deterministischer, z. B. 0.2 für Fakten; höher = kreativer, z. B. 0.8–1.2). Default oft 0.8.
- top_p (float): Nucleus Sampling (z. B. 0.9). Nur entweder temperature oder top_p stark verändern.
- top_k (int): Nur die K wahrscheinlichsten nächsten Tokens (z. B. 40).
- num_ctx (int): Kontextlänge in Tokens (kann auch oben unter
providers.ollama.num_ctxstehen). - num_predict (int): Maximale Anzahl zu generierender Tokens.
- seed (int): Fester Zufallssamen für reproduzierbare Ausgaben.
- min_p (float): Mindest-Wahrscheinlichkeit für Token-Auswahl.
- stop (string oder Liste): Stop-Sequenzen, die die Generierung beenden.
Beispiel in config.yaml / miniassistant.yaml:
providers:
ollama:
base_url: http://127.0.0.1:11434
num_ctx: 8192
think: true
options:
temperature: 0.7
top_p: 0.9
top_k: 40- CLI-Chat:
miniassistant chat(Modellwechsel:/model MODELLNAMEoder/model ALIAS) - Web-UI:
miniassistant serve– dann http://127.0.0.1:8765 (Host/Port in Config änderbar, z. B.server.port: 8080oder--port 8080) - Token: Beim ersten
servewird ein Token generiert (CLI-Ausgabe oderminiassistant token). Im Browser: Startseite öffnen, Token eingeben und „Zum Chat“ klicken – oder direkt z. B.http://host:8765/chat?token=DEIN_TOKENaufrufen. API:?token=...in der URL oder HeaderAuthorization: Bearer <token>. - Anhänge (Web-UI / Discord / Matrix): Bilder (PNG, JPG, GIF, WebP) gehen ans Vision-Modell. Dokumente (PDF, DOCX,
.txt,.md,.csv,.json,.xml,.log,.rst) werden extrahiert und in die Nachricht eingebettet. Gescannte PDFs werden als Seitenbilder durchs Vision-Modell geschickt. Optional viapip install -e '.[docs]'. Details/Limits: sieheCONFIGURATION.mdAbschnitt 21.
MiniAssistant stellt zwei OpenAI-kompatible Schnittstellen bereit:
Vollstaendig OpenAI-kompatibel mit dem konfigurierten Agent-Kontext (SOUL, IDENTITY, TOOLS, USER, Memory). Ideal fuer Open WebUI, Continue.dev, Cursor und Tools die den vollen MiniAssistant-Funktionsumfang nutzen sollen.
Endpunkte:
GET /v1/models- Alle Modelle auflisten (inkl. Aliases)POST /v1/chat/completions- Chat mit Agent-ContextPOST /v1/completions- Text Completion (optional)
# Modelle auflisten (inkl. Aliases wie "fast", "code", "sonnet")
curl -s http://localhost:8765/v1/models -H "Authorization: Bearer TOKEN"
# Chat Completion mit Kurzname
curl -s http://localhost:8765/v1/chat/completions \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"model": "fast", "messages": [{"role": "user", "content": "Hallo!"}]}'
# Streaming (SSE)
curl -s -N http://localhost:8765/v1/chat/completions \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"model": "fast", "stream": true, "messages": [{"role": "user", "content": "Hallo!"}]}'Details, Integrationsbeispiele und Einschraenkungen: OPENAI_API.md
Aktiviere in der Config raw_proxy.enabled: true fuer einen direkten Proxy (/raw/v1/) ohne Agent-Context. Ideal fuer externe Tools die keinen System-Prompt wollen.
# config.yaml
raw_proxy:
enabled: true
token: "dein-token" # Optional: wenn leer, keine Auth erforderlich
rate_limit: 100 # Requests pro Minute (default 100; 0 = deaktiviert)Wichtig:
raw_proxy.token: Wird automatisch generiert wennenabled: trueaber kein Token vorhanden (wieserver.token).- Token anzeigen:
miniassistant token --raw-proxy - Token neu generieren:
miniassistant token --raw-proxy --regenerate - Separate Rate Limits:
server.rate_limitfuer/v1/,raw_proxy.rate_limitfuer/raw/v1/.
# Modelle von allen OpenAI-kompatiblen Providern
curl -s http://localhost:8765/raw/v1/models -H "Authorization: Bearer TOKEN"
# Chat-Completion (Modellname ohne provider-prefix)
curl -s http://localhost:8765/raw/v1/chat/completions \
-H "Authorization: Bearer TOKEN" \
-H "Content-Type: application/json" \
-d '{"model": "qwen3.5-122b-a10b", "messages": [{"role": "user", "content": "Hallo!"}]}'Reverse-Proxy Beispiel (Nginx) - Nur Raw-Proxy freigeben:
server {
listen 443 ssl;
server_name ai.deinedomain.de;
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
# Nur Raw-Proxy Endpunkte freigeben (kein Agent-Context)
location /raw/v1 {
proxy_pass http://127.0.0.1:8765/raw/v1;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Authorization $http_authorization;
# Streaming unterstuetzen
proxy_buffering off;
chunked_transfer_encoding off;
}
# Alles andere verweigern
location / {
return 404;
}
}Client-Usage (OpenAI SDK):
from openai import OpenAI
client = OpenAI(
base_url="https://ai.deinedomain.de/raw/v1",
api_key="dein-raw-proxy-token"
)
response = client.chat.completions.create(
model="qwen3.5-122b-a10b",
messages=[{"role": "user", "content": "Hallo!"}]
)| Pfad | Beschreibung | Auth | Agent-Context |
|---|---|---|---|
/chat |
Web-UI | server.token |
Ja |
/v1/* |
MiniAssistant API | server.token |
Ja |
/raw/v1/* |
Raw Proxy | raw_proxy.token |
Nein |
/api/* |
Interne APIs | server.token |
Ja |
/nutzung |
Usage Tracking | server.token |
Ja |
/config |
Config-Editor | server.token |
Ja |
Nur Raw-Proxy freigeben? Siehe Reverse-Proxy Beispiel oben - dann sind /v1/, /chat, /api/* usw. nicht von aussen erreichbar.
Unterschiede: /v1/ = mit Agent-Context (MiniAssistant), /raw/v1/ = direkter Proxy (OpenAI-kompatibel). Details: CONFIGURATION.md (#10b)
In der Config server.host: "0.0.0.0" setzen (miniassistant config oder YAML). Wichtig: Token setzen, damit nur Berechtigte zugreifen.
Wird MiniAssistant nur via Reverse-Proxy ins Internet gestellt (empfohlen), bind weiter auf 127.0.0.1 und beachte:
server.trust_forwarded: truesetzen. Sonst sieht der Server jede Anfrage als vom Proxy kommend (127.0.0.1) — dann teilen sich alle Clients einen Rate-Limit- und Brute-Force-Zähler, und ein einzelner Angreifer kann mit fehlgeschlagenen Logins alle Nutzer für 1 h aussperren. Nur aktivieren, wenn wirklich ein vertrauenswürdiger Proxy davorsitzt (sonst kann jeder Client seine IP per Header spoofen).- Der Proxy muss die echte Client-IP weiterreichen. Im Nginx-Beispiel oben zusätzlich:
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme;
server.rate_limit(Requests/Minute pro IP für/und/v1, Default100,0= aus) undraw_proxy.rate_limitgreifen erst sinnvoll, wenntrust_forwardedaktiv ist — sonst zählt alles gegen die Proxy-IP.
Die LLM erfährt automatisch, auf welchem System sie läuft (OS, Distribution, Paketmanager, Init-System), damit sie die passenden Befehle nutzt (z. B. apt vs dnf, systemctl vs service). Erkannt werden u. a. Debian/Ubuntu, Fedora/RHEL, Arch, Alpine, openSUSE, macOS.
- Sprache: Priorität:
respond_in_input_language: truein der Config (antwortet automatisch in der Sprache des Nutzerprompts) →Response language:in IDENTITY.md → Default Deutsch. Beim Onboarding wird die Sprache abgefragt und in IDENTITY.md eingetragen.respond_in_input_languageist nützlich für Multi-User-Bots (Matrix/Discord) mit gemischten Sprachen. - Merken: Das Modell weiß, dass es mit exec Dateien lesen/schreiben kann. Wenn
workspaceoderagent_dirgesetzt sind, werden diese Pfade im System-Prompt genannt – der Assistent kann dort Notizen anlegen, wenn du ihn darum bittest. - Memory abschalten: Per Default protokolliert MiniAssistant Exchanges in tägliche
memory/YYYY-MM-DD.md-Dateien (und optional in mempalace). Wer das nicht will, setztmemory.enabled: falsein der Config — dieser Master-Switch killt Tagesdateien,last_summary.json, den Memory-Block im System-Prompt und mempalace inkl.search_memory-Tool gemeinsam. Details: CONFIGURATION.md. - Geplante Jobs (ohne System-Cron): Optional
scheduler.enabled: truein der Config undpip install miniassistant[scheduler]. Dann steht das Tool schedule zur Verfügung (Cron z. B.0 9 * * *oder „in 30 minutes“). Jobs werden beimserveausgeführt. - Nutzungs-Tracking: Optional
server.track_usage: true– zeichnet jeden LLM-Aufruf (Modell, Typ, Dauer in Sekunden) als CSV in$config_dir/usage/usage.csvauf. In der Web-UI unter/nutzungmit Zeitfiltern (Stunde, Tag, Woche, Monat, Jahr) und Charts einsehbar. - Proxy für read_url: Optionale Proxy-Konfiguration für serverseitige URL-Abrufe (
read_url.proxiesmit Namen). Unterstützt HTTP/HTTPS/SOCKS5 sowie Strategienfirst,random,roundrobin,none. Details: CONFIGURATION.md. - JS-Rendering (optional):
read_urlunterstütztjs: truefür JavaScript-lastige Seiten (SPAs, React/Vue/Angular). Erfordert Playwright:pip install miniassistant[js] && playwright install chromium(~300 MB). Ohne Installation: Warnung + Fallback auf normalen Fetch.
Alle Einträge sind optional. Fehlt etwas in der Config, werden Defaults bzw. Ollama-Standards genutzt – es bricht nichts.
Ausführlich und strukturiert: CONFIGURATION.md (wo die Config liegt, alle Bereiche, Optionen, Beispiele). Die Doku wird mit dem Code mitgepflegt.
- Smart Compacting: Wenn der Chatverlauf den Kontext füllt, werden ältere Messages automatisch zusammengefasst. Steuerbar via
chat.context_quota(Default: 0.85 = 85% vonnum_ctx). Skaliert automatisch mit der Modellgröße. - Slot Cache (llama.cpp): Optional persistiert KV-Cache pro Conversation am LLM-Server für schnelle Resumes (10-30s gespart bei langen Conversations). Default OFF, opt-in via
slot_cache.enabled: truein der Config. Funktioniert nicht mit--mmproj-Modellen. Details: CONFIGURATION.md §22.
Siehe MINIASSISTANT_PLAN.md für Features: mehrere Modelle + Aliase, Memory bei Modellwechsel, Bootup-Assistent, SOUL selbst schreiben, Matrix optional.
LGPL 2.1 (GNU Lesser General Public License, Version 2.1)
Was als kleines KI-Projekt von Menschen begann, schreibt sich mittlerweile selbst. Die laufende Umsetzung macht inzwischen direkt die KI; Code, Doku und Fixes entstehen mit einem KI-Agenten.