Integración del plugin OpenClaw + QQ y retrospectiva de depuración ultra larga (proceso completo)
Nota: Esta retrospectiva está organizada según los pasos que se ejecutaron; se centra en registrar todo el flujo desde la integración, la depuración conjunta hasta la localización del problema central, así como cada conclusión clave.
I. Contexto y objetivos
El objetivo esta vez fue integrar OpenClaw en el canal de QQ (basado en NapCat + el plugin openclaw_qq) y lograr:
- Envío/recepción normal en chats privados y de grupo de QQ
- Enrutamiento de sesiones y registros visibles en la WebUI
- Estrategias controlables de administrador/lista negra (para evitar el abuso/robo de Token)
- La configuración puede guardarse de forma estable en la Control UI
II. Entorno y línea temporal (aproximada)
Según las marcas de tiempo de los logs del gateway, esta investigación cubrió varias fases, con una depuración continua de alta intensidad de varias horas (aprox. 4+ horas).
III. Flujo de trabajo principal (por fases)
1) Integración del canal QQ y depuración básica conjunta
Primero completé el despliegue básico del plugin QQ y NapCat:
- Instalar y habilitar el plugin
openclaw_qq - Desplegar NapCat con Docker
- Corregir el modo de conexión de NapCat a Forward WS Server (OpenClaw se conecta como cliente)
- Tras alinear el Token de OneBot y la cuenta, el estado del canal QQ volvió a
OK
2) Corrección de problemas de sesión y enrutamiento
Durante la depuración conjunta apareció el fenómeno de “la sesión de QQ se mezcla con la sesión principal/la de TG”; realicé una corrección del enrutamiento:
- Corregir el parseo de rutas de QQ group/direct
- Evitar que las escrituras de QQ sobrescriban los metadatos de la sesión principal
- Garantizar que las sesiones de QQ y TG puedan separarse y rastrearse
Resultado: la visibilidad de las sesiones de QQ en la WebUI mejoró significativamente.
3) Ajuste de la estrategia de contexto y mensajes duplicados
Para el problema de “QQ trae un historial muy largo cada vez y genera ruido”:
- Cambiar el valor por defecto de
historyLimita0 - Documentar claramente: por defecto se depende del sistema de sesiones de OpenClaw, no se fuerza el pegado del texto original del grupo
- Solo habilitar el pegado de historial cuando el usuario lo necesite explícitamente
Al mismo tiempo se corrigió la lógica relacionada con disparos duplicados y avisos repetidos:
- Ajustar el orden de comprobación de restricciones de administrador a: primero condiciones de disparo (@/palabra clave) y luego autorización
- Añadir enfriamiento/antirrebote a los avisos a no administradores (por defecto 10 segundos)
- Corregir el posible bucle de avisos en el escenario reply-to-bot
4) Mejora de capacidades de administrador/lista negra
Para evitar el abuso, añadí y reforcé capacidades:
adminOnlyChatnotifyNonAdminBlockednonAdminBlockedMessageblockedNotifyCooldownMs
La lógica de lista negra finalmente se confirmó como:
- Los mensajes de usuarios que coinciden con
blockedUsersse ignoran directamente (sin respuesta, sin aviso)
5) Control UI y problema de guardado de configuración (clave)
El problema más costoso y crítico fue:
- En la página
/config, con solo cambiar la lista blanca/negra de QQ, aún aparecíainvalid config - El error sin embargo apuntaba a
models.providers.*.models[0].maxTokens
Conclusión final tras localizar el origen:
/configguarda el paquete completo, no solo envíachannels.qq- Durante la validación del paquete completo, si cualquier campo es anómalo, falla todo el guardado
maxTokensse procesa erróneamente en ciertas rutas (se convierte a string / es afectado por la “línea roja”), causando que falle la validación del paquete completo- Por eso parece “cambiar el QQ provoca un error del modelo”, pero en esencia es “la validación del paquete completo arrastra a todos”
IV. Por qué parece que “cambiar el QQ arrastra a maxTokens”
En una frase: no es una relación de negocio, es una relación del mecanismo de guardado.
- Lo que se cambia es un campo de QQ
- Se dispara la escritura de toda la configuración
- En toda la configuración, el tipo del campo del modelo deriva (por ejemplo
maxTokenspasa a string / inválido) - La validación falla y el error burbujea al frontend
V. Acciones de sincronización del repositorio y local
Hice correcciones continuas en el repositorio del plugin y las envié varias veces, incluyendo:
- Corrección de la estrategia de administrador
- Corrección del enrutamiento de sesiones
- Ajuste del valor por defecto de la inyección de historial
- Mejora de compatibilidad del schema del frontend
- Refuerzo de la documentación (ejemplos en chino)
- Complemento de archivos de despliegue Docker de NapCat
- Ignorar directorios en tiempo de ejecución para evitar contaminar el repositorio
Al mismo tiempo, el .openclaw/extensions/qq local se mantuvo sincronizado con la rama principal remota.
VI. Sobre “¿modificando solo el plugin QQ se puede resolver por completo?”
Conclusión:
- Se puede resolver el comportamiento interno del plugin QQ y la mayoría de los problemas de usabilidad
- Pero no se puede corregir desde la capa del plugin el problema del enlace central de guardado del paquete completo en OpenClaw
- Porque la validación de
models.*pertenece al OpenClaw Core y no está dentro del alcance del plugin QQ
VII. Recomendaciones ejecutables (final)
Disponible a corto plazo (sin tocar el Core)
- Usar CLI para modificar la lista blanca/negra de QQ, evitando la ruta de guardado del paquete completo de
/config:
openclaw config set channels.qq.admins '\"1838552185\"' --json
openclaw config set channels.qq.blockedUsers '\"342571216\"' --json
openclaw gateway restart
Recomendación a medio plazo (solución de raíz)
- Esperar/seguir el arreglo oficial de OpenClaw para este tipo de issue (
maxTokens+ redaction + config save) - O enviar a los oficiales una reproducción mínima y un PR con parche
VIII. Lecciones
- Al depurar la página
/config, hay que pensar siempre en “validación del paquete completo”, no solo en el ítem modificado - Si la redacción (redaction) usa emparejamiento amplio (como
/token/i), puede dañar por errormaxTokens - En plugins de chat, el orden de autorización (primero disparo y luego autorización) es crucial; si no, genera ruido en el grupo
- El antirrebote y la deduplicación deben estar habilitados por defecto; de lo contrario, los problemas se amplifican rápidamente en chats grupales