{"service":"haiko-llm — synthese et analyse de documents (Qwen3.5 9B)","version":"1.2","modele":"qwen3.5:9b","langue_reponse":"francais par defaut ; demander explicitement une autre langue dans le champ 'prompt' pour en changer","authentification":{"type":"token statique","entetes_acceptes":["Authorization: Bearer <TOKEN>","X-API-Key: <TOKEN>"],"obtenir_le_token":"aupres de l'operateur du service — il n'est pas distribue ici","sans_token":"401 sur toutes les routes sauf GET / et GET /ping"},"endpoints":[{"methode":"POST","chemin":"/prompt","token":true,"usage":"analyser du texte deja extrait — le plus simple pour un agent","content_type":"application/json","corps":{"prompt":"consigne (optionnel, defaut = synthese structuree)","text":"le texte a analyser (obligatoire, non vide)"},"reponse":{"synthese":"string","modele":"string","extraits_traites":"int"},"ecrit_sur_disque":false,"exemple":"curl -X POST $BASE/prompt -H \"Authorization: Bearer $TOKEN\" -H 'Content-Type: application/json' -d '{\"prompt\":\"Resume en 3 puces\",\"text\":\"...\"}'"},{"methode":"POST","chemin":"/synthese","token":true,"usage":"envoyer de vrais fichiers ; l'extraction du texte est faite par le service","content_type":"multipart/form-data","champs":{"files":"fichier, repetable, OBLIGATOIRE (au moins un, sinon 422)","prompt":"consigne (optionnel)","conserver":"bool, defaut true — mettre false pour ne rien archiver sur disque"},"formats_acceptes":["pdf","docx","pptx","xlsx","html","csv","txt","md"],"reponse":{"synthese":"string","modele":"string","extraits_traites":"int","fichiers":"[{fichier, octets, caracteres}]","sortie":"chemin du .md sauvegarde cote serveur","sources_conservees":"chemin, ou null si conserver=false"},"ecrit_sur_disque":true,"exemple":"curl -X POST $BASE/synthese -H \"Authorization: Bearer $TOKEN\" -F 'files=@rapport.pdf' -F 'prompt=Synthese en 10 puces' -F 'conserver=false'"},{"methode":"GET","chemin":"/health","token":true,"usage":"etat du service, modele charge, fenetre de contexte"},{"methode":"GET","chemin":"/ping","token":false,"usage":"joignabilite seule, renvoie {\"ok\": true}"},{"methode":"GET","chemin":"/","token":false,"usage":"ce document"},{"methode":"GET","chemin":"/docs","token":false,"usage":"interface Swagger interactive"},{"methode":"GET","chemin":"/openapi.json","token":false,"usage":"schema OpenAPI brut"}],"pieges":["Si tu demandes du JSON dans 'prompt', la reponse du modele arrive comme une CHAINE dans le champ 'synthese' : il faut un second json.loads() sur ce champ.","Un petit modele peut emballer sa reponse dans des balises ```json — retirer les delimiteurs avant de parser.","Les schemas de reponse de /prompt et /synthese different : /prompt ne renvoie ni 'fichiers', ni 'sortie', ni 'sources_conservees'.","temperature=0.3 : deux appels identiques peuvent donner des valeurs differentes. Ne pas batir de test d'egalite stricte dessus.","/synthese archive les fichiers recus par defaut. Pour un usage repete, passer conserver=false, ou utiliser /prompt.","Pas d'API compatible OpenAI sur ce port : /v1/chat/completions renvoie 404."],"limites":{"taille_max_par_requete_octets":209715200,"fenetre_de_contexte_tokens":32768,"documents_longs":"au-dela de la fenetre, le texte est decoupe en extraits de 45000 caracteres puis fusionne (map-reduce). Aucune troncature silencieuse. 'extraits_traites' indique le nombre d'extraits utilises.","duree":"une requete sur un document long peut prendre plusieurs minutes — prevoir un timeout client d'au moins 1800 s.","concurrence":"un seul modele est charge en memoire ; les requetes simultanees sont servies l'une apres l'autre."}}