> ## Documentation Index
> Fetch the complete documentation index at: https://docs.locusmedical.fr/llms.txt
> Use this file to discover all available pages before exploring further.

# GraphRAG retrieving diffusé étape par étape (NDJSON)

> Iso avec `/v2/retrieve`, mais diffusé au fil de l'eau : une ligne JSON par étape de la pipeline (`query_maker`, `retrieval`, `deliberation`, `answer`, `drugs`), puis une ligne terminale `done` portant la payload complète (le même corps que `/v2/retrieve`) ou `error`.

Avec `deliberate=true`, la boucle réflexive diffuse en plus chacun de ses tours sans attendre son verdict : `deliberation_judge` (ce que le juge voyait, ce qu'il conclut, la sonde qu'il décide) et `deliberation_probe` (la sonde lancée et ce qu'elle rapporte, ids compris). Sans eux, l'étape reste muette pendant plusieurs appels lourds.

Mêmes étapes et même point d'entrée que la Sandbox admin (`POST /console/retrieve`) : l'app client peut afficher l'avancée réelle du retrieving au lieu d'une barre qui invente sa progression.

Chaque ligne est un objet JSON complet, séparé par `\n` (`Content-Type: application/x-ndjson`).



## OpenAPI

````yaml /openapi.json post /v2/retrieve/stream
openapi: 3.1.0
info:
  title: Locus API
  description: >-
    Locus knowledge layer — REST + MCP for clinical knowledge.


    Two categories of surface:

    - **query** (read) — `/v1/search`, `/v1/answer`, `/v1/context` (legacy Meili
    contract serving AlmaPro) and `/v2/retrieve` (knowledge-graph retrieval, MKF
    0.1.3).

    - **ops** — `/health`.


    The write plane (PDF → Neo4j graph: ingest, summarize, MKU extraction) is
    NOT exposed over HTTP — it is a batch pipeline driven by the `locus` CLI,
    which runs where the source PDFs are.
  version: 0.2.0
servers:
  - url: https://core.locusmedical.fr
    description: Production
security: []
paths:
  /v2/retrieve/stream:
    post:
      tags:
        - query
      summary: GraphRAG retrieving diffusé étape par étape (NDJSON)
      description: >-
        Iso avec `/v2/retrieve`, mais diffusé au fil de l'eau : une ligne JSON
        par étape de la pipeline (`query_maker`, `retrieval`, `deliberation`,
        `answer`, `drugs`), puis une ligne terminale `done` portant la payload
        complète (le même corps que `/v2/retrieve`) ou `error`.


        Avec `deliberate=true`, la boucle réflexive diffuse en plus chacun de
        ses tours sans attendre son verdict : `deliberation_judge` (ce que le
        juge voyait, ce qu'il conclut, la sonde qu'il décide) et
        `deliberation_probe` (la sonde lancée et ce qu'elle rapporte, ids
        compris). Sans eux, l'étape reste muette pendant plusieurs appels
        lourds.


        Mêmes étapes et même point d'entrée que la Sandbox admin (`POST
        /console/retrieve`) : l'app client peut afficher l'avancée réelle du
        retrieving au lieu d'une barre qui invente sa progression.


        Chaque ligne est un objet JSON complet, séparé par `\n` (`Content-Type:
        application/x-ndjson`).
      operationId: retrieve_stream_endpoint_v2_retrieve_stream_post
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RetrieveRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema: {}
            application/x-ndjson:
              schema:
                type: string
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - lsk: []
components:
  schemas:
    RetrieveRequest:
      properties:
        query:
          type: string
          title: Query
        patient_ehr:
          anyOf:
            - type: string
            - type: 'null'
          title: Patient Ehr
          description: Dossier patient libre (EHR)
        history:
          items:
            $ref: '#/components/schemas/RetrieveTurn'
          type: array
          title: History
          description: >-
            Tours précédents, du plus ancien au plus récent. Sert UNIQUEMENT au
            query-maker, pour qualifier ce que le dernier message apporte : une
            nouvelle question, une précision, ou un fait patient. Les réponses
            antérieures ne sont jamais données au modèle de rédaction — elles
            n'ont pas de règle derrière elles et ne peuvent pas faire source.
        concept_k:
          type: integer
          maximum: 20
          minimum: 1
          title: Concept K
          default: 5
        chunk_k:
          type: integer
          maximum: 50
          minimum: 0
          title: Chunk K
          description: 0 = pas de chemin documentaire
          default: 10
        mku_k:
          type: integer
          maximum: 50
          minimum: 0
          title: Mku K
          description: Top-k MKU vectoriel ; 0 = pas de chemin MKU
          default: 12
        mku_weight:
          type: number
          maximum: 1
          minimum: 0
          title: Mku Weight
          description: >-
            Pondération hybride d'accès aux MKU : 0 = concepts seuls (un MKU
            n'est atteignable que par les termes de son propre verbatim), 1 =
            vecteurs seuls (sur l'embedding contextualisé doc+section), 0.5 =
            les deux. Défaut 0.75 : la config PROMUE par l'ajustement (run #50,
            hybrid·w0.75·x1·c10·m12·k5·t5). Voir REFERENCE_CONFIG.
          default: 0.75
        table_k:
          type: integer
          maximum: 20
          minimum: 0
          title: Table K
          description: Top-k tables de décision (vecteur) ; 0 = pas de tables directes
          default: 5
        deliberate:
          type: boolean
          title: Deliberate
          description: >-
            Seconde lecture : confronte les critères des règles au dossier, va
            chercher une définition manquante, et ne pose une question qu'en
            dernier recours. Hors du point de fonctionnement de référence —
            l'activer change le coût et n'est pas encore mesuré par les évals.
          default: false
        use_cross_refs:
          type: boolean
          title: Use Cross Refs
          description: >-
            Étendre le résultat aux MKU voisins par CROSS_REF (multi-hop, cap
            3). Défaut True : la config promue au run #50 les retient. Le run
            #39, sur un jeu plus étroit, les donnait perdants — d'où l'ancien
            défaut False.
          default: true
      type: object
      required:
        - query
      title: RetrieveRequest
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    RetrieveTurn:
      properties:
        question:
          type: string
          title: Question
          default: ''
        answer_short:
          type: string
          title: Answer Short
          description: La conduite tenue à ce tour, en une phrase.
          default: ''
      type: object
      title: RetrieveTurn
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
  securitySchemes:
    lsk:
      type: http
      description: Locus API key — paste the raw `lsk_…` value (no 'Bearer ' prefix).
      scheme: bearer

````