File size: 5,871 Bytes
4ef91a7
 
161838f
a34c407
 
161838f
 
 
bcc50e3
 
161838f
bcc50e3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a34c407
 
161838f
 
a34c407
 
 
 
 
161838f
a34c407
 
 
 
 
161838f
a34c407
 
 
161838f
a34c407
161838f
33357aa
161838f
33357aa
 
161838f
 
 
 
 
 
 
 
 
33357aa
 
161838f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33357aa
161838f
 
 
 
33357aa
161838f
 
 
 
33357aa
a34c407
161838f
a34c407
 
 
161838f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# 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