# ── Meilisearch ────────────────────────────────────────────────────────────── MEILI_URL=http://localhost:7700 # Master key (self-hosted) or Default Admin API Key (Meilisearch Cloud) MEILI_MASTER_KEY=judilibre-demo-master-key # Search-only key handed to the browser (NEXT_PUBLIC_MEILI_SEARCH_KEY works too). # It must reach both indexes. Leave empty locally to let the web app look up the # default "Search API Key" through MEILI_MASTER_KEY. MEILI_SEARCH_KEY= # Server-side key with actions ["search","documents.get"], used to read one decision. # Lets a deployment run without any admin key. MEILI_DOCUMENTS_KEY= # Embedder name on both indexes; empty hides the hybrid-search toggle. MEILI_EMBEDDER=voyage MEILI_INDEX=decisions # Passage index; defaults to _chunk MEILI_CHUNK_INDEX= # Browser-side URL of Meilisearch (search-as-you-type talks to it directly). NEXT_PUBLIC_MEILI_URL=http://localhost:7700 # ── Judilibre (PISTE) ──────────────────────────────────────────────────────── # 1. Create a free account on https://piste.gouv.fr # 2. Create an application, subscribe it to "Judilibre" (sandbox and/or production) # 3. Copy the application's credentials below: either the KeyId (API-key application)… PISTE_KEY_ID= # …or the OAuth client id/secret (OAuth application). Sandbox token URL: # https://sandbox-oauth.piste.gouv.fr/api/oauth/token PISTE_CLIENT_ID= PISTE_CLIENT_SECRET= PISTE_OAUTH_URL=https://oauth.piste.gouv.fr/api/oauth/token # Production: https://api.piste.gouv.fr/cassation/judilibre/v1.0 # Sandbox: https://sandbox-api.piste.gouv.fr/cassation/judilibre/v1.0 JUDILIBRE_API_URL=https://api.piste.gouv.fr/cassation/judilibre/v1.0 # Decision-date range and jurisdictions exported by `indexer index` DATE_START=2023-01-01 JURISDICTIONS=cc # ── Chat (Meilisearch conversational search) ───────────────────────────────── # Provider used by Meilisearch to talk to the LLM: openAi | mistral | azureOpenAi | vLlm | gemini # Default: Claude Sonnet 5.5 through the LUMEN gateway, which speaks the OpenAI API, # hence the openAi source with LUMEN's base URL. CHAT_API_KEY is a LUMEN virtual key. CHAT_SOURCE=openAi CHAT_API_KEY= # LUMEN must be reached by its public URL: Meilisearch rejects private IPs (127.0.0.1…) # as a chat baseUrl. Leave empty for OpenAI itself; mistral: https://api.mistral.ai/v1 CHAT_BASE_URL=https://lumen.meilisearch.com/v1 # Model name sent by the web app in chat requests. # NOTE: the GPT-5.6 family (luna/sol/terra) cannot be used here: it refuses function # tools on /v1/chat/completions unless reasoning_effort="none", and Meilisearch only # sends low|medium|high. With OpenAI directly (empty CHAT_BASE_URL), use gpt-5.5. CHAT_MODEL=claude-sonnet-5-5 CHAT_WORKSPACE=judilibre # Printed by `indexer setup`; the web app falls back to MEILI_MASTER_KEY when empty MEILI_CHAT_KEY= # ── Optional: hybrid (semantic) search with Voyage AI ──────────────────────── # When set, `indexer setup` configures a Voyage AI embedder (REST source); the search # page gets a "Hybride" toggle and the assistant retrieves with hybrid search. VOYAGE_API_KEY= # voyage-law-2: legal-domain model, 16K context. Alternative: voyage-4 (general, multilingual). VOYAGE_MODEL=voyage-law-2 # Endpoint Meilisearch calls for embeddings (Voyage's API by default). Through LUMEN: # VOYAGE_URL=https://lumen.meilisearch.com/v1/embeddings with a LUMEN key in VOYAGE_API_KEY. # Changing it re-embeds every document. # VOYAGE_URL=https://api.voyageai.com/v1/embeddings