]> git.djapps.eu Git - pkg/ggml/sources/llama.cpp/commit
ui: add read_media tool (#25877)
authorparabelboi <redacted>
Wed, 12 Aug 2026 10:03:32 +0000 (12:03 +0200)
committerGitHub <redacted>
Wed, 12 Aug 2026 10:03:32 +0000 (12:03 +0200)
commit4dd127584b87d1b12b6a33c2213197234503d8f7
tree4fffe251a3ebbffcc1945869ee7e84aff964356d
parent89e0aa6fd362617d9073e0dafc18e41241521572
ui: add read_media tool (#25877)

* server: add read_image tool (#25875)

Adds a server-tool that allows vision models to analyze server-side images.
This tool is reading a single file for now:
The image data is base64 encoded and passed to the UI, which
decodes it, fills the <img> tag and removes the data URI before
passing the tool result back to the model.

* cleanup read_image tool: move magic strings to constants

* Add dedicated constants file: tools/ui/src/lib/constants/read-image.ts
  with PREFIX_IMAGE, PREFIX_SIZE, PREFIX_MIME constants
* Use ATTACHMENT_SAVED_REGEX from agentic.ts in ChatMessageToolCallBlockReadImage.svelte
* Use NEWLINE constant from code.ts instead of hardcoded '\n'
* Use PREFIX_SIZE in regex pattern for size parsing
* Add SERVER_TOOL_READ_IMAGE_PREFIX_* constants in C++ server-tools.cpp
  to match the TypeScript PREFIX_* constants for consistency

* server: rename read_image tool to read_media for images and audio

* Rename server_tool_read_image to server_tool_read_media in C++
* Rename enum BuiltInTool.READ_IMAGE to READ_MEDIA
* Rename UI constants, parser, and Svelte component files
* Update display label from 'Read image' to 'Read media'

* ui: consolidate audio data URI handling into shared utility

* Extract getAudioInputFormat to a shared utility (was duplicated inline)
* Store raw base64 in base64Data on the message object
* Use base64Data to construct data URIs for audio rendering
* Update agentic store to build INPUT_AUDIO parts from base64Data

* server: read_media: restrict audio to wav/mp3 and minor fixes

* Server get_mime_from_extension now only advertises audio/wav and
  audio/mpeg (the only formats the model's input_audio API accepts)
* Case-insensitive extension matching (fixes .MP3, .Wav, etc.)
* Unknown extensions return an error instead of a multi-MB data URI
  that inflates model context with garbage
* Updated tool description to document supported formats
* Frontend AUDIO_MIME_TO_EXTENSION trimmed to match server
* fix a missing import in tools/ui/src/lib/stores/agentic.svelte.ts

* server: read_media: add to --tools help text and README tool list

* ui: fix indentation in ChatMessageToolCallBlockDefault.svelte

* server: read_media tool: fix a cast to use the correct type

* server: read_media: multiple fixes

* server-tools.cpp import cctype, remove UTF-8 char, check mime before reading file
* ui: add MimeTypePrefix.AUDIO and use it in agentic.svelte.ts

* server: make read_media inherit from read_file and add uses_cwd

* ui: fix formating issues

* rm from server

* move it to frontend-only tool

* correct partial commit

* rm unused

* ui: address review from allozaur

Replace the magic strings, regexes and number in the read_media parser
and service with named constants. Path splitting reuses
FILE_PATH_SEPARATOR_REGEX, the size header regex moves to
READ_MEDIA_SIZE_REGEX derived from PREFIX_SIZE, and
FILE_EXTENSION_SEPARATOR lands next to it in constants/code.ts.

---------

Co-authored-by: ckrafft <redacted>
Co-authored-by: Xuan Son Nguyen <redacted>
Co-authored-by: Pascal <redacted>
25 files changed:
tools/server/server-tools.cpp
tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessage/ChatMessageToolCall/ChatMessageToolCallBlock.svelte
tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessage/ChatMessageToolCall/ChatMessageToolCallBlockDefault.svelte
tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessage/ChatMessageToolCall/ChatMessageToolCallBlockExecShellCommand.svelte
tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessage/ChatMessageToolCall/ChatMessageToolCallBlockReadMedia.svelte [new file with mode: 0644]
tools/ui/src/lib/components/app/chat/ChatMessages/ChatMessage/ChatMessageToolCall/parsers/read-media.ts [new file with mode: 0644]
tools/ui/src/lib/constants/built-in-tools.ts
tools/ui/src/lib/constants/code.ts
tools/ui/src/lib/constants/index.ts
tools/ui/src/lib/constants/mcp-resource.ts
tools/ui/src/lib/constants/read-media.ts [new file with mode: 0644]
tools/ui/src/lib/constants/tools.ts
tools/ui/src/lib/enums/files.enums.ts
tools/ui/src/lib/enums/tools.enums.ts
tools/ui/src/lib/services/chat.service.ts
tools/ui/src/lib/services/read-media.service.ts [new file with mode: 0644]
tools/ui/src/lib/services/tools.service.ts
tools/ui/src/lib/stores/agentic.svelte.ts
tools/ui/src/lib/stores/models.svelte.ts
tools/ui/src/lib/stores/tools.svelte.ts
tools/ui/src/lib/utils/agentic.ts
tools/ui/src/lib/utils/audio-format.ts [new file with mode: 0644]
tools/ui/src/lib/utils/index.ts
tools/ui/tests/client/README-perf.md
tools/ui/tests/unit/agentic-hotpath.bench.ts