Skip to main content

LLM Chat - Releases

← App details

Nextcloud 34

LLM Chat 2.4.0
Release Details
UpdatedSept. 5, 2026, 6:43 a.m.
Changelog

Added

  • New tool "Ask you a question" (issue #15), off by default. A model that is genuinely unsure what was meant can now ask instead of guessing, and gets the answer back as a tool result rather than having to end its turn on a question the user then has to answer as a new message. Up to five questions in one call — asking again after the first round is answered is far more annoying than one longer form, so the cap is on the call, not on the dialog. Questions can carry options, which the user can pick from or ignore in favour of typing; a free text field is always there, because the model guessed the choices and being forced into the closest wrong one is worse than typing — where the options are checkboxes the typed answer is added to what was ticked rather than replacing it, since "all that apply" and "one of these" promise different things. Answering only some of them is allowed: a model asking five questions has usually asked one too many. Dismissing the dialog tells the model so in as many words, with an instruction not to ask again but to name the assumption it went with instead. Two such calls per answer, counted across the whole agent loop rather than per round — the five-question cap sits in the tool definition, so without this a seven-round budget would allow asking in every one of them. Counted only when a dialog actually opens, so a malformed call the model can still fix does not cost it an attempt, and a call that finds the budget spent is told exactly that instead of being reported as a dismissal nobody performed.
  • The composer has a file picker (issue #16). The file tools address paths relative to the home, and typing one by hand is tedious enough that people instead describe the file and hope the model finds it — which costs a search, a listing, and often the wrong file. Picked paths are inserted as plain quoted strings rather than markdown links or attachment chips: that is exactly what nc_read_text, nc_read_pdf and nc_read_image take as their path argument, so nothing has to be translated back. Multi-select and directories are allowed, the picker reopens where the last pick happened, and the button only appears for profiles that have the Nextcloud tools — a path in the prompt is noise to a profile that cannot open it. Nextcloud permits " in filenames, so the quote character steps aside instead of being escaped — single quotes, or a markdown code fence when the name contains both kinds. Backslash-escaping would fix the parse and create a worse bug: the model would have to strip the escapes again before calling a tool, and one that does not asks the file service for a file that does not exist under that name.

Fixed

  • nc_read_image scales images down before they go out (issue #14). Until now whatever sat in Nextcloud went to the model untouched, so an 8 MB phone photo became ~10.7 MB of base64 in the request body — the PDF path, which has to render an image first, was the thriftier of the two. Tokens were never the issue: Anthropic and OpenAI resize server-side anyway and bill for what comes out of that. What was the issue is that Anthropic refuses anything over 5 MB per image with an HTTP 400 that arrives after the tool ran and the user approved it, taking the whole turn with it. Images now go through the same treatment as a rendered PDF page — 1568 px on the longer edge, JPEG q0.85 — with EXIF orientation applied while decoding, since a portrait photo otherwise reaches the model lying on its side, and transparency flattened onto white, since JPEG has no alpha and undefined pixels come out black.
  • An image that is already small in both senses — at most 1568 px and under 1 MB — is passed through untouched: a re-encode would only make it blurrier. Same for SVG, which is markup a canvas cannot be pointed at, and for a flat graphic that happens to encode larger as JPEG than it was as PNG. Every one of those paths goes through the same size check and refuses with a message the model can relay, rather than handing back an oversized original — a passthrough that skips the ceiling is the exact HTTP 400 this change exists to prevent.
  • Animated images are resized like everything else rather than passed through to preserve the animation. No provider looks at more than one frame — OpenAI documents GIF support as non-animated, Anthropic takes a single frame — so the remaining frames are bytes paid for and never read, and an 8 MB animation refused for being over the limit is strictly worse than its first frame at 200 KB. Small ones keep their animation anyway by falling into the size passthrough, where it costs nothing either way.
Licenses GNU Affero General Public License v3.0 or later
Certificate-----BEGIN CERTIFICATE-----
MIIEAjCCAuoCAhP6MA0GCSqGSIb3DQEBCwUAMHsxCzAJBgNVBAYTAkRFMRswGQYD
VQQIDBJCYWRlbi1XdWVydHRlbWJlcmcxFzAVBgNVBAoMDk5leHRjbG91ZCBHbWJI
MTYwNAYDVQQDDC1OZXh0Y2xvdWQgQ29kZSBTaWduaW5nIEludGVybWVkaWF0ZSBB
dXRob3JpdHkwHhcNMjYwOTA0MTMxNTExWhcNMzYxMjEwMTMxNTExWjASMRAwDgYD
VQQDDAdsbG1jaGF0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA7HDs
jKp7FsGKcuel3l3CTv8nfsIZXOMCyn2/kR0cZ18lnjrsxstIV/kB+t/lHD/V63Sp
weVFyxdOR5suH1ZYyc2iAGNtghJOq/hijKwSCNeJfSijyaHPOThIQaNDF30hDrSe
zThc3KidVfRfLz+FDJl18KzUJvYYRBDrBpd70UuDuiVoDu2mNPsUMx/ubQzLCCA+
lGOcWMAV8wcBi3SE/CNciqDvzU1WAIxl0KcUzCdF924IyG7XcRktuSdDXxMEPiV4
r3FYkUVZLTMkjT6gOzWNGt0i5pjJNFV0WYo3+OnaT3Ra2tCxSFYPGUhptxsY6xTu
gLOkSc5SOT8CSsFS7fjERutvt8C0oHEbu5N7TDoywBIcgu+oSe6pGuI12D8WAt+C
EuLs1OM4i7yUETtYoeURPWXDyhhu58Lfl89EFOfKjwhuySDhX6ALV8d559hPD9VY
OU/zv6j6De0m89lYgWXyoF0ClT0iu5OXqFO5NQuW8ZnXN2rZVvVNapMuYXSWdeL/
qi/xzivNsS++fZrRAO8kfGViN8wrcPcw4laKw/82iTsI9rldsimXkMQx2rXDw+4/
dCor1rdv3pAKv0xODI6bvLO3/df5DjlDHqAl9H++E2SiXciII+4abLQ+1lP8Ebsi
4e9lVt6ypI8Q3AeQunGWIiFmCtmKmM22jvgMTEsCAwEAATANBgkqhkiG9w0BAQsF
AAOCAQEAffSGNpUST/kNZvVzcELBSu7RY77qo2MmkJ+zgo+4raXq66G3EITIIHyA
vbx2Mrok18l+xLNhd+m37+1W31/HRdKIsldma2qfb1eVw9bDH927LdHjFPKcZuIu
d6o3y6DS+jcYC01ghT9eDo4ammi5xUDJrriDkA1FAQl8VDhofCe76U40GSZTlg8f
uON0WiFfRuA7IG8Trw2DcQFEHEi7ufVEV/OUFdQoDAtIljunOm4iXV9pRLdj1Um6
UYKKERhs3/oIUjuFSbuBQgUBo7LCt5q69K64hfwexNax/pEkIR8kjzdtnUdqcAhX
3nq8ZcjtzKgN3LRYfYUEgRYAyEqthQ==
-----END CERTIFICATE-----
SignatureGXXp5Wmnvq/CoAIe03yQrPaNWS7jQ81KGL+mU/2wfhS3Y75VmjDl1EBDmH2U7G38YTKcM6XTbvRQE3zH6n8j7z356u6Uf7ilX9eAv9RyG/KHYy8xogGdauQkz5LaK6aI1e2XX0xM6vg5akuxq+hngD1ynAbnIZ0lRyQOVYjz18fTxgs8rY8OCTajOOVeaDkuLc9PAzeS7K9k+g7ZgvNxEDEwI/akor07YKdSp8WPApXAwyB/mmSBAxc9qwyUnNf18bczS6ah5e/rD7HnFhAY4K4kB698uk8FjdbWTbsyZy6dzz+DN5l9MDcsIMjOP5xD83I/thc7Wu+EHxERtxqACebWfkVUBdX7clklM+N1V1j/600InPmwugAU0MkSdl9qHQ4KUhy9OW/CKWrsPYClTufjzF+ztjN3V2av2VmyKgCZmh2d/npz1CugCDTqqASwmFTVQ81aKbXq4UvQ1PDfJcS61Gj9rE0+2373OSj5hc0835KlLxShKnMpoe9MrJwSXrNN8Si+RmwOAPY+/+vmTuVwX8YKrwIJhu5QTMT6C2UAK1wMjq3cFaQU34yT0MreTx6QTEvjFID8TbD4YfSAQDP2bJKM6lm0huBlvV5zdx5BsMpyv6mlfcG/sFBw1XgKEZmQwj8BKLskmp0iSYghuZjt4tT+gnYfTI+9LrHdcxo=
Signature digestsha512
Dependencies
Required Nextcloud versions >=34.0.0,<35.0.0
Minimum Integer bits32
PHP>=8.2.0