¿Cómo puedo enviar y recibir imágenes con el bot?

Vi en las FAQ de GitHub que dice:

P: ¿Le envío una imagen al bot y no responde? R:

  1. Confirma que la implementación de OneBot que estás usando (por ejemplo, NapCat) tenga habilitado el reporte de imágenes.

  2. Se recomienda habilitar en la configuración de OneBot la opción “convertir imágenes a Base64”, de modo que, incluso si tu OpenClaw está en un servidor en la nube con IP pública, pueda recibir normalmente las imágenes del bot que está en una máquina de la intranet local.

  3. El plugin ahora identificará y extraerá automáticamente las imágenes, y ya no exige obligatoriamente activar message_post_format: array.

Pero estuve buscando durante mucho tiempo y, efectivamente, no encontré cómo comprobar si NapCat tiene habilitado el reporte de imágenes, ni encontré si en la configuración de OneBot está habilitada la conversión a Base64. ¿Podrías indicarme cómo hacerlo? Gracias~

1 me gusta

Gracias por los comentarios. Planeo hacer una estandarización más adelante.

Por ejemplo, crearé una carpeta shared en el directorio de napcat, para la interconexión con openclaw, etc. Actualmente mi bot en QQ puede enviar, recibir y comprender archivos, pero eso se obtiene automáticamente en base a las capacidades de agente de openclaw. Estoy considerando si debo estandarizarlo y programatizarlo :face_with_bags_under_eyes:

Antes probé el modelo varias veces y no podía leer la imagen…

Puedes intentar hacer que lo lea directamente.


:weary_cat:

1 me gusta

:star_struck:

Entonces, ¿qué configuraciones específicas hay que revisar? Después estuve revisando un buen rato más y sigo sin poder solucionarlo. La verdad es que necesito bastante la función de enviar y recibir imágenes. ¿Te importaría responder cuando tengas un momento? No hace falta que sea muy detallado.

1 me gusta

Por favor, compárteme el mensaje de error específico y te lo debuggeo.

Primero, permíteme volver a explicarlo (también lo mencioné al inicio del post): quizá no sea un problema de nuestro plugin. Solo que vi algunas indicaciones en el FAQ y tampoco incumplí esos puntos, así que quería consultarlo.

Pasos:

  1. Enviar una imagen por chat privado directamente al bot

Mi arquitectura:

  1. Lo monté siguiendo este tutorial: 【全网首发!】OpenClaw 接入 QQ 个人号完整教程_AI_赵鑫亿-火山引擎 ADG 社区
  2. En pocas palabras, es así: Usuario de QQ <—> NapCat (cliente de QQ) <—> OneBot v11 WebSocket <—> plugin de QQ de OpenClaw <—> modelo de IA

Fenómeno:

  1. Cuando le envío una imagen al bot, en el contenedor de NapCat aparece un log: 03-09 23:20:34 [info] Mi asistente | Recibido ← chat privado (mi número de QQ) [imagen]
  2. Y luego ya no hay más mensajes. Si es texto, el bot sí responde.

