Skip to content

Conversation

nirga
Copy link
Member

@nirga nirga commented Sep 19, 2025

Important

Enhances Vercel AI SDK tool call handling with standardized span names, improved attribute mapping, and refactored span processing logic.

  • Behavior:
    • Standardizes span names for AI operations like text/object generation and streaming in ai-sdk-transformations.ts.
    • Introduces dedicated tool-call span naming for better identification.
    • Maps tool-call inputs/outputs into trace attributes for enhanced observability.
  • Refactor:
    • Splits span processing into naming (on start) and attribute transformation (on end) in span-processor.ts.
    • Expands handling of AI-instrumented spans for broader coverage.
  • Tests:
    • Updates tests in ai-sdk-integration.test.ts, ai-sdk-transformations.test.ts, and decorators.test.ts to verify new span names and attribute transformations.

This description was created by Ellipsis for c6827a0. You can customize this summary. It will automatically update as commits are pushed.


Summary by CodeRabbit

  • New Features

    • Standardized canonical span names for AI operations (text/object generation and streaming) and distinct tool-call naming.
    • AI telemetry metadata is now collected and propagated to association properties for richer traces.
  • Refactor

    • Span processing split into separate naming (at start) and attribute transformation (at end) steps for more consistent tracing.
  • Tests

    • Tests updated to expect the new canonical span names and adjusted to the revamped transformation flow.

Copy link

coderabbitai bot commented Sep 19, 2025

Caution

Review failed

The pull request is closed.

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

Split AI SDK span processing into separate name and attribute transforms. Span names are remapped (including a TOOL_SPAN_NAME for tool calls), telemetry metadata is extracted into association properties, name transforms run on span start and attribute transforms run on span end. Public APIs and types were reorganized.

Changes

