hermes - 💡(How to fix) Fix [Setup]: DingTalk adapter incompatible with dingtalk-stream 0.24.x (`_IncomingHandler` missing `raw_process`)

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…

The DingTalk platform adapter in hermes-agent==0.14.0 appears incompatible with dingtalk-stream==0.24.x.

Gateway startup succeeds and Stream Mode connects successfully, but incoming messages cannot be processed because _IncomingHandler does not implement the newer handler lifecycle expected by dingtalk-stream.

This causes the bot to appear online but never respond to messages.


Error Message

INFO tools.lazy_deps: Lazy-installing dingtalk-stream==0.24.3 alibabacloud-dingtalk==2.2.42 qrcode==7.4.2 for feature 'platform.dingtalk'

INFO gateway.platforms.dingtalk:
[Dingtalk] Connected via Stream Mode

INFO gateway.run:
✓ dingtalk connected

WARNING gateway.platforms.dingtalk:
[Dingtalk] Stream client error:
'_IncomingHandler' object has no attribute 'pre_start'

INFO gateway.platforms.dingtalk:
[Dingtalk] Reconnecting in 2s...

ERROR dingtalk_stream.client:
error processing message:
'_IncomingHandler' object has no attribute 'raw_process'

Root Cause

dingtalk-stream>=0.24 appears to have introduced additional callback lifecycle methods.

Current handler only implements:

class _IncomingHandler(ChatbotHandler):

    def pre_start(self):
        pass

    async def process(self, message):
        ...

However the SDK now invokes:

pre_start()
raw_process()
process()

Since _IncomingHandler does not implement raw_process, incoming events fail.

There may also be a threading issue because asyncio.create_task() is called inside SDK callbacks and could fail if the callback runs outside the gateway event loop.


Fix Action

Fix / Workaround

dingtalk_stream.client → message dispatch layer → handler.raw_process() not found

2026-05-22 08:05:58,421 INFO dingtalk_stream.client: open connection, url=https://api.dingtalk.com/v1.0/gateway/connections/open
2026-05-22 08:05:58,605 INFO dingtalk_stream.client: endpoint is {'endpoint': 'wss://wss-open-connection-union.dingtalk.com:443/connect', 'ticket': '10df525a-55b5-11f1-85b6-8a62bdfdb80d'}
2026-05-22 08:06:02,429 INFO gateway.run: kanban dispatcher: embedded in gateway (interval=60.0s)
2026-05-22 08:06:39,699 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:07:39,711 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:08:13,989 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:09:13,998 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:12:57,356 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:13:57,118 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'

Code Example

INFO tools.lazy_deps: Lazy-installing dingtalk-stream==0.24.3 alibabacloud-dingtalk==2.2.42 qrcode==7.4.2 for feature 'platform.dingtalk'

INFO gateway.platforms.dingtalk:
[Dingtalk] Connected via Stream Mode

INFO gateway.run:
✓ dingtalk connected

WARNING gateway.platforms.dingtalk:
[Dingtalk] Stream client error:
'_IncomingHandler' object has no attribute 'pre_start'

INFO gateway.platforms.dingtalk:
[Dingtalk] Reconnecting in 2s...

ERROR dingtalk_stream.client:
error processing message:
'_IncomingHandler' object has no attribute 'raw_process'

---

class _IncomingHandler(ChatbotHandler):

    def pre_start(self):
        pass

    async def process(self, message):
        ...

---

pre_start()
raw_process()
process()

---

def raw_process(self, callback_message):
    try:
        result = self.process(callback_message)

        if asyncio.iscoroutine(result):
            if self._loop and self._loop.is_running():
                asyncio.run_coroutine_threadsafe(
                    result,
                    self._loop,
                )
                return AckMessage.STATUS_OK, "OK"

        return result

    except Exception:
        logger.exception(
            "[%s] Error in raw_process",
            self._adapter.name,
        )
        return AckMessage.STATUS_SYSTEM_EXCEPTION, "error"

---

asyncio.create_task(
    self._safe_on_message(chatbot_msg)
)

---

if self._loop:
    asyncio.run_coroutine_threadsafe(
        self._safe_on_message(chatbot_msg),
        self._loop,
    )
else:
    asyncio.create_task(
        self._safe_on_message(chatbot_msg)
    )

---

### 1. Stream Connection Status

 id="dbg1"
[Dingtalk] Connected via Stream Mode
✓ dingtalk connected
Gateway running with 1 platform(s)


