Skip to main content

NapCat (QQ / OneBot 11) platform adapter for Hermes Agent

Project description

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

hermes_napcat-0.2.0.tar.gz (40.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

hermes_napcat-0.2.0-py3-none-any.whl (40.6 kB view details)

Uploaded Python 3

File details

Details for the file hermes_napcat-0.2.0.tar.gz.

File metadata

  • Download URL: hermes_napcat-0.2.0.tar.gz
  • Upload date:
  • Size: 40.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for hermes_napcat-0.2.0.tar.gz
Algorithm Hash digest
SHA256 a28f11cd14b5d593a6934ee7f77b84ff1a278c33af7ef0545bf9436c5644d96f
MD5 7f9a34c997271574c0329d604191410b
BLAKE2b-256 b0953485c6c1db563d09a0b3307e1ebc46bbd4b0185262e118c9c3c88f32dbbf

See more details on using hashes here.

File details

Details for the file hermes_napcat-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: hermes_napcat-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 40.6 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.5

File hashes

Hashes for hermes_napcat-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f66625ae698d47ce440590a21005f7504d4ee7000c9d808525511a47cd71d3a7
MD5 f63ad64c9d20893cc766ab0ec331c97e
BLAKE2b-256 270fffa304c69d93cd063ca48b2259fd24152d9856f9438631b475017cb29227

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page