> ## 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.

# Exécuter une unité logique désignée, sans retrieving

> Applique le moteur déterministe (somme, comparaison, parcours de graphe) à une unité logique qu'on DÉSIGNE par sa clé, au lieu de la chercher.

À utiliser pour tous les tours intermédiaires d'un formulaire ouvert : cocher une case, choisir une branche, changer un niveau. `/v2/retrieve` reste la route quand la QUESTION change.

Deux propriétés que le second tour de `/v2/retrieve` ne peut pas offrir :

- **déterminisme** — l'unité est désignée, pas classée : impossible de recevoir l'interprétation d'un autre score que celui qu'on remplit ;
- **coût** — une lecture de nœud, aucun appel de modèle.

`computed` est le même objet que `elicitations[].computed`, produit par le même code. Un `outcome: null` avec un `reason` rempli est une réponse, pas une panne : « la source ne donne aucune interprétation pour ce total » est une information clinique.

`404` quand aucune unité logique ne porte cette clé dans le périmètre de sources demandé. `400` sur une source inconnue.



## OpenAPI

````yaml /openapi.json post /v2/logic/compute
openapi: 3.1.0
info:
  title: Locus API
  description: >-
    Locus knowledge layer — REST over a clinical knowledge graph.


    Two categories of surface:

    - **query** (read) — `/v2/retrieve` and `/v2/retrieve/stream`
    (knowledge-graph retrieval, MKF 0.1.3), `/v2/drugs/*` (the full text of an
    SmPC section a retrieval truncated) and `/v2/feedback` (a thumb on a traced
    answer);

    - **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.5.0
servers:
  - url: https://core.locusmedical.fr
    description: Production
security: []
paths:
  /v2/logic/compute:
    post:
      tags:
        - query
      summary: Exécuter une unité logique désignée, sans retrieving
      description: >-
        Applique le moteur déterministe (somme, comparaison, parcours de graphe)
        à une unité logique qu'on DÉSIGNE par sa clé, au lieu de la chercher.


        À utiliser pour tous les tours intermédiaires d'un formulaire ouvert :
        cocher une case, choisir une branche, changer un niveau. `/v2/retrieve`
        reste la route quand la QUESTION change.


        Deux propriétés que le second tour de `/v2/retrieve` ne peut pas offrir
        :


        - **déterminisme** — l'unité est désignée, pas classée : impossible de
        recevoir l'interprétation d'un autre score que celui qu'on remplit ;

        - **coût** — une lecture de nœud, aucun appel de modèle.


        `computed` est le même objet que `elicitations[].computed`, produit par
        le même code. Un `outcome: null` avec un `reason` rempli est une
        réponse, pas une panne : « la source ne donne aucune interprétation pour
        ce total » est une information clinique.


        `404` quand aucune unité logique ne porte cette clé dans le périmètre de
        sources demandé. `400` sur une source inconnue.
      operationId: compute_endpoint_v2_logic_compute_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/LogicComputeRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/LogicComputeResponse'
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
      security:
        - lsk: []
