langchain-ai/deepagents · error · TypeError

Unsupported hook event: {type(event).__name__}

Error message

Unsupported hook event: {type(event).__name__}

What it means

`_project_event` is a singledispatch projector in `libs/code/deepagents_code/hooks/projection.py` that converts internal `HookDomainEvent` objects into wire-format inputs for external hook processes. If no registered handler matches the event's concrete type, the fallback raises `TypeError`, indicating an internal invariant was violated: an event type reached hook projection that the library does not know how to serialize.

Source

Thrown at libs/code/deepagents_code/hooks/projection.py:110

    payload = HOOK_WIRE_INPUT_ADAPTER.dump_python(
        result,
        mode="json",
        by_alias=True,
        exclude_none=True,
    )
    return HOOK_WIRE_INPUT_ADAPTER.validate_python(payload)


@singledispatch
def _project_event(
    event: HookDomainEvent,
    _invocation: HookInvocation,
    _transcript_path: Path,
    _agent_transcript_path: Path | None,
) -> HookWireInput:
    msg = f"Unsupported hook event: {type(event).__name__}"
    raise TypeError(msg)


@_project_event.register(SessionStartEvent)
def _project_session_start(
    event: SessionStartEvent,
    invocation: HookInvocation,
    transcript_path: Path,
    _agent_transcript_path: Path | None,
) -> HookWireInput:
    return SessionStartWireInput(
        **_base_fields(invocation, transcript_path),
        hook_event_name=HookEvent.SESSION_START,
        source=event.cause,
        model=event.model,
    )


@_project_event.register(UserPromptSubmitEvent)

View on GitHub (pinned to a1af029e6e)

Solutions

  1. Use one of the supported event types (e.g. `SessionStartEvent`, `SubagentStopEvent`) instead of a custom class
  2. Register a projector with `@_project_event.register(MyEvent)` returning a `HookWireInput`
  3. Align library versions so the event type and its projector come from the same release

Example fix

// before
project_hook_input(MyCustomEvent(), invocation, transcript, agent_transcript)
// after
@_project_event.register
 def _project_custom(event: MyCustomEvent, ...) -> HookWireInput: ...
Defensive patterns

Strategy: type-guard

Validate before calling

if not isinstance(event, SUPPORTED_HOOK_EVENTS):
    raise TypeError(f"cannot project event: {type(event).__name__}")

Type guard

from typing import TypeGuard
from deepagents_code.hooks.events import HookDomainEvent
SUPPORTED = (SessionStartEvent, SubagentStopEvent, SubagentStartEvent)  # as applicable

def is_projectable(e: HookDomainEvent) -> TypeGuard[SessionStartEvent | SubagentStopEvent]:
    return isinstance(e, SUPPORTED)

Try / catch

try:
    wire = project_hook_input(event, invocation, transcript, agent_transcript)
except TypeError as e:
    logger.warning("skipping unprojectable hook event: %s", e)

Prevention

When it happens

Trigger: Calling `project_hook_input` with a `HookDomainEvent` subclass that has no `@_project_event.register` handler — typically a custom/unknown event class or an event added in a newer library version than the projector table.

Common situations: Passing hand-constructed or mocked domain events into the hook pipeline in tests; running hook code against a mismatched deepagents version where a new event type exists but projection support doesn't; subclassing `HookDomainEvent` to inject custom events.

Related errors


AI-assisted analysis of langchain-ai/deepagents@a1af029e6e (2026-08-29). Data as JSON: /api/errors/a4abdb9005fffc2f. Report an issue: GitHub.