diff --git a/ai/compose.yml b/ai/compose.yml index 89dceca..d844774 100755 --- a/ai/compose.yml +++ b/ai/compose.yml @@ -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 diff --git a/ai/hermes/Dockerfile b/ai/hermes/Dockerfile index dd044f9..368efca 100644 --- a/ai/hermes/Dockerfile +++ b/ai/hermes/Dockerfile @@ -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. diff --git a/ai/honcho/Dockerfile b/ai/honcho/Dockerfile new file mode 100644 index 0000000..e654667 --- /dev/null +++ b/ai/honcho/Dockerfile @@ -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"] diff --git a/ai/honcho/config.toml b/ai/honcho/config.toml new file mode 100644 index 0000000..0578f57 --- /dev/null +++ b/ai/honcho/config.toml @@ -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 diff --git a/ai/honcho/init-db.sql b/ai/honcho/init-db.sql new file mode 100644 index 0000000..0aa0fc2 --- /dev/null +++ b/ai/honcho/init-db.sql @@ -0,0 +1 @@ +CREATE EXTENSION IF NOT EXISTS vector; diff --git a/ai/openconcho/Dockerfile b/ai/openconcho/Dockerfile new file mode 100644 index 0000000..de9ed48 --- /dev/null +++ b/ai/openconcho/Dockerfile @@ -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;"]