Aller au contenu

Référence de la CLI du serveur

Paquet : piighost-api

piighost-api est la ligne de commande du serveur compagnon. serve démarre le serveur HTTP. Les commandes dataset construisent et notent un jeu de détections à partir des traces d'observation.

piighost-api serve [--config SOURCE] [--host HOST] [--port PORT] [--log-level LEVEL]
piighost-api dataset extract --output FILE [--since DATE] [--until DATE] [--mode MODE] [--limit N]
piighost-api dataset metrics --input FILE [--output FILE] [--output-format FORMAT] [--match-mode MODE] [--iou-threshold FLOAT] [--source SOURCE]

Le serveur demande Python 3.12 ou plus récent et piighost>=2.0,<3. Ses extras ajoutent des fonctions optionnelles :

ExtraAjoute
gliner2piighost[gliner2], pour une configuration qui exécute un détecteur GLiNER2
observationle SDK OpenTelemetry et l'exporteur OTLP, pour exporter les traces
datasetle SDK Langfuse et python-dotenv, pour dataset extract
pip install "piighost-api[gliner2,observation]"

piighost-api serve

Construit le pipeline une fois et sert les endpoints de l'API avec uvicorn, dans un seul processus.

piighost-api serve --config catalog:piighost/support-en --host 0.0.0.0 --port 8000
OptionDéfautDescription
--config, -cPIIGHOST_CONFIGUn fichier de config de pipeline TOML ou JSON, ou une référence du catalogue comme catalog:piighost/support-en
--host127.0.0.1Hôte d'écoute
--port8000Port d'écoute
--log-levelinfodebug, info, warning ou error
  • Sans --config ni PIIGHOST_CONFIG, la commande imprime Missing --config or PIIGHOST_CONFIG. avec une indication d'usage et sort en 1. Un chemin de fichier qui n'existe pas sort en 1 avec Configuration file not found:.
  • Une référence du catalogue charge la configuration complète que le catalogue piighost publie sous ce nom. Une référence épinglée à un commit est récupérée au premier démarrage, puis lue dans le cache disque.
  • Une configuration qui ne déclare pas de section [memory] est servie avec la mémoire in-process, in_memory. Ses conversations vivent dans le processus du serveur, donc chaque instance tient les siennes. Plusieurs instances derrière un load balancer demandent une mémoire redis ou sqlalchemy partagée, voir Déploiement multi-instance.
  • Toute section de premier niveau se surcharge avec une variable PIIGHOST_ qui porte un objet JSON, comme pour un fichier, voir Surcharges d'environnement. PIIGHOST_MEMORY ajoute ainsi une mémoire partagée à une configuration du catalogue. Celle de l'exemple ci-dessous demande piighost[crypto] pour son cipher.
  • Sans clé dans une variable API_KEY_, le serveur refuse de démarrer sauf si PIIGHOST_ALLOW_ANONYMOUS est posée.
export PIIGHOST_MEMORY='{"type": "redis", "url": "redis://redis:6379/0", "hasher": {"type": "argon2"}, "cipher": {"type": "aesgcm"}}'
piighost-api serve --config catalog:piighost/support-en

Variables d'environnement

VariableDéfautEffet
PIIGHOST_CONFIGaucunFichier de config ou référence du catalogue, lu quand --config est absent
API_KEY_<NAME>aucunUne clé d'API acceptée par variable. La valeur est celle qu'imprime keyshield generate
SECRET_PEPPERle poivre intégré de keyshield, avec un avertissementPoivre du hash Argon2 que le serveur garde de chaque clé, imprimé par keyshield pepper
PIIGHOST_ALLOW_ANONYMOUSdésactivé1, true, yes ou on laisse le serveur démarrer sans clé, chaque route est alors ouverte. S'applique aussi quand les clés échouent à se charger
PIIGHOST_MAX_BODY_BYTES1000000Plus grand corps de requête accepté, au-delà 413
PIIGHOST_RATE_LIMITdésactivé<unit>:<count> par client, unit parmi second, minute, hour, day, comme minute:300. Une valeur mal formée arrête le serveur au démarrage
PIIGHOST_OPENAI_UPSTREAMhttps://api.openai.com/v1Upstream de /openai/v1 quand une requête n'en nomme aucun
PIIGHOST_ANTHROPIC_UPSTREAMhttps://api.anthropic.com/v1Upstream de /anthropic/v1 quand une requête n'en nomme aucun
PIIGHOST_ANTHROPIC_ANONYMIZE_SYSTEMfalse1, true, yes ou on dé-identifie aussi le prompt système
PIIGHOST_ANTHROPIC_PLACEHOLDER_NOTEvide, pas de notedefault ajoute la note intégrée sur les placeholders. Tout autre texte sert lui-même de note
PIIGHOST_ANTHROPIC_NOTE_PLACEMENTsystemuser place la note dans le premier message utilisateur, toute autre valeur dans le prompt système
OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_ENDPOINTaucunUn endpoint OTLP active l'export des traces. Si les deux sont posées, la première de la liste l'emporte. Demande l'extra observation
OTEL_SERVICE_NAMEpiighost-apiNom de service des traces exportées
LANGFUSE_PUBLIC_KEY, LANGFUSE_SECRET_KEYaucunIdentifiants de dataset extract

