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:
@ -383,6 +383,7 @@ describe("CustomAgentChatView", () => {
|
|||||||
|
|
||||||
expect(agentBubble).toBeTruthy();
|
expect(agentBubble).toBeTruthy();
|
||||||
expect(errorBubble).toBeTruthy();
|
expect(errorBubble).toBeTruthy();
|
||||||
|
expect(within(errorBubble!).getByText("Session Codex")).toBeTruthy();
|
||||||
expect(
|
expect(
|
||||||
within(agentBubble!).getByText(expectedChatTime(firstDeltaReceivedAtMs)),
|
within(agentBubble!).getByText(expectedChatTime(firstDeltaReceivedAtMs)),
|
||||||
).toBeTruthy();
|
).toBeTruthy();
|
||||||
|
|||||||
@ -144,6 +144,23 @@ function describeOpenFailure(e: unknown): string {
|
|||||||
return message || "Cause technique non disponible.";
|
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> {
|
function instrumentationError(e: unknown): Record<string, unknown> {
|
||||||
if (e && typeof e === "object") {
|
if (e && typeof e === "object") {
|
||||||
const err = e as GatewayError & { name?: string };
|
const err = e as GatewayError & { name?: string };
|
||||||
@ -1018,6 +1035,7 @@ export function CustomAgentChatView({
|
|||||||
[agentId, conversationId, projectId],
|
[agentId, conversationId, projectId],
|
||||||
);
|
);
|
||||||
const displayTurns = turns;
|
const displayTurns = turns;
|
||||||
|
const sessionLabel = structuredSessionLabel(profile.structuredAdapter);
|
||||||
const [requesterDelegation, setRequesterDelegation] =
|
const [requesterDelegation, setRequesterDelegation] =
|
||||||
useState<RequesterDelegationState>({ active: false });
|
useState<RequesterDelegationState>({ active: false });
|
||||||
|
|
||||||
@ -2162,6 +2180,7 @@ export function CustomAgentChatView({
|
|||||||
key={index}
|
key={index}
|
||||||
turn={turn}
|
turn={turn}
|
||||||
requesterName={agentName}
|
requesterName={agentName}
|
||||||
|
sessionLabel={sessionLabel}
|
||||||
expandedProgressKeys={expandedProgressKeys}
|
expandedProgressKeys={expandedProgressKeys}
|
||||||
onToggleProgressExpanded={(key) =>
|
onToggleProgressExpanded={(key) =>
|
||||||
setExpandedProgressKeys((prev) => {
|
setExpandedProgressKeys((prev) => {
|
||||||
@ -2352,11 +2371,13 @@ export function CustomAgentChatView({
|
|||||||
function ChatBubble({
|
function ChatBubble({
|
||||||
turn,
|
turn,
|
||||||
requesterName,
|
requesterName,
|
||||||
|
sessionLabel,
|
||||||
expandedProgressKeys,
|
expandedProgressKeys,
|
||||||
onToggleProgressExpanded,
|
onToggleProgressExpanded,
|
||||||
}: {
|
}: {
|
||||||
turn: ChatTurn;
|
turn: ChatTurn;
|
||||||
requesterName: string;
|
requesterName: string;
|
||||||
|
sessionLabel: string | null;
|
||||||
expandedProgressKeys: Set<string>;
|
expandedProgressKeys: Set<string>;
|
||||||
onToggleProgressExpanded: (key: string) => void;
|
onToggleProgressExpanded: (key: string) => void;
|
||||||
}) {
|
}) {
|
||||||
@ -2406,6 +2427,9 @@ function ChatBubble({
|
|||||||
labelClassName="font-semibold text-danger"
|
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: " : ""}
|
{turn.role === "unknown" ? "Chunk inconnu reçu: " : ""}
|
||||||
<span className="whitespace-pre-wrap break-words">{turn.text}</span>
|
<span className="whitespace-pre-wrap break-words">{turn.text}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user