RemEx
b1c05bca83
feat(llm-parse): read a photo, as a booking or as a receipt in Costs
...
Whether the AI Parsing model reads images is an admin setting now, and it
lands with the two features that send a photo, so it has something to
control.
The setting is `vision: 'auto' | 'on' | 'off'` on the addon config. On
Automatic a local Ollama is asked what the model can do (`/api/show`), and a
cloud provider means no; Yes and No are applied as set. The old `multimodal`
flag is not read: the admin screens wrote it false on every save, so a
stored false meant nothing. The per-user toggle keeps its on/off meaning and
is read by the extraction now. The lookup is server-side only: capped read,
validated body, never throws, cached per server and model.
GET /api/llm/capabilities answers it for the signed-in caller, and both
photo pickers below ask it.
The booking import takes JPG, PNG and WEBP when the model reads images.
The photo goes as an image to every provider (image_url, an Anthropic image
block, Ollama's native chat with `images`), capped at 1600px, and skips KDE
Itinerary. A scanned PDF, which used to reach the model as empty text, has
its first two pages drawn by pdf-parse and sent the same way. The rest is
the import as it was: background job, review, the file attached to the
booking, the linked cost. On a real qwen3.5:4b a train ticket came back as
bare clock times until the router gave the model every type's field
meanings, and its price as an object inside a string, which read as 4900;
both are handled.
Costs gets Scan receipt: a dialog laid out like the booking import's takes
one photo, read on the import job queue, then reviewed in the existing
expense editor pre-filled with merchant, total, currency, day and lines,
the photo waiting in Receipts & Invoices to be uploaded on save. No table,
no migration, no category guess, no document-type detection.
2026-09-26 14:38:01 +02:00
..
2026-08-07 21:07:14 +02:00
2026-08-07 22:18:14 +02:00
2026-09-26 14:38:01 +02:00
2026-08-07 16:00:12 +02:00
2026-09-20 13:54:31 +02:00
2026-09-26 14:38:01 +02:00
2026-09-26 10:36:03 +02:00
2026-08-22 11:33:55 +02:00
2026-08-07 19:58:12 +02:00
2026-09-24 16:50:02 +02:00
2026-09-26 11:22:20 +02:00
2026-08-11 20:28:49 +02:00
2026-08-23 11:59:12 +02:00
2026-09-01 17:18:10 +02:00
2026-09-20 13:54:31 +02:00
2026-09-25 15:34:32 +02:00
2026-08-10 17:08:54 +02:00
2026-06-16 22:22:45 +02:00
2026-09-21 22:14:44 +02:00
2026-08-15 16:42:27 +02:00
2026-08-15 16:42:27 +02:00
2026-08-09 20:54:39 +02:00
2026-08-10 19:54:46 +02:00
2026-09-21 22:14:44 +02:00
2026-09-24 23:17:03 +00:00
2026-08-22 11:33:55 +02:00
2026-06-16 22:22:45 +02:00
2026-07-25 15:12:38 +02:00
2026-09-19 19:24:38 +02:00
2026-09-23 11:28:24 +02:00
2026-08-17 14:48:23 +02:00
2026-09-15 21:36:34 +02:00
2026-08-13 14:06:35 +02:00
2026-09-26 10:36:03 +02:00
2026-07-27 22:34:41 +02:00
2026-08-23 11:59:12 +02:00
2026-09-01 17:18:10 +02:00
2026-08-28 15:23:05 +02:00
2026-08-07 15:14:14 +02:00
2026-09-24 23:17:03 +00:00
2026-08-22 11:33:55 +02:00
2026-08-22 11:33:55 +02:00
2026-09-26 10:36:02 +02:00
2026-09-26 13:19:27 +02:00
2026-09-26 13:19:27 +02:00
2026-09-26 13:19:27 +02:00
2026-09-26 10:36:03 +02:00
2026-08-22 11:33:55 +02:00
2026-09-20 13:54:31 +02:00
2026-08-10 19:54:46 +02:00
2026-07-26 15:28:55 +02:00
2026-09-06 15:02:58 +02:00
2026-09-24 23:17:03 +00:00
2026-09-14 13:20:21 +02:00
2026-08-12 14:14:37 +02:00
2026-09-09 00:11:00 +02:00
2026-09-06 15:02:58 +02:00
2026-09-19 21:01:45 +02:00
2026-09-23 20:32:41 +02:00
2026-09-23 20:32:41 +02:00
2026-08-25 19:26:38 +02:00
2026-06-16 22:22:45 +02:00
2026-09-01 17:18:10 +02:00
2026-08-10 21:49:27 +02:00
2026-07-25 18:14:37 +02:00
2026-07-25 18:14:37 +02:00
2026-09-20 13:54:31 +02:00
2026-09-14 10:39:49 +02:00
2026-09-20 13:54:31 +02:00
2026-09-14 10:39:49 +02:00
2026-09-14 23:00:57 +02:00
2026-09-14 10:39:49 +02:00
2026-09-14 23:00:57 +02:00
2026-09-14 10:39:49 +02:00
2026-09-20 13:54:31 +02:00
2026-09-11 22:28:03 +02:00
2026-08-11 22:14:12 +02:00
2026-09-23 22:40:47 +02:00
2026-09-23 22:40:46 +02:00
2026-09-23 22:40:46 +02:00
2026-08-07 18:42:53 +02:00
2026-09-22 12:12:41 +02:00
2026-08-22 11:33:55 +02:00
2026-08-11 16:42:49 +02:00
2026-08-11 22:23:51 +02:00
2026-08-11 11:15:32 +02:00
2026-09-08 23:15:26 +02:00
2026-09-08 23:15:26 +02:00
2026-09-16 11:08:07 +02:00
2026-09-12 12:24:33 +02:00
2026-09-20 13:54:31 +02:00
2026-09-01 17:18:10 +02:00
2026-08-23 11:59:12 +02:00
2026-09-24 23:48:49 +00:00
2026-08-23 11:59:12 +02:00
2026-09-24 23:48:49 +00:00
2026-09-26 11:22:20 +02:00
2026-09-13 23:49:00 +02:00
2026-08-20 15:43:27 +02:00
2026-09-03 10:47:08 +02:00
2026-09-03 10:47:08 +02:00
2026-09-24 23:48:49 +00:00
2026-09-26 10:36:03 +02:00
2026-08-15 16:42:27 +02:00
2026-08-15 16:42:27 +02:00
2026-09-12 18:02:57 +02:00
2026-08-15 16:42:27 +02:00
2026-08-15 16:42:27 +02:00
2026-09-07 18:36:54 +02:00
2026-09-23 22:35:01 +02:00
2026-09-08 20:41:57 +02:00
2026-09-22 13:30:12 +02:00
2026-09-21 22:14:44 +02:00
2026-08-10 12:24:15 +02:00
2026-09-08 20:41:57 +02:00
2026-09-23 22:35:01 +02:00
2026-09-07 18:36:54 +02:00
2026-08-10 12:24:15 +02:00
2026-09-07 14:05:33 +02:00
2026-09-23 22:35:01 +02:00
2026-09-21 22:14:44 +02:00
2026-09-25 01:24:55 +00:00
2026-08-11 22:44:20 +02:00
2026-09-07 18:36:54 +02:00
2026-08-11 23:11:34 +02:00
2026-08-23 11:59:12 +02:00
2026-08-08 22:27:56 +02:00
2026-09-23 17:41:25 +02:00
2026-09-26 11:22:20 +02:00
2026-09-23 17:41:25 +02:00
2026-08-10 13:38:26 +02:00
2026-09-24 23:17:03 +00:00
2026-09-26 10:36:03 +02:00
2026-09-06 15:02:58 +02:00
2026-08-08 12:09:56 +02:00
2026-09-06 15:02:58 +02:00
2026-09-04 12:15:53 +02:00
2026-09-04 12:15:53 +02:00
2026-08-23 11:59:12 +02:00
2026-09-04 12:15:53 +02:00
2026-08-15 16:42:27 +02:00
2026-09-22 13:30:12 +02:00
2026-09-20 12:48:44 +02:00
2026-09-02 16:21:50 +02:00
2026-09-02 16:21:50 +02:00
2026-09-02 21:06:51 +02:00
2026-08-23 11:59:12 +02:00
2026-09-26 11:22:20 +02:00
2026-09-26 11:22:20 +02:00
2026-08-10 17:08:54 +02:00
2026-08-22 11:33:55 +02:00
2026-08-10 19:54:46 +02:00
2026-08-10 12:24:15 +02:00
2026-09-23 22:35:01 +02:00
2026-09-23 22:35:01 +02:00
2026-09-26 10:36:03 +02:00
2026-09-07 14:05:33 +02:00
2026-09-07 14:05:33 +02:00
2026-09-07 14:05:33 +02:00
2026-09-23 22:35:01 +02:00
2026-09-13 15:36:02 +02:00
2026-07-30 17:07:12 +02:00
2026-08-12 17:43:22 +02:00
2026-09-13 23:49:00 +02:00
2026-09-26 10:36:02 +02:00
2026-09-13 23:48:59 +02:00
2026-09-13 23:48:59 +02:00
2026-09-12 23:36:09 +02:00
2026-09-12 23:36:49 +02:00
2026-08-23 11:59:12 +02:00
2026-08-19 23:36:42 +02:00
2026-08-10 19:54:46 +02:00
2026-09-26 14:38:01 +02:00
2026-08-09 22:43:05 +02:00
2026-08-10 21:49:27 +02:00
2026-09-26 10:36:03 +02:00
2026-09-26 10:36:03 +02:00
2026-09-12 11:23:09 +02:00
2026-09-20 13:54:31 +02:00
2026-09-24 11:32:52 +02:00
2026-09-23 15:31:09 +02:00
2026-09-23 15:31:09 +02:00
2026-09-18 13:17:43 +02:00
2026-09-12 12:24:33 +02:00
2026-09-10 21:40:51 +02:00
2026-09-10 21:40:51 +02:00
2026-08-23 11:59:12 +02:00
2026-09-09 14:52:50 +02:00
2026-08-15 22:48:16 +02:00
2026-08-15 16:42:27 +02:00
2026-09-24 21:56:12 +02:00
2026-08-22 11:33:55 +02:00
2026-09-11 11:01:25 +02:00
2026-09-02 21:06:42 +02:00
2026-09-09 10:11:36 +02:00
2026-08-25 19:26:38 +02:00
2026-09-20 12:48:44 +02:00
2026-09-20 14:28:45 +02:00
2026-09-20 14:28:45 +02:00
2026-08-10 19:54:46 +02:00
2026-07-26 15:28:55 +02:00
2026-08-22 11:33:55 +02:00
2026-08-09 19:13:21 +02:00
2026-08-16 23:17:50 +02:00
2026-08-28 15:23:05 +02:00
2026-08-01 12:45:35 +02:00
2026-09-07 09:01:56 +02:00
2026-08-20 18:40:21 +02:00
2026-08-22 11:33:55 +02:00
2026-09-24 23:48:49 +00:00
2026-09-23 22:35:01 +02:00
2026-08-19 23:36:42 +02:00
2026-08-09 19:13:21 +02:00
2026-08-10 19:54:46 +02:00
2026-08-10 13:38:26 +02:00
2026-08-11 16:42:49 +02:00
2026-08-10 13:38:26 +02:00
2026-09-26 13:19:27 +02:00
2026-09-20 12:34:34 +02:00
2026-09-26 10:36:03 +02:00
2026-09-01 16:19:21 +02:00
2026-08-11 16:42:49 +02:00
2026-09-24 16:50:02 +02:00
2026-08-12 00:38:41 +02:00
2026-09-12 12:51:27 +02:00
2026-08-23 11:59:12 +02:00
2026-08-15 16:42:27 +02:00
2026-08-18 22:24:29 +02:00
2026-09-01 17:18:10 +02:00
2026-09-24 14:05:42 +02:00
2026-08-10 13:38:26 +02:00
2026-08-11 09:58:37 +02:00
2026-06-16 22:22:45 +02:00