Le pipeline lit ses propres secrets (PIIGHOST_HASH_PEPPER, PIIGHOST_CIPHER_KEY, PIIGHOST_DATABASE_URL et MISTRAL_API_KEY). PIIGHOST_CATALOG_URL nomme un catalogue privé. Ces variables sont listées dans la Référence TOML. Les autres variables OTEL_*, en-têtes compris, sont lues par l'exporteur OpenTelemetry lui-même, voir Observation.

L'image Docker en lit quatre de plus, listées dans Déployer un pipeline en production.


piighost-api dataset extract

Lit des traces sur Langfuse et écrit un enregistrement JSONL par trace. Il demande l'extra dataset ainsi que LANGFUSE_PUBLIC_KEY et LANGFUSE_SECRET_KEY, lues dans l'environnement ou dans un fichier .env du répertoire courant. Sans elles, il sort en 1.

piighost-api dataset extract --output dataset.jsonl --since 2026-09-01 --limit 1000
OptionDéfautDescription
--output, -orequisFichier JSONL à écrire
--sinceaucunIgnore les traces antérieures à cette date, %Y-%m-%d, %Y-%m-%dT%H:%M:%S ou %Y-%m-%d %H:%M:%S
--untilaucunIgnore les traces postérieures à cette date, mêmes formats
--modeallhitl, model-only ou all
--limitaucunS'arrête après ce nombre d'enregistrements
--modeNom de trace luentities tiré de
hitlpiighost.hitl_correctionles detections de la sortie de la trace, la correction humaine
model-onlypiighost.anonymizeles detections de sortie de son enfant piighost.detect
allles deuxselon la trace

Une trace sans texte d'entrée, ou une trace de modèle sans son enfant piighost.detect, est ignorée. La commande se termine par Wrote N records to FILE (M skipped).

{
  "text": "Hi Jane Doe, from Acme in Boston",
  "entities": [[3, 11, "PERSON"], [18, 22, "ORGANIZATION"], [26, 32, "LOCATION"]],
  "model_entities": [[3, 11, "PERSON"], [18, 22, "LOCATION"]],
  "labels_universe": [],
  "source": "hitl",
  "trace_id": "...",
  "session_id": "...",
  "created_at": "..."
}
ChampContenu
entitiesLes spans de référence en [start, end, label]. C'est la correction humaine pour un enregistrement hitl, et la sortie du modèle pour un enregistrement model
model_entitiesLes spans du modèle, égaux à entities sur un enregistrement model
labels_universeLes labels de l'entrée d'une trace de correction, vide sur un enregistrement model
sourcehitl ou model

piighost-api dataset metrics

Note le modèle contre la référence d'un fichier JSONL écrit par dataset extract, label par label. Il ne demande aucun extra.

piighost-api dataset metrics --input dataset.jsonl
OptionDéfautDescription
--input, -irequisFichier JSONL à lire
--output, -ostdoutFichier où écrire le rapport
--output-formattabletable, csv ou json
--match-modestrictstrict exige le même span et le même label, lenient accepte un span de même label dont le taux de recouvrement atteint --iou-threshold
--iou-threshold0.5Seuil de recouvrement en mode lenient
--sourceallhitl, model ou all, les enregistrements à noter

Sur l'enregistrement ci-dessus, le tableau est :

label                    tp     fp     fn      P      R     F1
--------------------------------------------------------------
LOCATION                  0      1      1   0.00   0.00   0.00
ORGANIZATION              0      0      1   0.00   0.00   0.00
PERSON                    1      0      0   1.00   1.00   1.00
--------------------------------------------------------------
macro avg                 -      -      -   0.33   0.33   0.33
micro avg                 -      -      -   0.50   0.33   0.40

Label confusion (model -> human, same span):
  LOCATION -> ORGANIZATION: 1

tp compte un span du modèle que la référence contient, fp un span du modèle qu'elle ne contient pas, fn un span de référence que le modèle a manqué. P, R et F1 sont la précision, le rappel et leur moyenne harmonique. La section de confusion liste les spans où le modèle et la référence s'accordent sur les décalages et diffèrent sur le label.


Voir aussi