Skip to main content

hermes-napcat

NapCat (QQ / OneBot 11) adapter for Hermes Agent

PyPI Python License

English · 中文

Connect Hermes to QQ via NapCat's OneBot 11 reverse WebSocket. Chat with your AI assistant in any QQ group or DM, with full group management and admin controls.

QQ App ──── NapCat ──WS──▶ hermes-napcat ──▶ Hermes (LLM)
                                │                  │
                                └─────HTTP API ◀───┘
                               (port 18801)   (port 18800)

Features

  • Group & DM — @mention in groups; direct message for private chats
  • Shared group sessions — whole group shares one context; sender names auto-prefixed
  • Admin system — restrict management commands to a configurable QQ number list
  • 48 QQ tools — messaging, group management, files, OCR, reactions, and more
  • Media support — images, voice (→ WAV via ffmpeg), video, file upload/download
  • Quoted message context — replies carry the quoted content automatically
  • One-command setup — interactive wizard installs and configures everything

Requirements

  • Python 3.11+
  • Hermes Agent (source install)
  • NapCat with HTTP API + reverse WS enabled
  • aiohttp >= 3.9
  • ffmpeg (optional, for voice transcription)

Quick Start

1. Install

pip install hermes-napcat

2. Setup

hermes-napcat setup

The wizard patches Hermes Agent, writes the NapCat config, updates ~/.hermes/config.yaml, and asks for your QQ number and admin list.

To also download and install NapCat automatically:

hermes-napcat setup --with-napcat

Non-interactive (CI / scripts):

hermes-napcat setup --qq 123456789 --admins "123456789,987654321" --with-napcat

3. Start NapCat

hermes-napcat napcat start

The QR code prints directly in your terminal — scan it with the QQ app. On subsequent starts NapCat auto-logins from cached session, no QR needed.

4. Start Hermes Gateway

nohup hermes gateway run > /tmp/hermes-gateway.log 2>&1 &

Configuration

~/.hermes/config.yaml:

platforms:
  napcat:
    enabled: true
    extra:
      http_api: "http://127.0.0.1:18801"   # NapCat HTTP API
      access_token: ""                      # Bearer token (if set in NapCat)
      self_id: "123456789"                  # Bot QQ number
      ws_port: 18800                        # Reverse WS listen port
      dm_policy: open                       # open | allowlist | disabled
      allow_from: []                        # QQ numbers allowed for DMs
      admins:                               # Can use management commands
        - "123456789"

platform_toolsets:
  napcat:
    - hermes-cli
    - hermes-napcat

group_sessions_per_user: false              # Whole group shares one session

NapCat config

~/Napcat/opt/QQ/resources/app/app_launcher/napcat/config/onebot11.json:

{
  "network": {
    "httpServers": [{
      "name": "httpServer",
      "enable": true,
      "port": 18801,
      "host": "0.0.0.0",
      "enableCors": true,
      "enableWebsocket": true,
      "messagePostFormat": "array",
      "token": "",
      "debug": false
    }],
    "websocketClients": [{
      "name": "HermesWs",
      "enable": true,
      "url": "ws://127.0.0.1:18800",
      "messagePostFormat": "array",
      "reportSelfMessage": false,
      "reconnectInterval": 5000,
      "token": "",
      "debug": false,
      "heartInterval": 30000
    }],
    "websocketServers": [],
    "httpSseServers": []
  }
}

Admin System

Set admins in config to restrict who can use management commands:

admins:
  - "123456789"

If admins is empty, all users can call any tool (open mode).

Permission levels

Operation Regular user Admin
Search, queries, code, read files ✅ ✅
QQ management (mute, kick, set admin…) ❌ ✅
Destructive system operations ❌ ⚠️ confirmation required

Destructive or irreversible admin actions always require explicit confirmation before execution.

Admin-only QQ tools: kick, mute, set admin, rename group, whole-group ban, leave group, set portrait, set special title, set/delete essence messages, publish/delete notices, delete group files, handle friend/group requests, delete friend.


Available Tools

Category Tools
Messaging qq_send_message, qq_recall_message, qq_set_msg_emoji_like, qq_forward_message, qq_send_group_forward_msg, qq_send_private_forward_msg, qq_mark_msg_as_read
History qq_get_group_msg_history, qq_get_friend_msg_history, qq_get_essence_msg_list, qq_set_essence_msg, qq_delete_essence_msg
User & Friends qq_get_user_info, qq_get_friend_list, qq_like_user, qq_poke, qq_set_friend_remark, qq_delete_friend, qq_handle_friend_request
Group Info qq_get_group_info, qq_get_group_list, qq_get_group_member_info, qq_get_group_member_list, qq_get_group_honor_info, qq_get_group_at_all_remain
Group Management qq_mute_group_member, qq_kick_group_member, qq_set_group_admin, qq_set_group_name, qq_set_group_card, qq_set_group_whole_ban, qq_set_group_special_title, qq_leave_group, qq_set_group_sign, qq_set_group_remark, qq_set_group_portrait, qq_handle_group_request
Notices qq_send_group_notice, qq_get_group_notice, qq_delete_group_notice
Files qq_upload_file, qq_get_group_root_files, qq_get_group_file_url, qq_create_group_file_folder, qq_delete_group_file, qq_download_file
Misc qq_ocr_image, qq_translate_en2zh

