Vision
Attach images, PDFs and text files to a generation job, or send image_url parts on the OpenAI-compatible chat endpoint, and read the per-file receipts.
Overview
Vision on MaxiMind is input only: MaxiMind's models read what you attach. Image generation is withheld (see Images). Two surfaces accept visual input:
POST /api/ai/generatewith anattachmentsarray (use job mode for documents).POST /v1/chat/completionswithimage_urlcontent parts.
Both use the same loader, the same host allow-list and the same limits. A key needs generate: true and a permitted engine in agent_engines. Input vision does not grant image generation, agent tasks, uploads, TTS or other endpoints.
Attachments on generate
POST /api/ai/generate
curl -s https://maximind.dev/api/ai/generate \
-H "x-api-key: $MAXIMIND_API_KEY" -H "content-type: application/json" \
-d '{"prompt":"Read the certificate and summarize the CV in Vietnamese.",
"engines":["codex","agy","claude"],"subscription_only":true,"async":true,
"attachments":[{"url":"https://media.svff.online/example/certificate.webp","label":"certificate"},
{"url":"https://media.svff.online/example/cv.pdf","label":"CV"}]}'
The example URLs are placeholders; use real, existing files on an allowed host.
| Name | Type | Required | Description |
|---|---|---|---|
attachments[].url |
string | Yes | HTTPS URL on an allowed host (below). |
attachments[].label |
string | No | A name echoed in the receipt. Files and labels are treated as source data, never as instructions. |
attachments[].path |
string | No | {"path":"/absolute/file"} is only for trusted local requests or logged-in admins. All API keys are denied local paths. |
engine |
string | No | An explicit pin permits only that engine. |
Attachment requests never use a pay-per-use API, even if subscription_only is omitted or false. Default fallback order is AGY Gemini, then Codex, then Claude, honoring the key's allowed engines.
Read receipts
Poll GET /api/ai/generate/jobs/{job_id}. A completed result adds one entry per input:
{"status":"done","ok":true,"engine":"codex","model":"gpt-5.6-sol","text":"…",
"attachments":[{"index":0,"label":"certificate","url":"https://media.svff.online/example/certificate.webp",
"kind":"image","mime":"image/webp","size":167994,"status":"read","how":"image_first_frame","truncated":false}]}
| Field | Meaning |
|---|---|
status |
read, skipped or failed. read means the input was submitted and generation completed with a model receipt; it does not guarantee the model's interpretation is correct. |
why |
Explains unavailable inputs. |
how |
Ingestion method: agy_view_file, native_image, image_first_frame, native_pdf, pdf_text, pdf_pages, text. |
truncated |
Whether text or pages were cut. PDF and text entries report page or character counts. |
normalized |
Original and processed bytes and dimensions when an image was resized. |
tried |
Outcomes for unsuccessful engines too. |
Applications must examine these outcomes before treating a document review as complete. Disallowed hosts and individual bad files are skipped; the text request can still complete.
Which engines read what
| Engine | Images | PDFs | Text files | Status |
|---|---|---|---|---|
| Codex | Native -i; WebP and GIF normalized |
Text or page images | Extracted text | Verified transport |
| Claude | Native image input implemented | Extracted text or bounded page images | Extracted text implemented | Authenticated inference unverified with the current enabled login; advertised unavailable |
| Antigravity | Native Gemini view_file vision |
Extracted text or bounded page images | Extracted text | Verified; sandboxed view_file only, same-process gate handshake and exact read receipts |
For image reading, pick a Google Gemini agy model or a verified Codex model. Antigravity attachments default to gemini-4-argon-high and permit only Google Gemini ids. The live status is in GET /api/ai/catalog.
Images on chat completions
A user message may contain image parts alongside text parts; image-only user messages are accepted.
curl -s https://maximind.dev/v1/chat/completions \
-H "Authorization: Bearer $MAXIMIND_API_KEY" -H 'Content-Type: application/json' \
-d '{"model":"agy/gemini-4-argon-high",
"messages":[{"role":"user","content":[
{"type":"text","text":"What does this image show?"},
{"type":"image_url","image_url":{"url":"https://media.svff.online/example/image.png"}}]}]}'
A data:image/png;base64,… URL works in place of the HTTPS URL. The response includes x-maximind.attachments; when streaming it is on the final completion chunk. The encoded JSON request is bounded to 60 MiB in addition to the decoded file limits.
Allowed hosts
HTTPS roots and subdomains of svff.online, vietlingo.com, ledoly.com, ledobit.com, macsvff.uk, plus AWS S3 hostnames for svff-media-storage* buckets. Redirects and DNS destinations are checked; private or reserved IPs, URL credentials and non-443 ports are rejected. Query credentials are omitted from receipts.
Limits
- At most 10 files, 15 MiB per file, 40 MiB total, 60 seconds per download.
- JPEG, PNG, WEBP, GIF, PDF and UTF-8 text are detected from bytes.
- Images: at most 25 million pixels and 100 frames; first frame used; EXIF orientation applied. Inputs over 2048 px on the longest side or over 4 MiB are compressed before ingestion.
- PDFs: extracted text when usable, otherwise up to 6 pages at 110 dpi with maximum image dimension 2048.
- Text: 80,000 extracted characters across files; total attachment prompt 100,000 characters.
- Two attachment requests run concurrently; eight are admitted in total.
How the boundary is kept
Codex and Claude run with host tools disabled. Antigravity may only use a sandboxed view_file on exact approved attachment paths after a trusted same-process gate handshake; every image requires a completed read receipt, and any other tool or outside path discards the answer. Antigravity runs in a private temporary HOME; private job files are removed after completion or failure.