components:
  schemas:
    LogicComputeRequest:
      properties:
        mku_key:
          type: string
          title: Mku Key
          description: >-
            L'unité à exécuter, par sa clé LISIBLE (« score:cha2ds2vasc ») ou
            par son `mku_id`. Les deux sont acceptés parce que les deux sont
            dans la payload de `/v2/retrieve` ; la clé survit à une
            ré-extraction, ce qui compte quand un formulaire reste ouvert.
        answers:
          additionalProperties:
            type: string
          type: object
          title: Answers
          description: >-
            Score : {intitulé de question: libellé de modalité}. Arbre : {id du
            nœud de décision: condition choisie}.


            Exactement la forme de `logic_answers[].answers` — un client qui
            tient déjà un formulaire ouvert n'a rien à retraduire.
        checked:
          items:
            type: string
          type: array
          title: Checked
          description: 'Score à cases : les libellés retenus.'
        level:
          anyOf:
            - type: string
            - type: 'null'
          title: Level
          description: 'Échelle ordinale : le niveau choisi (« NYHA II »).'
        sources:
          items:
            type: string
          type: array
          title: Sources
          description: Restriction d'éditeurs, comme sur `/v2/retrieve`. Vide = tous.
        exclude_sources:
          items:
            type: string
          type: array
          title: Exclude Sources
          description: Éditeurs exclus, comme sur `/v2/retrieve`.
      type: object
      required:
        - mku_key
      title: LogicComputeRequest
    LogicComputeResponse:
      properties:
        mku_id:
          type: string
          title: Mku Id
        mku_key:
          type: string
          title: Mku Key
          default: ''
        type:
          type: string
          title: Type
          description: score | tree
        titre:
          type: string
          title: Titre
          default: ''
        url:
          anyOf:
            - type: string
            - type: 'null'
          title: Url
        d_apres:
          anyOf:
            - type: string
            - type: 'null'
          title: D Apres
        computed:
          $ref: '#/components/schemas/RetrieveComputed'
          description: >-
            Le résultat du moteur — le MÊME objet que `elicitations[].computed`
            de `/v2/retrieve`, produit par le même code. `outcome: null` avec un
            `reason` rempli n'est pas une panne : « la source ne donne aucune
            interprétation pour ce total » est une information clinique.
        note:
          anyOf:
            - type: string
            - type: 'null'
          title: Note
          description: >-
            Pourquoi cette unité n'est pas exécutable (formule non extraite,
            sous-scores…).
      type: object
      required:
        - mku_id
        - type
        - computed
      title: LogicComputeResponse
      description: |-
        L'unité identifiée et ce que le moteur en a fait. Rien d'autre.

        Pas de `trace_id` : rien n'est tracé, parce qu'il n'y a pas de réponse
        rédigée sur laquelle un utilisateur pourrait se prononcer.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    RetrieveComputed:
      properties:
        total:
          anyOf:
            - type: number
            - type: 'null'
          title: Total
        outcome:
          anyOf:
            - type: string
            - type: 'null'
          title: Outcome
          description: >-
            La conduite conclue. Arbre : le libellé ENTIER du nœud terminal,
            sauts de ligne compris — les auteurs y posent une liste, et la
            tronquer perdrait la moitié de la conduite. `path`, lui, ne porte
            que les têtes de ligne : les deux ne se lisent donc pas pareil, et
            c'est voulu.
        outcome_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Outcome Id
          description: >-
            Arbre : l'identifiant du nœud conclu, joignable dans `graph.nodes`.
            Sans lui, la conclusion était la seule pièce du parcours qu'on ne
            pouvait pas resituer dans le graphe.
        description:
          anyOf:
            - type: string
            - type: 'null'
          title: Description
          description: 'Échelle : le libellé du niveau.'
        path:
          items:
            type: string
          type: array
          title: Path
          description: 'Arbre : le chemin parcouru, en LIBELLÉS.'
        path_ids:
          items:
            type: string
          type: array
          title: Path Ids
          description: >-
            Arbre : le même chemin, en identifiants de nœuds — joignables dans
            `graph.nodes`. Le moteur descend seul les pas forcés, donc ce chemin
            cite des nœuds qui ne sont pas des `steps` ; sans leurs
            identifiants, un client ne pouvait pas les situer.
        retained:
          items:
            additionalProperties: true
            type: object
          type: array
          title: Retained
          description: 'Score : le détail du total.'
        reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Reason
          description: Pourquoi le moteur ne conclut pas.
      type: object
      title: RetrieveComputed
      description: >-
        Ce que le MOTEUR a calculé — jamais ce qu'un modèle a estimé.


        `reason` est rempli quand il ne conclut PAS, et c'est le point : « la
        source

        ne donne aucune interprétation pour ce total » est une information
        clinique,

        pas une panne. Un modèle, lui, aurait produit une classe plausible.
    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

````