How It Works

  1. NapCat dials out to ws://127.0.0.1:18800 (reverse WebSocket)
  2. hermes-napcat receives the OneBot 11 event, extracts text/media, checks DM/group policy, prefixes sender name in group messages
  3. Hermes Agent processes the message with full tool access
  4. Response is sent back via NapCat's HTTP API at http://127.0.0.1:18801

Session isolation

Chat type Session key
Private (DM) One session per QQ user
Group (group_sessions_per_user: false) One session per group
Group (group_sessions_per_user: true) One session per user per group

CLI Reference

Command Description
hermes-napcat setup Interactive setup wizard
hermes-napcat setup --with-napcat Also download and install NapCat
hermes-napcat install Patch Hermes Agent only
hermes-napcat uninstall Remove patches + NapCat (default: both)
hermes-napcat uninstall --hermes-only Remove Hermes patches only
hermes-napcat uninstall --napcat-only Remove NapCat binary only
hermes-napcat status Show installation status
hermes-napcat napcat start Start NapCat (screen session)
hermes-napcat napcat stop Stop NapCat
hermes-napcat napcat status Show NapCat process status
hermes-napcat restart Restart NapCat + Hermes Gateway
hermes-napcat systemd install Create and enable systemd services
hermes-napcat systemd remove Remove systemd services

Uninstall

hermes-napcat uninstall                  # Remove everything
hermes-napcat uninstall --hermes-only    # Keep NapCat, remove Hermes patches
hermes-napcat uninstall --napcat-only    # Keep Hermes patches, remove NapCat
hermes-napcat uninstall --keep-data      # Keep QQ session data

Systemd (auto-start on reboot)

hermes-napcat systemd install    # creates napcat.service + hermes-gateway.service
hermes-napcat systemd remove

Troubleshooting

Symptom Cause Fix
Bot not responding in group Not @-mentioned @mention the bot in group messages
ECONNREFUSED 127.0.0.1:18800 Gateway not running hermes gateway run
403 unsupported_user_agent API provider blocks SDK user-agent See Provider Notes
KeyError: 'napcat' platforms.py not patched Re-run hermes-napcat install
Unauthorized user on all messages run.py auth bypass missing Re-run hermes-napcat install
Permission denied: only admins Sender not in admins list Add QQ to admins, or set admins: []
NapCat QR code not showing Startup timeout tail -f /tmp/napcat.log or screen -r napcat

Notes for specific providers

Some API providers block the OpenAI SDK's default AsyncOpenAI/Python X.X.X user-agent. In ~/.hermes/hermes-agent/run_agent.py, inside _apply_client_headers_for_base_url, add before the else branch:

elif "your-provider.com" in normalized:
    self._client_kwargs["default_headers"] = {
        "User-Agent": "codex_cli_rs/0.0.0",
        "originator": "codex_cli_rs"
    }

Apply the same change at the second location (~line 1176) and in agent/auxiliary_client.py.


Contributors

Avatar Name Role
shubyi shubyi Creator & Maintainer

License

MIT

Release files for hermes-napcat 0.2.10

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for hermes-napcat 0.2.10
File Size Uploaded
hermes_napcat-0.2.10.tar.gz 42.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for hermes-napcat 0.2.10
File Interpreter ABI Platform
hermes_napcat-0.2.10-py3-none-any.whl Python 3 none any Details

Total release size: 85.6 kB

Release files / hermes_napcat-0.2.10.tar.gz

Download URL hermes_napcat-0.2.10.tar.gz
Size 42.7 kB
Tags Source
SHA-256 checksum
How to use checksums
14504a3d6f873b2583282674f618c7767bfec06008d29a0e22e7e3102b112706
BLAKE2b-256 checksum
How to use checksums
50fb27a5554774810c2068032c5ebde49e882296c36eaf33507e18be5bcf1286
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release files / hermes_napcat-0.2.10-py3-none-any.whl

Download URL hermes_napcat-0.2.10-py3-none-any.whl
Size 42.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3d21dc39cbbb4aaac5bfd6b9e41fb03fd0acbaee190cfd9744690812fc422267
BLAKE2b-256 checksum
How to use checksums
a0f6eed1a59e5ef3346577eeee5267fda2e66335956a46679926b223d45fbf06
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.13.5

Release history Release notifications | RSS feed

This release

0.2.10 This release

2 release files

0.2.9

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

0.2.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page