@chen_hu_hu/pi-qq
Connect pi to QQ private chats.
Package details
Install @chen_hu_hu/pi-qq from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@chen_hu_hu/pi-qq- Package
@chen_hu_hu/pi-qq- Version
1.4.1- Published
- Nov 4, 2026
- Downloads
- 1,396/mo · 1,396/wk
- Author
- chen_hu_hu
- License
- MIT
- Types
- extension
- Size
- 212.4 KB
- Dependencies
- 3 dependencies · 1 peer
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-qq
Connect pi to a QQ private chat. Send text, voice, images, or files from QQ; pi works on your machine and sends the result back.
Requirements
- Node.js 22.19 or newer, matching pi.
- A QQ bot application with C2C private messaging enabled.
- A working pi installation.
Install
pi install npm:@chen_hu_hu/pi-qq
For local development:
pi --extension /path/to/pi-qq
Login
- Start pi.
- Run
/qq-login. - Scan the QR code with mobile QQ.
Credentials are not written to pi-qq.json. Restarting pi requires scanning again. /qq-logout clears the credentials immediately.
Usage
Send a private message to the bot to start a task.
- Text: normal chat message.
- Voice: QQ's built-in ASR text is sent to pi. The audio is not downloaded or saved. If ASR returns no text, the bot asks you to resend or type it.
- Images and files: saved under
.pi/pi-qq/<sessionId>/uploads/. If the message has no instruction, pi waits for your next text or voice message.
QQ clients differ in mixed-message support. Mobile QQ usually sends one message type at a time; desktop QQ can send text with an image. When a client includes text or voice together with attachments, pi-qq processes them in the same prompt.
Attachments
An attachment-only message does not start pi. Files and images are saved, and pi waits for the next text or voice instruction.
- Send one or more files or images, then send a text or voice message describing what to do.
- The next instruction includes the saved attachment paths.
- Multiple attachments uploaded before the instruction are combined into one prompt.
- Images are read through pi's
readtool, so the current model must support image input to see them. /newclears attachments waiting for an instruction.- Uploads are scoped to the current pi session. Same filename and identical content reuse the existing file; same filename with different content becomes
name-1.ext; different filenames with identical content are kept separately.
Example prompt seen by pi:
# Attachments:
- .pi/pi-qq/<sessionId>/uploads/report.pdf
# User message:
Summarize this file.
Voice messages
Voice messages use QQ's built-in ASR (asr_refer_text). The transcript is sent to pi as normal user text; pi never receives the audio file.
- The voice attachment is not downloaded or saved as
.amr/.silk. - No local or external speech-to-text service is used.
- If QQ ASR returns no text, the bot replies
Could not transcribe this voice message; please resend or type it.and does not start a pi run. - Voice and text are separate QQ messages; send them one after another when needed.
- If a client sends files or images together with a voice message, they are processed with the transcript.
Debug logs include the raw asr_refer_text and attachment metadata when logLevel is set to debug.
Reply format
- Thinking: its own bubble, plain text, starting with
**💭 思考**. Long thinking may continue in a new bubble with the header repeated. - Tools: one bubble per call:
## <icon> <name>;bashcommands use abashcode block, other arguments use inline code, and results usetext,markdown,python,json, etc. depending on the tool and file type. - Regular messages: raw text with no header.
- Tool icons: 💻 bash, 📖 read, 📝 write, ✏️ edit, 🔎 grep, 🔍 search, 🗂️ find, 📁 ls, 📋 list, 🌐 web, 📡 fetch, 🗑️ delete, ❌ remove, ✅ todo, 🧪 test; unconfigured tools use 🔧.
- Error recovery: after a model error, automatic retry runs within 60 seconds keep pushing to the original QQ chat.
/stopwaits for active tools and streams to finish before replying.
Commands
Run these in the pi terminal:
| Command | Description |
|---|---|
/qq-login |
Log in with a QR code and bind the scanning QQ user |
/qq-status |
Show login, connection, model, context, and bound user |
/qq-logout |
Log out and clear credentials |
/qq-new |
Reset the current session (used by QQ /new) |
QQ-side commands:
| Command | Description |
|---|---|
/new |
Start a new pi session |
/stop |
Abort the current run |
/compact |
Compact the current context |
/status |
Show session and context status |
/last |
Push the last completed reply as a stream, or restart the current output |
/help |
Show command help |
Diagnostics
These terminal commands are intended for troubleshooting:
| Command | Description |
|---|---|
/qq-test-budget |
Show passive-reply budget and stream-bubble diagnostics |
/qq-test-md [text] |
Send a Markdown test message |
/qq-test-stream |
Run a streamed timeline diagnostic (resume for probe) |
Settings
Create ~/.pi/agent/pi-qq.json to override defaults. It stores settings only; credentials are never written to it.
{
"thinkingRelay": true,
"language": "zh-cn",
"logLevel": "silent"
}
| Key | Default | Description |
|---|---|---|
thinkingRelay |
true |
Relay thinking as plain text with a localized 💭 header |
deliverAs |
"steer" |
Queue new messages while busy: steer or followUp |
fileMaxSize |
52428800 |
QQ attachment download limit in bytes (50MB) |
language |
"zh-cn" |
UI and log language: zh-cn or en-us |
logLevel |
"silent" |
Log threshold: silent, error, warn, info, or debug |
Settings are read when a pi session starts; restart pi after editing the file. Unknown keys are ignored, and invalid values fall back to defaults with a warning.
When logging is enabled, logs are written to <cwd>/.pi/pi-qq/logs/pi-qq-YYYY-MM-DD.log. PI_QQ_LOG_DIR overrides the directory. info records metadata only; debug records full events, attachments, prompts, and tool payloads.
Development
npm ci
npm run lint
npm run typecheck
npm test
npm run format:check
The extension entrypoint is index.ts. Source modules are grouped by responsibility:
| Directory | Responsibility |
|---|---|
src/qq/ |
QQ bot lifecycle, login, inbound handling, replies |
src/relay/ |
Streamed thinking/tool/text relay |
src/attachments/ |
Attachment download, storage, and voice transcripts |
src/quota/ |
Passive reply budget |
src/infra/ |
Settings, logging, and display formatting |
Notes
- Only C2C (QQ private chat) is supported.
- Runs triggered by inbound QQ messages are relayed to QQ. Unrelated tasks started directly in pi stay local.
- Images are saved as files and read through pi's
readtool; the current model must support image input to see them. - Saved attachments are workspace-local under
.pi/; add.pi/to your own project.gitignoreif needed. - QQ limits passive replies per inbound message. Use
/qq-test-budgetto inspect the local budget. - Reading a
SKILL.mdis shown as a## 🧩 Skillblock with the skill name; the file content is not forwarded to QQ.
License
MIT