Développeurs

Photographies

Un souvenir peut porter une image. Le moteur indexe l'image : une requête textuelle dans n'importe quelle langue y correspond donc même lorsque l'enregistrement n'a ni légende, ni titre, ni texte alternatif.

Pris en charge à partir de Tablet 2. Un moteur qui n'implémente pas les images le signale nommément au lieu de répondre un simple 404, ce qui permet de distinguer une fonctionnalité absente d'un souvenir absent. JPEG, PNG, GIF et WebP.

En stocker une

Passez un objet image à l'appel add ordinaire. content peut être vide ; l’image est alors trouvable par recherche à elle seule.

mem.add("at the beach", image={"data": b64})   # caption + image
mem.add("", image={"data": b64})               # the image IS the memory
// the image rides in the 4th argument; the 3rd is metadata
await mem.add("at the beach", undefined, {}, { image: { data: b64 } });
await mem.add("", undefined, {}, { image: { data: b64 } });   // the image IS the memory
let img = json!({"image": {"data": b64}});
mem.add_with("at the beach", None, json!({}), img.clone()).await?;
mem.add_with("", None, json!({}), img).await?;
curl -X POST https://api.wontopos.com/api/v1/memory/store \
  -H "X-API-Key: $WOS_KEY" -H "Content-Type: application/json" \
  -d '{"user_id":"alice","content":"","image":{"data":"<base64>"}}'

data est obligatoire. Un préfixe data:image/jpeg;base64, et les retours à la ligne ajoutés par base64 et openssl sont supprimés automatiquement.

ChampCe qu'il fait
dataBase64 de l'image. Obligatoire. Le plafond de taille est un réglage serveur, pas une constante du SDK : /health le publie sous memory.images.max_bytes.
referenceL'emplacement de votre propre copie de l'original. Stocké sous forme de chaîne et jamais récupéré par nos soins - et c'est bien sa place, puisque ce que nous conservons est réduit.
taken_atRFC3339, généralement issu de l'EXIF. Renseigne event_date lorsque ce champ est vide, de sorte que le souvenir est trié selon la date de prise de vue et non selon la date d'envoi.

En trouver une

Il n'existe pas de recherche de images distincte. search et recall renvoient les images avec le texte, classés ensemble.

Manipuler celles que vous avez

data, mime = mem.get_image(memory_id=mid)
page       = mem.list_images(limit=50)      # page["count"] = store total
mem.forget_image(memory_id=mid, preview=True)
const { bytes, contentType } = await mem.getImage(undefined, mid);
const page = await mem.listImages(undefined, { limit: 50 });
await mem.forgetImage(undefined, mid, { preview: true });
let (bytes, mime) = mem.get_image(None, mid).await?;
let page = mem.list_images(None, 50, None, None).await?;
mem.forget_image(None, mid, true).await?;
# the picture we hold — the one call on this plane that is not JSON
curl -X POST   .../api/v1/memory/image  -d '{"user_id":"alice","memory_id":"m_1"}'
curl -X POST   .../api/v1/memory/images -d '{"user_id":"alice","limit":50}'
curl -X DELETE .../api/v1/memory/image  -d '{"user_id":"alice","memory_id":"m_1","preview":true}'
AppelCe qu'il fait
get_imageL'image que nous conservons, sous la forme (bytes, content_type) - pas nécessairement celle que vous avez envoyée. Une image dont le grand côté dépassait 1 568 px a été stockée réduite et réencodée en WebP sauf s'il s'agissait d'un JPEG : un PNG revient donc en image/webp. Le type est déduit des octets, pas du nom donné au fichier envoyé ; nommez le fichier d'après content_type. Un souvenir sans image lève une erreur au lieu de renvoyer un contenu vide.
list_imagesUne page, du plus récent au plus ancien, plus count - le total du store, pas la taille de la page. La pagination se fait par curseur : renvoyez next_before et next_skip_ids. Les deux sont nécessaires car plusieurs images peuvent partager un même horodatage.
forget_imageSupprime l’image et conserve le texte. Une image stockée sans légende est le souvenir : dans ce cas, le souvenir est supprimé lui aussi.

Passez preview=True à forget_image pour obtenir memory_kept sans rien modifier. iter_images gère la pagination à votre place.

Ce que coûte une image

Une image est facturée en jetons, la même unité que le texte. Jetons = surface en pixels / 556,7. Au-delà de 1 568 px sur le côté long, le décompte se fait à 1 568 px : une image de 2 500 px coûte donc autant qu’une de 1 568 px.

ImageCompté àTokens
700 × 700as sent881
1000 × 1000as sent1,797
1568 × 1568as sent4,417
1920 × 10801568 × 8822,485
2500 × 18751568 × 11763,313
2500 × 25001568 × 15684,417

Plafond : 4 417 jetons par image. Nous réservons ce plafond sur votre solde avant l’appel et facturons ensuite la valeur mesurée, qui n’est jamais supérieure.

Ce que nous conservons, c'est l'image à la résolution d'un souvenir, pas votre original. Au-delà de 1 568 px sur le grand côté, elle est réduite à 1 568 px à l'entrée, et c'est cette image plus petite qui est indexée, stockée et renvoyée. Réduire suppose de réencoder : les formats sans perte sont donc écrits en WebP, et un PNG de 2 500 px revient en 1 568 px sous forme d'image/webp. Le JPEG reste du JPEG, et en dessous de 1 568 px les octets ne sont pas touchés. (Si le réencodage devait alourdir le fichier, nous gardons vos octets tels quels.) Les deux côtés doivent toujours mesurer ≥ 700 px et le grand côté ≤ 2 500 px, sinon l'appel est refusé avec un 400 : en dessous de 700 px un minimum forfaitaire s'applique, une image plus petite coûte donc autant à stocker, et au-delà de 2 500 px nous ne décodons pas le fichier du tout. Conservez votre propre copie, ou mettez son URL dans reference, s'il vous faut le fichier en pleine résolution.

Combien en reviennent

Valeur par défaut 1, maximum 5 images par réponse. Cinq images représentent près de 20 000 tokens.

ChampCe qu'il fait
max_images0 à 5. Nombre de images qu'une seule réponse peut porter. Valeur par défaut 1. 0 ne renvoie que le texte. Une valeur hors bornes est rejetée plutôt que ramenée dans les bornes.
Une légende en anglais sur une image améliore les requêtes en anglais et dégrade les requêtes dans les autres langues : 11,4 points de recall@5 en moyenne sur quatorze langues. Stockez les images sans légende si vos utilisateurs effectuent des recherches dans plusieurs langues.