Skillshub llm-council

install
source · Clone the upstream repo
git clone https://github.com/ComeOnOliver/skillshub
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/ComeOnOliver/skillshub "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/happycapy-ai/Happycapy-skills/llm-council" ~/.claude/skills/comeonoliver-skillshub-llm-council-123a0f && rm -rf "$T"
manifest: skills/happycapy-ai/Happycapy-skills/llm-council/SKILL.md
source content

LLM Council

Query multiple AI models in parallel with a live web dashboard.

Launch

cd ~/.claude/skills/llm-council/scripts
# Kill any existing server on the port
fuser -k 8787/tcp 2>/dev/null
# Start server
nohup python3 server.py > /tmp/council-server.log 2>&1 &
# Wait for startup, verify health
sleep 2 && curl -s --max-time 5 http://localhost:8787/health
# Export port for browser access
/app/export-port.sh 8787

Environment:

COUNCIL_PORT
(default 8787),
AI_GATEWAY_API_KEY
(required, auto-detected from environment).

Files

  • scripts/server.py
    - ThreadingHTTPServer, serves static files + API routes, SSE streaming
  • scripts/ai_gateway.py
    - AI Gateway client: query, parallel query, streaming, synthesis, anonymous voting
  • scripts/static/index.html
    - Dashboard UI (HappyCapy design system, light/dark theme)
  • scripts/static/app.js
    - Client-side logic (model selector, SSE parsing, markdown rendering, voting UI)

API

MethodPathDescription
GET
/
Dashboard
GET
/api/models
List models
GET
/health
Health check
POST
/api/council/stream
Query models (SSE)
POST
/api/council/synthesize
Synthesize consensus
POST
/api/council/vote
Anonymous model vote (SSE with keepalive)

Key Details

  • Server uses
    ThreadingHTTPServer
    for concurrent request handling
  • Vote endpoint streams SSE keepalive pings every 5s to prevent proxy timeouts (Cloudflare 524)
  • Static files served with
    Cache-Control: no-store, no-cache
    headers
  • Script tag uses cache-busting version param:
    app.js?v=...
    (bump when editing app.js)
  • Model IDs use dots not hyphens:
    anthropic/claude-sonnet-4.5
    (not
    claude-sonnet-4-5
    )