# Musculation

## Créer une nouvelle session de traitement vidéo

> Cet endpoint permet à un \*\*administrateur\*\* (ou sous-admin) d'uploader un \*\*fichier vidéo\*\* pour traitement et de créer une nouvelle ressource "session" \*\*au nom d'un autre utilisateur\*\*. Le serveur renverra un \`session\_id\` qui peut être utilisé pour interroger ou récupérer les détails/résultats de la session.\
> \### Corps de la requête (Multipart/Form-Data)\
> Vous devez fournir les champs suivants :\
> \- \*\*user\_id\*\* \*(string, obligatoire)\* : L'ID de l'utilisateur pour lequel cette session est créée. - \*\*video\*\* \*(fichier, obligatoire)\* : Le fichier vidéo brut à traiter. - \*\*session\_name\*\* \*(string, optionnel)\* : Un nom/lisible pour la session. - \*\*exercise\_name\*\* \*(string, obligatoire)\* : Le nom de l'exercice. Choisissez parmi : 'snatch', 'clean', ou 'clean\_and\_jerk'. - \*\*barbell\_mass\*\* \*(string, optionnel)\* : La masse de la barre utilisée (chaîne numérique). Par défaut 100 kg (ou 220 lb) si non fournie. - \*\*body\_joint\_angles\*\* \*(array\[string], optionnel)\* : Liste séparée par des virgules de noms d'articulations (ex : 'elbow, knee, ankle'). Par défaut \['all'] si non fourni.\
> \### Structure de la réponse\
> En cas de succès (HTTP 200), la réponse est un objet JSON avec : - \*\*session\_id\*\* \*(string)\* : Un identifiant unique pour la session créée. - \*\*title\*\* \*(string)\* : Le titre de la session (par défaut si \`session\_name\` n'est pas fourni).\
> \### Workflow\
> 1\. \*\*POST\*\* une requête multipart/form-data avec les champs obligatoires \`user\_id\` et \`video\`, plus les champs optionnels. 2. Fournir un token API-KEY valide dans l'en-tête \`Authorization\`. 3. L'appelant doit avoir des privilèges admin pour créer une session pour un autre utilisateur. 4. Si réussi, le serveur répond avec \`session\_id\` et \`title\`. 5. En cas d'erreur (champs manquants, permissions insuffisantes), un objet JSON avec une clé \`error\` est retourné.\
> \#### Exemple cURL :\
> \`\`\`bash curl -X POST \\\
> &#x20;    -H 'Content-Type: multipart/form-data' \\\
> &#x20;    -H 'Authorization: API-KEY \<YOUR\_ADMIN\_TOKEN>' \\\
> &#x20;    -F 'user\_id=someUserId123' \\\
> &#x20;    -F 'video=@/path/to/video.mp4' \\\
> &#x20;    -F 'session\_name=Session Personnalisée' \\\
> &#x20;    -F 'exercise\_name=clean' \\\
> &#x20;    -F 'barbell\_mass=30' \\\
> &#x20;    -F 'body\_joint\_angles=elbow, knee, ankle' \\\
> &#x20;    https\://\<backend-link>/weightlifting/management/sessions/\
> \`\`\`<br>

````json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/":{"post":{"operationId":"weightlifting_sessions_create","summary":"Créer une nouvelle session de traitement vidéo","description":"Cet endpoint permet à un **administrateur** (ou sous-admin) d'uploader un **fichier vidéo** pour traitement et de créer une nouvelle ressource \"session\" **au nom d'un autre utilisateur**. Le serveur renverra un `session_id` qui peut être utilisé pour interroger ou récupérer les détails/résultats de la session.\n### Corps de la requête (Multipart/Form-Data)\nVous devez fournir les champs suivants :\n- **user_id** *(string, obligatoire)* : L'ID de l'utilisateur pour lequel cette session est créée. - **video** *(fichier, obligatoire)* : Le fichier vidéo brut à traiter. - **session_name** *(string, optionnel)* : Un nom/lisible pour la session. - **exercise_name** *(string, obligatoire)* : Le nom de l'exercice. Choisissez parmi : 'snatch', 'clean', ou 'clean_and_jerk'. - **barbell_mass** *(string, optionnel)* : La masse de la barre utilisée (chaîne numérique). Par défaut 100 kg (ou 220 lb) si non fournie. - **body_joint_angles** *(array[string], optionnel)* : Liste séparée par des virgules de noms d'articulations (ex : 'elbow, knee, ankle'). Par défaut ['all'] si non fourni.\n### Structure de la réponse\nEn cas de succès (HTTP 200), la réponse est un objet JSON avec : - **session_id** *(string)* : Un identifiant unique pour la session créée. - **title** *(string)* : Le titre de la session (par défaut si `session_name` n'est pas fourni).\n### Workflow\n1. **POST** une requête multipart/form-data avec les champs obligatoires `user_id` et `video`, plus les champs optionnels. 2. Fournir un token API-KEY valide dans l'en-tête `Authorization`. 3. L'appelant doit avoir des privilèges admin pour créer une session pour un autre utilisateur. 4. Si réussi, le serveur répond avec `session_id` et `title`. 5. En cas d'erreur (champs manquants, permissions insuffisantes), un objet JSON avec une clé `error` est retourné.\n#### Exemple cURL :\n```bash curl -X POST \\\n     -H 'Content-Type: multipart/form-data' \\\n     -H 'Authorization: API-KEY <YOUR_ADMIN_TOKEN>' \\\n     -F 'user_id=someUserId123' \\\n     -F 'video=@/path/to/video.mp4' \\\n     -F 'session_name=Session Personnalisée' \\\n     -F 'exercise_name=clean' \\\n     -F 'barbell_mass=30' \\\n     -F 'body_joint_angles=elbow, knee, ankle' \\\n     https://<backend-link>/weightlifting/management/sessions/\n```\n","responses":{"200":{"description":"Session de traitement vidéo créée avec succès (HTTP 200).","content":{"application/json":{"schema":{"required":["session_id","title"],"type":"object","properties":{"session_id":{"description":"L'identifiant unique de la session créée.","type":"string"},"title":{"description":"Le titre de la session (par défaut si non fourni).","type":"string"}}}}}},"400":{"description":"Requête incorrecte - Peut être dû à un `user_id` manquant, une `video` manquante, ou des données de formulaire invalides.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token d'accès manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant un token manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - L'utilisateur n'a pas la permission admin pour créer des sessions pour d'autres.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant des privilèges insuffisants.","type":"string"}}}}}},"404":{"description":"Non trouvé - Indique des problèmes de logique métier ou des limitations de ressources (ex : limite de sessions).\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur décrivant le problème.","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue est survenue.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé indiquant une erreur côté serveur.","type":"string"}}}}}}},"tags":["weightlifting"],"requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"user_id":{"type":"string","description":"**Obligatoire.** L'ID de l'utilisateur pour lequel cette session est créée (champ texte).\n"},"video":{"type":"string","description":"**Obligatoire.** Le fichier vidéo brut à traiter (type de champ : fichier).\n"},"session_name":{"type":"string","description":"**Optionnel.** Un nom descriptif pour la session (champ texte)."},"exercise_name":{"type":"string","description":"**Obligatoire.** Le nom de l'exercice. Choisissez parmi : 'snatch', 'clean', ou 'clean_and_jerk'.\n"},"barbell_mass":{"type":"string","description":"**Optionnel.** La masse de la barre utilisée (chaîne numérique). Par défaut 100 kg (ou 220 lb) si non fournie.\n"},"body_joint_angles":{"type":"array","description":"**Optionnel.** Liste séparée par des virgules de noms d'articulations. Valeurs disponibles : `'ankle'`, `'knee'`, `'elbow'`, `'hip'`, `'shoulder'`. Exemple : `ankle,knee,hip`\n"}},"required":["user_id","video","exercise_name"]}}}}}}}}
````

