fix(chat): bulles d'erreur étiquetées par type de session structurée — #240

L'erreur « La réponse du modèle n'a pas pu être finalisée. » indique désormais
l'adapter en cause (Session Codex / Claude / OpenCode / HTTP) pour lever
l'ambiguïté constatée sur GameTime entre session Codex et Claude.
This commit is contained in:
2026-08-22 17:27:16 +02:00
parent 1962408eda
commit 41a850f2e9
2 changed files with 25 additions and 0 deletions

View File

@ -144,6 +144,23 @@ function describeOpenFailure(e: unknown): string {
return message || "Cause technique non disponible.";
}
function structuredSessionLabel(
adapter: AgentProfile["structuredAdapter"],
): string | null {
switch (adapter) {
case "codex":
return "Session Codex";
case "claude":
return "Session Claude";
case "openCode":
return "Session OpenCode";
case "openAiCompatible":
return "Session HTTP";
default:
return null;
}
}
function instrumentationError(e: unknown): Record<string, unknown> {
if (e && typeof e === "object") {
const err = e as GatewayError & { name?: string };
@ -1018,6 +1035,7 @@ export function CustomAgentChatView({
[agentId, conversationId, projectId],
);
const displayTurns = turns;
const sessionLabel = structuredSessionLabel(profile.structuredAdapter);
const [requesterDelegation, setRequesterDelegation] =
useState<RequesterDelegationState>({ active: false });
@ -2162,6 +2180,7 @@ export function CustomAgentChatView({
key={index}
turn={turn}
requesterName={agentName}
sessionLabel={sessionLabel}
expandedProgressKeys={expandedProgressKeys}
onToggleProgressExpanded={(key) =>
setExpandedProgressKeys((prev) => {
@ -2352,11 +2371,13 @@ export function CustomAgentChatView({
function ChatBubble({
turn,
requesterName,
sessionLabel,
expandedProgressKeys,
onToggleProgressExpanded,
}: {
turn: ChatTurn;
requesterName: string;
sessionLabel: string | null;
expandedProgressKeys: Set<string>;
onToggleProgressExpanded: (key: string) => void;
}) {
@ -2406,6 +2427,9 @@ function ChatBubble({
labelClassName="font-semibold text-danger"
/>
)}
{turn.role === "error" && sessionLabel && (
<p className="mb-1 font-medium text-danger/85">{sessionLabel}</p>
)}
{turn.role === "unknown" ? "Chunk inconnu reçu: " : ""}
<span className="whitespace-pre-wrap break-words">{turn.text}</span>
</div>