Desarrolladores

Imágenes

Una memoria puede llevar una imagen. El motor indexa la imagen, así que una consulta de texto en cualquier idioma coincide con ella aunque el registro no tenga pie de imagen, título ni texto alternativo.

Compatible con Tablet 2 y superiores. Un motor que no implementa imágenes lo indica nombrando el modelo, en lugar de responder un 404 a secas, de modo que se distingue una función ausente de una memoria ausente. JPEG, PNG, GIF y WebP.

Guardar una imagen

Pase un objeto image a la llamada add habitual. content puede ir vacío; entonces la imagen se puede buscar por sí sola.

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 es obligatorio. Tanto el prefijo data:image/jpeg;base64, como los saltos de línea que añaden base64 y openssl se eliminan automáticamente.

CampoQué hace
dataBase64 de la imagen. Obligatorio. El techo de tamaño es un ajuste del servidor, no una constante del SDK - /health lo publica como memory.images.max_bytes.
referenceDónde está su propia copia del original. Se guarda como cadena de texto y nosotros nunca la descargamos; y es justo su sitio, porque lo que guardamos está reducido.
taken_atRFC3339, normalmente tomado del EXIF. Rellena event_date cuando ese campo está vacío, de modo que la memoria se ordena por la fecha en que se tomó la imagen y no por la de subida.

Encontrar una imagen

No hay una búsqueda de imágenes aparte. search y recall devuelven las imágenes junto con el texto, ordenadas en la misma clasificación.

Trabajar con las imágenes ya guardadas

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}'
LlamadaQué hace
get_imageLa imagen que guardamos, como (bytes, content_type); no necesariamente la que usted subió. Una imagen cuyo lado largo superaba los 1.568 px se guardó reducida y se recodificó a WebP salvo que fuera un JPEG, así que un PNG vuelve como image/webp. El tipo se deduce de los bytes, no del nombre con el que se subió el archivo: póngale nombre al archivo según content_type. Una memoria sin imagen lanza un error en lugar de devolver algo vacío.
list_imagesUna página, las más recientes primero, más count - el total del store, no el tamaño de la página. La paginación es por cursor: devuelva next_before y next_skip_ids en la llamada siguiente. Hacen falta los dos porque varias imágenes pueden compartir la misma marca de tiempo.
forget_imageElimina la imagen y conserva el texto. Una imagen guardada sin pie de imagen es la memoria, así que ahí elimina también la memoria.

Pase preview=True a forget_image para obtener memory_kept sin modificar nada. iter_images pagina por usted.

Cuánto cuesta una imagen

Una imagen se factura en tokens, la misma unidad que el texto. Tokens = área en píxeles / 556,7. Por encima de 1.568 px en el lado largo el recuento se hace a 1.568 px, así que una imagen de 2.500 px cuesta lo mismo que una de 1.568 px.

ImagenTamaño contabilizadoTokens
700 × 700as sent881
1000 × 1000as sent1,797
1568 × 1568as sent4,417
1920 × 10801568 × 8822,485
2500 × 18751568 × 11763,313
2500 × 25001568 × 15684,417

Techo: 4.417 tokens por imagen. Reservamos ese techo contra su saldo antes de la llamada y cobramos después el valor medido, que nunca es mayor.

Lo que guardamos es la imagen a la resolución de una memoria, no su original. Por encima de 1.568 px en el lado largo se reduce a 1.568 px al entrar, y esa imagen más pequeña es la que se indexa, se almacena y se devuelve. Reducir implica recodificar, así que los formatos sin pérdida se escriben como WebP: un PNG de 2.500 px vuelve a 1.568 px como image/webp. El JPEG sigue siendo JPEG y por debajo de 1.568 px los bytes no se tocan. (Si recodificar hiciera el archivo más grande, dejamos sus bytes tal cual.) Ambos lados deben seguir midiendo ≥ 700 px y el lado largo ≤ 2.500 px, o la llamada se rechaza con un 400: por debajo de 700 px se aplica un mínimo fijo, así que una imagen más pequeña cuesta lo mismo almacenarla, y por encima de 2.500 px no descodificamos el archivo en absoluto. Guarde su propia copia, o ponga su URL en reference, si necesita el archivo a resolución completa.

Cuántas vuelven

Por defecto 1, máximo 5 imágenes por respuesta. Cinco imágenes rondan los 20.000 tokens.

CampoQué hace
max_imagesDe 0 a 5. Imágenes que puede llevar una sola respuesta. Por defecto 1. 0 devuelve solo texto. Un valor fuera de rango se rechaza en lugar de ajustarse.
Un pie de imagen en inglés mejora las consultas en inglés y empeora las consultas en los demás idiomas - 11,4 puntos de recall@5 de media en catorce idiomas. Guarde las imágenes sin pie de imagen si sus usuarios buscan en más de un idioma.