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

# logic

> POST /v2/logic/compute — exécuter une unité logique désignée, sans retrieving.

Un score, un arbre : une fois l'unité retrouvée, le praticien la **parcourt**.
Il coche une case, en coche une autre, choisit une branche. Chacun de ces gestes
est un calcul — une somme, une comparaison, un pas dans un graphe — et aucun
n'est une nouvelle question.

Cette route fait ce calcul, sur une unité qu'on **désigne** au lieu de la
chercher.

## Pourquoi ne pas rappeler `/v2/retrieve`

Deux raisons, et la seconde est la vraie.

**Le coût.** Additionner sept cases relançait le query-maker, l'embedding, les
deux chemins d'accès au graphe, l'expansion et la rédaction : 3 à 5 secondes
pour une somme que le moteur fait en microsecondes.

**Le déterminisme.** Un second appel à `/v2/retrieve` repasse par le
**classement**, et rien ne garantit qu'il retrouve l'unité qu'on est en train de
remplir. Le praticien coche la septième case d'un score et reçoit
l'interprétation d'un autre. Ici, l'unité est nommée par sa clé : ce cas
n'existe pas.

C'est le même partage qu'avec [`/v2/feedback`](/fr/capabilities/feedback) — un
geste qui arrive **après** la réponse, avec sa propre durée de vie, et qui n'a
pas à retraverser le pipeline qui l'a produite.

<Note>
  `/v2/retrieve` reste la route quand la **question** change. `/v2/logic/compute`
  est pour les tours intermédiaires d'un formulaire déjà ouvert.
</Note>

## Appeler

```bash theme={null}
curl -X POST https://core.locusmedical.fr/v2/logic/compute \
  -H "Authorization: Bearer $LOCUS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "mku_key": "score:cha2ds2vasc",
    "checked": ["Âge ≥ 75 ans", "Hypertension", "Diabète"]
  }'
```

| Champ                         | Ce que c'est                                                                                                                                                                                                    |
| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `mku_key`                     | L'unité, par sa clé lisible (`score:cha2ds2vasc`) **ou** par son `mku_id`. Les deux sont dans la payload de `/v2/retrieve` ; la clé survit à une ré-extraction, ce qui compte quand un formulaire reste ouvert. |
| `answers`                     | Score : `{intitulé de question: libellé de modalité}`. Arbre : `{id du nœud: condition choisie}`.                                                                                                               |
| `checked`                     | Score à cases : les libellés retenus.                                                                                                                                                                           |
| `level`                       | Échelle ordinale : le palier choisi (« NYHA II »).                                                                                                                                                              |
| `sources` · `exclude_sources` | La même restriction d'éditeurs que sur `/v2/retrieve`.                                                                                                                                                          |

Les trois champs de réponse sont **exactement** ceux de
`elicitations[].logic_answers` : un client qui tient déjà un formulaire ouvert
n'a rien à retraduire.

## Ce que ça rend

```json theme={null}
{
  "mku_id": "…",
  "mku_key": "score:cha2ds2vasc",
  "type": "score",
  "titre": "Score CHA₂DS₂-VASc",
  "computed": {
    "total": 4.0,
    "outcome": "Anticoagulation recommandée",
    "retained": [
      { "quoi": "Âge ≥ 75 ans", "points": 2.0 },
      { "quoi": "Hypertension", "points": 1.0 },
      { "quoi": "Diabète", "points": 1.0 }
    ],
    "reason": null
  }
}
```

`computed` est le **même objet** que `elicitations[].computed` de
`/v2/retrieve`, produit par le même code. Deux implémentations de la même
arithmétique auraient fini par diverger ; il n'y en a qu'une.

Pour un arbre, `computed` porte `outcome`, `path` (les libellés) et `path_ids`
(les identifiants, joignables dans le `graph` que `/v2/retrieve` a rendu).

<Note>
  `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 : un
  moteur sait le dire, là où un modèle produirait une classe plausible et
  inventée. De même, `reason: "décision requise"` sur un arbre veut dire qu'il
  reste une branche à choisir.
</Note>

Ce que la route ne rend pas : pas de rédaction, pas de sources, pas de
`trace_id`. Il n'y a pas de réponse écrite, donc rien sur quoi poser un pouce.

## Périmètre

La lecture est filtrée par source comme toutes les autres. L'invariant : **ce
que `/v2/retrieve` ne peut pas rendre, `/v2/logic/compute` ne peut pas
calculer.** Sans lui, la route serait un contournement du filtre pour qui devine
une clé.

## Erreurs

| Statut | Code                 | Signification                                                      |
| ------ | -------------------- | ------------------------------------------------------------------ |
| 400    | `UNKNOWN_SOURCE`     | Une source demandée n'existe pas.                                  |
| 404    | `UNKNOWN_LOGIC_UNIT` | Aucune unité logique ne porte cette clé dans le périmètre demandé. |
