Note to first-time contributors: Please open a discussion post in Discussions to discuss your idea/fix with the community before creating a pull request, and describe your changes before submitting a pull request.
This is to ensure large feature PRs are discussed with the community first, before starting work on it. If the community does not want this feature or it is not relevant for Open WebUI as a project, it can be identified in the discussion before working on the feature and submitting the PR.
Before submitting, make sure you've checked the following:
Target branch: Verify that the pull request targets the dev branch. PRs targeting main will be immediately closed.
Description: Provide a concise description of the changes made in this pull request down below.
Changelog: Ensure a changelog entry following the format of Keep a Changelog is added at the bottom of the PR description.
Documentation: Add docs in Open WebUI Docs Repository. Document user-facing behavior, environment variables, public APIs/interfaces, or deployment steps.
Dependencies: No new dependencies were added.
Testing: Performed manual verification and targeted regression tests (details below).
Agentic AI Code: This PR has gone through additional human review and manual testing before submission.
Code review: Performed self-review and ensured only one logical change is included.
Design & Architecture: Uses existing payload pipeline, no new settings added.
Git Hygiene: PR is atomic and only includes the image forwarding fix + tests.
Title Prefix:fix
Changelog Entry
Description
Fixes OpenAI-compatible chat payload construction so DB-backed message image attachments (message.files) are forwarded as messages[].contentimage_url parts.
Added
backend/open_webui/utils/chat_image_payload.py helper to append image attachment parts from chat history.
Regression tests in backend/open_webui/test/util/test_middleware_images.py.
Changed
backend/open_webui/utils/middleware.py now calls the helper after convert_url_images_to_base64(...) when chat_id + parent_message_id are available.
Deprecated
None.
Removed
None.
Fixed
Prevents image attachments that are stored in chat DB files from being dropped in OpenAI-compatible outbound payloads.
Avoids duplicate image insertion when content already has image_url parts.
Security
No security scope change.
Breaking Changes
BREAKING CHANGE: None.
Additional Information
Why this matters: in some flows, frontend sends text content while attachment images remain in DB files; downstream providers/gateways then receive no image content unless these files are lifted into message parts.
The helper intentionally ignores non-image files and no-ops when parent message context is missing.
Screenshots or Videos
Not applicable (backend payload fix).
Testing Performed
Manual:
Verified end-to-end by sending image-attached chat requests through OpenAI-compatible endpoint and confirming downstream receives image_url content parts.
By submitting this pull request, I confirm that I have read and fully agree to the Contributor License Agreement (CLA), and I am providing my contributions under its terms.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.
## 📋 Pull Request Information
**Original PR:** https://github.com/open-webui/open-webui/pull/21504
**Author:** [@Plutarch01](https://github.com/Plutarch01)
**Created:** 2/17/2026
**Status:** ❌ Closed
**Base:** `dev` ← **Head:** `fix/chat-files-image-forwarding`
---
### 📝 Commits (10+)
- [`fe6783c`](https://github.com/open-webui/open-webui/commit/fe6783c16699911c7be17392596d579333fb110c) Merge pull request #19030 from open-webui/dev
- [`fc05e0a`](https://github.com/open-webui/open-webui/commit/fc05e0a6c5d39da60b603b4d520f800d6e36f748) Merge pull request #19405 from open-webui/dev
- [`e3faec6`](https://github.com/open-webui/open-webui/commit/e3faec62c58e3a83d89aa3df539feacefa125e0c) Merge pull request #19416 from open-webui/dev
- [`9899293`](https://github.com/open-webui/open-webui/commit/9899293f050ad50ae12024cbebee7e018acd851e) Merge pull request #19448 from open-webui/dev
- [`140605e`](https://github.com/open-webui/open-webui/commit/140605e660b8186a7d5c79fb3be6ffb147a2f498) Merge pull request #19462 from open-webui/dev
- [`6f1486f`](https://github.com/open-webui/open-webui/commit/6f1486ffd0cb288d0e21f41845361924e0d742b3) Merge pull request #19466 from open-webui/dev
- [`d95f533`](https://github.com/open-webui/open-webui/commit/d95f533214e3fe5beb5e41ec1f349940bc4c7043) Merge pull request #19729 from open-webui/dev
- [`a727153`](https://github.com/open-webui/open-webui/commit/a7271532f8a38da46785afcaa7e65f9a45e7d753) 0.6.43 (#20093)
- [`6adde20`](https://github.com/open-webui/open-webui/commit/6adde203cd292a9e3af9c64a2ae36b603fed096a) Merge pull request #20394 from open-webui/dev
- [`f9b0534`](https://github.com/open-webui/open-webui/commit/f9b0534e0c442631d1cb7205169588b9b6204179) Merge pull request #20522 from open-webui/dev
### 📊 Changes
**3 files changed** (+232 additions, -0 deletions)
<details>
<summary>View changed files</summary>
➕ `backend/open_webui/test/util/test_middleware_images.py` (+124 -0)
➕ `backend/open_webui/utils/chat_image_payload.py` (+95 -0)
📝 `backend/open_webui/utils/middleware.py` (+13 -0)
</details>
### 📄 Description
# Pull Request Checklist
### Note to first-time contributors: Please open a discussion post in [Discussions](https://github.com/open-webui/open-webui/discussions) to discuss your idea/fix with the community before creating a pull request, and describe your changes before submitting a pull request.
This is to ensure large feature PRs are discussed with the community first, before starting work on it. If the community does not want this feature or it is not relevant for Open WebUI as a project, it can be identified in the discussion before working on the feature and submitting the PR.
**Before submitting, make sure you've checked the following:**
- [x] **Target branch:** Verify that the pull request targets the `dev` branch. **PRs targeting `main` will be immediately closed.**
- [x] **Description:** Provide a concise description of the changes made in this pull request down below.
- [x] **Changelog:** Ensure a changelog entry following the format of [Keep a Changelog](https://keepachangelog.com/) is added at the bottom of the PR description.
- [ ] **Documentation:** Add docs in [Open WebUI Docs Repository](https://github.com/open-webui/docs). Document user-facing behavior, environment variables, public APIs/interfaces, or deployment steps.
- [x] **Dependencies:** No new dependencies were added.
- [x] **Testing:** Performed manual verification and targeted regression tests (details below).
- [x] **Agentic AI Code:** This PR has gone through additional human review and manual testing before submission.
- [x] **Code review:** Performed self-review and ensured only one logical change is included.
- [x] **Design & Architecture:** Uses existing payload pipeline, no new settings added.
- [x] **Git Hygiene:** PR is atomic and only includes the image forwarding fix + tests.
- [x] **Title Prefix:** `fix`
# Changelog Entry
### Description
- Fixes OpenAI-compatible chat payload construction so DB-backed message image attachments (`message.files`) are forwarded as `messages[].content` `image_url` parts.
### Added
- `backend/open_webui/utils/chat_image_payload.py` helper to append image attachment parts from chat history.
- Regression tests in `backend/open_webui/test/util/test_middleware_images.py`.
### Changed
- `backend/open_webui/utils/middleware.py` now calls the helper after `convert_url_images_to_base64(...)` when `chat_id` + `parent_message_id` are available.
### Deprecated
- None.
### Removed
- None.
### Fixed
- Prevents image attachments that are stored in chat DB `files` from being dropped in OpenAI-compatible outbound payloads.
- Avoids duplicate image insertion when content already has `image_url` parts.
### Security
- No security scope change.
### Breaking Changes
- **BREAKING CHANGE**: None.
---
### Additional Information
- Why this matters: in some flows, frontend sends text content while attachment images remain in DB `files`; downstream providers/gateways then receive no image content unless these files are lifted into message parts.
- The helper intentionally ignores non-image files and no-ops when parent message context is missing.
### Screenshots or Videos
- Not applicable (backend payload fix).
### Testing Performed
Manual:
- Verified end-to-end by sending image-attached chat requests through OpenAI-compatible endpoint and confirming downstream receives `image_url` content parts.
Automated:
- `python -m py_compile backend/open_webui/utils/middleware.py backend/open_webui/utils/chat_image_payload.py backend/open_webui/test/util/test_middleware_images.py`
- `python -c "import sys,pytest; sys.path.insert(0,'backend'); raise SystemExit(pytest.main(['backend/open_webui/test/util/test_middleware_images.py']))"`
### Contributor License Agreement
By submitting this pull request, I confirm that I have read and fully agree to the [Contributor License Agreement (CLA)](https://github.com/open-webui/open-webui/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT), and I am providing my contributions under its terms.
---
<sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
📋 Pull Request Information
Original PR: https://github.com/open-webui/open-webui/pull/21504
Author: @Plutarch01
Created: 2/17/2026
Status: ❌ Closed
Base:
dev← Head:fix/chat-files-image-forwarding📝 Commits (10+)
fe6783cMerge pull request #19030 from open-webui/devfc05e0aMerge pull request #19405 from open-webui/deve3faec6Merge pull request #19416 from open-webui/dev9899293Merge pull request #19448 from open-webui/dev140605eMerge pull request #19462 from open-webui/dev6f1486fMerge pull request #19466 from open-webui/devd95f533Merge pull request #19729 from open-webui/deva7271530.6.43 (#20093)6adde20Merge pull request #20394 from open-webui/devf9b0534Merge pull request #20522 from open-webui/dev📊 Changes
3 files changed (+232 additions, -0 deletions)
View changed files
➕
backend/open_webui/test/util/test_middleware_images.py(+124 -0)➕
backend/open_webui/utils/chat_image_payload.py(+95 -0)📝
backend/open_webui/utils/middleware.py(+13 -0)📄 Description
Pull Request Checklist
Note to first-time contributors: Please open a discussion post in Discussions to discuss your idea/fix with the community before creating a pull request, and describe your changes before submitting a pull request.
This is to ensure large feature PRs are discussed with the community first, before starting work on it. If the community does not want this feature or it is not relevant for Open WebUI as a project, it can be identified in the discussion before working on the feature and submitting the PR.
Before submitting, make sure you've checked the following:
devbranch. PRs targetingmainwill be immediately closed.fixChangelog Entry
Description
message.files) are forwarded asmessages[].contentimage_urlparts.Added
backend/open_webui/utils/chat_image_payload.pyhelper to append image attachment parts from chat history.backend/open_webui/test/util/test_middleware_images.py.Changed
backend/open_webui/utils/middleware.pynow calls the helper afterconvert_url_images_to_base64(...)whenchat_id+parent_message_idare available.Deprecated
Removed
Fixed
filesfrom being dropped in OpenAI-compatible outbound payloads.image_urlparts.Security
Breaking Changes
Additional Information
files; downstream providers/gateways then receive no image content unless these files are lifted into message parts.Screenshots or Videos
Testing Performed
Manual:
image_urlcontent parts.Automated:
python -m py_compile backend/open_webui/utils/middleware.py backend/open_webui/utils/chat_image_payload.py backend/open_webui/test/util/test_middleware_images.pypython -c "import sys,pytest; sys.path.insert(0,'backend'); raise SystemExit(pytest.main(['backend/open_webui/test/util/test_middleware_images.py']))"Contributor License Agreement
By submitting this pull request, I confirm that I have read and fully agree to the Contributor License Agreement (CLA), and I am providing my contributions under its terms.
🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.