curl --request POST \
--url https://core.locusmedical.fr/v2/retrieve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "<string>",
"patient_ehr": "<string>",
"history": [
{
"question": "",
"answer_short": ""
}
],
"concept_k": 5,
"chunk_k": 10,
"mku_k": 12,
"mku_weight": 0.75,
"table_k": 5,
"deliberate": false,
"use_cross_refs": false,
"concept_mku_k": 60,
"cross_ref_hops": 1,
"cross_ref_seeds": 40,
"cross_ref_k": 400,
"app_version": "<string>",
"app_build": "<string>",
"app_platform": "<string>"
}
'import requests
url = "https://core.locusmedical.fr/v2/retrieve"
payload = {
"query": "<string>",
"patient_ehr": "<string>",
"history": [
{
"question": "",
"answer_short": ""
}
],
"concept_k": 5,
"chunk_k": 10,
"mku_k": 12,
"mku_weight": 0.75,
"table_k": 5,
"deliberate": False,
"use_cross_refs": False,
"concept_mku_k": 60,
"cross_ref_hops": 1,
"cross_ref_seeds": 40,
"cross_ref_k": 400,
"app_version": "<string>",
"app_build": "<string>",
"app_platform": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
patient_ehr: '<string>',
history: [{question: '', answer_short: ''}],
concept_k: 5,
chunk_k: 10,
mku_k: 12,
mku_weight: 0.75,
table_k: 5,
deliberate: false,
use_cross_refs: false,
concept_mku_k: 60,
cross_ref_hops: 1,
cross_ref_seeds: 40,
cross_ref_k: 400,
app_version: '<string>',
app_build: '<string>',
app_platform: '<string>'
})
};
fetch('https://core.locusmedical.fr/v2/retrieve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core.locusmedical.fr/v2/retrieve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => '<string>',
'patient_ehr' => '<string>',
'history' => [
[
'question' => '',
'answer_short' => ''
]
],
'concept_k' => 5,
'chunk_k' => 10,
'mku_k' => 12,
'mku_weight' => 0.75,
'table_k' => 5,
'deliberate' => false,
'use_cross_refs' => false,
'concept_mku_k' => 60,
'cross_ref_hops' => 1,
'cross_ref_seeds' => 40,
'cross_ref_k' => 400,
'app_version' => '<string>',
'app_build' => '<string>',
'app_platform' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://core.locusmedical.fr/v2/retrieve"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"patient_ehr\": \"<string>\",\n \"history\": [\n {\n \"question\": \"\",\n \"answer_short\": \"\"\n }\n ],\n \"concept_k\": 5,\n \"chunk_k\": 10,\n \"mku_k\": 12,\n \"mku_weight\": 0.75,\n \"table_k\": 5,\n \"deliberate\": false,\n \"use_cross_refs\": false,\n \"concept_mku_k\": 60,\n \"cross_ref_hops\": 1,\n \"cross_ref_seeds\": 40,\n \"cross_ref_k\": 400,\n \"app_version\": \"<string>\",\n \"app_build\": \"<string>\",\n \"app_platform\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://core.locusmedical.fr/v2/retrieve")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"patient_ehr\": \"<string>\",\n \"history\": [\n {\n \"question\": \"\",\n \"answer_short\": \"\"\n }\n ],\n \"concept_k\": 5,\n \"chunk_k\": 10,\n \"mku_k\": 12,\n \"mku_weight\": 0.75,\n \"table_k\": 5,\n \"deliberate\": false,\n \"use_cross_refs\": false,\n \"concept_mku_k\": 60,\n \"cross_ref_hops\": 1,\n \"cross_ref_seeds\": 40,\n \"cross_ref_k\": 400,\n \"app_version\": \"<string>\",\n \"app_build\": \"<string>\",\n \"app_platform\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.locusmedical.fr/v2/retrieve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"patient_ehr\": \"<string>\",\n \"history\": [\n {\n \"question\": \"\",\n \"answer_short\": \"\"\n }\n ],\n \"concept_k\": 5,\n \"chunk_k\": 10,\n \"mku_k\": 12,\n \"mku_weight\": 0.75,\n \"table_k\": 5,\n \"deliberate\": false,\n \"use_cross_refs\": false,\n \"concept_mku_k\": 60,\n \"cross_ref_hops\": 1,\n \"cross_ref_seeds\": 40,\n \"cross_ref_k\": 400,\n \"app_version\": \"<string>\",\n \"app_build\": \"<string>\",\n \"app_platform\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"query": "<string>",
"trace_id": "",
"core_version": "",
"reformulated": "",
"ehr_summary": "",
"turn_kind": "",
"ehr_additions": "",
"answer": "",
"answer_short": "",
"answer_format": "markdown",
"mkus": [
{
"id": "<string>",
"verbatim": "<string>",
"criteria": "",
"directive": "",
"mku_class": "<string>",
"population": [
"<string>"
],
"doc_id": "<string>",
"doc_title": "<string>",
"section_title": "<string>",
"score": 0,
"via": ""
}
],
"chunks": [
{
"id": "<string>",
"text": "<string>",
"score": 123,
"doc_id": "<string>",
"doc_title": "<string>",
"section_title": "<string>"
}
],
"tables": [
{
"id": "<string>",
"label": "",
"number": 123,
"caption": "",
"html": "",
"footnotes": "",
"score": 0,
"doc_id": "<string>",
"doc_title": "<string>",
"section_title": "<string>",
"via": "direct",
"matched_mkus": [
"<string>"
]
}
],
"docs": [
{
"id": "<string>",
"title": "<string>",
"year": 123,
"url": "<string>",
"summary": "<string>",
"reco_id": "<string>",
"source_id": "<string>",
"source_name": "<string>"
}
],
"drugs": [
{
"concept_id": "<string>",
"dci": "",
"aliases": [
"<string>"
],
"atc": [
"<string>"
],
"via": "mku",
"mentions": [
"<string>"
],
"from_mku_ids": [
"<string>"
],
"reference": {
"cis": "<string>",
"label": "",
"forme": "<string>",
"voie": "<string>",
"salt": "<string>",
"dosage": "<string>",
"dosage_source": "<string>",
"molecules_associees": [
"<string>"
],
"atc": [
"<string>"
],
"n_rubrics": 0,
"rubrics": [
{
"id": "<string>",
"code": "",
"label": "",
"text": "",
"truncated": false
}
],
"unavailable_reason": "<string>"
},
"others": [
{
"cis": "<string>",
"label": "",
"forme": "<string>",
"voie": "<string>",
"salt": "<string>",
"dosage": "<string>",
"dosage_source": "<string>",
"molecules_associees": [
"<string>"
],
"atc": [
"<string>"
],
"n_rubrics": 0,
"rubrics": [
{
"id": "<string>",
"code": "",
"label": "",
"text": "",
"truncated": false
}
],
"unavailable_reason": "<string>"
}
],
"others_total": 0
}
],
"cross_refs": [
{
"id1": "<string>",
"id2": "<string>",
"polarity": "<string>"
}
],
"concepts": [
{
"id": "<string>",
"label": "<string>"
}
],
"deliberation": {
"sufficient": false,
"checks": [
{
"mku_id": "",
"criterion": "",
"status": "",
"evidence": "",
"blocking": false
}
],
"gaps": [
{
"what": "",
"why": ""
}
],
"rounds": [
{
"index": 0,
"modality": "",
"query": "",
"seeds": [
"<string>"
],
"rationale": "",
"gained": {},
"gained_ids": {}
}
],
"judgements": [
{
"index": 0,
"sufficient": false,
"saw": {},
"checks": [
{
"mku_id": "",
"criterion": "",
"status": "",
"evidence": "",
"blocking": false
}
],
"gaps": [
{
"what": "",
"why": ""
}
],
"probe": {
"modality": "",
"query": "",
"seeds": [
"<string>"
],
"rationale": ""
},
"asked": false
}
],
"define_queries": [
"<string>"
],
"passes": 0,
"clarification": {
"question": "",
"why": "",
"criterion": "",
"options": [
{
"label": "<string>",
"value": "<string>"
}
]
}
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}GraphRAG retrieving (MKF 0.1.3, LangGraph 2-paths)
Query maker → (semantic ‖ concept+graph) → context → frontier answer. No judge, no safety sweep. Traced in LangSmith.
answer is Markdown. Content negotiation on Accept:
application/json(default) — full payload, answer + provenance;text/markdown— answer and provenance as one Markdown document;text/html— the same, rendered as a readable page.
curl --request POST \
--url https://core.locusmedical.fr/v2/retrieve \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"query": "<string>",
"patient_ehr": "<string>",
"history": [
{
"question": "",
"answer_short": ""
}
],
"concept_k": 5,
"chunk_k": 10,
"mku_k": 12,
"mku_weight": 0.75,
"table_k": 5,
"deliberate": false,
"use_cross_refs": false,
"concept_mku_k": 60,
"cross_ref_hops": 1,
"cross_ref_seeds": 40,
"cross_ref_k": 400,
"app_version": "<string>",
"app_build": "<string>",
"app_platform": "<string>"
}
'import requests
url = "https://core.locusmedical.fr/v2/retrieve"
payload = {
"query": "<string>",
"patient_ehr": "<string>",
"history": [
{
"question": "",
"answer_short": ""
}
],
"concept_k": 5,
"chunk_k": 10,
"mku_k": 12,
"mku_weight": 0.75,
"table_k": 5,
"deliberate": False,
"use_cross_refs": False,
"concept_mku_k": 60,
"cross_ref_hops": 1,
"cross_ref_seeds": 40,
"cross_ref_k": 400,
"app_version": "<string>",
"app_build": "<string>",
"app_platform": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
query: '<string>',
patient_ehr: '<string>',
history: [{question: '', answer_short: ''}],
concept_k: 5,
chunk_k: 10,
mku_k: 12,
mku_weight: 0.75,
table_k: 5,
deliberate: false,
use_cross_refs: false,
concept_mku_k: 60,
cross_ref_hops: 1,
cross_ref_seeds: 40,
cross_ref_k: 400,
app_version: '<string>',
app_build: '<string>',
app_platform: '<string>'
})
};
fetch('https://core.locusmedical.fr/v2/retrieve', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://core.locusmedical.fr/v2/retrieve",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'query' => '<string>',
'patient_ehr' => '<string>',
'history' => [
[
'question' => '',
'answer_short' => ''
]
],
'concept_k' => 5,
'chunk_k' => 10,
'mku_k' => 12,
'mku_weight' => 0.75,
'table_k' => 5,
'deliberate' => false,
'use_cross_refs' => false,
'concept_mku_k' => 60,
'cross_ref_hops' => 1,
'cross_ref_seeds' => 40,
'cross_ref_k' => 400,
'app_version' => '<string>',
'app_build' => '<string>',
'app_platform' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://core.locusmedical.fr/v2/retrieve"
payload := strings.NewReader("{\n \"query\": \"<string>\",\n \"patient_ehr\": \"<string>\",\n \"history\": [\n {\n \"question\": \"\",\n \"answer_short\": \"\"\n }\n ],\n \"concept_k\": 5,\n \"chunk_k\": 10,\n \"mku_k\": 12,\n \"mku_weight\": 0.75,\n \"table_k\": 5,\n \"deliberate\": false,\n \"use_cross_refs\": false,\n \"concept_mku_k\": 60,\n \"cross_ref_hops\": 1,\n \"cross_ref_seeds\": 40,\n \"cross_ref_k\": 400,\n \"app_version\": \"<string>\",\n \"app_build\": \"<string>\",\n \"app_platform\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://core.locusmedical.fr/v2/retrieve")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"query\": \"<string>\",\n \"patient_ehr\": \"<string>\",\n \"history\": [\n {\n \"question\": \"\",\n \"answer_short\": \"\"\n }\n ],\n \"concept_k\": 5,\n \"chunk_k\": 10,\n \"mku_k\": 12,\n \"mku_weight\": 0.75,\n \"table_k\": 5,\n \"deliberate\": false,\n \"use_cross_refs\": false,\n \"concept_mku_k\": 60,\n \"cross_ref_hops\": 1,\n \"cross_ref_seeds\": 40,\n \"cross_ref_k\": 400,\n \"app_version\": \"<string>\",\n \"app_build\": \"<string>\",\n \"app_platform\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://core.locusmedical.fr/v2/retrieve")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"query\": \"<string>\",\n \"patient_ehr\": \"<string>\",\n \"history\": [\n {\n \"question\": \"\",\n \"answer_short\": \"\"\n }\n ],\n \"concept_k\": 5,\n \"chunk_k\": 10,\n \"mku_k\": 12,\n \"mku_weight\": 0.75,\n \"table_k\": 5,\n \"deliberate\": false,\n \"use_cross_refs\": false,\n \"concept_mku_k\": 60,\n \"cross_ref_hops\": 1,\n \"cross_ref_seeds\": 40,\n \"cross_ref_k\": 400,\n \"app_version\": \"<string>\",\n \"app_build\": \"<string>\",\n \"app_platform\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"query": "<string>",
"trace_id": "",
"core_version": "",
"reformulated": "",
"ehr_summary": "",
"turn_kind": "",
"ehr_additions": "",
"answer": "",
"answer_short": "",
"answer_format": "markdown",
"mkus": [
{
"id": "<string>",
"verbatim": "<string>",
"criteria": "",
"directive": "",
"mku_class": "<string>",
"population": [
"<string>"
],
"doc_id": "<string>",
"doc_title": "<string>",
"section_title": "<string>",
"score": 0,
"via": ""
}
],
"chunks": [
{
"id": "<string>",
"text": "<string>",
"score": 123,
"doc_id": "<string>",
"doc_title": "<string>",
"section_title": "<string>"
}
],
"tables": [
{
"id": "<string>",
"label": "",
"number": 123,
"caption": "",
"html": "",
"footnotes": "",
"score": 0,
"doc_id": "<string>",
"doc_title": "<string>",
"section_title": "<string>",
"via": "direct",
"matched_mkus": [
"<string>"
]
}
],
"docs": [
{
"id": "<string>",
"title": "<string>",
"year": 123,
"url": "<string>",
"summary": "<string>",
"reco_id": "<string>",
"source_id": "<string>",
"source_name": "<string>"
}
],
"drugs": [
{
"concept_id": "<string>",
"dci": "",
"aliases": [
"<string>"
],
"atc": [
"<string>"
],
"via": "mku",
"mentions": [
"<string>"
],
"from_mku_ids": [
"<string>"
],
"reference": {
"cis": "<string>",
"label": "",
"forme": "<string>",
"voie": "<string>",
"salt": "<string>",
"dosage": "<string>",
"dosage_source": "<string>",
"molecules_associees": [
"<string>"
],
"atc": [
"<string>"
],
"n_rubrics": 0,
"rubrics": [
{
"id": "<string>",
"code": "",
"label": "",
"text": "",
"truncated": false
}
],
"unavailable_reason": "<string>"
},
"others": [
{
"cis": "<string>",
"label": "",
"forme": "<string>",
"voie": "<string>",
"salt": "<string>",
"dosage": "<string>",
"dosage_source": "<string>",
"molecules_associees": [
"<string>"
],
"atc": [
"<string>"
],
"n_rubrics": 0,
"rubrics": [
{
"id": "<string>",
"code": "",
"label": "",
"text": "",
"truncated": false
}
],
"unavailable_reason": "<string>"
}
],
"others_total": 0
}
],
"cross_refs": [
{
"id1": "<string>",
"id2": "<string>",
"polarity": "<string>"
}
],
"concepts": [
{
"id": "<string>",
"label": "<string>"
}
],
"deliberation": {
"sufficient": false,
"checks": [
{
"mku_id": "",
"criterion": "",
"status": "",
"evidence": "",
"blocking": false
}
],
"gaps": [
{
"what": "",
"why": ""
}
],
"rounds": [
{
"index": 0,
"modality": "",
"query": "",
"seeds": [
"<string>"
],
"rationale": "",
"gained": {},
"gained_ids": {}
}
],
"judgements": [
{
"index": 0,
"sufficient": false,
"saw": {},
"checks": [
{
"mku_id": "",
"criterion": "",
"status": "",
"evidence": "",
"blocking": false
}
],
"gaps": [
{
"what": "",
"why": ""
}
],
"probe": {
"modality": "",
"query": "",
"seeds": [
"<string>"
],
"rationale": ""
},
"asked": false
}
],
"define_queries": [
"<string>"
],
"passes": 0,
"clarification": {
"question": "",
"why": "",
"criterion": "",
"options": [
{
"label": "<string>",
"value": "<string>"
}
]
}
}
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Authorizations
Locus API key — paste the raw lsk_… value (no 'Bearer ' prefix).
Headers
Body
Dossier patient libre (EHR)
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.
Show child attributes
Show child attributes
1 <= x <= 200 = pas de chemin documentaire
0 <= x <= 50Top-k MKU vectoriel ; 0 = pas de chemin MKU
0 <= x <= 50Pondé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.
0 <= x <= 1Top-k tables de décision (vecteur) ; 0 = pas de tables directes
0 <= x <= 20Seconde 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.
Étendre le résultat aux MKU voisins par CROSS_REF. Défaut False : les arêtes du corpus portent trop de liens superflus et d'erreurs pour qu'on serve ce signal (2 septembre 2026). Passer à true réactive l'expansion — utile pour mesurer ce que la coupure coûte une fois la passe de cross-ref assainie.
Top-k MKU du chemin CONCEPTUEL, classés par nombre de concepts touchés.
1 <= x <= 400Profondeur du voisinage CROSS_REF. Coût EXPONENTIEL : l'expansion énumère des chemins. 3 était le défaut servi, et c'est lui qui a bloqué la prod quand le graphe a grossi.
1 <= x <= 3MKU primaires (les mieux classés) semant l'expansion CROSS_REF.
1 <= x <= 200Arêtes CROSS_REF rendues au plus ; celles entre primaires d'abord.
1 <= x <= 2000Version publiée de l'app appelante (p.ex. 1.4.2).
64Le build EXACT : SHA git court sur le web, numéro de build natif sur iOS/Android. C'est lui qui distingue deux binaires d'une même version publiée — sans lui, 1.4.2 désigne plusieurs binaires et un bug n'est pas rejouable.
64web | ios | android.
32Response
Successful Response
L'identifiant de CETTE réponse, frappé par le serveur avant de la rendre. C'est la clé à renvoyer à POST /v2/feedback pour attacher un retour utilisateur — sans lui, un pouce levé ne désigne rien.
Vide quand la journalisation des traces est coupée (LOCUS_TRACES_ENABLED=false) : le client doit alors simplement ne pas proposer le retour, plutôt que de poster dans le vide.
La version du core qui a produit cette réponse, lisible : 0.2.0+a1b2c3d (r:4f9e2b71) — version applicative, commit déployé, empreinte du chemin de lecture. Rendue AUSSI dans la payload (et pas seulement écrite en base) pour qu'un client puisse l'afficher dans un rapport de bug sans avoir à interroger /health.
nouvelle_question | precision_question | fait_patient
Le fait clinique nouveau apporté par ce tour. À APPENDRE au dossier côté client : c'est là qu'il sera confronté aux critères des règles. Un fait resté dans la question ne change aucune recommandation.
Réponse rédigée, en Markdown (titres, listes, tableaux, citations). En JSON les sauts de ligne sont échappés en \n : lire avec jq -r '.answer', ou demander Accept: text/markdown pour recevoir le Markdown brut, ou Accept: text/html pour une page lisible.
La conduite à tenir en une phrase, DÉRIVÉE de answer (son titre de niveau 1). Champ de confort : answer reste le Markdown complet, titre compris, donc rien ne casse pour un client qui l'ignore.
Format de answer. Déclaré pour qu'un client sache le rendre.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Documents mobilisés, dédupliqués — métadonnées et lien profond.
Show child attributes
Show child attributes
Médicaments rattachés aux règles citées — lane SÉPARÉE des MKU (contrat C4) : une rubrique de RCP n'est jamais promue en unité citable, et n'entre pas dans le contexte de rédaction.
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Présent uniquement si deliberate était demandé.
Show child attributes
Show child attributes