Fix/preview sirve public - #21
Merged
Merged
Conversation
Un bloque image en el formato neutral, y cada proveedor lo traduce a lo suyo: Anthropic quiere source.base64 con media_type; los de formato OpenAI quieren un data URI dentro de image_url. Los dos formatos verificados contra su doc oficial. La imagen va antes del texto. Las dos documentaciones dicen lo mismo: el modelo responde mejor viendo primero y leyendo la pregunta despues. La bandera "ve" decide a quien se le manda. Quien no ve no se queda fuera: recibe la ruta del adjunto y con eso puede meter el logo en el header. Lo unico que no puede es decir de que color es. OpenRouter queda en false porque bajo un mismo perfil revende modelos que ven y modelos que no. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…l agente quiere Viven en <sala>.adjuntos, hermano del workspace, igual que los turnos y los marcadores. La razon es la misma: una imagen que era platica no tiene por que acabar en el repo que alguien se va a descargar. La que si se va a usar entra por usar_adjunto, y esa decision es del agente porque es quien sabe donde van los estaticos de su stack. De paso resuelve que read_file lee utf8: el agente no lee el PNG, pide que se copie. El nombre en disco es un uuid mas el nombre visible. El uuid delante impide que dos capturas llamadas igual se pisen y que un nombre de fuera decida donde se escribe; el nombre detras deja buscarlo sin llevar un indice aparte. maxHttpBufferSize a 8MB. El default de socket.io es 1MB y lo peor de pasarse no es el rechazo, es que el mensaje se descarta sin avisar: desde la sala parece que le diste a enviar y no paso nada. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ctrl+V o arrastrarla al chat. Se ve en la sala para todos, vean o no vean sus modelos, porque el chat entre personas es una cosa y lo que llega al agente es otra. Al agente solo le llega si lo mencionas, igual que pasa hoy con el texto. Las imagenes se encogen en el navegador antes de salir, con canvas. No es solo el peso: una imagen cuesta tokens segun sus dimensiones y aqui paga cada quien con su key, asi que mandar una captura de 4K en vez de reducirla significa que quien invoque al agente paga tres veces mas por lo mismo. El limite de 1568px sale de la doc de Anthropic, es lo que los modelos procesan sin reescalar. En el mensaje las imagenes se piden al server por URL en vez de viajar en base64, para que el navegador las cachee y entrar a una sala con historial largo no arrastre megas. Los GIF se mandan tal cual: redibujarlos en un canvas se quedaria con el primer fotograma, y quien manda un GIF lo manda por el movimiento. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
El script existia solo en server/package.json, asi que "npm run demo:imagenes" fallaba desde la raiz, que es como se documentan y se corren todos los demas. Mismo hueco que tuvieron demo:agentes-se-ven y demo:interrupcion.
Arrastrar y pegar ya funcionaban, pero no se ven: nadie adivina que puede soltar un archivo en el chat si no hay una pista. Y en el telefono no existe ninguna de las dos, asi que ahi no habia forma de subir nada. Es un <input type="file"> escondido y un boton que lo dispara. Toda la logica se reusa: el mismo esImagenAceptada que filtran onDrop y onPaste, y la misma agregarImagenes. El dialogo del sistema usa la lista ACEPTADOS (png, jpeg, webp, gif) para no ofrecer lo que el server va a rechazar. El input se limpia despues de elegir: sin eso, escoger el MISMO archivo dos veces seguidas no vuelve a disparar onChange y parece que se ignoro.
El agente puso un logo en public/ y escribio bien el <img src="/logo.png">, pero salia el icono de imagen rota. El archivo estaba donde debia y la ruta era correcta: lo que fallaba era el ruteo del proxy. Habia una lista blanca de lo que si va al preview (/@vite/, /src/, /node_modules/, ...). Servia mientras el proyecto solo pidiera modulos, porque Vite los inyecta con rutas absolutas desde la raiz del origen y no se pueden reconfigurar. Pero public/ puede tener cualquier cosa -- una imagen, un favicon, una fuente, un PDF -- y nada de eso empieza con un prefijo conocido, asi que el navegador recibia el HTML de la Sala en vez del archivo. Es el tercer bug del mismo ruteo por la misma causa: el preview en blanco (los imports ES no mandan Referer), el HMR que no llegaba (Vite abre su WebSocket contra "/"), y ahora las imagenes. Cada uno se parcheo agregando otra entrada a la lista. Ahora la lista es al reves: se enumera lo de la SALA, que es nuestro y solo cambia cuando lo cambiamos nosotros. Lo del preview no se puede enumerar porque depende del proyecto que construya el agente. Con una guarda que hacia falta: "/" siempre es la Sala. La cookie del preview sobrevive en la pestana, asi que sin eso abrir Multi despues de ver un preview te daria la app del proyecto. demo:proxy-rutas (24/24) fija los tres casos historicos y el nuevo.
Tu pregunta destapo un choque real: /assets/ lo usan los dos. Ahi compila el front de Multi, pero Rails y Phoenix tambien sirven los suyos ahi, asi que un proyecto en Rails no habria podido cargar sus assets. Se desempata con el referer: si la peticion viene de dentro del preview, es del proyecto; si no, es de la Sala. El referer si llega en un <script src> o un <link href>, que es como se piden los assets compilados -- el que falta es el de los imports de modulos ES, y para esos esta la cookie. Y de paso confirma lo que preguntabas. La lista blanca vieja era literalmente de Vite (/@vite/, /src/, /node_modules/), asi que un proyecto en Django pidiendo /static/css/main.css habria fallado igual que la imagen. Con la lista invertida ya no depende del stack: Django, Next, Remix, SvelteKit, Astro, Rails y un livereload cualquiera pasan sin que el proxy sepa nada de ellos. demo:proxy-rutas pasa de 24 a 32.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.