Files
Loki/internal/loki/web_thumb_test.go
MichaelandClaude Opus 5.5 5016396998 Repris d'AJEAN : recherche d'images, aperçu du navigateur, vignettes, liens d'images
- web_images (amont v0.17.7) : recherche d'images DuckDuckGo, pendant de
  web_search ; les images du web s'affichent dans le fil avec la loupe, sans
  Referer, et disparaissent si le site les refuse. Schéma minimal pour tenir
  le budget du préambule.
- Aperçu en direct du navigateur piloté (cu_autoshot.go) : une capture après
  chaque action browser_* qui change la page, gardée en RAM, jamais envoyée au
  modèle, retirée du journal en fin de tour ; une carte dans le fil, en fondu.
- Vignettes calculées par le serveur (?thumb=, amont v0.17.9) : ~560 px au
  lieu de l'original (7 Ko au lieu de 550 Ko sur une capture), chargées deux
  par deux avec un nouvel essai ; la loupe ouvre l'original.
- Un lien vers une image ([graphique](graph.png)) l'affiche au lieu d'un
  bouton de téléchargement.
- Chrome du computer use tué avec Loki sous Linux (Pdeathsig), même en cas
  d'arrêt brutal : plus de navigateur orphelin dans le conteneur.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 10:30:05 +02:00

48 lines
1.3 KiB
Go

package loki
import (
"bytes"
"image"
"image/color"
"image/png"
"os"
"path/filepath"
"testing"
)
func TestChatThumbReduitEtCache(t *testing.T) {
dir := t.TempDir()
p := filepath.Join(dir, "capture.png")
src := image.NewNRGBA(image.Rect(0, 0, 2400, 1500))
x := uint32(1)
for i := range src.Pix { // bruit : se comprime comme une photo, pas comme un motif
x ^= x << 13
x ^= x >> 17
x ^= x << 5
src.Pix[i] = byte(x)
}
src.Set(0, 0, color.NRGBA{0, 0, 0, 0})
var buf bytes.Buffer
_ = png.Encode(&buf, src)
_ = os.WriteFile(p, buf.Bytes(), 0o644)
st, _ := os.Stat(p)
data, mime, err := chatThumb(p, st, 560)
if err != nil || mime != "image/jpeg" {
t.Fatalf("vignette : %v %s", err, mime)
}
img, _, err := image.Decode(bytes.NewReader(data))
if err != nil || img.Bounds().Dx() != 560 {
t.Fatalf("taille inattendue : %v %v", err, img.Bounds())
}
if len(data) >= buf.Len() {
t.Fatalf("vignette (%d o) pas plus légère que l'original (%d o)", len(data), buf.Len())
}
again, _, _ := chatThumb(p, st, 560)
if &again[0] != &data[0] {
t.Fatal("la 2e demande aurait dû venir du cache")
}
if _, _, err := chatThumb(filepath.Join(dir, "x.webp"), st, 560); err == nil {
t.Fatal("un fichier illisible doit renvoyer une erreur (repli client sur l'original)")
}
}