## Récupérer les détails d'une session d'haltérophilie

> Récupère les détails d'une session d'haltérophilie spécifiée par son \`session\_id\`. Les données retournées incluent les URLs des vidéos originale et analysée, le timestamp de création, le type d'exercice, les informations utilisateur, les métriques, les angles, les métriques de rapport et les timestamps.\
> \### Paramètre de chemin\
> \- \*\*session\_id\*\* \*(string, obligatoire)\* : L'identifiant unique de la session à récupérer.\
> \### Paramètre de requête\
> \- \*\*demo\*\* \*(boolean, optionnel)\* : Mettre à \`true\` pour récupérer une session démo pré-générée.\
> \### Structure de la réponse (HTTP 200)\
> En cas de succès, la réponse est un objet JSON avec : - \*\*analyzed\_video\_url\*\* \*(string, URI)\* : URL publique de la vidéo analysée. - \*\*video\_url\*\* \*(string, URI)\* : URL publique de la vidéo originale. - \*\*created\_at\*\* \*(object)\* : Un dictionnaire avec :\
> &#x20;   \- \*\*date\*\* \*(string)\* : Date de création au format \`DD/MM/YYYY\`.\
> &#x20;   \- \*\*time\*\* \*(string)\* : Heure de création au format \`HH:MM AM/PM\`.\
> \- \*\*exercise\*\* \*(string)\* : L'exercice effectué (ex : 'snatch'). - \*\*user\_name\*\* \*(string)\* : Le nom de l'utilisateur associé à la session. - \*\*activity\*\* \*(string)\* : Le type d'activité (doit être 'Weightlifting'). - \*\*title\*\* \*(string)\* : Le titre de la session. - \*\*metrics\*\* \*(object)\* : Dictionnaire de valeurs métriques numériques (ex : vitesse, puissance). - \*\*angles\*\* \*(object)\* : Dictionnaire où chaque clé correspond à un tableau de valeurs d'angles. - \*\*report\_metrics\*\* \*(object)\* : Dictionnaire de métriques spécifiques au rapport. - \*\*all\_timestamps\*\* \*(array\[number])\* : Tableau de timestamps pour les données de session.\
> \### Gestion des erreurs\
> \- \*\*400 Requête incorrecte\*\* : Paramètres invalides (ex : UID admin invalide). - \*\*401 Non autorisé\*\* : Token d'accès manquant ou invalide. - \*\*403 Interdit\*\* : Privilèges insuffisants. - \*\*404 Non trouvé\*\* : Session non trouvée ou activité non valide. - \*\*500 Erreur interne du serveur\*\* : Erreur inattendue.\
> \### Sécurité\
> Un token API-KEY valide doit être fourni dans l'en-tête \`Authorization\`.<br>

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/":{"get":{"operationId":"weightlifting_sessions_read","summary":"Récupérer les détails d'une session d'haltérophilie","description":"Récupère les détails d'une session d'haltérophilie spécifiée par son `session_id`. Les données retournées incluent les URLs des vidéos originale et analysée, le timestamp de création, le type d'exercice, les informations utilisateur, les métriques, les angles, les métriques de rapport et les timestamps.\n### Paramètre de chemin\n- **session_id** *(string, obligatoire)* : L'identifiant unique de la session à récupérer.\n### Paramètre de requête\n- **demo** *(boolean, optionnel)* : Mettre à `true` pour récupérer une session démo pré-générée.\n### Structure de la réponse (HTTP 200)\nEn cas de succès, la réponse est un objet JSON avec : - **analyzed_video_url** *(string, URI)* : URL publique de la vidéo analysée. - **video_url** *(string, URI)* : URL publique de la vidéo originale. - **created_at** *(object)* : Un dictionnaire avec :\n    - **date** *(string)* : Date de création au format `DD/MM/YYYY`.\n    - **time** *(string)* : Heure de création au format `HH:MM AM/PM`.\n- **exercise** *(string)* : L'exercice effectué (ex : 'snatch'). - **user_name** *(string)* : Le nom de l'utilisateur associé à la session. - **activity** *(string)* : Le type d'activité (doit être 'Weightlifting'). - **title** *(string)* : Le titre de la session. - **metrics** *(object)* : Dictionnaire de valeurs métriques numériques (ex : vitesse, puissance). - **angles** *(object)* : Dictionnaire où chaque clé correspond à un tableau de valeurs d'angles. - **report_metrics** *(object)* : Dictionnaire de métriques spécifiques au rapport. - **all_timestamps** *(array[number])* : Tableau de timestamps pour les données de session.\n### Gestion des erreurs\n- **400 Requête incorrecte** : Paramètres invalides (ex : UID admin invalide). - **401 Non autorisé** : Token d'accès manquant ou invalide. - **403 Interdit** : Privilèges insuffisants. - **404 Non trouvé** : Session non trouvée ou activité non valide. - **500 Erreur interne du serveur** : Erreur inattendue.\n### Sécurité\nUn token API-KEY valide doit être fourni dans l'en-tête `Authorization`.\n","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'identifiant unique de la session d'haltérophilie à récupérer.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Mettre à `true` pour récupérer une session démo pré-générée au lieu d'une réelle.\n","required":false}],"responses":{"200":{"description":"Détails de la session d'haltérophilie récupérés avec succès.","content":{"application/json":{"schema":{"required":["analyzed_video_url","video_url","created_at","exercise","user_name","activity","title","metrics","angles","report_metrics","all_timestamps"],"type":"object","properties":{"analyzed_video_url":{"description":"URL publique de la vidéo analysée.","type":"string","format":"uri"},"video_url":{"description":"URL publique de la vidéo originale.","type":"string","format":"uri"},"created_at":{"description":"Timestamp de création de la session.","required":["date","time"],"type":"object","properties":{"date":{"description":"Date au format DD/MM/YYYY.","type":"string"},"time":{"description":"Heure au format HH:MM AM/PM.","type":"string"}}},"exercise":{"description":"L'exercice effectué (ex : 'snatch').","type":"string"},"user_name":{"description":"Nom de l'utilisateur associé à la session.","type":"string"},"activity":{"description":"Type d'activité, attendu 'Weightlifting'.","type":"string"},"title":{"description":"Le titre de la session.","type":"string"},"metrics":{"description":"Dictionnaire de métriques numériques.","type":"object","additionalProperties":{"type":"number"}},"angles":{"description":"Dictionnaire de tableaux de valeurs d'angles.","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"report_metrics":{"description":"Dictionnaire de métriques de rapport.","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"all_timestamps":{"description":"Liste de timestamps correspondant aux données de session.","type":"array","items":{"type":"number"}}}}}}},"400":{"description":"Requête incorrecte - Paramètres ou UID admin invalides.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé pour requêtes invalides.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token d'accès manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Token manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - Privilèges insuffisants.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"L'utilisateur n'est pas autorisé à accéder à ces données.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session non trouvée ou activité invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée.","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue est survenue.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé indiquant une erreur côté serveur.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
```

