Skip to content

TypeError in LoadSkillTool.run_async after session rewind: 'NoneType' object is not iterable #5193

@SAMFVH

Description

@SAMFVH

Bug Report

Description

LoadSkillTool.run_async crashes with TypeError: 'NoneType' object is not iterable after a session rewind when the skills feature is enabled.

Steps to Reproduce

  1. Enable the SKILL_TOOLSET experimental feature
  2. Run an agent session that activates a skill (populating _adk_activated_skill_{agent_name} in state)
  3. Rewind the session to a point before the skill was activated
  4. Continue the session and trigger a load_skill tool call

Root Cause

Runner._compute_state_delta_for_rewind (runners.py:716) sets state keys to None to mark them for deletion when they were added after the rewind point:

# runners.py:715-716
if key not in state_at_rewind_point:
    rewind_state_delta[key] = None

This sets _adk_activated_skill_{agent_name} to None. Later, LoadSkillTool.run_async does:

# skill_toolset.py:155
activated_skills = list(tool_context.state.get(state_key, []))

Since the key exists with value None, dict.get() returns None (not the default []), and list(None) raises TypeError.

Stack Trace

File ".../google/adk/tools/skill_toolset.py", line 155, in run_async
    activated_skills = list(tool_context.state.get(state_key, []))
TypeError: 'NoneType' object is not iterable

Suggested Fix

# skill_toolset.py:155
activated_skills = list(tool_context.state.get(state_key) or [])

This handles both missing keys and explicit None values. The same pattern should be applied to _resolve_additional_tools_from_state (line 742) for consistency, even though it currently doesn't crash due to the if not activated_skills guard on line 744.

Version

google-adk 1.3.0

Metadata

Metadata

Assignees

No one assigned

    Labels

    tools[Component] This issue is related to tools

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions