Skip to content
Merged
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
34 changes: 18 additions & 16 deletions sentry_sdk/integrations/langchain.py
Original file line number Diff line number Diff line change
Expand Up @@ -523,28 +523,31 @@ def on_tool_start(self, serialized, input_str, *, run_id, **kwargs):
with capture_internal_exceptions():
if not run_id:
return

tool_name = serialized.get("name") or kwargs.get("name")

watched_span = self._create_span(
run_id,
kwargs.get("parent_run_id"),
op=OP.GEN_AI_EXECUTE_TOOL,
name=serialized.get("name") or kwargs.get("name") or "AI tool usage",
name=f"execute_tool {tool_name}",
Copy link

Choose a reason for hiding this comment

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

Bug: Tool Execution Span Naming Regression

The on_tool_start span name now incorrectly displays "execute_tool None" when serialized.get("name") and kwargs.get("name") are both falsy. This regression removes the previous fallback to "AI tool usage", resulting in unhelpful span names.

Fix in Cursor Fix in Web

origin=LangchainIntegration.origin,
)
watched_span.span.set_data(
SPANDATA.GEN_AI_TOOL_NAME, serialized.get("name")
)
span = watched_span.span

span.set_data(SPANDATA.GEN_AI_OPERATION_NAME, "execute_tool")
span.set_data(SPANDATA.GEN_AI_TOOL_NAME, tool_name)

tool_description = serialized.get("description")
if tool_description is not None:
span.set_data(SPANDATA.GEN_AI_TOOL_DESCRIPTION, tool_description)

if should_send_default_pii() and self.include_prompts:
set_data_normalized(
watched_span.span,
SPANDATA.GEN_AI_REQUEST_MESSAGES,
span,
SPANDATA.GEN_AI_TOOL_INPUT,
kwargs.get("inputs", [input_str]),
)
if kwargs.get("metadata"):
set_data_normalized(
watched_span.span,
SPANDATA.GEN_AI_REQUEST_METADATA,
kwargs.get("metadata"),
)

def on_tool_end(self, output, *, run_id, **kwargs):
# type: (SentryLangchainCallback, str, UUID, Any) -> Any
Expand All @@ -557,19 +560,18 @@ def on_tool_end(self, output, *, run_id, **kwargs):
if not span_data:
return
if should_send_default_pii() and self.include_prompts:
set_data_normalized(
span_data.span, SPANDATA.GEN_AI_RESPONSE_TEXT, output
)
set_data_normalized(span_data.span, SPANDATA.GEN_AI_TOOL_OUTPUT, output)
self._exit_span(span_data, run_id)

def on_tool_error(self, error, *args, run_id, **kwargs):
# type: (SentryLangchainCallback, Union[Exception, KeyboardInterrupt], UUID, Any) -> Any
"""Run when tool errors."""
# TODO(shellmayr): how to correctly set the status when the toolfails
# TODO(shellmayr): how to correctly set the status when the tool fails?
if run_id and run_id in self.span_map:
span_data = self.span_map[run_id]
if span_data:
span_data.span.set_status("unknown")

self._handle_error(run_id, error)


Expand Down
Loading