Entwickler

Bilder

Eine Erinnerung kann ein Bild enthalten. Die Engine indexiert das Bild, sodass eine Textanfrage in jeder Sprache darauf passt, auch wenn der Datensatz keine Bildunterschrift, keinen Titel und keinen Alt-Text hat.

Unterstützt ab Tablet 2. Eine Engine, die Bilder nicht implementiert, meldet das namentlich, statt mit einem bloßen 404 zu antworten, sodass Sie ein fehlendes Feature von einer fehlenden Erinnerung unterscheiden können. JPEG, PNG, GIF und WebP.

Ein Bild speichern

Übergeben Sie ein image-Objekt an den normalen add-Aufruf. content darf leer sein; das Bild ist dann für sich allein durchsuchbar.

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 ist erforderlich. Ein Präfix data:image/jpeg;base64, sowie die von base64 und openssl eingefügten Zeilenumbrüche werden für Sie entfernt.

FeldWas er tut
dataBase64 des Bildes. Erforderlich. Die Größenobergrenze ist eine Servereinstellung, keine SDK-Konstante - /health meldet sie als memory.images.max_bytes.
referenceWo Ihre eigene Kopie des Originals liegt. Wird als Zeichenkette gespeichert und von uns nie abgerufen - und genau der richtige Ort dafür, denn was wir vorhalten, ist verkleinert.
taken_atRFC3339, üblicherweise aus EXIF. Füllt event_date, wenn dieses leer ist, sodass die Erinnerung nach dem Aufnahmezeitpunkt sortiert wird und nicht nach dem Zeitpunkt des Hochladens.

Ein Bild finden

Es gibt keine separate Bildsuche. search und recall geben Bilder zusammen mit Text zurück, gemeinsam gerankt.

Mit vorhandenen Bilder arbeiten

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}'
AufrufWas er tut
get_imageDas Bild, das wir vorhalten, als (bytes, content_type) - nicht zwangsläufig Ihr Upload. Ein Bild, dessen lange Kante über 1.568 px lag, wurde verkleinert gespeichert und, sofern es kein JPEG war, zu WebP umkodiert: ein PNG kommt als image/webp zurück. Der Typ wird aus den Bytes ermittelt, nicht aus dem Namen, unter dem hochgeladen wurde - benennen Sie die Datei also nach content_type. Eine Erinnerung ohne Bild löst einen Fehler aus, statt etwas Leeres zurückzugeben.
list_imagesEine Seite, neueste zuerst, plus count - die Gesamtzahl im Store, nicht die Seitengröße. Die Paginierung läuft über einen Cursor: Geben Sie next_before und next_skip_ids zurück. Beides ist nötig, weil Bilder denselben Zeitstempel haben können.
forget_imageEntfernt das Bild und behält den Text. Ein ohne Bildunterschrift gespeichertes Bild ist die Erinnerung, dort wird also auch die Erinnerung gelöscht.

Übergeben Sie preview=True an forget_image, um memory_kept zu erhalten, ohne etwas zu ändern. iter_images übernimmt die Paginierung für Sie.

Was ein Bild kostet

Ein Bild wird in Token abgerechnet, derselben Einheit wie Text. Token = Fläche in Pixeln / 556,7. Ab 1.568 px an der langen Kante wird mit 1.568 px gerechnet, ein Bild mit 2.500 px kostet also so viel wie eines mit 1.568 px.

BildGezählt beiTokens
700 × 700as sent881
1000 × 1000as sent1,797
1568 × 1568as sent4,417
1920 × 10801568 × 8822,485
2500 × 18751568 × 11763,313
2500 × 25001568 × 15684,417

Obergrenze: 4.417 Token pro Bild. Wir reservieren diese Obergrenze vor dem Aufruf von Ihrem Guthaben und rechnen danach den gemessenen Wert ab, der nie höher ausfällt.

Was wir vorhalten, ist das Bild in der Auflösung einer Erinnerung, nicht Ihr Original. Über 1.568 px an der langen Kante wird es beim Eingang auf 1.568 px verkleinert, und dieses kleinere Bild wird indexiert, gespeichert und zurückgegeben. Verkleinern heißt umkodieren, deshalb werden verlustfreie Formate als WebP geschrieben: ein PNG mit 2.500 px kommt mit 1.568 px als image/webp zurück. JPEG bleibt JPEG, und unterhalb von 1.568 px bleiben die Bytes unangetastet. (Würde die Datei durch das Umkodieren größer, behalten wir Ihre Bytes so, wie sie waren.) Beide Kanten müssen weiterhin ≥ 700 px sein und die lange Kante ≤ 2.500 px, sonst wird der Aufruf mit einem 400 abgelehnt - unter 700 px gilt ein pauschaler Mindestbetrag, ein kleineres Bild kostet in der Speicherung also gleich viel, und über 2.500 px dekodieren wir die Datei gar nicht erst. Behalten Sie eine eigene Kopie oder legen Sie deren URL in reference ab, wenn Sie die Datei in voller Auflösung brauchen.

Wie viele zurückkommen

Standard 1, maximal 5 Bilder pro Antwort. Fünf Bilder sind knapp 20.000 Tokens.

FeldWas er tut
max_images0 bis 5. Bilder, die eine einzelne Antwort enthalten darf. Standard 1. 0 gibt nur Text zurück. Werte außerhalb des Bereichs werden abgelehnt, nicht begrenzt.
Eine englische Bildunterschrift an einem Bild verbessert Anfragen auf Englisch und verschlechtert Anfragen in anderen Sprachen - im Mittel über vierzehn Sprachen 11,4 Punkte recall@5. Speichern Sie Bilder ohne Bildunterschrift, wenn Ihre Nutzer in mehr als einer Sprache suchen.