Cohort / File(s) Summary
AI SDK transformations
packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts
Reworked span-name mappings (HANDLED_SPAN_NAMES → canonical names such as text.generate, object.generate, text.stream); added TOOL_SPAN_NAME; introduced AI_TELEMETRY_METADATA_PREFIX and transformTelemetryMetadata to collect ai.telemetry.metadata.* into association properties; added transformLLMSpans(attributes), transformAiSdkSpanNames(span: Span), and transformAiSdkSpanAttributes(span: ReadableSpan); removed/renamed previous transform APIs and adjusted imports/types (Span, ReadableSpan).
Span processor integration
packages/traceloop-sdk/src/lib/tracing/span-processor.ts
Replaced single end-phase transform with two-phase flow: call transformAiSdkSpanNames(span) on span start and transformAiSdkSpanAttributes(span) on span end; updated imports and Span typing; preserved exporter/OTLP compatibility logic.
Tests
packages/traceloop-sdk/test/*
Updated tests to expect canonical span names like text.generate instead of legacy ai.generateText.*; adjusted imports and calls to new transformation helpers and association key.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  actor App
  participant SpanProcessor
  participant AiTransforms as ai-sdk-transformations
  participant Exporter

  App->>SpanProcessor: onSpanStart(span)
  SpanProcessor->>AiTransforms: transformAiSdkSpanNames(span)
  Note right of AiTransforms #eef2ff: Map ai.* names → canonical names\nMark tool-call spans (TOOL_SPAN_NAME)

  App->>SpanProcessor: onSpanEnd(span)
  SpanProcessor->>AiTransforms: transformAiSdkSpanAttributes(span)
  Note right of AiTransforms #fff7e6: Extract ai.telemetry.metadata.* → association props\nApply LLM attribute transforms and tool args/results mapping

  SpanProcessor->>Exporter: proceed with export / OTLP compatibility
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • galkleinman
  • avivhalfon

Poem

I hopped through spans both start and end,
Renamed each trace and matched each friend.
Telemetry tucked, tool calls neat and sly,
Attributes humming as traces fly.
A little rabbit clap—good trace, hop by! 🐰✨

Pre-merge checks and finishing touches

✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The PR title succinctly and accurately describes the primary intent — fixing the formatting of Vercel AI SDK tool calls — which matches the changes that add ai.toolCall handling, span-name remapping, and attribute transformations; it is concise and focused rather than vague or noisy.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 65c57a8 and c6827a0.

📒 Files selected for processing (4)
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts (4 hunks)
  • packages/traceloop-sdk/test/ai-sdk-integration.test.ts (3 hunks)
  • packages/traceloop-sdk/test/ai-sdk-transformations.test.ts (60 hunks)
  • packages/traceloop-sdk/test/decorators.test.ts (1 hunks)

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Changes requested ❌

Reviewed everything up to 65c57a8 in 2 minutes and 27 seconds. Click for details.
  • Reviewed 142 lines of code in 2 files
  • Skipped 0 files when reviewing.
  • Skipped posting 0 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.

Workflow ID: wflow_Xq8XoJByBky9HnEq

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.


export const transformAiSdkSpanNames = (span: Span): void => {
if (span.name === TOOL_SPAN_NAME) {
span.updateName(`${span.attributes["ai.toolCall.name"] as string}.tool`);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Guard the use of 'ai.toolCall.name' in transformAiSdkSpanNames to avoid formatting to 'undefined.tool' if the attribute is missing.

Suggested change
span.updateName(`${span.attributes["ai.toolCall.name"] as string}.tool`);
span.updateName(`${span.attributes["ai.toolCall.name"] ? span.attributes["ai.toolCall.name"] : "tool"}.tool`);


const shouldHandleSpan = (span: ReadableSpan): boolean => {
return span.name in HANDLED_SPAN_NAMES;
return span.instrumentationScope.name === "ai";
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use optional chaining for instrumentationScope (e.g. span.instrumentationScope?.name) in shouldHandleSpan to avoid potential runtime errors.

Suggested change
return span.instrumentationScope.name === "ai";
return span.instrumentationScope?.name === "ai";

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts (1)

366-376: Stringify non-primitive values before assigning to SpanAttributes

  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts — transformResponseText (lines 56–57) and transformResponseObject (lines 79–80): currently assign attributes[${SpanAttributes.LLM_COMPLETIONS}.0.content] = attributes[AI_RESPONSE_*]; ensure value is a string (e.g. typeof v === 'string' ? v : JSON.stringify(v)) before assigning.
  • transformResponseToolCalls (function ~lines 100–137): attributes[${SpanAttributes.LLM_COMPLETIONS}.0.tool_calls.${index}.arguments] = toolCall.args and the tool_call.arguments pushed into toolCallParts — stringify toolCall.args (or conditionally stringify) before assigning/pushing.
  • transformPrompts (line 263): attributes[contentKey] = processedContent — OK (processMessageContent returns a string).
  • transformVendor (line 361): attributes[SpanAttributes.LLM_SYSTEM] = mappedVendor || vendor — ensure vendor is string: mappedVendor || (typeof vendor === 'string' ? vendor : JSON.stringify(vendor)).
  • transformToolCalls (lines 383, 386): span.attributes[SpanAttributes.TRACELOOP_ENTITY_INPUT/OUTPUT] = span.attributes["ai.toolCall.args"/"ai.toolCall.result"] — stringify these values (or conditionally stringify) before assigning.
🧹 Nitpick comments (2)
packages/traceloop-sdk/src/lib/tracing/span-processor.ts (1)

162-164: Gate name transforms to AI spans to avoid accidental renames.

Only rename when the instrumentation is "ai".

Apply this diff:

-  transformAiSdkSpanNames(span);
+  const scopeName =
+    (span as any).instrumentationScope?.name ||
+    (span as any).instrumentationLibrary?.name;
+  if (scopeName === "ai") {
+    transformAiSdkSpanNames(span);
+  }
packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts (1)

378-390: Map tool-call args/result independently (don’t require both).

Today nothing is mapped if only args or only result exist.

Apply this diff:

-const transformToolCalls = (span: ReadableSpan): void => {
-  if (
-    span.attributes["ai.toolCall.args"] &&
-    span.attributes["ai.toolCall.result"]
-  ) {
-    span.attributes[SpanAttributes.TRACELOOP_ENTITY_INPUT] =
-      span.attributes["ai.toolCall.args"];
-    delete span.attributes["ai.toolCall.args"];
-    span.attributes[SpanAttributes.TRACELOOP_ENTITY_OUTPUT] =
-      span.attributes["ai.toolCall.result"];
-    delete span.attributes["ai.toolCall.result"];
-  }
-};
+const transformToolCalls = (span: ReadableSpan): void => {
+  if (span.attributes["ai.toolCall.args"]) {
+    span.attributes[SpanAttributes.TRACELOOP_ENTITY_INPUT] =
+      span.attributes["ai.toolCall.args"];
+    delete span.attributes["ai.toolCall.args"];
+  }
+  if (span.attributes["ai.toolCall.result"]) {
+    span.attributes[SpanAttributes.TRACELOOP_ENTITY_OUTPUT] =
+      span.attributes["ai.toolCall.result"];
+    delete span.attributes["ai.toolCall.result"];
+  }
+};
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Disabled knowledge base sources:

  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between c1ee4af and 65c57a8.

📒 Files selected for processing (2)
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts (3 hunks)
  • packages/traceloop-sdk/src/lib/tracing/span-processor.ts (4 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
packages/{instrumentation-*,traceloop-sdk}/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

Import AI/LLM semantic attribute constants from @traceloop/ai-semantic-conventions rather than hardcoding strings

Files:

  • packages/traceloop-sdk/src/lib/tracing/span-processor.ts
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts
packages/traceloop-sdk/**/*.{ts,tsx}

