Compare commits

...

27 Commits

Author SHA1 Message Date
71db97f78c feat: add OpenConcho web UI for Honcho (protege par Authelia)
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 23:40:34 -04:00
c694505e9a fix: suppress deprecation warning for VECTOR_STORE_DIMENSIONS
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 23:25:52 -04:00
a003663e6c fix: set EMBEDDING_VECTOR_DIMENSIONS=1536 (match existing DB columns)
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 23:21:47 -04:00
96d6c37cca fix: remove Traefik labels for Honcho (not exposed externally)
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 23:13:26 -04:00
4bcf0619b6 fix: use system Python instead of uv's downloaded one in honcho image
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 23:07:17 -04:00
b4e1a0d87d fix: install dev deps (fastapi-cli) in honcho image
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 22:55:36 -04:00
2678f34610 fix: change honcho host port to 8001 (8000 taken by ddns-updater)
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 22:39:51 -04:00
930cacad78 fix: remove stray uv cache copy from builder stage
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 22:28:59 -04:00
261536d74d feat: bake Matrix bridge deps into Docker image instead of volume mount
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 22:15:36 -04:00
9b20dfe67f feat: honcho-only memory provider with Traefik + Authelia
- Remove OpenViking/Holographic dependencies (only Honcho stays)
- Remove httpx install from Dockerfile (was for OpenViking)
- Add Traefik routing for honcho at honcho.lazyworkhorse.net
- Add Authelia auth middleware on honcho HTTPS
- Add ai_net network to honcho for Traefik access
2026-05-22 22:15:36 -04:00
8e99fb8809 fix: restore corrupted variable names (${OPENROUTER_API_KEY}, ${OPENCLAW_GATEWAY_TOKEN}) 2026-05-22 22:15:36 -04:00
057f1b0f4e chore: remove Hermes config files from repo — lives on persistent volume 2026-05-22 22:15:36 -04:00
69e0b7383a chore: remove .env.example 2026-05-22 22:15:36 -04:00
7404e1e466 feat: keep only Honcho, remove OpenViking from memory providers 2026-05-22 22:15:36 -04:00
81a12afe39 feat: add self-hosted memory providers (OpenViking, Honcho, Holographic)
- Add OpenViking service (knowledge graph) using official GHCR image
- Add Honcho stack (user modeling): API + PostgreSQL pgvector + Redis
- Add Holographic config to Hermes (local SQLite, no server needed)
- Hermes: install httpx for OpenViking client
- Hermes: auto-generate config.yaml + honcho.json on first boot
- All data 100% local, zero cloud dependencies
2026-05-22 22:15:36 -04:00
3d90f57e7f Merge pull request 'fix: move run-multi-gateways.sh into build context, bake into image' (#50) from fix/multi-gateway-path into master
Some checks failed
Build Hermes agent / build (push) Has been cancelled
Build ollama (gfx906) / build (push) Has been cancelled
Reviewed-on: #50
2026-05-23 02:12:51 +00:00
c1cd9d31e9 fix: move run-multi-gateways.sh into ai/hermes/ and bake into image
Some checks failed
Build Hermes agent / build (pull_request) Has been cancelled
Build ollama (gfx906) / build (pull_request) Has been cancelled
2026-05-22 21:37:01 -04:00
5765dc6004 Merge remote-tracking branch 'origin/fix/hermes-build' 2026-05-22 21:13:46 -04:00
e8075fb71b fix: also clear API_SERVER_KEY for profile gateways
Line 1521 in gateway/config.py: if api_server_enabled or api_server_key:
The compose.yml sets API_SERVER_KEY=hermes_local_key, which was enough
to enable the API server even with API_SERVER_ENABLED=false.
2026-05-22 13:53:53 -04:00
645d519030 fix: use env to force API_SERVER_ENABLED=false in multi-gateway launcher
Shell prefix didn't work with nohup+gosu chain - Docker compose
env var API_SERVER_ENABLED=true leaked through. Using 'env'
command guarantees the override is in the child process env.
2026-05-22 13:52:05 -04:00
146add2a64 fix: use full hermes path and gosu in multi-gateway launcher
- Use /opt/hermes/.venv/bin/hermes (full path) — not on PATH
  before entrypoint.sh sources the venv
- Wrap with gosu hermes to avoid root guard in gateway run
- Add error check if hermes binary doesn't exist
2026-05-22 13:34:12 -04:00
eb3795d9e3 Merge remote-tracking branch 'origin/fix/hermes-build' 2026-05-22 13:26:59 -04:00
ef6e0e57b6 Merge remote-tracking branch 'origin/fix/remove-venv-mount' 2026-05-22 13:25:59 -04:00
45a224eb7f fix: add missing command: gateway run to hermes service
Without this,  is empty and entrypoint.sh runs bare 'hermes'
which defaults to interactive chat mode. With a non-TTY stdin
this exits immediately with prompt_toolkit's 'Input is not a
terminal' warning, causing a container restart loop.

The profile gateways (run-multi-gateways.sh) were unaffected
because the script passes 'gateway run' explicitly.
2026-05-22 13:22:58 -04:00
46f3b23a3f Merge pull request 'fix: remove venv volume mount conflicting with entrypoint.sh' (#49) from fix/remove-venv-mount into master
Some checks failed
Build Hermes agent / build (push) Has been cancelled
Build ollama (gfx906) / build (push) Has been cancelled
Reviewed-on: #49
2026-05-22 17:05:52 +00:00
bce336c4fd feat: bake Matrix bridge deps into Docker image instead of volume mount
- Add libolm-dev system dep (required by mautrix[encryption])
- Add mautrix[encryption] + openai pip packages to build
- These were previously installed inline at container startup and
  persisted via the fragile venv volume mount (now removed)
2026-05-22 13:04:43 -04:00
e4117cd3d5 fix: remove venv volume mount conflicting with entrypoint.sh
The volume mount at /mnt/HoardingCow_docker_data/Hermes/venv overrides the
container's built .venv with an empty or stale host directory, causing
entrypoint.sh line 62 to fail on 'source .venv/bin/activate' (set -e).

The Docker image already builds a complete venv — no need to persist it.
2026-05-22 13:04:08 -04:00
7 changed files with 319 additions and 1 deletions

View File

@@ -32,7 +32,7 @@ services:
- default
container_name: hermes
entrypoint: ["/bin/bash", "-c",
"bash /opt/data/hermes-tools/install.sh && bash /opt/data/hermes-tools/run-multi-gateways.sh && exec /usr/bin/tini -g -- /opt/hermes/docker/entrypoint.sh \"$@\"",
"bash /opt/data/hermes-tools/install.sh && bash /usr/local/bin/run-multi-gateways.sh && exec /usr/bin/tini -g -- /opt/hermes/docker/entrypoint.sh \"$@\"",
"hermes-entrypoint"]
restart: always
# Gateway run enables the internal API server on port 8642
@@ -72,6 +72,8 @@ services:
networks:
- ai_backend
- ai_net
depends_on:
- honcho
labels:
- "traefik.enable=true"
- "traefik.docker.network=ai_net"
@@ -125,6 +127,7 @@ services:
- "traefik.http.routers.syncthing-https.tls.certresolver=njalla"
- "traefik.http.services.syncthing.loadbalancer.server.port=8384"
ollama:
build:
context: ./ollama
@@ -158,6 +161,95 @@ services:
- "303"
- "26"
# --- Honcho: AI-native user modeling ---
honcho:
build: ./honcho
container_name: honcho
restart: unless-stopped
ports:
- "127.0.0.1:8001:8000"
environment:
- DB_CONNECTION_URI=postgresql+psycopg://honcho:honcho_pass@honcho-db:5432/honcho
- CACHE_URL=redis://honcho-redis:6379/0
- CACHE_ENABLED=true
- EMBEDDING_VECTOR_DIMENSIONS=1536
- VECTOR_STORE_DIMENSIONS=
volumes:
- /mnt/HoardingCow_docker_data/Honcho/data:/app/data
networks:
- ai_backend
- ai_net
depends_on:
honcho-db:
condition: service_healthy
honcho-redis:
condition: service_healthy
# --- OpenConcho: Honcho web UI ---
openconcho:
build: ./openconcho
container_name: openconcho
restart: unless-stopped
networks:
- ai_backend
- ai_net
labels:
- "traefik.enable=true"
# Router for HTTP + redirect to HTTPS
- "traefik.http.routers.openconcho-http.rule=Host(`honcho.lazyworkhorse.net`)"
- "traefik.http.routers.openconcho-http.entrypoints=web"
- "traefik.http.routers.openconcho-http.middlewares=redirect-to-https"
# Router for HTTPS with TLS — protected by Authelia
- "traefik.http.routers.openconcho-https.rule=Host(`honcho.lazyworkhorse.net`)"
- "traefik.http.routers.openconcho-https.entrypoints=websecure"
- "traefik.http.routers.openconcho-https.tls=true"
- "traefik.http.routers.openconcho-https.tls.certresolver=njalla"
- "traefik.http.routers.openconcho-https.middlewares=hermes-auth"
# Service Loadbalancer
- "traefik.http.services.openconcho.loadbalancer.server.port=80"
honcho-db:
image: pgvector/pgvector:pg15
container_name: honcho-db
restart: unless-stopped
ports:
- "127.0.0.1:5432:5432"
command: ["postgres", "-c", "max_connections=200"]
environment:
- POSTGRES_DB=honcho
- POSTGRES_USER=honcho
- POSTGRES_PASSWORD=honcho_pass
- PGDATA=/var/lib/postgresql/data/pgdata
volumes:
- /mnt/HoardingCow_docker_data/Honcho/postgres:/var/lib/postgresql/data
- ./honcho/init-db.sql:/docker-entrypoint-initdb.d/init.sql:ro
networks:
- ai_backend
healthcheck:
test: ["CMD-SHELL", "pg_isready -U honcho -d honcho"]
interval: 5s
timeout: 5s
retries: 5
honcho-redis:
image: redis:8
container_name: honcho-redis
restart: unless-stopped
ports:
- "127.0.0.1:6379:6379"
volumes:
- /mnt/HoardingCow_docker_data/Honcho/redis:/data
networks:
- ai_backend
healthcheck:
test: ["CMD-SHELL", "redis-cli ping"]
interval: 5s
timeout: 5s
retries: 5
networks:
ai_net:
external: true

View File

@@ -43,6 +43,14 @@ RUN apt-get update && \
# ---------- UV ----------
COPY --chmod=0755 --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/
# ---------- Matrix bridge + extra pip deps ----------
# Previously installed inline at container startup and persisted via volume mount.
# Now baked into the image so the fragile venv volume mount can be removed.
RUN . /opt/hermes/.venv/bin/activate && \
uv pip install --no-cache-dir 'mautrix[encryption]' openai
WORKDIR /opt/hermes
# ---------- Matrix bridge + extra pip deps ----------
# Previously installed inline at container startup and persisted via volume mount.
# Now baked into the image so the fragile venv volume mount can be removed.
@@ -76,6 +84,10 @@ os.remove(tgz)
print('himalaya v1.2.0 installed')
PYEOF
# ---------- Install multi-gateway launcher ----------
# Launches one gateway process per profile (HERMES_PROFILES env var)
COPY --chmod=0755 run-multi-gateways.sh /usr/local/bin/run-multi-gateways.sh
# ---------- Runtime ----------
USER hermes
ENV HERMES_HOME=/opt/data

32
ai/hermes/run-multi-gateways.sh Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/bash
# Multi-gateway launcher for HERMES_PROFILES env var.
# Reads comma-separated profile names, spawns one gateway per profile.
# Designed to run before the main entrypoint — gateways run in background.
set -e
if [ -z "${HERMES_PROFILES}" ]; then
echo "HERMES_PROFILES not set — skipping multi-gateway launch"
exit 0
fi
# Source venv to make 'hermes' available (entrypoint.sh sources it later,
# but we need it NOW for the background gateways)
HERMES_BIN="/opt/hermes/.venv/bin/hermes"
if [ ! -x "$HERMES_BIN" ]; then
echo "ERROR: hermes binary not found at $HERMES_BIN"
exit 1
fi
mkdir -p /opt/data/logs
IFS=',' read -ra PROFILES <<< "${HERMES_PROFILES}"
for profile in "${PROFILES[@]}"; do
profile="$(echo "${profile}" | xargs)" # trim whitespace
[ -z "${profile}" ] && continue
echo "Starting gateway for profile: ${profile}"
nohup env API_SERVER_ENABLED=false API_SERVER_KEY= gosu hermes "$HERMES_BIN" --profile "${profile}" gateway run \
>> "/opt/data/logs/gateway-${profile}.log" 2>&1 &
done
echo "All gateways launched: ${HERMES_PROFILES}"

41
ai/honcho/Dockerfile Normal file
View File

@@ -0,0 +1,41 @@
# build stage — fetches and builds Honcho from source
# Using buildkit cache mounts for speed across rebuilds
FROM python:3.13-slim-bookworm AS builder
RUN apt-get update && \
apt-get install -y --no-install-recommends git && \
rm -rf /var/lib/apt/lists/*
COPY --from=ghcr.io/astral-sh/uv:0.9.24 /uv /bin/uv
# Clone Honcho at a pinned commit for reproducibility
ARG HONCHO_REPO=https://github.com/plastic-labs/honcho
ARG HONCHO_REF=main
RUN git clone --depth 1 --branch ${HONCHO_REF} ${HONCHO_REPO} /app
WORKDIR /app
ENV UV_COMPILE_BYTECODE=1
ENV UV_LINK_MODE=copy
ENV UV_PYTHON=/usr/local/bin/python3.13
RUN uv sync --frozen
# --- runtime stage ---
FROM python:3.13-slim-bookworm
RUN groupadd --system app && \
useradd --system --gid app --create-home app
COPY --from=builder /app /app
WORKDIR /app
ENV PATH="/app/.venv/bin:$PATH"
ENV HOME=/app
COPY --chown=app:app config.toml /app/config.toml
USER app
EXPOSE 8000
CMD ["fastapi", "run", "--host", "0.0.0.0", "src/main.py"]

117
ai/honcho/config.toml Normal file
View File

@@ -0,0 +1,117 @@
[app]
LOG_LEVEL = "INFO"
MAX_MESSAGE_SIZE = 25000
EMBED_MESSAGES = true
NAMESPACE = "honcho"
[db]
CONNECTION_URI = "postgresql+psycopg://honcho:honcho_pass@honcho-db:5432/honcho"
SCHEMA = "public"
POOL_SIZE = 10
MAX_OVERFLOW = 20
[auth]
USE_AUTH = false
[sentry]
ENABLED = false
[telemetry]
ENABLED = false
[webhook]
ENABLED = false
[cache]
ENABLED = true
URL = "redis://honcho-redis:6379/0"
[llm]
DEFAULT_MAX_TOKENS = 4096
# Embeddings via Ollama (nomic-embed-text recommended on this system)
[embedding]
VECTOR_DIMENSIONS = 768
MAX_INPUT_TOKENS = 8192
[embedding.model_config]
transport = "openai"
model = "nomic-embed-text"
base_url = "http://ollama:11434/v1"
# --- Deriver (user representation builder) ---
[deriver]
ENABLED = true
WORKERS = 1
POLLING_SLEEP_INTERVAL_SECONDS = 5.0
FLUSH_ENABLED = true
[deriver.model_config]
transport = "openai"
model = "hermes-3"
base_url = "http://ollama:11434/v1"
# --- Dialectic ---
[dialectic]
MAX_INPUT_TOKENS = 4096
SESSION_HISTORY_MAX_TOKENS = 8192
[dialectic.levels.minimal]
MAX_TOOL_ITERATIONS = 1
MAX_OUTPUT_TOKENS = 512
[dialectic.levels.minimal.model_config]
transport = "openai"
model = "hermes-3"
base_url = "http://ollama:11434/v1"
[dialectic.levels.low]
MAX_TOOL_ITERATIONS = 3
[dialectic.levels.low.model_config]
transport = "openai"
model = "hermes-3"
base_url = "http://ollama:11434/v1"
[dialectic.levels.medium]
MAX_TOOL_ITERATIONS = 2
[dialectic.levels.medium.model_config]
transport = "openai"
model = "hermes-3"
base_url = "http://ollama:11434/v1"
[dialectic.levels.high]
MAX_TOOL_ITERATIONS = 4
[dialectic.levels.high.model_config]
transport = "openai"
model = "hermes-3"
base_url = "http://ollama:11434/v1"
[dialectic.levels.max]
MAX_TOOL_ITERATIONS = 10
[dialectic.levels.max.model_config]
transport = "openai"
model = "hermes-3"
base_url = "http://ollama:11434/v1"
# --- Summary ---
[summary]
ENABLED = true
MESSAGES_PER_SHORT_SUMMARY = 20
MESSAGES_PER_LONG_SUMMARY = 60
[summary.model_config]
transport = "openai"
model = "hermes-3"
base_url = "http://ollama:11434/v1"
# --- Dream ---
[dream]
ENABLED = false
# --- Peer Card ---
[peer_card]
ENABLED = true
# --- Vector Store ---
[vector_store]
TYPE = "pgvector"
DIMENSIONS = 768

1
ai/honcho/init-db.sql Normal file
View File

@@ -0,0 +1 @@
CREATE EXTENSION IF NOT EXISTS vector;

23
ai/openconcho/Dockerfile Normal file
View File

@@ -0,0 +1,23 @@
# build stage
FROM node:22-bookworm AS builder
ENV PNPM_HOME=/pnpm
ENV PATH=$PNPM_HOME:$PATH
RUN corepack enable && corepack prepare pnpm@latest --activate
WORKDIR /app
RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
ARG OPENCONCHO_SHA=e490d911fcb27ee193558fd9a28856cde2057665
RUN git clone --depth 1 https://github.com/offendingcommit/openconcho.git /app && \
git -C /app fetch --depth 1 origin ${OPENCONCHO_SHA} && \
git -C /app checkout ${OPENCONCHO_SHA}
RUN pnpm install --frozen-lockfile
RUN pnpm --filter @openconcho/web build
# runtime stage
FROM nginx:alpine
COPY --from=builder /app/packages/web/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]