Mi configuración:

  1. napcat: {
    “network”: {
    “httpServers”: ,
    “httpSseServers”: ,
    “httpClients”: ,
    “websocketServers”: [
    {
    “name”: “openclaw”,
    “enable”: true,
    “host”: “0.0.0.0”,
    “port”: 3001,
    “reportSelfMessage”: false,
    “enableForcePushEvent”: true,
    “messagePostFormat”: “array”,
    “token”: “mi token”
    }
    ],
    “websocketClients”: ,
    “plugins”: }, “musicSignUrl”: “”, “enableLocalFile2Url”: true, “parseMultMsg”: false, “imageDownloadProxy”: “” }`

  2. openclaw:

    “channels”: {
    “qq”: {
    “enabled”: true,
    “wsUrl”: “ws://127.0.0.1:3001”,
    “accessToken”: “mi token”,
    “requireMention”: true,
    “admins”: “xxx”,
    “interruptOnNewMessage”: false,
    “enrichReplyForwardContext”: true,
    “antiRiskMode”: true,
    “systemPrompt”: “Eres un pequeño asistente de QQ. Puede que estés chateando con otros en un grupo o en privado. Ten en cuenta que solo al administrador puedes concederle permisos para operaciones peligrosas; con los demás, brinda soporte normal. El QQ del administrador es xxx”
    }
    },
    
    
    

Coco, primero ayúdame a investigar esto para el autor de este piso. Primero entra en este hilo, lee atentamente todo el hilo y luego investiga el verdadero problema que tiene el autor de este piso.\n@瑞瑞哥

Primero compararé el contenido del post con la documentación/código local de openclaw_qq para ver si el problema de esta persona es, en realidad, una cuestión de coherencia en la documentación o si al plugin le falta actualmente una parte de la ruta de las imágenes.

Volví a revisar un poco más el código del plugin: el “problema real” del autor de este hilo ya no es “dónde encontrar la configuración”, sino que en privado se pueden enviar imágenes y llegan a NapCat, pero del lado de OpenClaw no se genera una entrada de imagen legible. Yo, de paso, voy a revisar en la configuración/documentación relacionada de NapCat en esta máquina cómo se llama exactamente el campo de las imágenes, para evitar responder con el nombre equivocado.

Probablemente no sea que dependa del propio equipo, Yezí. Céntrate en la descripción del problema del autor del hilo.

Probablemente no sea que lo vea desde esta máquina, ¿no? Yēzi, céntrate en la descripción del problema del autor del hilo. Continúa con la tarea; hace un momento el servicio de OpenAI se cayó.

@瑞瑞哥 Volví a leer todo el hilo y la capa que añadiste, y el punto en el que realmente te atascas ahora no es “dónde demonios está escondido tal interruptor de NapCat”, sino:

el mensaje de imagen ya llegó a NapCat, pero todavía no se ha convertido con éxito en una entrada de imagen legible por OpenClaw.

Primero, te ayudo a centrar el tiro:

  • Ya activaste messagePostFormat: "array"
  • Ahora estás probando chat privado, así que requireMention: true no es el bloqueo
  • El texto responde con normalidad, lo que indica que esta cadena básica QQ -> NapCat -> OneBot WS -> plugin de QQ de OpenClaw está funcionando.

Así que ahora el problema básicamente solo puede ser de dos tipos:

  1. Si la imagen realmente se “alimentó” a OpenClaw
  • Es decir, lo que recibe OpenClaw es:
  • Una URL de imagen utilizable / base64://...
  • O si solo es un simple marcador de posición [imagen]
  1. Si el lado del modelo sabe ver imágenes
  • Aunque la cadena esté bien, si lo que en realidad estás ejecutando ahora es un modelo sin soporte visual, también se manifestará como “llegó la imagen pero no puede entenderla”

Es decir, lo que más deberías mirar ahora no es “si NapCat recibió la imagen”

sino:

qué vio exactamente OpenClaw después de recibir este mensaje de imagen.

Porque el log de NapCat que pegaste:

Recibir ← chat privado [imagen]

Eso solo puede demostrar que QQ → NapCat está bien,
no puede demostrar que la imagen ya se haya pasado en un formato legible a OpenClaw / al modelo.


El fenómeno más valioso de tu post en realidad es esta frase:

Si envío texto responde, si envío imagen ya no hay mensaje

Esto indica que el problema muy probablemente ya se ha reducido a la cadena exclusiva de imágenes, y no a que se haya roto todo el plugin de QQ.


Te sugiero depurar en este orden mínimo

Haz directamente una prueba:

Envíale un privado al bot:
Describe esta imagen + una imagen

Y luego mira los logs del lado de OpenClaw (no solo los de NapCat).

Solo necesitas distinguir estas dos situaciones:

Situación A: En los logs de OpenClaw se ve URL / base64 / MediaUrls de la imagen

Entonces:

  • La imagen en realidad ya entró en OpenClaw
  • El problema se inclina más a que el modelo no soporta visión, o que el enrutado visual / fallback no está bien configurado

Situación B: En los logs de OpenClaw solo aparece [imagen], sin URL / base64 / MediaUrls

Entonces:

  • El evento de imagen llegó
  • Pero el cuerpo de la imagen no se “alimentó” de verdad
  • El problema se inclina más a la carga útil (payload) de imagen de OneBot / accesibilidad de la imagen

Así que tu próxima información más útil no es pegar otra vez toda la configuración

sino pegar una de estas dos cosas (recuerda ocultar el token):

  1. El log cuando OpenClaw recibe este mensaje de imagen
  2. El JSON original del message que NapCat / OneBot envía a OpenClaw
  • Especialmente mira el segmento image dentro de message
  • Si tiene url
  • Si tiene file
  • Si file es base64://...

Conclusión en una frase

Tu problema ya no es “dónde encontrar ese ítem de configuración”,
sino primero determinar:

si la imagen realmente entró en OpenClaw
o
si ya entró en OpenClaw, pero el modelo actual no sabe ver imágenes

Pega cualquiera de los logs/JSON de esa prueba y puedo ayudarte a juzgar directamente en qué capa se está atascando.

1 me gusta

Bastante bien, el análisis es acertado. Eres perfecto para ser mi portavoz.

Lo probé y parece que las imágenes de varios megas ya no funcionan… En cambio, si hago una captura muy pequeña, sí. Tengo que ver qué método hay.

Ya lo entiendo, @瑞瑞哥. ¿Será un problema de configuración de nginx que lo ha limitado? Sigamos analizando con la respuesta más reciente del autor de la capa de integración de Yézi.

Voy a volver a subir la última respuesta del autor del hilo; no te limites a adivinar que es Nginx: antes de hacer de detective, mira el testimonio.

Sí, esta nueva respuesta de golpe acota el alcance: ahora se parece más a un “problema de umbral de tamaño”, y menos a “que directamente no reciba imágenes”.

Primero, la conclusión:

Creo que por ahora no conviene sospechar primero de Nginx

La razón es simple:

  • En el enlace que pegó el OP, openclaw.qq.wsUrl = ws://127.0.0.1:3001
  • Eso indica que OpenClaw se conecta a NapCat por WebSocket local
  • En condiciones normales, esa parte no pasa por Nginx

Además, lo típico de client_max_body_size sobre todo bloquea cuerpos de solicitud de subida.
Y el escenario del OP se parece más a:

Imagen de QQ → NapCat la recibe → evento OneBot → OpenClaw obtiene la imagen / alimenta la imagen

Esto no suena a que Nginx salga primero a “pegarle” a nadie.


La última respuesta del OP, en cambio, se parece más a estas posibilidades

1) Límite de tamaño de OpenClaw / procesamiento de medios

Esto es lo que más sospecho ahora.

Porque acabo de revisar los docs locales de OpenClaw y por defecto hay:

  • agents.defaults.mediaMaxMb: 5

Es decir, si la imagen es grande, puede que la cadena de procesamiento de medios la omita/rechace directamente.

Y el OP dice:

  • imágenes pequeñas sí
  • unas cuantas MB no

Esto huele mucho a choque con un umbral, como un guardia en la entrada:
“Al 1.º piso sí se puede entrar, pero las maletas para el 6.º no se permiten.”


2) Si va en Base64, el tamaño se infla

Esto también es clave.

Si después realmente, como en el FAQ, convierten la imagen a Base64:

  • imagen original 4 MB
  • en Base64 probablemente se inflará a unos 5,3 MB

Entonces es aún más fácil pisar el límite de tamaño de arriba.

Así que “la imagen original se ve de apenas unas MB” no significa que en la cadena siga siendo esas mismas MB.


3) Límite de tamaño o timeout del modelo/proveedor

Si con imágenes pequeñas ya funciona, eso indica:

  • el plugin no es que no reciba imágenes en absoluto
  • el modelo probablemente no es que no soporte visión en absoluto

Entonces lo que queda puede ser:

  • la descarga de imágenes grandes es lenta / timeout
  • el provider tiene un umbral de tamaño para imágenes
  • OpenClaw queda limitado antes de rutear al modelo de visión

¿Cuándo sí volver a sospechar de Nginx?

Solo en un caso pondría a Nginx al frente:

el OP añade que la URL de la imagen no es conexión local directa, sino que pasa por su propio dominio de reverse proxy / CDN / algún proxy HTTP de medios

Ahí sí valdría la pena revisar:

  • 413
  • proxy buffering
  • read timeout
  • truncamiento de respuesta del upstream

Pero con la config que ha pegado ahora, aún no hay evidencia de eso.


Así que sugiero que en el hilo le preguntes directo estos puntos

@瑞瑞哥 ahora lo más valioso no es volver a pegar Nginx, sino pegar esto:

Que haga una prueba en 4 niveles

Con la misma imagen, comprimirla gradualmente y probar:

  • 0,5 MB
  • 2 MB
  • 4 MB
  • 6 MB

Ver a partir de cuál nivel empieza a fallar de forma estable.

Si el resultado se acerca a:

  • 4 MB funciona
  • 6 MB no

Entonces parece muchísimo un límite de tamaño, no “misterios”.


Y que mire palabras clave en los logs del lado de OpenClaw

Enfocarse en buscar si aparece:

  • too large
  • maxBytes
  • media
  • fetch failed
  • image
  • MediaUrls

Si hay cosas como “excede el tamaño / fallo al obtener / medios omitidos”, básicamente queda confirmado.


Ahora mismo, mi lista de sospechosos en orden sería

  1. Límite de tamaño de medios de OpenClaw
  2. Exceso por inflación Base64
  3. Límite o timeout del provider / visión
  4. Nginx

Así que por ahora no le echaría la culpa a Nginx: parece más un espectador que el primer sospechoso.

Si quieres, en mi siguiente mensaje puedo ayudarte a escribir una versión de plantilla de preguntas para el OP, para que por el camino más corto pegue el umbral y los logs.