📄 CodeRabbit inference engine (CLAUDE.md)

packages/traceloop-sdk/**/*.{ts,tsx}: Use the provided decorators (@workflow, @task, @agent) for workflow/task/agent spans instead of re-implementing them
For manual LLM operations, use trace.withLLMSpan from @traceloop/node-server-sdk

Files:

  • packages/traceloop-sdk/src/lib/tracing/span-processor.ts
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts
🧠 Learnings (5)
📚 Learning: 2025-08-24T22:08:07.023Z
Learnt from: CR
PR: traceloop/openllmetry-js#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-24T22:08:07.023Z
Learning: Applies to packages/traceloop-sdk/**/*.{ts,tsx} : Use the provided decorators (workflow, task, agent) for workflow/task/agent spans instead of re-implementing them

Applied to files:

  • packages/traceloop-sdk/src/lib/tracing/span-processor.ts
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts
📚 Learning: 2025-08-24T22:08:07.023Z
Learnt from: CR
PR: traceloop/openllmetry-js#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-24T22:08:07.023Z
Learning: Applies to packages/{instrumentation-*,traceloop-sdk}/**/*.{ts,tsx} : Import AI/LLM semantic attribute constants from traceloop/ai-semantic-conventions rather than hardcoding strings

Applied to files:

  • packages/traceloop-sdk/src/lib/tracing/span-processor.ts
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts
📚 Learning: 2025-08-24T22:08:07.023Z
Learnt from: CR
PR: traceloop/openllmetry-js#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-24T22:08:07.023Z
Learning: Applies to packages/instrumentation-*/**/*.{ts,tsx} : Instrumentations must create spans with appropriate AI/LLM semantic attributes for calls they wrap

Applied to files:

  • packages/traceloop-sdk/src/lib/tracing/span-processor.ts
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts
📚 Learning: 2025-08-24T22:08:07.023Z
Learnt from: CR
PR: traceloop/openllmetry-js#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-24T22:08:07.023Z
Learning: Applies to packages/traceloop-sdk/**/*.{ts,tsx} : For manual LLM operations, use trace.withLLMSpan from traceloop/node-server-sdk

Applied to files:

  • packages/traceloop-sdk/src/lib/tracing/span-processor.ts
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts
📚 Learning: 2025-08-24T22:08:07.023Z
Learnt from: CR
PR: traceloop/openllmetry-js#0
File: CLAUDE.md:0-0
Timestamp: 2025-08-24T22:08:07.023Z
Learning: Applies to packages/ai-semantic-conventions/src/SemanticAttributes.ts : Define all AI/LLM span attribute constants in packages/ai-semantic-conventions/src/SemanticAttributes.ts

Applied to files:

  • packages/traceloop-sdk/src/lib/tracing/span-processor.ts
  • packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts
🧬 Code graph analysis (2)
packages/traceloop-sdk/src/lib/tracing/span-processor.ts (1)
packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts (2)
  • transformAiSdkSpanNames (396-403)
  • transformAiSdkSpanAttributes (405-411)
packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts (1)
packages/ai-semantic-conventions/src/SemanticAttributes.ts (1)
  • SpanAttributes (17-61)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Build and test
🔇 Additional comments (8)
packages/traceloop-sdk/src/lib/tracing/span-processor.ts (3)

5-7: Importing SDK Span is appropriate for updateName usage.

Correct to use Span from @opentelemetry/sdk-trace-node here.


228-233: Good placement: attribute transforms on end before export.

Running transformAiSdkSpanAttributes(span) before ensureSpanCompatibility is the right order.


5-7: Verify OpenTelemetry package versions align with SpanProcessor imports.

Automated scan found no @opentelemetry/* entries in package.json files; packages/traceloop-sdk/src/lib/tracing/span-processor.ts imports @opentelemetry/sdk-trace-node — confirm where OTel deps are declared (monorepo root, peerDependencies, or left to consumers) and ensure the installed major version (v1 vs v2) is compatible with the SpanProcessor typings.

packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts (5)

1-1: Correct: use SDK Span for updateName.

updateName exists on SDK Span; this import is right.


4-13: Span-name mapping looks good.

New names match the intended actions (run.ai/text.generate/object.generate/text.stream).


15-16: Tool-call span constant introduced appropriately.

Clear dedicated key for tool-call handling.


405-411: Good split: attributes handled on end; names on start.

Separation keeps span names stable while allowing attribute transforms once all data is present.


346-364: Vendor mapping: use OpenTelemetry gen_ai.system canonical identifiers (lowercase/dotted).

Map VENDOR_MAPPING prefixes to the OTel GenAI canonical tokens (examples: openai, anthropic, gcp.vertex_ai, gcp.gemini, azure.ai.openai, aws.bedrock, cohere). For unknown/custom models use a friendly name or set gen_ai.system to _OTHER. Ensure transformVendor writes the canonical token to SpanAttributes.LLM_SYSTEM (not display names like "OpenAI" or "Google"). File: packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts (transformVendor).

Comment on lines 392 to 395
const shouldHandleSpan = (span: ReadableSpan): boolean => {
return span.name in HANDLED_SPAN_NAMES;
return span.instrumentationScope.name === "ai";
};

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Handle both instrumentationScope and instrumentationLibrary (OTel v1/v2).

Current check misses v1 where only instrumentationLibrary exists, causing transforms to be skipped.

Apply this diff:

-const shouldHandleSpan = (span: ReadableSpan): boolean => {
-  return span.instrumentationScope.name === "ai";
-};
+const shouldHandleSpan = (span: ReadableSpan): boolean => {
+  const scopeName =
+    (span as any).instrumentationScope?.name ||
+    (span as any).instrumentationLibrary?.name;
+  return scopeName === "ai";
+};
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
const shouldHandleSpan = (span: ReadableSpan): boolean => {
return span.name in HANDLED_SPAN_NAMES;
return span.instrumentationScope.name === "ai";
};
const shouldHandleSpan = (span: ReadableSpan): boolean => {
const scopeName =
(span as any).instrumentationScope?.name ||
(span as any).instrumentationLibrary?.name;
return scopeName === "ai";
};
🤖 Prompt for AI Agents
In packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts around lines
392 to 395, the shouldHandleSpan function only checks
span.instrumentationScope.name (OTel v2) and therefore misses v1 spans that use
instrumentationLibrary; update the predicate to read the name from either
instrumentationScope or instrumentationLibrary (e.g. use
instrumentationScope?.name ?? instrumentationLibrary?.name) and compare that
value to "ai" so spans from both OTel v1 and v2 are handled.

Comment on lines +396 to 403
export const transformAiSdkSpanNames = (span: Span): void => {
if (span.name === TOOL_SPAN_NAME) {
span.updateName(`${span.attributes["ai.toolCall.name"] as string}.tool`);
}
if (span.name in HANDLED_SPAN_NAMES) {
span.updateName(HANDLED_SPAN_NAMES[span.name]);
}
};
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Guard against missing ai.toolCall.name to prevent 'undefined.tool'.

Only rename tool-call spans when the name attribute exists and is non-empty.

Apply this diff:

 export const transformAiSdkSpanNames = (span: Span): void => {
-  if (span.name === TOOL_SPAN_NAME) {
-    span.updateName(`${span.attributes["ai.toolCall.name"] as string}.tool`);
-  }
+  if (span.name === TOOL_SPAN_NAME) {
+    const toolName = (span.attributes["ai.toolCall.name"] as unknown) as string | undefined;
+    if (typeof toolName === "string" && toolName.length > 0) {
+      span.updateName(`${toolName}.tool`);
+    }
+  }
   if (span.name in HANDLED_SPAN_NAMES) {
     span.updateName(HANDLED_SPAN_NAMES[span.name]);
   }
 };
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
export const transformAiSdkSpanNames = (span: Span): void => {
if (span.name === TOOL_SPAN_NAME) {
span.updateName(`${span.attributes["ai.toolCall.name"] as string}.tool`);
}
if (span.name in HANDLED_SPAN_NAMES) {
span.updateName(HANDLED_SPAN_NAMES[span.name]);
}
};
export const transformAiSdkSpanNames = (span: Span): void => {
if (span.name === TOOL_SPAN_NAME) {
const toolName = (span.attributes["ai.toolCall.name"] as unknown) as string | undefined;
if (typeof toolName === "string" && toolName.length > 0) {
span.updateName(`${toolName}.tool`);
}
}
if (span.name in HANDLED_SPAN_NAMES) {
span.updateName(HANDLED_SPAN_NAMES[span.name]);
}
};
🤖 Prompt for AI Agents
In packages/traceloop-sdk/src/lib/tracing/ai-sdk-transformations.ts around lines
396 to 403, the tool-call renaming can produce "undefined.tool" when
ai.toolCall.name is missing; change the logic so you only call
span.updateName(`${...}.tool`) if span.attributes["ai.toolCall.name"] is a
non-empty string (e.g. typeof === "string" &&
span.attributes["ai.toolCall.name"].trim() !== ""), otherwise skip that rename;
keep the subsequent HANDLED_SPAN_NAMES check as-is so other mappings still
apply.

Comment on lines +405 to +410
export const transformAiSdkSpanAttributes = (span: ReadableSpan): void => {
if (!shouldHandleSpan(span)) {
return;
}
transformAiSdkSpanName(span);
transformAiSdkAttributes(span.attributes);
transformLLMSpans(span.attributes);
transformToolCalls(span);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[STYLE] naming & args aren't consistent, if you changed transformAiSdkSpan -> transformAiSdkSpanAttributes than the methods used inside should also be with attrs suffix imo, and have the same signature

span.updateName(`${span.attributes["ai.toolCall.name"] as string}.tool`);
}
if (span.name in HANDLED_SPAN_NAMES) {
span.updateName(HANDLED_SPAN_NAMES[span.name]);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nice! this updateName is a new api i think so. if that's the case this change will break the otel-v1 tho if we merge it.

just read about it, it exists since v1, makes me wonder why didn't we use it.

Comment on lines +9 to +12
[AI_GENERATE_TEXT]: "run.ai",
[AI_GENERATE_TEXT_DO_GENERATE]: "text.generate",
[AI_GENERATE_OBJECT_DO_GENERATE]: "object.generate",
[AI_STREAM_TEXT_DO_STREAM]: "text.stream",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these naming changes may break mor's monitors if merged.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@galkleinman the name changes didn't work at all apparently

Copy link
Contributor

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Looks good to me! 👍

Reviewed 08f5484 in 1 minute and 29 seconds. Click for details.
  • Reviewed 940 lines of code in 4 files
  • Skipped 0 files when reviewing.
  • Skipped posting 8 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.
1. packages/traceloop-sdk/test/ai-sdk-transformations.test.ts:395
  • Draft comment:
    Excellent test for handling invalid JSON in 'ai.prompt.messages'; the attributes remain unchanged on parse failure.
  • Reason this comment was not posted:
    Comment was not on a location in the diff, so it can't be submitted as a review comment.
2. packages/traceloop-sdk/test/ai-sdk-transformations.test.ts:428
  • Draft comment:
    The unescaping of JSON escape sequences in prompt messages is correctly validated.
  • Reason this comment was not posted:
    Comment was not on a location in the diff, so it can't be submitted as a review comment.
3. packages/traceloop-sdk/test/ai-sdk-transformations.test.ts:888
  • Draft comment:
    Token usage calculations correctly handle both numeric and string values for prompt and completion tokens.
  • Reason this comment was not posted:
    Comment did not seem useful. Confidence is useful = 0% <= threshold 50% This comment is purely informative, stating that token usage calculations handle both numeric and string values. It does not provide a suggestion, ask for confirmation, or point out a potential issue. It violates the rule against making purely informative comments.
4. packages/traceloop-sdk/test/decorators.test.ts:189
  • Draft comment:
    Decorator tests effectively verify dynamic workflow and task naming along with association property propagation.
  • Reason this comment was not posted:
    Comment was not on a location in the diff, so it can't be submitted as a review comment.
5. packages/traceloop-sdk/test/decorators.test.ts:525
  • Draft comment:
    The parallel workflow test confirms that association properties are isolated between concurrent traces.
  • Reason this comment was not posted:
    Comment was not on a location in the diff, so it can't be submitted as a review comment.
6. packages/traceloop-sdk/test/decorators.test.ts:640
  • Draft comment:
    Vercel AI span fix test properly aligns the span format with OpenLLMetry expectations, including model and token usage attributes.
  • Reason this comment was not posted:
    Comment was not on a location in the diff, so it can't be submitted as a review comment.
7. packages/traceloop-sdk/test/decorators.test.ts:161
  • Draft comment:
    The suppressed workflow test verifies that no spans are created when 'suppressTracing' is enabled.
  • Reason this comment was not posted:
    Comment was not on a location in the diff, so it can't be submitted as a review comment.
8. packages/traceloop-sdk/test/ai-sdk-transformations.test.ts:5
  • Draft comment:
    Typographical Error: The constant name ASSOCATION_PROPERTIES_KEY seems misspelled. It likely should be ASSOCIATION_PROPERTIES_KEY.
  • Reason this comment was not posted:
    Decided after close inspection that this draft comment was likely wrong and/or not actionable: usefulness confidence = 0% vs. threshold = 50% The comment points out a legitimate spelling error in a constant name that was imported. However, this is an import statement - we can't see the actual constant definition in this diff. The typo exists in another file that we can't see. According to the rules, we should "ignore cross-file issues" and "only think about the file you are reviewing". The typo seems real and should be fixed, but fixing it would require changes in another file where the constant is defined. Am I being too strict with the cross-file rule? No, the rules are clear that we should ignore cross-file issues. Even though the typo is real, fixing it requires changes to another file where the constant is defined. We can't properly review this without seeing that file. Delete the comment since it requires changes in another file that we can't see in this diff. The cross-file rule takes precedence.

Workflow ID: wflow_vQl2ibH6AaMvPSkZ

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.

Copy link
Contributor

@ellipsis-dev ellipsis-dev bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Important

Looks good to me! 👍

Reviewed c6827a0 in 36 seconds. Click for details.
  • Reviewed 169 lines of code in 2 files
  • Skipped 0 files when reviewing.
  • Skipped posting 2 draft comments. View those below.
  • Modify your settings and rules to customize what types of comments Ellipsis leaves. And don't forget to react with 👍 or 👎 to teach Ellipsis.
1. packages/traceloop-sdk/test/ai-sdk-integration.test.ts:233
  • Draft comment:
    Refactored the arrow function in the .find call by removing the trailing comma. This concise inline format improves clarity without changing functionality.
  • Reason this comment was not posted:
    Confidence changes required: 0% <= threshold 50% None
2. packages/traceloop-sdk/test/ai-sdk-transformations.test.ts:1555
  • Draft comment:
    The assert statements were reformatted (e.g. multi-line assertions in telemetry metadata and other test blocks) for greater consistency and readability. No functional changes were introduced.
  • Reason this comment was not posted:
    Confidence changes required: 0% <= threshold 50% None

Workflow ID: wflow_dg3vMM9GFxMlH9cN

You can customize Ellipsis by changing your verbosity settings, reacting with 👍 or 👎, replying to comments, or adding code review rules.

@nirga nirga merged commit 748cc84 into main Sep 21, 2025
7 of 8 checks passed
@nirga nirga deleted the fix-ai-sdk-agents branch September 21, 2025 10:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants