Spaces:
Running on Zero
Running on Zero
|
Download docs/deployment.md from lothnic/precedentai: direct link, hf CLI and curl.
- Browser
- Download file 20.7 kB
-
https://huggingface.co/spaces/lothnic/precedentai/resolve/main/docs/deployment.md
- Command line
-
hf download hf://spaces/lothnic/precedentai/docs/deployment.md
-
curl -L -o deployment.md https://huggingface.co/spaces/lothnic/precedentai/resolve/main/docs/deployment.md
20.7 kB
| # Free public deployment | |
| Hosting endpoints: | |
| - [PrecedentAI website](https://precedent.lothnic.dev/chat) | |
| - [Backend Space and build logs](https://huggingface.co/spaces/lothnic/precedentai) | |
| The current deployment separates the web app from its large Python runtime: | |
| - Vercel hosts the TanStack Start frontend and its same-origin `/api/*` proxy. | |
| - Hugging Face hosts the Gradio Server wrapper on the free `zero-a10g` tier. The existing FastAPI application is mounted at `/backend`. | |
| - A private Hugging Face dataset holds the complete corpus and hybrid index. A read-only repository volume is pinned to the artifact commit. Public PDF archives are downloaded from their separately pinned upstream revisions. | |
| - Retrieval runs on CPU. The selected inference provider supplies answer generation through the OpenAI-compatible client. Ordinary chat does not allocate a GPU. This keeps LangGraph conversation and approval state in one process. | |
| The release contains 22,416 selected Supreme Court judgments/orders from 1950–2025 and 516 constitutional source units from the official 1 May 2026 edition. The four indexes contain 967,053 passages in total. Constitutional units include omitted provisions and reference Appendices; this is neither an in-force Article count nor comprehensive coverage of Indian courts and legislation. Runtime data occupies about 22.74 GiB including retained source PDFs. Startup verifies file sizes and SHA-256 hashes, preserves index freshness metadata, checks vector/registry counts, and warms the embedding model before serving research. It never replaces the corpus with the test fixture. | |
| ## Accounts and initial setup | |
| This path needs no credit card. A free Hugging Face account must qualify to create a ZeroGPU Space (verified email, account older than 30 days, available Space allowance). The platform accepted this account and created `lothnic/precedentai`. A Vercel personal account hosts `precedentai`. | |
| ```sh | |
| hf auth login | |
| vercel login | |
| hf repos create YOUR_NAME/precedentai --type space --space-sdk gradio --flavor zero-a10g --public --exist-ok | |
| ``` | |
| Install the Python project with its serving, ML and LLM dependencies. Configure the selected provider and its working key locally before uploading (see [LLM setup](setup.md#llm-stage-groq-openai-nvidia-agentrouter)). Stop processes that write to the corpus or index, checkpoint SQLite, and then run: | |
| ```sh | |
| uv run --extra serve --extra ml --extra llm python scripts/deploy_hf_space.py \ | |
| --space YOUR_NAME/precedentai --artifacts YOUR_NAME/precedentai-rag | |
| ``` | |
| The script uploads only allowlisted release artifacts to a private dataset, bundles their manifest with the Space code, mounts the dataset at the immutable commit, and sets the Space secrets and public configuration. Interrupted artifact uploads can resume. `--prepare-only` checks and stages the release without uploading. No raw training/data directory is published in the public Space repository. | |
| The deployed artifact release remains `35c80a7515dd216516b9ffc8fdba20671214c908`. | |
| The current 8 October approval-receipt release is backend code | |
| `8e0740261575a304290a8b6f6a28b2ec4c8284e5`, using the same immutable artifact. | |
| The private Supabase approval migration is applied. Loaded four-index/storage | |
| readiness and the metadata receipt route pass without a model call; see | |
| [approval receipts](v2-approvals.md) and `data/eval/v2_approval_backend_checks.json`. | |
| The preceding source-identity release was backend code | |
| `d637f7f6f0767138d38acc99dfc192de530186fb`. | |
| Its full registry audit and live document/readiness checks are recorded in | |
| `data/eval/v2_document_identity_audit.json` and | |
| `data/eval/v2_document_identity_backend_checks.json`. Source readers expose whether | |
| reported docket groupings have been checked against the retained PDF; distinct | |
| document IDs remain unchanged. See [source identity review](v2-source-audit.md). | |
| The preceding 8 October feedback release is backend code | |
| `df1329e77d60e290e4c656301e376591bfa521c8`, using the same immutable artifact. | |
| Loaded index/storage checks are recorded in `data/eval/v2_feedback_backend_checks.json`; | |
| feedback uses the dedicated private Supabase table migrated through the CLI. | |
| The preceding 8 October candidate-selection release is backend code | |
| `254f1494d46faa88ade061e76dfa517e16826cbd`, using the same immutable artifact. | |
| Its frozen-query comparison is recorded in `data/eval/v2_candidate_relevance_checks.json`; | |
| fresh hosted relevance acceptance is recorded in `data/eval/v2_candidate_relevance_hosted.json`. | |
| The anticipatory-bail probe returns relevant Chidambaram/Sushila Aggarwal passages; | |
| it does not verify a synthesized legal answer or the full v2 quality gates. The preceding trace/tie release | |
| is `007c4cdeee6f8ca707d53309799d5a181dd7b0a7`, and bounded admission was published | |
| at `85499f8cbad81e25f2fd113527917a73b20d7479`. The earlier source-readiness update is backend code | |
| `5a5a84f93cca14f3e9e6435dbb640a69a9cf8d5a`; actual public four-index and | |
| private-storage probes are recorded in `data/eval/v2_readiness_checks.json`. | |
| The preceding API-contract update is backend code | |
| `4f5dcf54e6b47a4dc8d1ce6a71e0ee4665b4a973`; its read-only release verification | |
| is recorded in `data/eval/v2_api_contract_checks.json`. The preceding answer update is | |
| backend code | |
| `96b4bf5f87d31eb8afd555fcd8c4085475b7fbf2`; its acceptance is recorded in | |
| `data/eval/v2_statutory_scope_checks.json`. The preceding date/context release | |
| `51528145bf7aef448a198564f5f6b60a6eedb1c5` remains documented in | |
| `data/eval/v2_named_decision_date_checks.json`. Vercel deployment | |
| `dpl_8wMp53Pd3nvTafZwqQ4WfPCbXk6Q` serves the custom domain with single-use | |
| review IDs and receipt privacy notices, alongside accessibility | |
| corrections, source-identity disclosures, feedback/support, the | |
| loaded-readiness badge and Google-only sign-in. Public Google handoff and | |
| desktop/mobile guest checks pass (`data/eval/v2_oauth_configuration_checks.json`). | |
| The preceding accessibility frontend was `dpl_GAVycfPnxxLosei6k4ceX8fsfypj`. | |
| Actual read-only approval proxy and served-bundle checks are in | |
| `data/eval/v2_approval_deployment.json`. | |
| The preceding source-identity frontend was `dpl_2F4XpkHRQ4BySRe6fLhUQAvgEKSV`. | |
| Accessibility evidence is recorded in `data/eval/v2_accessibility_checks.json` and | |
| `data/eval/v2_accessibility_deployment.json`; physical devices and real screen-reader | |
| sessions remain separate from local browser and hosted asset/API checks. | |
| The preceding feedback frontend was `dpl_79VVidW8ndwnyTCa8T7UCk99Qj4j`. | |
| The preceding source-log privacy frontend was `dpl_2oAQZ65mH6EV3j9qiWhYinVdmHvE`. | |
| The preceding candidate/readiness frontend was `dpl_3ncM5yN5JdDLrYCg4UFvtHMCtoCJ`; | |
| the earlier readiness frontend was `dpl_Ej4bSjr9mUUuG6e1zSDYQoUcvZsq`. | |
| The preceding Google-only frontend was `dpl_9KAawB9trzwPrsT4LoTPrCDB28oe`. | |
| The prior frontend was | |
| `dpl_Fz9qM7KJEM7Lr5DTCjaUAwEg5jLi`. Supabase activation used | |
| `dpl_3uJfAgGP3mdzFYBwJoCh1xHhxLK3` | |
| (`data/eval/v2_supabase_deployment.json`). The preceding 7 October | |
| Constitution release used backend `b5691561721db72b6b264cdb6c2f03d41823c349` | |
| and Vercel `dpl_HA5mPnctRtcpktp5sEue4cwjXywM`. | |
| The running Space landing page links to the custom domain. If the default transfer | |
| repeatedly stalls on a particular network, `HF_HUB_DISABLE_XET=1` selects Hugging | |
| Face's compatible LFS transfer path. This changes transfer behavior, not the | |
| verified artifact contents. | |
| The generated proxy key is stored locally in `deploy/.generated/hosting.env` with mode `0600`; that directory is ignored by Git. Keep it private. The runtime does not need a personal Hugging Face access token: the platform mounts the private dataset using the owner's identity. | |
| ### Routine code releases | |
| Frontend source is tracked in `web/` beside the Python backend. For an existing | |
| Space, first stage code against its current immutable artifact release: | |
| ```sh | |
| .venv/bin/python scripts/deploy_hf_space.py \ | |
| --space lothnic/precedentai --artifacts lothnic/precedentai-rag \ | |
| --code-only --prepare-only --output deploy/.generated/code-release | |
| ``` | |
| The command checks the live Space settings, bundled manifest and pinned dataset | |
| manifest, then prepares allowlisted code and writes `code-release.json` with file | |
| hashes. It does not build, upload or change the corpus. After local verification, | |
| run the same command without `--prepare-only` to publish code with a parent-commit | |
| guard against a concurrent code release. Existing secrets, artifact mounts and | |
| hardware are preserved. Wait for readiness and verify actual answers, storage and | |
| coverage before the frontend release: | |
| ```sh | |
| cd web | |
| bun run typecheck | |
| bun run test:auth | |
| bun run build:vercel | |
| vercel deploy --prod --yes | |
| ``` | |
| Use a regular remote Vercel build for production so deployment settings provide | |
| server credentials. A local build verifies packaging; its environment is not | |
| automatically suitable for production. Record returned web/backend revisions, | |
| retain the preceding release and run public acceptance. Code-only preparation | |
| was verified against the live pinned release on 8 October 2026. Broader release | |
| automation, generated API types and a hosted rollback drill remain open. | |
| ### V2 candidate releases | |
| The live public beta now uses a schema-2 catalog with the primary case corpus, | |
| the 1950 and 1973–1978 supplements, and the Constitution. This deployment does | |
| not complete every v2 milestone or establish practitioner-accepted legal quality. | |
| See [the Constitution guide](constitutional-corpus.md) and | |
| [the discovery release commands](v2-discovery.md#serving-additional-batches). | |
| `--prepare-only` validates and stages a candidate; `--artifacts-only` publishes | |
| its immutable private artifact revision without touching the live Space. Use a | |
| separate output directory under `deploy/.generated` to retain the baseline. | |
| The schema-2 manifest declares each corpus, registry identity, vector collection, | |
| document/passage count and combined coverage. Startup verifies all of them before | |
| serving research. Schema 1 remains accepted and explicitly clears supplement and | |
| v2-discovery settings when restored. The source archives are selected from the | |
| retained documents rather than a hardcoded year range, including historical PDFs. | |
| The current release was prepared with all three `--supplement NAME CORPUS INDEX` | |
| arguments. A no-flag deployment creates a primary-only release, so preserve those | |
| arguments when updating the expanded catalog. Parallel MCP recovery is enabled | |
| with `LEGAL_AI_ENABLE_WEB_FALLBACK=true` and a shared cap of 60 external HTTP | |
| attempts per rolling day. It uses anonymous access and no paid API fallback. | |
| Before promotion, retain the production identifiers and backend code recorded in | |
| `data/eval/v2_release_baseline.json`. Restore backend code, artifact variables and | |
| the read-only mount to that same baseline together if rollback is needed. The | |
| corresponding immutable Vercel deployment is recorded there too. Local restoration | |
| and rollback checks do not replace an actual hosted rollback/performance check. | |
| ## Frontend | |
| In `web`, link the Vercel project and configure **server-only** environment variables for both preview and production: | |
| - `BACKEND_URL=https://YOUR_NAME-precedentai.hf.space/backend` | |
| - `BACKEND_API_KEY` equal to the generated proxy key | |
| Use Vercel's environment settings or `vercel env add` with secure input. Do not use `VITE_*` variables for these secrets. Deploy with `vercel deploy`, verify the preview, and publish with `vercel deploy --prod`. The configured build command uses Nitro's Vercel preset. The frontend stays in its separately managed local checkout. | |
| The proxy creates an HMAC-signed, HttpOnly, SameSite cookie and supplies the secret and browser session to the backend. Each session's thread names are isolated, including draft approvals. Direct unauthenticated backend access is rejected; `/backend/health` is public liveness. The browser receives no API key. Successful API responses and conversation history are not cached. | |
| Optional [Google account login](authentication.md) uses encrypted Auth.js cookies. Verified sign-ins now resolve a stable UUID in the dedicated Supabase account database; guests continue using the signed browser session. Google is configured; its external audience and successful real login returning to signed-in chat are owner-confirmed on 8 October 2026. GitHub is deferred at the owner's request. Existing sessions need a fresh sign-in for the database identity. Browser history stays separate by account; signed-in users can explicitly enable and save private copies for another browser. Nothing uploads automatically. See [accounts and saved history](v2-accounts.md). | |
| Connection status retries after a cold start. An unsupported streaming endpoint can fall back to `/chat`; busy responses and interrupted streams are not automatically resubmitted, which prevents duplicate graph turns. The backend releases the research slot when the final response body is sent. | |
| ## Verification and limits | |
| Check the Space build and application logs with `hf spaces logs YOUR_NAME/precedentai` and its status with `hf spaces info YOUR_NAME/precedentai --expand runtime`. Wait for the full RAG readiness log before publishing the frontend. Confirm `/api/health` reports the fused backend and enabled LLM, and `/ready` confirms the configured indexes and private storage. Exercise a greeting, a source-linked research question, a PDF link, and a draft approval from the deployed website. | |
| The 9 October answer-checking release is backend | |
| `f8135ff6e5d714bd3ec21fd3913ff2eacbe84777`, using the existing immutable | |
| artifact `35c80a7515dd216516b9ffc8fdba20671214c908`. Frontend | |
| `dpl_Cn8QwcJRjuAstr7DyBWP6uETsYEd` is unchanged. Only the answer/support modules | |
| changed: strict checker response schema and a bounded provision-scope wording | |
| guard. The regular suite remains 176 passes/two skips; an actual one-call, | |
| 1,595-token provider checker diagnostic passes. That diagnostic checks one | |
| qualified claim against an exact retained source window, not a new hosted answer | |
| or automatic correction. See `data/eval/v2_answer_reliability_checks.json` and | |
| the separately scoped `data/eval/v2_answer_reliability_backend_checks.json`. | |
| The 7 October 2026 release verified 62 private artifact entries through remote | |
| LFS hashes or downloaded small-file hashes before promotion. The live runtime | |
| reported 22,932 source documents and all four catalog identities. The public | |
| website streamed a synthesized answer to the user's religion question, with | |
| citations to Articles 25–28 and a visible personal-law statute coverage gap. | |
| Canonical Article 25 metadata and the original PDF's exact SHA-256 matched the | |
| retained edition. Direct unauthenticated source requests returned 401. Three | |
| existing auth tests passed with stubbed OAuth; Google configuration was retained, | |
| but a new real-provider sign-in was not exercised. Startup emitted two ignored | |
| asyncio event-loop cleanup warnings after readiness; the catalog and live chat | |
| requests passed. These are deployment smoke checks, not legal-quality acceptance. | |
| Desktop/mobile browser checks on the public domain also passed for answer-first | |
| formatting, the edition-aware Constitution reader, exact quote highlights and | |
| the physical PDF page link. They replayed the actual public response and made no | |
| additional inference requests. The release report is | |
| `data/eval/constitution_deployment.json`. | |
| Initial release validation: 114 Python tests passed, with two optional model-integration tests skipped. The deployed API passed conversation-memory and session-isolation checks, SSE research with generated citations, byte-for-byte PDF hash verification, and the cross-session approval guard. The final research smoke request completed in about 5.5 seconds; this is one observation, not a latency guarantee. Frontend builds, type checks, desktop/mobile layout checks, and the busy/unsupported-stream retry scenarios also passed. A final browser check submitted a real research question on the public site and rendered the response on desktop and mobile without page errors or horizontal overflow. | |
| This is a public beta, with shared free-provider capacity rather than an uptime guarantee. The default safeguards serialize graph turns and allow ten turns per guest browser session or signed-in account per hour and thirty total turns per day. Busy or quota-limited requests return a readable message. These limits are configurable through `LEGAL_AI_PUBLIC_REQUESTS_PER_HOUR` and `LEGAL_AI_PUBLIC_REQUESTS_PER_DAY`. | |
| The Space's writable disk is ephemeral. Restarting it restores the verified release | |
| and clears default/guest RAM conversation state. Since 8 October 2026, protected | |
| requests, provider budgets, stable account identities and optional saved copies | |
| use private Supabase PostgreSQL storage. Approval receipts preserve consumed | |
| decisions separately. The 9 October recovery update adds default-off, bounded | |
| 24-hour checkpoints for signed-in users; see [temporary recovery](v2-recovery.md) | |
| for activation evidence and limits. Saved copies remain transcript-only. Prior | |
| RAM usage was not imported at cutover. Hosted scheduled/off-site backups, | |
| request-specific response replay and recovery drills remain unfinished. HF | |
| sleep/cold starts and free inference quotas can delay or limit service. Full v2 | |
| quality and operational gates remain open. | |
| The AgentRouter deployment uses `deepseek-v4-flash` for generation and answer checks. The preceding Groq configuration preferred `openai/gpt-oss-120b` and used `openai/gpt-oss-20b` when the preferred model returned HTTP 429. The fallback is optional in local configuration (`LEGAL_AI_LLM_FALLBACK_MODEL`) and stays on the same provider and account. Both models are listed in Groq's [free plan limits](https://console.groq.com/docs/rate-limits). Calls record the model actually used. SDK retries are disabled because the application already bounds retries; authentication errors never trigger a model switch. If generation remains unavailable, the app serves source excerpts instead. Citation checks establish provenance, not the correctness of every legal claim; drafts still require qualified review. Smoke tests exposed incorrect date attribution in generated privacy-law analysis despite valid source links. Treat claim/date verification as a remaining RAG quality gap, and do not describe this beta as providing legally verified answers. | |
| NVIDIA is also supported. To activate it on the existing Space, add a server-side | |
| `NVIDIA_API_KEY` secret and set `LEGAL_AI_LLM_PROVIDER=nvidia` plus | |
| `LEGAL_AI_LLM_MODEL=deepseek-ai/deepseek-v4.1-flash`. Clear | |
| `LEGAL_AI_LLM_FALLBACK_MODEL` and `LEGAL_AI_LLM_BASE_URL` when switching from | |
| Groq; NVIDIA supplies its own default endpoint. See [LLM setup](setup.md#llm-stage-groq-openai-nvidia-agentrouter). | |
| Full publication reads the selected local provider, publishes its matching key | |
| as a Space secret, and preserves any configured same-provider fallback and | |
| endpoint override. The automatic `openai/gpt-oss-20b` deployment fallback applies | |
| only to Groq. A code-only release preserves the active provider and secrets. | |
| AgentRouter can be selected on the existing Space after publishing its provider | |
| support. Add `AR_API_KEY` as a server-side Hugging Face Space secret, then set: | |
| ```dotenv | |
| LEGAL_AI_ENABLE_LLM=true | |
| LEGAL_AI_LLM_PROVIDER=agentrouter | |
| LEGAL_AI_LLM_MODEL=deepseek-v4-flash | |
| LEGAL_AI_LLM_FALLBACK_MODEL= | |
| LEGAL_AI_LLM_BASE_URL= | |
| ``` | |
| Use a model ID enabled for the AgentRouter account. The current integration | |
| defaults to `https://agentrouter.org/v1`; an explicit base URL overrides it. | |
| It retains the provider-specific User-Agent from `tools/llm_client.py`. | |
| `LEGAL_AI_AGENTROUTER_API_KEY` is an alternative scoped secret. Keep keys in | |
| Space secrets and never in public variables or frontend `VITE_*` settings. | |
| Code-only publication preserves the existing provider settings, so activating | |
| AgentRouter requires updating these Space variables separately. Verify a real | |
| hosted research turn and inspect provider usage after the restart. | |
| Answer prompts include passage text, source identity, and legal date/role caveats. File hashes, archive paths, and PDF links stay in server-side provenance and the response, reducing generation tokens without removing the evidence or source-reading capability. | |
| The repository's Dockerfile and systemd unit remain alternatives for users with an appropriate paid host or VM. They are not required for this no-card setup. Free-tier eligibility and allowances can change; check the [Hugging Face Spaces documentation](https://huggingface.co/docs/hub/spaces-overview), [repository volumes](https://huggingface.co/docs/hub/spaces-storage), and [Vercel Hobby documentation](https://vercel.com/docs/plans/hobby) before creating another deployment. | |