Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .server-changes/ai-tool-call-span-errors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
area: webapp
type: fix
---

Failed AI SDK tool call and embedding spans now show the error message and stack trace in the run inspector, below the tool input.
16 changes: 15 additions & 1 deletion apps/webapp/app/components/runs/v3/ai/AIEmbedSpanDetails.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
import type { SpanEvent as OtelSpanEvent } from "@trigger.dev/core/v3";
import { Header3 } from "~/components/primitives/Headers";
import { Paragraph } from "~/components/primitives/Paragraph";
import { SpanEvents } from "~/components/runs/v3/SpanEvents";
import { formatDuration } from "./aiHelpers";
import { SpanMetricRow as MetricRow } from "./SpanMetricRow";

Expand Down Expand Up @@ -35,7 +37,13 @@ export function extractAIEmbedData(
};
}

export function AIEmbedSpanDetails({ data }: { data: AIEmbedData }) {
export function AIEmbedSpanDetails({
data,
spanEvents,
}: {
data: AIEmbedData;
spanEvents?: OtelSpanEvent[];
}) {
return (
<div className="flex h-full flex-col overflow-hidden">
<div className="flex-1 overflow-y-auto scrollbar-thin scrollbar-track-transparent scrollbar-thumb-surface-control">
Expand All @@ -58,6 +66,12 @@ export function AIEmbedSpanDetails({ data }: { data: AIEmbedData }) {
</div>
</div>
)}

{spanEvents && spanEvents.some((event) => !event.name.startsWith("trigger.dev/")) && (
<div className="py-2.5">
<SpanEvents spanEvents={spanEvents} />
</div>
)}
</div>
</div>
</div>
Expand Down
16 changes: 15 additions & 1 deletion apps/webapp/app/components/runs/v3/ai/AIToolCallSpanDetails.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
import type { SpanEvent as OtelSpanEvent } from "@trigger.dev/core/v3";
import { Header3 } from "~/components/primitives/Headers";
import { CodeBlock } from "~/components/code/CodeBlock";
import { TruncatedCopyableValue } from "~/components/primitives/TruncatedCopyableValue";
import { SpanEvents } from "~/components/runs/v3/SpanEvents";
import { formatDuration, tryPrettyJson } from "./aiHelpers";
import { SpanMetricRow as MetricRow } from "./SpanMetricRow";

Expand Down Expand Up @@ -36,7 +38,13 @@ export function extractAIToolCallData(
};
}

export function AIToolCallSpanDetails({ data }: { data: AIToolCallData }) {
export function AIToolCallSpanDetails({
data,
spanEvents,
}: {
data: AIToolCallData;
spanEvents?: OtelSpanEvent[];
}) {
return (
<div className="flex h-full flex-col overflow-hidden">
<div className="flex-1 overflow-y-auto scrollbar-thin scrollbar-track-transparent scrollbar-thumb-surface-control">
Expand Down Expand Up @@ -68,6 +76,12 @@ export function AIToolCallSpanDetails({ data }: { data: AIToolCallData }) {
/>
</div>
)}

{spanEvents && spanEvents.some((event) => !event.name.startsWith("trigger.dev/")) && (
<div className="py-2.5">
<SpanEvents spanEvents={spanEvents} />
</div>
)}
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1777,7 +1777,7 @@ function SpanEntity({ span }: { span: Span }) {
<div className="px-3">
<SpanHorizontalTimeline startTime={span.startTime} duration={span.duration} />
</div>
<AIToolCallSpanDetails data={span.entity.object} />
<AIToolCallSpanDetails data={span.entity.object} spanEvents={span.events} />
</div>
);
}
Expand All @@ -1787,7 +1787,7 @@ function SpanEntity({ span }: { span: Span }) {
<div className="px-3">
<SpanHorizontalTimeline startTime={span.startTime} duration={span.duration} />
</div>
<AIEmbedSpanDetails data={span.entity.object} />
<AIEmbedSpanDetails data={span.entity.object} spanEvents={span.events} />
</div>
);
}
Expand Down
Loading