## Exporter les données d'une session d'haltérophilie

> Récupère les données d'une session d'haltérophilie depuis Firestore, incluant les points clés, les angles et les timestamps. L'activité de la session doit être 'Weightlifting'.\
> \### Paramètre de chemin\
> \- \*\*session\_id\*\* \*(string, obligatoire)\* : L'identifiant unique de la session à exporter.\
> \### Paramètre de requête\
> \- \*\*demo\*\* \*(boolean, optionnel)\* : Mettre à \`true\` pour récupérer une session démo pré-générée.\
> \### Structure de la réponse (HTTP 200)\
> En cas de succès, la réponse est un objet JSON contenant : - \*\*keypoints\*\* \*(object)\* : Dictionnaire de points clés (ex : 'lknev', 'lknex'). - \*\*angles\*\* \*(object)\* : Dictionnaire de mesures d'angles (ex : 'lank\_angle'). - \*\*all\_timestamps\*\* \*(array\[number])\* : Tableau de timestamps pour les données. - \*\*metrics\*\* \*(object)\* : Dictionnaire de valeurs métriques numériques. - \*\*activity\*\* \*(string)\* : L'activité de la session (doit être 'Weightlifting').\
> \### Gestion des erreurs\
> \- \*\*400 Requête incorrecte\*\* : Paramètres invalides (ex : erreur UID admin). - \*\*401 Non autorisé\*\* : Token manquant ou invalide. - \*\*403 Interdit\*\* : Privilèges insuffisants. - \*\*404 Non trouvé\*\* : Session non trouvée ou activité invalide. - \*\*500 Erreur interne du serveur\*\* : Erreur inattendue.\
> \### Sécurité\
> Un token API-KEY valide doit être fourni dans l'en-tête \`Authorization\`.<br>

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/export/":{"get":{"operationId":"weightlifting_sessions_export_list","summary":"Exporter les données d'une session d'haltérophilie","description":"Récupère les données d'une session d'haltérophilie depuis Firestore, incluant les points clés, les angles et les timestamps. L'activité de la session doit être 'Weightlifting'.\n### Paramètre de chemin\n- **session_id** *(string, obligatoire)* : L'identifiant unique de la session à exporter.\n### Paramètre de requête\n- **demo** *(boolean, optionnel)* : Mettre à `true` pour récupérer une session démo pré-générée.\n### Structure de la réponse (HTTP 200)\nEn cas de succès, la réponse est un objet JSON contenant : - **keypoints** *(object)* : Dictionnaire de points clés (ex : 'lknev', 'lknex'). - **angles** *(object)* : Dictionnaire de mesures d'angles (ex : 'lank_angle'). - **all_timestamps** *(array[number])* : Tableau de timestamps pour les données. - **metrics** *(object)* : Dictionnaire de valeurs métriques numériques. - **activity** *(string)* : L'activité de la session (doit être 'Weightlifting').\n### Gestion des erreurs\n- **400 Requête incorrecte** : Paramètres invalides (ex : erreur UID admin). - **401 Non autorisé** : Token manquant ou invalide. - **403 Interdit** : Privilèges insuffisants. - **404 Non trouvé** : Session non trouvée ou activité invalide. - **500 Erreur interne du serveur** : Erreur inattendue.\n### Sécurité\nUn token API-KEY valide doit être fourni dans l'en-tête `Authorization`.\n","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"L'ID de la session pour exporter les données d'haltérophilie.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Mettre à `true` pour récupérer une session démo pré-générée au lieu d'une réelle.\n","required":false}],"responses":{"200":{"description":"Données de session d'haltérophilie récupérées avec succès.","content":{"application/json":{"schema":{"required":["keypoints","angles","all_timestamps","metrics","activity"],"type":"object","properties":{"keypoints":{"description":"Dictionnaire de points clés. Chaque clé correspond à un tableau de valeurs numériques.\n","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"angles":{"description":"Dictionnaire d'angles. Chaque clé correspond à un tableau de valeurs numériques.\n","type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"all_timestamps":{"description":"Tableau de timestamps (en secondes) pour les données de session.","type":"array","items":{"type":"number"}},"metrics":{"description":"Dictionnaire de métriques numériques. Chaque clé correspond à un nombre.","type":"object","additionalProperties":{"type":"number"}},"activity":{"description":"L'activité de la session (doit être 'Weightlifting').","type":"string"}}}}}},"400":{"description":"Requête incorrecte - Paramètres invalides ou erreur UID admin.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur décrivant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token manquant ou invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Token manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - Privilèges insuffisants.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"L'utilisateur n'est pas autorisé à accéder à ces données.","type":"string"}}}}}},"404":{"description":"Non trouvé - La session n'a pas été trouvée ou son activité n'est pas 'Weightlifting'.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée.","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue est survenue.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé indiquant une erreur côté serveur.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
```

