NousResearch/hermes-agent

LINE adapter inbound image message type mapping

Cluster 38235 · gateway. Data as of

Nothing open on GitHub. Fix merged in #39485 on 5 Jun 2026. Check it covers your case.

The short answer

0open issues
0open PRs
3items grouped
Known?
Yes. 3 related items grouped here, 1 issue already closed.
Fix event
A fix was merged to main in PR #39485. Check it covers your case. No release data is tracked.
Tracker
The maintainers' tracker marks this unresolved. That is separate from the fix event.
Still open
Nothing open on GitHub.

These issues and pull requests concern a bug where the LINE adapter incorrectly parses or classifies inbound image messages, and the associated fixes to map LINE message types to the correct internal MessageType.

Open issues0

No open issues.

Open PRs0

No open pull requests.

Fixes on record

Merged to main. A stamp counts the issues a fix is linked to.

  • #39485 fix(line): map inbound message types to the correct MessageType

    merged to main

    files: plugins/platforms/line/adapter.py, tests/gateway/test_line_plugin.py

    Show the diff
    • plugins/platforms/line/adapter.py
      @@ -133,6 +133,21 @@
       LINE_IMAGE_MAX_BYTES = 10 * 1024 * 1024  # 10 MB per LINE docs
       LINE_AV_MAX_BYTES = 200 * 1024 * 1024  # 200 MB for voice/video
       
      +# Map LINE webhook message types to the normalized MessageType the gateway
      +# routes on. LINE has no separate "voice" type — audio messages are recorded
      +# voice clips, so they map to VOICE (which the gateway sends through STT),
      +# mirroring how Telegram/WhatsApp classify voice notes. Anything unknown
      +# falls back to TEXT.
      +_LINE_MESSAGE_TYPES = {
      +    "text": MessageType.TEXT,
      +    "image": MessageType.PHOTO,
      +    "video": MessageType.VIDEO,
      +    "audio": MessageType.VOICE,
      +    "file": MessageType.DOCUMENT,
      +    "location": MessageType.LOCATION,
      +    "sticker": MessageType.STICKER,
      +}
      +
       # A 1×1 transparent PNG used as fallback video preview thumbnail when no
       # explicit preview is supplied — LINE requires ``previewImageUrl`` for
       # video messages. Sourced from the Python stdlib (no Pillow dependency).
      @@ -968,7 +983,7 @@ async def _handle_message_event(self, event: Dict[str, Any]) -> None:
       
               event_obj = MessageEvent(
                   text=text,
      -            message_type=MessageType.TEXT if msg_type == "text" else MessageType.IMAGE,
      +            message_type=_LINE_MESSAGE_TYPES.get(msg_type, MessageType.TEXT),
                   source=source_obj,
                   raw_message=event,
                   message_id=message_id,
    • tests/gateway/test_line_plugin.py
      @@ -641,3 +641,36 @@ def test_get_chat_info_infers_type_from_prefix(self, monkeypatch):
               assert asyncio.run(ad.get_chat_info("U123"))["type"] == "dm"
               assert asyncio.run(ad.get_chat_info("C123"))["type"] == "group"
               assert asyncio.run(ad.get_chat_info("R123"))["type"] == "channel"
      +
      +
      +# ---------------------------------------------------------------------------
      +# 9. Inbound message-type classification
      +# ---------------------------------------------------------------------------
      +
      +class TestMessageTypeMapping:
      +    """LINE webhook message types must map to the right normalized
      +    MessageType so the gateway routes media correctly (e.g. voice → STT,
      +    files → document handling). Regression guard for the old code that
      +    referenced the non-existent ``MessageType.IMAGE`` and collapsed every
      +    non-text message onto a single type."""
      +
      +    def test_image_event_not_attributeerror_regression(self):
      +        # The bug: MessageType.IMAGE doesn't exist on the enum.
      +        MessageType = _line.MessageType
      +        assert not hasattr(MessageType, "IMAGE")
      +
      +    def test_every_line_type_maps_to_correct_enum(self):
      +        MessageType = _line.MessageType
      +        mapping = _line._LINE_MESSAGE_TYPES
      +        assert mapping["text"] == MessageType.TEXT
      +        assert mapping["image"] == MessageType.PHOTO
      +        assert mapping["video"] == MessageType.VIDEO
      +        # LINE has no separate voice type — audio clips are voice notes.
      +        assert mapping["audio"] == MessageType.VOICE
      +        assert mapping["file"] == MessageType.DOCUMENT
      +        assert mapping["location"] == MessageType.LOCATION
      +        assert mapping["sticker"] == MessageType.STICKER
      +
      +    def test_unknown_type_falls_back_to_text(self):
      +        MessageType = _line.MessageType
      +        assert _line._LINE_MESSAGE_TYPES.get("flex", MessageType.TEXT) == MessageType.TEXT

1 PR closed without merging

From the close comments: merged via another change 1

  • #38528 fix(line): classify image messages as photos · merged via another change → 7309f3b, #39485
Closed issues · 1
  • Closed#38235[Bug]: LINE adapter can't parse image messages
How this cluster was grouped
  • Link evidence (structural links throughout): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
  • Pairwise link density 0.67: the share of item pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. 1.00 means every pair is linked.

Pick up a Lab task

Check whether a fix covers the open issues here, with your own agent. Bring back evidence for maintainers.

Open the Lab

At a glance

Subsystem
gateway
Merged PRs
#39485
Closed issues
1
Attempts
1 PR closed without merging
Fix link checked
5 Jun 2026

For your agent

The same facts, typed.