120120_GEN_AI_AGENT_NAME = "gen_ai.agent.name"
121121_GEN_AI_AGENT_TYPE = "gen_ai.agent.type"
122122_GEN_AI_AGENT_DESCRIPTION = "gen_ai.agent.description"
123+ _LANGGRAPH_RUN_NAME = "LangGraph"
123124
124125# ---------------------------------------------------------------------------
125126# _RunData — per-run bookkeeping
@@ -162,6 +163,11 @@ def _should_capture_chain_content() -> bool:
162163 return False
163164
164165
166+ def _span_start_context (parent_ctx : Context | None ) -> Context :
167+ """Use an empty context when no LangChain parent was resolved."""
168+ return parent_ctx if parent_ctx is not None else Context ()
169+
170+
165171# ---------------------------------------------------------------------------
166172# LoongsuiteTracer
167173# ---------------------------------------------------------------------------
@@ -326,7 +332,10 @@ def _handle_llm_start(self, run: Run) -> None:
326332 tool_defs = _extract_tool_definitions (run )
327333 if tool_defs :
328334 invocation .tool_definitions = tool_defs
329- self ._handler .start_llm (invocation , context = parent_ctx )
335+ self ._handler .start_llm (
336+ invocation ,
337+ context = _span_start_context (parent_ctx ),
338+ )
330339 rd = _RunData (
331340 run_kind = "llm" ,
332341 span = invocation .span ,
@@ -425,7 +434,7 @@ def _resolve_langgraph_agent_name(self, run: Run) -> str:
425434 over the generic default.
426435 """
427436 name = run .name or ""
428- if not _has_langgraph_react_metadata (run ) or name != "LangGraph" :
437+ if not _has_langgraph_react_metadata (run ) or name != _LANGGRAPH_RUN_NAME :
429438 return name
430439
431440 parent_id = getattr (run , "parent_run_id" , None )
@@ -474,7 +483,10 @@ def _start_agent(self, run: Run) -> None:
474483 agent_name = agent_name ,
475484 input_messages = input_messages ,
476485 )
477- self ._handler .start_invoke_agent (invocation , context = parent_ctx )
486+ self ._handler .start_invoke_agent (
487+ invocation ,
488+ context = _span_start_context (parent_ctx ),
489+ )
478490 _enrich_deepagents_agent_span (invocation .span , run )
479491 rd = _RunData (
480492 run_kind = "agent" ,
@@ -494,7 +506,7 @@ def _start_chain(self, run: Run) -> None:
494506 span = self ._tracer .start_span (
495507 name = f"chain { run .name } " ,
496508 kind = SpanKind .INTERNAL ,
497- context = parent_ctx ,
509+ context = _span_start_context ( parent_ctx ) ,
498510 )
499511
500512 span .set_attribute (GEN_AI_OPERATION_NAME , "chain" )
@@ -640,7 +652,10 @@ def _on_tool_start(self, run: Run) -> None:
640652 tool_call_arguments = input_str ,
641653 tool_call_id = tool_call_id ,
642654 )
643- self ._handler .start_execute_tool (invocation , context = parent_ctx )
655+ self ._handler .start_execute_tool (
656+ invocation ,
657+ context = _span_start_context (parent_ctx ),
658+ )
644659 rd = _RunData (
645660 run_kind = "tool" ,
646661 span = invocation .span ,
@@ -701,7 +716,10 @@ def _on_retriever_start(self, run: Run) -> None:
701716 query = inputs .get ("query" ) or ""
702717
703718 invocation = RetrievalInvocation (query = query )
704- self ._handler .start_retrieval (invocation , context = parent_ctx )
719+ self ._handler .start_retrieval (
720+ invocation ,
721+ context = _span_start_context (parent_ctx ),
722+ )
705723 rd = _RunData (
706724 run_kind = "retriever" ,
707725 span = invocation .span ,
@@ -877,11 +895,14 @@ def _is_task_tool_span(span: Span | None) -> bool:
877895
878896
879897def _is_deepagents_subagent_candidate (run : Run ) -> bool :
898+ """Detect deepagents subagent roots, preserving explicit metadata first."""
880899 metadata = getattr (run , "metadata" , None ) or {}
881900 if not isinstance (metadata , Mapping ):
882901 return False
883902 if metadata .get ("ls_agent_type" ) == "subagent" :
884903 return True
904+ if getattr (run , "name" , None ) != _LANGGRAPH_RUN_NAME :
905+ return False
885906 return (
886907 metadata .get ("ls_integration" ) == "deepagents"
887908 and _is_task_tool_span (get_current_span ())
0 commit comments