Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
7c7ce1541c | ||
|
|
014c86f51e | ||
|
|
c4770194d9 |
@@ -49,7 +49,7 @@ jobs:
|
|||||||
- name: Login to Gitea Registry
|
- name: Login to Gitea Registry
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
registry: git.schweitz.internal
|
registry: git.schweitz.net
|
||||||
username: ${{ secrets.REGISTRY_USER }}
|
username: ${{ secrets.REGISTRY_USER }}
|
||||||
password: ${{ secrets.REGISTRY_PASSWORD }}
|
password: ${{ secrets.REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
@@ -61,8 +61,8 @@ jobs:
|
|||||||
provenance: false
|
provenance: false
|
||||||
sbom: false
|
sbom: false
|
||||||
tags: |
|
tags: |
|
||||||
git.schweitz.internal/jpmschweitzer/desklock-gateway:latest
|
git.schweitz.net/jpmschweitzer/desklock-gateway:latest
|
||||||
git.schweitz.internal/jpmschweitzer/desklock-gateway:${{ github.ref_name }}
|
git.schweitz.net/jpmschweitzer/desklock-gateway:${{ github.ref_name }}
|
||||||
|
|
||||||
- name: Trigger Watchtower update
|
- name: Trigger Watchtower update
|
||||||
if: success()
|
if: success()
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
## What this project is
|
## What this project is
|
||||||
|
|
||||||
DeskLock is the living-room visual/audio endpoint for **Tatlock**, the homelab butler
|
DeskLock is the living-room visual/audio endpoint for **Tatlock**, the homelab butler
|
||||||
(`/mnt/media/Projects/tatlock`, API at `http://tatlock.schweitz.internal:8000`). Two halves,
|
(`/mnt/media/Projects/tatlock`, API at `http://tatlock:8000` on `docker-dataplane`).
|
||||||
one repo:
|
Two halves, one repo:
|
||||||
|
|
||||||
- `firmware/` — ESP-IDF (C, LVGL 9) app for the Waveshare ESP32-P4-WIFI6-Touch-LCD-3.4C
|
- `firmware/` — ESP-IDF (C, LVGL 9) app for the Waveshare ESP32-P4-WIFI6-Touch-LCD-3.4C
|
||||||
(3.4" round 800×800 touch display, dual mics + ES7210 AEC, ES8311 codec + speaker).
|
(3.4" round 800×800 touch display, dual mics + ES7210 AEC, ES8311 codec + speaker).
|
||||||
@@ -124,7 +124,8 @@ make typecheck # mypy
|
|||||||
## Homelab context
|
## Homelab context
|
||||||
|
|
||||||
- This server **is** tower-of-joy; the device, gateway, and Tatlock all share the LAN.
|
- This server **is** tower-of-joy; the device, gateway, and Tatlock all share the LAN.
|
||||||
- Use `tatlock.schweitz.internal:8000` (direct, no SSO) — the public
|
- Machine-to-machine traffic uses container names on the `docker-dataplane` network —
|
||||||
`tatlock.schweitz.net` route sits behind Authentik and is not for machine-to-machine
|
`http://tatlock:8000` (the deployed stack overrides `DESKLOCK_TATLOCK_BASE_URL` to
|
||||||
traffic.
|
the host LAN IP while Tatlock runs on the host). Browser-facing URLs use
|
||||||
|
`https://<name>.schweitz.net` (NPM, Authentik SSO) — never for M2M traffic.
|
||||||
- Git remote: `git.schweitz.net` (Gitea).
|
- Git remote: `git.schweitz.net` (Gitea).
|
||||||
|
|||||||
@@ -8,6 +8,15 @@ until the first tagged release.
|
|||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [0.2.2] — 2026-07-19
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The gateway's default Tatlock URL is now `http://tatlock:8000` (docker
|
||||||
|
container name) — the retiring `tatlock.schweitz.internal` domain is gone
|
||||||
|
from config and docs. Deployments setting `DESKLOCK_TATLOCK_BASE_URL` are
|
||||||
|
unaffected.
|
||||||
|
|
||||||
## [0.2.1] — 2026-07-15
|
## [0.2.1] — 2026-07-15
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
@@ -38,8 +38,8 @@ happens on this server.
|
|||||||
▼ │ Speaches (container, GPU) │
|
▼ │ Speaches (container, GPU) │
|
||||||
┌────────────────────┐ │ • STT: faster-whisper │
|
┌────────────────────┐ │ • STT: faster-whisper │
|
||||||
│ Tatlock (butler) │ │ • TTS: Kokoro / Piper │
|
│ Tatlock (butler) │ │ • TTS: Kokoro / Piper │
|
||||||
│ tatlock.schweitz. │ │ also usable by Open WebUI, │
|
│ http://tatlock │ │ also usable by Open WebUI, │
|
||||||
│ internal :8000 │ │ Home Assistant, … │
|
│ :8000 │ │ Home Assistant, … │
|
||||||
└────────────────────┘ └─────────────────────────────┘
|
└────────────────────┘ └─────────────────────────────┘
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ models — the container stays a slim pure-Python image with no CUDA/ML dependen
|
|||||||
2. Buffers inbound PCM until end-of-utterance (client-signalled in phase 1; VAD later).
|
2. Buffers inbound PCM until end-of-utterance (client-signalled in phase 1; VAD later).
|
||||||
3. **STT**: POST to Speaches `/v1/audio/transcriptions`.
|
3. **STT**: POST to Speaches `/v1/audio/transcriptions`.
|
||||||
4. **Chat**: POST the transcript to Tatlock `/v1/chat/completions`
|
4. **Chat**: POST the transcript to Tatlock `/v1/chat/completions`
|
||||||
(`http://tatlock.schweitz.internal:8000`, OpenAI-compatible, **streaming**),
|
(`http://tatlock:8000`, OpenAI-compatible, **streaming**),
|
||||||
maintaining the conversation history so follow-ups have context.
|
maintaining the conversation history so follow-ups have context.
|
||||||
5. **TTS**: as Tatlock's token stream completes each sentence, POST it to Speaches
|
5. **TTS**: as Tatlock's token stream completes each sentence, POST it to Speaches
|
||||||
`/v1/audio/speech` and forward the PCM immediately — see
|
`/v1/audio/speech` and forward the PCM immediately — see
|
||||||
@@ -335,7 +335,7 @@ Gitea Actions (`.gitea/workflows/build.yml`), following the tatlock/tatlock-ui p
|
|||||||
|
|
||||||
- **Every push to `main`**: lint + tests for the gateway (Python 3.12).
|
- **Every push to `main`**: lint + tests for the gateway (Python 3.12).
|
||||||
- **Version tags (`v0.1.0`, …)**: tests, then build `gateway/` into
|
- **Version tags (`v0.1.0`, …)**: tests, then build `gateway/` into
|
||||||
`git.schweitz.internal/jpmschweitzer/desklock-gateway:{latest,tag}`, push to the
|
`git.schweitz.net/jpmschweitzer/desklock-gateway:{latest,tag}`, push to the
|
||||||
Gitea registry, create a release, and trigger Watchtower to roll the running
|
Gitea registry, create a release, and trigger Watchtower to roll the running
|
||||||
container.
|
container.
|
||||||
- Required repo/org secrets: `REGISTRY_USER`, `REGISTRY_PASSWORD`,
|
- Required repo/org secrets: `REGISTRY_USER`, `REGISTRY_PASSWORD`,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[project]
|
[project]
|
||||||
name = "desklock-gateway"
|
name = "desklock-gateway"
|
||||||
version = "0.2.1"
|
version = "0.2.2"
|
||||||
description = "Voice gateway bridging the DeskLock device to the Tatlock butler (STT/chat/TTS)"
|
description = "Voice gateway bridging the DeskLock device to the Tatlock butler (STT/chat/TTS)"
|
||||||
requires-python = ">=3.11"
|
requires-python = ">=3.11"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ from pydantic_settings import BaseSettings
|
|||||||
class Settings(BaseSettings):
|
class Settings(BaseSettings):
|
||||||
"""Gateway configuration, overridable via DESKLOCK_* environment variables."""
|
"""Gateway configuration, overridable via DESKLOCK_* environment variables."""
|
||||||
|
|
||||||
tatlock_base_url: str = "http://tatlock.schweitz.internal:8000"
|
tatlock_base_url: str = "http://tatlock:8000"
|
||||||
tatlock_model: str = "Tatlock"
|
tatlock_model: str = "Tatlock"
|
||||||
|
|
||||||
# PCM rate of the device WebSocket contract (docs/architecture.md)
|
# PCM rate of the device WebSocket contract (docs/architecture.md)
|
||||||
|
|||||||
Reference in New Issue
Block a user