WebSocket connection is successfully established.

---

### 2. Message Processing Failure

 id="dbg2"
WARNING gateway.platforms.dingtalk:
'_IncomingHandler' object has no attribute 'pre_start'

ERROR dingtalk_stream.client:
error processing message:
'_IncomingHandler' object has no attribute 'raw_process'


---

### 3. Handler Implementation (Hermes 0.14.0)

Current `_IncomingHandler` implementation:

 id="dbg3"
class _IncomingHandler(ChatbotHandler):

    def pre_start(self) -> None:
        return

    async def process(self, message: CallbackMessage):
        ...


Missing method:

* `raw_process(self, callback_message)`

---

### 4. SDK Behavior (Observed)

From runtime behavior:


SDK invocation chain:
pre_start()
raw_process()
process()


Hermes only implements:

* pre_start ✔
* process ✔
* raw_process  (missing)

---

### 5. Failure Point

Failure occurs inside:


dingtalk_stream.client
→ message dispatch layer
→ handler.raw_process() not found


This causes the stream client to continuously reconnect and drop messages.

---

### 6. Runtime Impact

* WebSocket connects successfully
* No message is processed
* Bot remains silent despite receiving events
* Reconnect loop triggered after processing failure

---

2026-05-22 08:05:58,421 INFO dingtalk_stream.client: open connection, url=https://api.dingtalk.com/v1.0/gateway/connections/open
2026-05-22 08:05:58,605 INFO dingtalk_stream.client: endpoint is {'endpoint': 'wss://wss-open-connection-union.dingtalk.com:443/connect', 'ticket': '10df525a-55b5-11f1-85b6-8a62bdfdb80d'}
2026-05-22 08:06:02,429 INFO gateway.run: kanban dispatcher: embedded in gateway (interval=60.0s)
2026-05-22 08:06:39,699 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:07:39,711 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:08:13,989 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:09:13,998 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:12:57,356 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:13:57,118 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
RAW_BUFFERClick to expand / collapse

What's Going Wrong?

Summary

The DingTalk platform adapter in hermes-agent==0.14.0 appears incompatible with dingtalk-stream==0.24.x.

Gateway startup succeeds and Stream Mode connects successfully, but incoming messages cannot be processed because _IncomingHandler does not implement the newer handler lifecycle expected by dingtalk-stream.

This causes the bot to appear online but never respond to messages.


Environment

  • hermes-agent: 0.14.0
  • dingtalk-stream: 0.24.3
  • alibabacloud-dingtalk: 2.2.42
  • qrcode: 7.4.2
  • Python: (fill your version)
  • OS: (fill your environment)

Logs

INFO tools.lazy_deps: Lazy-installing dingtalk-stream==0.24.3 alibabacloud-dingtalk==2.2.42 qrcode==7.4.2 for feature 'platform.dingtalk'

INFO gateway.platforms.dingtalk:
[Dingtalk] Connected via Stream Mode

INFO gateway.run:
✓ dingtalk connected

WARNING gateway.platforms.dingtalk:
[Dingtalk] Stream client error:
'_IncomingHandler' object has no attribute 'pre_start'

INFO gateway.platforms.dingtalk:
[Dingtalk] Reconnecting in 2s...

ERROR dingtalk_stream.client:
error processing message:
'_IncomingHandler' object has no attribute 'raw_process'

Root Cause Analysis

dingtalk-stream>=0.24 appears to have introduced additional callback lifecycle methods.

Current handler only implements:

class _IncomingHandler(ChatbotHandler):

    def pre_start(self):
        pass

    async def process(self, message):
        ...

However the SDK now invokes:

pre_start()
raw_process()
process()

Since _IncomingHandler does not implement raw_process, incoming events fail.

There may also be a threading issue because asyncio.create_task() is called inside SDK callbacks and could fail if the callback runs outside the gateway event loop.


Proposed Fix

Add compatibility support for raw_process().

Example:

def raw_process(self, callback_message):
    try:
        result = self.process(callback_message)

        if asyncio.iscoroutine(result):
            if self._loop and self._loop.is_running():
                asyncio.run_coroutine_threadsafe(
                    result,
                    self._loop,
                )
                return AckMessage.STATUS_OK, "OK"

        return result

    except Exception:
        logger.exception(
            "[%s] Error in raw_process",
            self._adapter.name,
        )
        return AckMessage.STATUS_SYSTEM_EXCEPTION, "error"

