File size: 5,470 Bytes
8c1b9fe
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# Deploying Auralynq to a Hugging Face Space

> **Status: implemented and locally smoke-tested; not yet published to a
> real Hugging Face Space.** The `deploy/huggingface/` artifacts (Dockerfile,
> entrypoint, env template, Space README template) exist and were verified
> with `podman build` + `podman run` on this machine: health check, `/api/status`
> demo-mode fields, the ModelFit hardware probe, upload gating (403 when
> `AURALYNQ_ALLOW_UPLOADS=false`), the landing page, and a real grounded
> `/api/query` answer against the pre-seeded demo corpus all worked through
> the single exposed port. **Not verified:** an actual Hugging Face Space
> build (HF's build environment, network egress rules, and persistent-storage
> mount behavior can all differ from a local Podman run) β€” see the caveats in
> [`deploy/huggingface/README.md`](../../deploy/huggingface/README.md) before
> publishing one. Nothing here has been published to Hugging Face
> automatically; publishing is always a manual step you take yourself.

## Why a Space needs its own packaging

Auralynq's default topology (see [podman.md](podman.md)) is 7 containers
behind a Caddy TLS proxy β€” that doesn't map onto a single HF Space container.
A Space needs one image that either serves the API and a static/SSR frontend
together, or runs both processes under a small supervisor inside one
container.

## The two modes

**Mode A β€” Lightweight demo Space (this is what `deploy/huggingface/Dockerfile` builds today)**
- No secrets required to run.
- Ships with the [demo corpus](../../examples/demo_corpus/) β€” seeded and
  indexed on first boot by `entrypoint.sh` (verified: ~1 second, offline).
- Forces the offline/extractive fallback path (hash embeddings, in-memory
  vector store, extractive answering) β€” no model downloads, no GPU.
- Uploads disabled by default (`AURALYNQ_ALLOW_UPLOADS=false`, enforced in
  `auralynq/serving/app.py`'s `/ingest` handler β€” verified: returns 403) so a
  public, unauthenticated Space can't accumulate arbitrary user documents.
- Demonstrates: chat, citations, visual grounding, ModelFit hardware page
  (CPU-only numbers, real for whatever container it runs in).

**Mode B β€” Full Docker Space (same image; flip the env vars below)**
- Reads provider keys from HF Space **Secrets** (never Variables, never
  baked into the image).
- Optionally attaches persistent `/data` if the Space has persistent storage
  enabled; otherwise storage is ephemeral and reset on every Space restart β€”
  this will be stated plainly in the Space README so nobody mistakes it for
  durable storage.
- Uploads may be enabled (`AURALYNQ_ALLOW_UPLOADS=true`) only when the
  operator understands the privacy implications of a public Space
  persisting user-uploaded documents.

## Environment variables

```bash
AURALYNQ_HF_SPACE=true
AURALYNQ_DEMO_MODE=true
AURALYNQ_PUBLIC_DEMO=true
AURALYNQ_ALLOW_UPLOADS=false            # true only if you understand the persistence/privacy trade-off
AURALYNQ_DATA_DIR=/data/auralynq
AURALYNQ_SERVE__API_KEY=                # set via Space Secrets if the Space needs auth
NEXT_PUBLIC_API_BASE=/api
AURALYNQ_LLM__PROVIDER=extractive
AURALYNQ_VECTOR__BACKEND=memory
AURALYNQ_EMBEDDING__PROVIDER=hash
AURALYNQ_VISUAL__ENABLED=true
AURALYNQ_MODELFIT__ENABLED=true
```

All of these are real, typed `Settings` fields (`auralynq/config/settings.py`)
read by the API at startup β€” `hf_space`, `demo_mode`, `public_demo`, and
`allow_uploads` are surfaced back out on `GET /api/status` (verified in a
running container), and `modelfit.enabled` gates whether the ModelFit router
is even mounted. `env.example` in `deploy/huggingface/` documents the full
set, split into Space Variables vs. Secrets.

## Variables vs. Secrets (Hugging Face concept, applies once the Space exists)

- **Variables**: visible to anyone who can view the Space's settings/logs if
  misconfigured β€” fine for `AURALYNQ_DEMO_MODE`, `NEXT_PUBLIC_API_BASE`, etc.
  Never put a provider key in a Variable.
- **Secrets**: encrypted, not visible in the Space UI or logs β€” use for
  `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `COHERE_API_KEY`,
  `AURALYNQ_SERVE__API_KEY`, `HUGGINGFACE_TOKEN`.

## Persistent vs. ephemeral storage

- Free/CPU Spaces without persistent storage attached: everything under
  `AURALYNQ_DATA_DIR` is wiped on every Space restart/redeploy. Uploaded
  documents, the vector index, and the page cache do not survive.
- Spaces with **Persistent Storage** enabled: `/data` survives restarts. Mode
  B is designed to use this when available and to say so explicitly in the
  Space README so users don't assume privacy guarantees that don't hold for
  a public Space regardless of storage durability.

## Hardware

- Default target: **CPU basic** β€” the whole point of the lightweight mode is
  that it needs no GPU.
- Upgrading to GPU: only meaningful if you also enable a real embedding/LLM
  provider; document the specific hardware tier once ModelFit numbers exist
  for it (no fabricated numbers β€” see `docs/benchmarks.md` once it exists).

## Duplicating the Space

Once published, "Duplicate this Space" carries over Variables but not
Secrets β€” anyone duplicating a Mode B Space must re-enter their own provider
keys; they never inherit the original operator's keys.

## Next steps

- No containers at all β†’ [no-podman.md](no-podman.md)
- Full Podman stack β†’ [podman.md](podman.md)
- Remote server deployment β†’ [server.md](server.md)