tabby-tavern-stack / DEVLOG.md
jpanasuk's picture
v3.0.0 UNIFIED: Taproot + Basecamp folded into Tabby Tavern
bcc50e3 verified
|
Raw
History Blame Contribute Delete
5.87 kB

Tabby-Tavern Development Log

Engineering history for the containerized local AI lab. Public tree is sanitized β€” no live keys, no weights, no chat logs.

Hardware baseline

  • GPU: NVIDIA GeForce RTX 4070 (12 GB)
  • Environment: WSL2 Ubuntu + Docker Compose with NVIDIA GPU passthrough
  • Primary inference path (v3 UNIFIED): Qwen3.5-9B GGUF on llama.cpp CUDA (qwen service)
  • Alternate inference (profile): TabbyAPI EXL3 + Ollama GGUF
  • Character frontend: SillyTavern (PNG character cards)
  • Tooling: MCPO + FastMCP; optional dockroot diagnostics
  • Coding pack: former Basecamp volumes on the same network

v3.0.0 UNIFIED β€” Taproot + Basecamp folded in (2026-08-25)

Hermes session 20260825_002829 merged the running Taproot Qwen stack and Basecamp coding pack into /home/jpanasuk/tabby-tavern/docker-compose.yml.

  • Compose project: tabby-tavern
  • Network: tabby-tavern_ai-network
  • Default: 15 services. Qwen and Postgres healthy. SearXNG / MCPO / code-server / Qdrant / Meilisearch HTTP 200.
  • Primary endpoint: http://qwen:8080/v1 in-network, http://localhost:1234/v1 on the host. Model alias Qwen3.5-9B.
  • TabbyAPI + Ollama: --profile alternate-inference (VRAM contention).
  • dockroot: --profile diagnostics, socket read-only, no host port.
  • Basecamp named volumes preserved (basecamp_*).
  • Public tree sanitizes host model paths to ./models/... and drops external: true so a stranger can up without those volume names pre-created.
  • Sell sheet rewritten from this live graph β€” not the old 6-service pitch and not the fake 21-service pitch.

Week 1 β€” Core integration

  • Consolidated TabbyAPI, SillyTavern, Open WebUI, Ollama, SearXNG into one compose file
  • Adopted EXL3 weights for faster VRAM load vs earlier experiments
  • Fixed cross-container TabbyAPI auth/whitelist failures that blocked peer services
  • Added persistent volume mounts for configs and data directories

Week 2 β€” Model bring-up & GPU tuning

  • Loaded Llama-3.1-8B-Instruct EXL3 (6.0 bpw class) into tabby_models/
  • Tuned container env: flash attention / KV cache flags, shm_size: 16g, CUDA device ordering
  • Documented start/stop operational loop (docker compose down && up -d)

Week 3 β€” Public packaging

  • Created sanitized publish tree (no weights, no user DBs, no tokens)
  • Added SECURITY.md and example TabbyAPI config
  • Mirrored narrative to GitHub portfolio rebuild (Aug 2026)
  • Early public revisions accidentally included lab convenience keys β€” treat those as burned (see SECURITY.md)

Week 4 β€” WSL2 fresh install + MCPO (Aug 2026)

Full from-scratch rebuild on clean WSL2 (same RTX 4070). Every fix is in the README WSL2 field notes.

Issues hit and resolved

  • EXL2 dropped from TabbyAPI. ghcr.io/theroyallab/tabbyapi:latest no longer loads EXL2. Switched to turboderp/Llama-3.1-8B-Instruct-exl3 6.0bpw.
  • NVIDIA Container Toolkit repo URL. deb ... noble main β†’ apt Malformed entry (Component). Flat repo line with amd64 / works.
  • libcuda.so missing in container. Triton/exllamav3 link step needs -lcuda. Dockerfile now symlinks /usr/local/cuda-12.8/compat/libcuda.so.
  • Port conflict with host Ollama. Docker Ollama remapped to host 11435.
  • Open WebUI only wired to Ollama. Added OPENAI_API_BASE_URL=http://tabbyapi:5000/v1 so the UI can use EXL3 and GGUF.
  • SillyTavern browser launch in Docker. browserLaunch.enabled: false. Keep basicAuthMode: true or ST will refuse to start on 0.0.0.0.
  • SearXNG JSON format. Default was HTML-only; added json for MCPO + Open WebUI RAG.
  • 12 GB VRAM tuning. cache_8bit: true, max_seq_len: 8192, cache_size: 8192. ~8 GB used by 6.0bpw EXL3, ~4 GB left for a small GGUF.

MCPO MCP server β€” built and integrated

  • FastMCP server at mcp-servers/server.py (not raw JSON-RPC)
  • Seven tools via MCPO OpenAPI at /host-master/:
    • list_tabbyapi_models
    • tabbyapi_chat
    • list_ollama_models
    • ollama_pull_model
    • ollama_chat
    • get_stack_status
    • searxng_search
  • MCPO config uses /app/.venv/bin/python3 because that venv has mcp
  • Empty mcpServers crashes MCPO β€” always ship at least one entry
  • Companion tavern_mcp.py is the connectivity toolkit (status / self-check / wire)

Character cards

  • SillyTavern PNG character cards are first-class in this tree (cards/)
  • Default Seraphina card + expression sprites copied from the lab ST data dir (no chats, no secrets)
  • README documents import into a fresh SillyTavern

Compose shape vs earlier public tree

  • In: mcpo service (port 8001), Open WebUI dual-backend env, Ollama host 11435, character cards
  • Out of core compose: SearXNG Redis (SearXNG runs fine without it; JSON search still works)
  • Optional docker-compose.starter.yml overlay for extra coding tools (not required)

Final verified state (24/24 checks)

  • Six containers running, no restart loops
  • TabbyAPI: EXL3 model loaded, chat ~53 tok/s processing
  • Ollama: llama3.1:8b pulled
  • Open WebUI: healthy, connected to TabbyAPI and Ollama
  • SillyTavern: running with basic auth; cards importable
  • SearXNG: serving with JSON format
  • MCPO: 7 tool endpoints live
  • GPU: 8 GB / 12 GB VRAM on RTX 4070

v2.0.0 public release (2026-08-25)

  • Hugging Face model card (this README YAML) brought in sync with the live lab
  • GitHub first tagged release (v2.0.0)
  • Public mcpo/config.json no longer contains a live TabbyAPI key (placeholder only)
  • Cards, MCPO, WSL2 Dockerfile fix, and dual-backend Open WebUI are in the published compose

Open follow-ups

  • One-command bootstrap that builds the TabbyAPI image + prints next model download
  • Healthcheck targets in compose
  • Optional Traefik/Caddy reverse-proxy profile for LAN HTTPS
  • Keep Redis as an optional compose profile if SearXNG cache becomes a bottleneck