## Analyser un mouvement d'haltérophilie

> Exécute une analyse biomécanique complète d'une session d'haltérophilie (\`snatch\`, \`clean\`, etc.).\
> \### Paramètre de chemin\
> \- \*\*session\_id\*\* \*(string, obligatoire)\* – ID unique de la session d'haltérophilie.\
> \### Paramètre de requête (Optionnel)\
> \- \*\*demo\*\* \*(boolean)\* – Mettre à \`true\` pour retourner une analyse de mouvement démo pré-générée.\
> \### Structure de la réponse (\`HTTP 200\`)\
> Retourne un rapport JSON contenant des métriques par section, par frame, des timings de phase et des infos utilisateur.\
> \`\`\`json {\
> &#x20; "exercise": "snatch",\
> &#x20; "key\_metrics": {\
> &#x20;   "power\_output":           \[ 2350, 2425, 2510, 2600, 2705 ],\
> &#x20;   "ground\_reaction\_force":  \[ 1120, 1180, 1215, 1260, 1300 ],\
> &#x20;   "barbell\_velocity":       \[ 0.90, 1.05, 1.28, 1.55, 2.02 ]\
> &#x20; },\
> &#x20; "body\_positioning": {\
> &#x20;   "hip\_velocity": \[ 0.45, 0.52, 0.60 ],\
> &#x20;   "shin\_angle":   \[ 75.0, 72.5, 70.2 ],\
> &#x20;   "hip\_height":   \[ 450, 455, 468 ],\
> &#x20;   "torso\_angle":  \[ 40.0, 38.5, 36.8 ]\
> &#x20; },\
> &#x20; "joint\_angles": {\
> &#x20;   "hip\_angle":  \[ 165, 159, 152 ],\
> &#x20;   "knee\_angle": \[ 155, 147, 138 ]\
> &#x20; },\
> &#x20; "barbell\_positioning": {\
> &#x20;   "bar\_height":              \[ 120, 385, 610 ],\
> &#x20;   "barbell\_trajectory":      \[ 0, -8, -2 ],\
> &#x20;   "vertical\_shoulder\_height":\[ 1380, 1400, 1440 ]\
> &#x20; },\
> &#x20; "phase\_data": {\
> &#x20;   "start\_of\_lifting":        { "image\_url": "<https://storage.googleapis.com>..." },\
> &#x20;   "first\_pull\_end":   { "image\_url": "<https://storage.googleapis.com>..." }\
> &#x20; },\
> &#x20; "chart\_data": {\
> &#x20;   "setup":       { "start": 0,    "end": 536 },\
> &#x20;   "first\_pull":  { "start": 536,  "end": 952 }\
> &#x20; },\
> &#x20; "user\_information": {\
> &#x20;   "display\_name": "Ahror Jabborov",\
> &#x20;   "age": 28,\
> &#x20;   "weight": 75,\
> &#x20;   "height": 178\
> &#x20; },\
> &#x20; "session\_date": "18/05/2025",\
> &#x20; "comments": {}\
> } \`\`\`\
> \### Codes d'erreur\
> \- \*\*400 Requête incorrecte\*\* – Paramètres invalides. - \*\*401 Non autorisé\*\* – Token manquant/invalide. - \*\*403 Interdit\*\* – Utilisateur sans abonnement valide. - \*\*404 Non trouvé\*\* – Session inexistante. - \*\*500 Erreur interne du serveur\*\* – Échec inattendu.\
> \### Sécurité\
> Requiert un token API-KEY valide dans l'en-tête \`Authorization\`.<br>

````json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/lift-analysis/":{"post":{"operationId":"weightlifting_sessions_lift-analysis_create","summary":"Analyser un mouvement d'haltérophilie","description":"Exécute une analyse biomécanique complète d'une session d'haltérophilie (`snatch`, `clean`, etc.).\n### Paramètre de chemin\n- **session_id** *(string, obligatoire)* – ID unique de la session d'haltérophilie.\n### Paramètre de requête (Optionnel)\n- **demo** *(boolean)* – Mettre à `true` pour retourner une analyse de mouvement démo pré-générée.\n### Structure de la réponse (`HTTP 200`)\nRetourne un rapport JSON contenant des métriques par section, par frame, des timings de phase et des infos utilisateur.\n```json {\n  \"exercise\": \"snatch\",\n  \"key_metrics\": {\n    \"power_output\":           [ 2350, 2425, 2510, 2600, 2705 ],\n    \"ground_reaction_force\":  [ 1120, 1180, 1215, 1260, 1300 ],\n    \"barbell_velocity\":       [ 0.90, 1.05, 1.28, 1.55, 2.02 ]\n  },\n  \"body_positioning\": {\n    \"hip_velocity\": [ 0.45, 0.52, 0.60 ],\n    \"shin_angle\":   [ 75.0, 72.5, 70.2 ],\n    \"hip_height\":   [ 450, 455, 468 ],\n    \"torso_angle\":  [ 40.0, 38.5, 36.8 ]\n  },\n  \"joint_angles\": {\n    \"hip_angle\":  [ 165, 159, 152 ],\n    \"knee_angle\": [ 155, 147, 138 ]\n  },\n  \"barbell_positioning\": {\n    \"bar_height\":              [ 120, 385, 610 ],\n    \"barbell_trajectory\":      [ 0, -8, -2 ],\n    \"vertical_shoulder_height\":[ 1380, 1400, 1440 ]\n  },\n  \"phase_data\": {\n    \"start_of_lifting\":        { \"image_url\": \"https://storage.googleapis.com...\" },\n    \"first_pull_end\":   { \"image_url\": \"https://storage.googleapis.com...\" }\n  },\n  \"chart_data\": {\n    \"setup\":       { \"start\": 0,    \"end\": 536 },\n    \"first_pull\":  { \"start\": 536,  \"end\": 952 }\n  },\n  \"user_information\": {\n    \"display_name\": \"Ahror Jabborov\",\n    \"age\": 28,\n    \"weight\": 75,\n    \"height\": 178\n  },\n  \"session_date\": \"18/05/2025\",\n  \"comments\": {}\n} ```\n### Codes d'erreur\n- **400 Requête incorrecte** – Paramètres invalides. - **401 Non autorisé** – Token manquant/invalide. - **403 Interdit** – Utilisateur sans abonnement valide. - **404 Non trouvé** – Session inexistante. - **500 Erreur interne du serveur** – Échec inattendu.\n### Sécurité\nRequiert un token API-KEY valide dans l'en-tête `Authorization`.\n","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"Identifiant de la session à analyser.","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"Mettre à `true` pour récupérer l'analyse de mouvement démo pré-générée au lieu d'une réelle.\n","required":false}],"responses":{"200":{"description":"Rapport d'analyse de mouvement généré avec succès.","content":{"application/json":{"schema":{"type":"object","properties":{"exercise":{"type":"string"},"key_metrics":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"body_positioning":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"joint_angles":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"barbell_positioning":{"type":"object","additionalProperties":{"type":"array","items":{"type":"number"}}},"phase_data":{"type":"object","additionalProperties":{"type":"object","properties":{"average_time_ms":{"type":"integer"}}}},"chart_data":{"type":"object","additionalProperties":{"type":"object","properties":{"start":{"type":"integer"},"end":{"type":"integer"}}}},"user_information":{"type":"object","additionalProperties":{"type":"string"}},"session_date":{"type":"string","format":"date"},"comments":{"type":"object"}}}}}},"400":{"description":"Requête incorrecte - Token ou paramètres invalides.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé décrivant la requête invalide.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token invalide ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que le token est manquant ou invalide.","type":"string"}}}}}},"403":{"description":"Interdit - Accès admin requis.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur indiquant que des privilèges admin sont requis.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session non trouvée ou utilisateur sans abonnement valide.\n","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur indiquant que la session n'a pas été trouvée ou que l'abonnement est invalide.\n","type":"string"}}}}}},"500":{"description":"Erreur interne du serveur - Une erreur inattendue est survenue.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé indiquant une erreur côté serveur.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
````

## Générer des fils de commentaires d'analyse pour une session d'haltérophilie

> \### Générer des fils de commentaires d'analyse\
> Crée un fil GenAI par métrique d'analyse (puissance, force, vitesse de la barre, angles articulaires, etc.) afin que l'assistant puisse retourner des commentaires concis de coaching pour chacune.\
> \*\*Exemple d'utilisation :\*\*\
> \`POST /weightlifting/sessions/{session\_id}/recommendation/\`\
> \*\*Paramètres :\*\*\
> \- \`session\_id\` \*(string, obligatoire)\* - Identifiant de la session à analyser.\
> \- \`measurement\_system\` \*(query, optionnel)\* - \`'metric'\` (par défaut) ou \`'imperial'\`; détermine les unités intégrées dans chaque prompt.\
> \*\*Structure de réponse :\*\*\
> Un objet JSON associant chaque métrique demandée à l'ID du fil GenAI créé.\
> \*\*Exemple de réponse :\*\*\
> \`\`\`json {\
> &#x20; "power\_output":           "thread\_a12b34",\
> &#x20; "ground\_reaction\_force":  "thread\_c56d78",\
> &#x20; "barbell\_velocity":       "thread\_e90f12",\
> &#x20; "hip\_velocity":           "thread\_g34h56",\
> &#x20; "shin\_angle":             "thread\_i78j90",\
> &#x20; "hip\_height":             "thread\_k12l34",\
> &#x20; "torso\_angle":            "thread\_m56n78",\
> &#x20; "hip\_angle":              "thread\_o90p12",\
> &#x20; "knee\_angle":             "thread\_q34r56",\
> &#x20; "bar\_height":             "thread\_s78t90",\
> &#x20; "barbell\_trajectory":     "thread\_u12v34",\
> &#x20; "vertical\_shoulder\_height":"thread\_w56x78"\
> } \`\`\`\
> \*\*Notes :\*\*\
> \- \`session\_id\` doit référencer une session existante. - L'appelant doit avoir les permissions appropriées (token valide & abonnement payant). - Utilisez les IDs de fil retournés pour récupérer ultérieurement les commentaires générés.

````json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/recommendation/":{"post":{"operationId":"weightlifting_sessions_recommendation_create","summary":"Générer des fils de commentaires d'analyse pour une session d'haltérophilie","description":"### Générer des fils de commentaires d'analyse\nCrée un fil GenAI par métrique d'analyse (puissance, force, vitesse de la barre, angles articulaires, etc.) afin que l'assistant puisse retourner des commentaires concis de coaching pour chacune.\n**Exemple d'utilisation :**\n`POST /weightlifting/sessions/{session_id}/recommendation/`\n**Paramètres :**\n- `session_id` *(string, obligatoire)* - Identifiant de la session à analyser.\n- `measurement_system` *(query, optionnel)* - `'metric'` (par défaut) ou `'imperial'`; détermine les unités intégrées dans chaque prompt.\n**Structure de réponse :**\nUn objet JSON associant chaque métrique demandée à l'ID du fil GenAI créé.\n**Exemple de réponse :**\n```json {\n  \"power_output\":           \"thread_a12b34\",\n  \"ground_reaction_force\":  \"thread_c56d78\",\n  \"barbell_velocity\":       \"thread_e90f12\",\n  \"hip_velocity\":           \"thread_g34h56\",\n  \"shin_angle\":             \"thread_i78j90\",\n  \"hip_height\":             \"thread_k12l34\",\n  \"torso_angle\":            \"thread_m56n78\",\n  \"hip_angle\":              \"thread_o90p12\",\n  \"knee_angle\":             \"thread_q34r56\",\n  \"bar_height\":             \"thread_s78t90\",\n  \"barbell_trajectory\":     \"thread_u12v34\",\n  \"vertical_shoulder_height\":\"thread_w56x78\"\n} ```\n**Notes :**\n- `session_id` doit référencer une session existante. - L'appelant doit avoir les permissions appropriées (token valide & abonnement payant). - Utilisez les IDs de fil retournés pour récupérer ultérieurement les commentaires générés.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"Identifiant unique de la session","required":true},{"schema":{"type":"string","enum":["metric","imperial"]},"name":"measurement_system","in":"query","description":"Système de mesure utilisé dans les prompts","required":false}],"responses":{"201":{"description":"Fils créés avec succès.","content":{"application/json":{"schema":{"description":"Dictionnaire associant les métriques aux IDs de fils.","required":["power_output","ground_reaction_force","barbell_velocity","hip_velocity","shin_angle","hip_height","torso_angle","hip_angle","knee_angle","bar_height","barbell_trajectory","vertical_shoulder_height"],"type":"object","properties":{"power_output":{"description":"ID de fil pour la puissance.","type":"string"},"ground_reaction_force":{"description":"ID de fil pour la force de réaction au sol.","type":"string"},"barbell_velocity":{"description":"ID de fil pour la vitesse de la barre.","type":"string"},"hip_velocity":{"description":"ID de fil pour la vitesse de hanche.","type":"string"},"shin_angle":{"description":"ID de fil pour l'angle du tibia.","type":"string"},"hip_height":{"description":"ID de fil pour la hauteur de hanche.","type":"string"},"torso_angle":{"description":"ID de fil pour l'angle du torse.","type":"string"},"hip_angle":{"description":"ID de fil pour l'angle de hanche.","type":"string"},"knee_angle":{"description":"ID de fil pour l'angle de genou.","type":"string"},"bar_height":{"description":"ID de fil pour la hauteur max de la barre.","type":"string"},"barbell_trajectory":{"description":"ID de fil pour la trajectoire de la barre.","type":"string"},"vertical_shoulder_height":{"description":"ID de fil pour la hauteur d'épaule.","type":"string"}}}}}},"400":{"description":"Requête invalide - Token ou paramètres incorrects.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token invalide ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur d'authentification.","type":"string"}}}}}},"403":{"description":"Interdit - Privilèges admin requis.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur de permissions.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session inexistante ou abonnement invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur.","type":"string"}}}}}},"500":{"description":"Erreur serveur interne.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur serveur.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
````

## Obtenir le résumé d'une session d'haltérophilie

> Récupère un résumé détaillé d'une session via son \`session\_id\`, combinant métriques quantitatives et commentaires GenAI optionnels.\
> \*\*Mode d'emploi :\*\* 1. Envoyez une requête \*\*GET\*\* avec le \`session\_id\` dans l'URL. 2. La réponse contient un objet JSON structuré (voir ci-dessous).\
> \*\*Paramètre de requête :\*\* - \*\*demo\*\* \*(booléen, optionnel)\* - À \`true\` pour un résumé de démo.\
> \*\*Structure de réponse :\*\* - \*\*summary\_text\*\* \*(object, optionnel)\* - Commentaires GenAI :\
> &#x20;   \- \*\*velocity\*\* - Analyse de vitesse.\
> &#x20;   \- \*\*power\*\* - Observations sur la puissance.\
> &#x20;   \- \*\*stability\*\* - Notes sur la stabilité.\
> &#x20;   \- \*\*final\_summary\*\* - Synthèse globale.\
> \
> \- \*\*exercise\_type\*\* \*(string)\* - Type d'exercice (ex: \*Snatch\*). - \*\*velocity\*\* \*(object)\* - Vitesse de barre (min/max/valeurs en m/s). - \*\*power\*\* \*(object)\* - Force (N) et puissance (W). - \*\*stability\*\* \*(object)\* - Durée, hauteur et trajectoire de barre. - \*\*user\_information\*\* \*(object)\* - Profil utilisateur. - \*\*session\_date\*\* \*(string)\* - Date de session (ex: \`07/04/2025\`).\
> \*\*Note :\*\* \`summary\_text\` n'apparaît qu'après génération des commentaires.

```json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/summary/":{"get":{"operationId":"weightlifting_sessions_summary_list","summary":"Obtenir le résumé d'une session d'haltérophilie","description":"Récupère un résumé détaillé d'une session via son `session_id`, combinant métriques quantitatives et commentaires GenAI optionnels.\n**Mode d'emploi :** 1. Envoyez une requête **GET** avec le `session_id` dans l'URL. 2. La réponse contient un objet JSON structuré (voir ci-dessous).\n**Paramètre de requête :** - **demo** *(booléen, optionnel)* - À `true` pour un résumé de démo.\n**Structure de réponse :** - **summary_text** *(object, optionnel)* - Commentaires GenAI :\n    - **velocity** - Analyse de vitesse.\n    - **power** - Observations sur la puissance.\n    - **stability** - Notes sur la stabilité.\n    - **final_summary** - Synthèse globale.\n\n- **exercise_type** *(string)* - Type d'exercice (ex: *Snatch*). - **velocity** *(object)* - Vitesse de barre (min/max/valeurs en m/s). - **power** *(object)* - Force (N) et puissance (W). - **stability** *(object)* - Durée, hauteur et trajectoire de barre. - **user_information** *(object)* - Profil utilisateur. - **session_date** *(string)* - Date de session (ex: `07/04/2025`).\n**Note :** `summary_text` n'apparaît qu'après génération des commentaires.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"Identifiant unique de la session","required":true},{"schema":{"type":"boolean"},"name":"demo","in":"query","description":"À `true` pour récupérer un résumé de démo pré-généré.","required":false}],"responses":{"200":{"description":"Résumé récupéré avec succès","content":{"application/json":{"schema":{"required":["exercise_type","velocity","power","stability","user_information","session_date"],"type":"object","properties":{"summary_text":{"description":"Commentaires GenAI optionnels.","type":"object","properties":{"velocity":{"description":"Analyse de performance de vitesse.","type":"string"},"power":{"description":"Analyse de production de puissance.","type":"string"},"stability":{"description":"Notes sur la stabilité de trajectoire.","type":"string"},"final_summary":{"description":"Remarques de coaching globales.","type":"string"}}},"exercise_type":{"description":"Type d'exercice effectué.","type":"string"},"velocity":{"type":"object","properties":{"bar_velocity":{"type":"object","properties":{"min":{"description":"Vitesse minimale (m/s).","type":"number"},"max":{"description":"Vitesse maximale (m/s).","type":"number"},"values":{"description":"Échantillons de vitesse (m/s).","type":"array","items":{"type":"number"}}}}}},"power":{"type":"object","properties":{"ground_reaction_force":{"type":"object","properties":{"min":{"description":"Force minimale (N).","type":"number"},"max":{"description":"Force maximale (N).","type":"number"},"values":{"description":"Échantillons de force (N).","type":"array","items":{"type":"number"}}}},"power":{"type":"object","properties":{"min":{"description":"Puissance minimale (W).","type":"number"},"max":{"description":"Puissance maximale (W).","type":"number"},"values":{"description":"Échantillons de puissance (W).","type":"array","items":{"type":"number"}}}}}},"stability":{"type":"object","properties":{"total_time":{"description":"Durée totale (s).","type":"number"},"bar_height":{"type":"object","properties":{"max":{"description":"Hauteur maximale (m).","type":"number"},"values":{"description":"Échantillons de hauteur (m).","type":"array","items":{"type":"number"}}}},"bar_trajectory":{"type":"object","properties":{"xAxis":{"description":"Trajectoire sur l'axe X (m).","type":"array","items":{"type":"number"}},"yAxis":{"description":"Trajectoire sur l'axe Y (m).","type":"array","items":{"type":"number"}}}}}},"user_information":{"description":"Profil utilisateur au moment de la session.","type":"object","properties":{"weight":{"description":"Poids (kg)","type":"number"},"height":{"description":"Taille (cm)","type":"number"},"age":{"description":"Âge","type":"string"},"gender":{"description":"Genre","type":"string"},"email":{"description":"Email","type":"string"},"display_name":{"description":"Nom d'affichage","type":"string"}}},"session_date":{"description":"Date de session (ex: '07/04/2025').","type":"string"}}}}}},"400":{"description":"Requête invalide - Paramètres incorrects.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token manquant ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur d'authentification.","type":"string"}}}}}},"403":{"description":"Interdit - Abonnement invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur d'abonnement.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session introuvable.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur.","type":"string"}}}}}},"500":{"description":"Erreur serveur interne.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur serveur.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
```

## Générer un résumé pour une session d'haltérophilie

> \### Générer des fils de résumé\
> Cet endpoint génère des fils de résumé pour une session donnée, basés sur des blocs prédéfinis et des métriques.\
> \*\*Exemple d'utilisation :\*\* Envoyez une requête \`POST\` à \`/weightlifting/sessions/{session\_id}/summary/\` où \`{session\_id}\` est l'identifiant unique de la session.\
> \*\*Paramètres :\*\* - \`session\_id\` \*(string, obligatoire)\*: L'identifiant unique de la session.\
> \*\*Structure de réponse :\*\* Un objet JSON associant chaque bloc à son ID de fil GenAI.\
> \*\*Exemple de réponse :\*\* \`\`\`json {\
> &#x20;   "velocity": "thread\_thread\_id",\
> &#x20;   "power": "thread\_thread\_id",\
> &#x20;   "stability": "thread\_thread\_id",\
> &#x20;   "final\_summary": "thread\_thread\_id",\
> } \`\`\`\
> \*\*Notes :\*\* - Vérifiez que le \`session\_id\` est valide. - L'utilisateur doit avoir les permissions nécessaires.

````json
{"openapi":"3.1.1","info":{"title":"API WEB AIKYNETIX","version":"v2"},"servers":[{"url":"https://api.aikynetix.app"}],"security":[{"Bearer":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"Bearer":{"type":"apiKey","name":"Authorization","in":"header","description":"Entrez votre token Bearer (authentification Firebase) au format : Bearer <token>"},"ApiKeyAuth":{"type":"apiKey","name":"API-KEY","in":"header","description":"Entrez votre clé API dans l'en-tête : API-KEY: <api_key>"}}},"paths":{"/weightlifting/sessions/{session_id}/summary/":{"post":{"operationId":"weightlifting_sessions_summary_create","summary":"Générer un résumé pour une session d'haltérophilie","description":"### Générer des fils de résumé\nCet endpoint génère des fils de résumé pour une session donnée, basés sur des blocs prédéfinis et des métriques.\n**Exemple d'utilisation :** Envoyez une requête `POST` à `/weightlifting/sessions/{session_id}/summary/` où `{session_id}` est l'identifiant unique de la session.\n**Paramètres :** - `session_id` *(string, obligatoire)*: L'identifiant unique de la session.\n**Structure de réponse :** Un objet JSON associant chaque bloc à son ID de fil GenAI.\n**Exemple de réponse :** ```json {\n    \"velocity\": \"thread_thread_id\",\n    \"power\": \"thread_thread_id\",\n    \"stability\": \"thread_thread_id\",\n    \"final_summary\": \"thread_thread_id\",\n} ```\n**Notes :** - Vérifiez que le `session_id` est valide. - L'utilisateur doit avoir les permissions nécessaires.","parameters":[{"schema":{"type":"string"},"name":"session_id","in":"path","description":"Identifiant unique de la session","required":true},{"schema":{"type":"string","enum":["metric","imperial"]},"name":"measurement_system","in":"query","description":"Système de mesure : 'metric' ou 'imperial'","required":false}],"responses":{"201":{"description":"Fils de résumé générés avec succès.","content":{"application/json":{"schema":{"type":"object","additionalProperties":{"description":"ID de fil pour un bloc de résumé","type":"string"}}}}},"400":{"description":"Requête invalide - Token ou paramètres incorrects.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur détaillé.","type":"string"}}}}}},"401":{"description":"Non autorisé - Token invalide ou expiré.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur d'authentification.","type":"string"}}}}}},"403":{"description":"Interdit - Privilèges admin requis.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Erreur de permissions.","type":"string"}}}}}},"404":{"description":"Non trouvé - Session inexistante ou abonnement invalide.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur.","type":"string"}}}}}},"500":{"description":"Erreur serveur interne.","content":{"application/json":{"schema":{"type":"object","properties":{"error":{"description":"Message d'erreur serveur.","type":"string"}}}}}}},"tags":["weightlifting"]}}}}
````


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.aikynetix.app/fr/api-documentation/developer-resources-and-api-reference/api-reference/weightlifting.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
