Sessions & traçage distribué
Deux besoins fréquents : relier les tours d'une même conversation, et continuer une trace à travers plusieurs services.
Conversations multi-tours
Pour un SIA conversationnel, attachez le même session_id à chaque tour (un flow par tour), et
un actor_id pour identifier l'utilisateur. Le cockpit regroupe alors les tours en une session.
trace_id contient un ou plusieurs flow_id, chacun contenant des span_id (steps).
def handle_turn(user_message: str): with flow(client, flow_definition_id="support_bot", name="support_bot_main", session_id="conv_8421", actor_id="user_42") as f: with step(f, asset=llm_asset, flow=Flow(name="support_bot_main", phase=FlowPhase.ANALYSIS, step="answer")) as s: answer = generate(user_message) payload(s, "output", Data(role=DataRole.OUTPUT, kind=DataKind.COMPLETION, format=DataFormat.TEXT), answer) return answerTraçage distribué (multi-services)
Quand un service appelle un autre, sérialisez le contexte dans un carrier (en-têtes HTTP) côté
émetteur, puis reprenez-le côté récepteur avec resume_flow : la même trace continue, le span du
service B se rattache au step du service A.
# --- Service A : injecter le carrier dans les headers sortants ---with flow(client, flow_definition_id="orchestrator", name="orchestrator_main") as f: with step(f, asset=api_asset, flow=Flow(name="orchestrator_main", step="call_b")) as s: headers = f.to_carrier(s) # dict prêt à mettre dans les headers HTTP requests.post("https://service-b/infer", headers=headers, json=payload_body)# --- Service B : reprendre la trace ---def handler(request): f = resume_flow(client, dict(request.headers)) with step(f, asset=model_asset, flow=Flow(name="orchestrator_main", step="infer")) as s: ... # rattaché au step "call_b" du service A| CarrierKey (header) | Requis |
|---|---|
| niaone-flow-definition-id | oui |
| niaone-flow-id | oui |
| niaone-trace-id | oui |
| niaone-flow-name | oui |
| niaone-parent-span-id | recommandé (rattachement) |
| niaone-session-id / niaone-actor-id | si présents |
Reprise après erreur
En safe_mode, si un carrier est incomplet, resume_flow n'échoue pas : il démarre un flow neuf
et route l'erreur vers on_error. Vos services aval continuent d'émettre.