Optional improvement:

Replace:

asyncio.create_task(
    self._safe_on_message(chatbot_msg)
)

with:

if self._loop:
    asyncio.run_coroutine_threadsafe(
        self._safe_on_message(chatbot_msg),
        self._loop,
    )
else:
    asyncio.create_task(
        self._safe_on_message(chatbot_msg)
    )

to avoid cross-thread event loop issues.


Expected Behavior

  • DingTalk Stream Mode connects successfully
  • Incoming messages are received and processed
  • Bot responds normally without reconnect loops

Thanks for maintaining Hermes Agent 🙌

Steps Taken

  1. Verified DingTalk Stream connection is successful

    • Log shows: Connected via Stream Mode and ✓ dingtalk connected
  2. Confirmed required dependencies are installed via lazy install

    • dingtalk-stream==0.24.3
    • alibabacloud-dingtalk==2.2.42
  3. Checked environment variables

    • DINGTALK_CLIENT_ID and DINGTALK_CLIENT_SECRET are correctly configured
  4. Observed that message delivery reaches stream client

    • WebSocket connection established successfully
  5. Identified failure occurs during message processing phase

    • Error: _IncomingHandler missing pre_start
    • Follow-up error: _IncomingHandler missing raw_process
  6. Attempted to validate SDK behavior manually

    • Confirmed dingtalk-stream 0.24.x expects raw_process() lifecycle hook
  7. Isolated root cause to handler compatibility mismatch between Hermes adapter and SDK version

Installation Method

Docker

Operating System

CentOS7

Python Version

Python: 3.13.5

Hermes Version

0.14.0

Debug Report

### 1. Stream Connection Status

 id="dbg1"
[Dingtalk] Connected via Stream Mode
✓ dingtalk connected
Gateway running with 1 platform(s)


WebSocket connection is successfully established.

---

### 2. Message Processing Failure

 id="dbg2"
WARNING gateway.platforms.dingtalk:
'_IncomingHandler' object has no attribute 'pre_start'

ERROR dingtalk_stream.client:
error processing message:
'_IncomingHandler' object has no attribute 'raw_process'


---

### 3. Handler Implementation (Hermes 0.14.0)

Current `_IncomingHandler` implementation:

 id="dbg3"
class _IncomingHandler(ChatbotHandler):

    def pre_start(self) -> None:
        return

    async def process(self, message: CallbackMessage):
        ...


Missing method:

* `raw_process(self, callback_message)`

---

### 4. SDK Behavior (Observed)

From runtime behavior:


SDK invocation chain:
pre_start()
→ raw_process()
→ process()


Hermes only implements:

* pre_start ✔
* process ✔
* raw_process ❌ (missing)

---

### 5. Failure Point

Failure occurs inside:


dingtalk_stream.client
→ message dispatch layer
→ handler.raw_process() not found


This causes the stream client to continuously reconnect and drop messages.

---

### 6. Runtime Impact

* WebSocket connects successfully
* No message is processed
* Bot remains silent despite receiving events
* Reconnect loop triggered after processing failure

Full Error Output

2026-05-22 08:05:58,421 INFO dingtalk_stream.client: open connection, url=https://api.dingtalk.com/v1.0/gateway/connections/open
2026-05-22 08:05:58,605 INFO dingtalk_stream.client: endpoint is {'endpoint': 'wss://wss-open-connection-union.dingtalk.com:443/connect', 'ticket': '10df525a-55b5-11f1-85b6-8a62bdfdb80d'}
2026-05-22 08:06:02,429 INFO gateway.run: kanban dispatcher: embedded in gateway (interval=60.0s)
2026-05-22 08:06:39,699 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:07:39,711 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:08:13,989 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:09:13,998 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:12:57,356 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'
2026-05-22 08:13:57,118 ERROR dingtalk_stream.client: error processing message: '_IncomingHandler' object has no attribute 'raw_process'

What I've Already Tried

  • Downgraded Hermes Agent to 0.13.0
  • After downgrading, DingTalk Stream mode works normally
  • No _IncomingHandler related errors occur in 0.13.0
  • Message processing and bot responses function as expected

This confirms the issue is introduced in 0.14.0 and is related to compatibility with dingtalk-stream>=0.24.x.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - 💡(How to fix) Fix [Setup]: DingTalk adapter incompatible with dingtalk-stream 0.24.x (`_IncomingHandler` missing `raw_process`)