diff --git a/.server-changes/ai-tool-call-span-errors.md b/.server-changes/ai-tool-call-span-errors.md
new file mode 100644
index 00000000000..31ab5ba5ddd
--- /dev/null
+++ b/.server-changes/ai-tool-call-span-errors.md
@@ -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.
diff --git a/apps/webapp/app/components/runs/v3/ai/AIEmbedSpanDetails.tsx b/apps/webapp/app/components/runs/v3/ai/AIEmbedSpanDetails.tsx
index 1cac3de503f..25ed6c8a29a 100644
--- a/apps/webapp/app/components/runs/v3/ai/AIEmbedSpanDetails.tsx
+++ b/apps/webapp/app/components/runs/v3/ai/AIEmbedSpanDetails.tsx
@@ -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";
@@ -35,7 +37,13 @@ export function extractAIEmbedData(
};
}
-export function AIEmbedSpanDetails({ data }: { data: AIEmbedData }) {
+export function AIEmbedSpanDetails({
+ data,
+ spanEvents,
+}: {
+ data: AIEmbedData;
+ spanEvents?: OtelSpanEvent[];
+}) {
return (
@@ -58,6 +66,12 @@ export function AIEmbedSpanDetails({ data }: { data: AIEmbedData }) {
)}
+
+ {spanEvents && spanEvents.some((event) => !event.name.startsWith("trigger.dev/")) && (
+
+
+
+ )}
diff --git a/apps/webapp/app/components/runs/v3/ai/AIToolCallSpanDetails.tsx b/apps/webapp/app/components/runs/v3/ai/AIToolCallSpanDetails.tsx
index 5557f2728c2..e35c9a7f698 100644
--- a/apps/webapp/app/components/runs/v3/ai/AIToolCallSpanDetails.tsx
+++ b/apps/webapp/app/components/runs/v3/ai/AIToolCallSpanDetails.tsx
@@ -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";
@@ -36,7 +38,13 @@ export function extractAIToolCallData(
};
}
-export function AIToolCallSpanDetails({ data }: { data: AIToolCallData }) {
+export function AIToolCallSpanDetails({
+ data,
+ spanEvents,
+}: {
+ data: AIToolCallData;
+ spanEvents?: OtelSpanEvent[];
+}) {
return (
@@ -68,6 +76,12 @@ export function AIToolCallSpanDetails({ data }: { data: AIToolCallData }) {
/>
)}
+
+ {spanEvents && spanEvents.some((event) => !event.name.startsWith("trigger.dev/")) && (
+
+
+
+ )}
diff --git a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx
index 374440dfa0b..807e527793c 100644
--- a/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx
+++ b/apps/webapp/app/routes/resources.orgs.$organizationSlug.projects.$projectParam.env.$envParam.runs.$runParam.spans.$spanParam/route.tsx
@@ -1777,7 +1777,7 @@ function SpanEntity({ span }: { span: Span }) {
-
+
);
}
@@ -1787,7 +1787,7 @@ function SpanEntity({ span }: { span: Span }) {
-
+
);
}