This commit fixes do_picture_description feature when using Docling as an external document parser.

Merge branch 'dev' into vaclavs-picture-description
This commit is contained in:
Vaclav Cerny 2025-06-04 14:29:41 +02:00
commit 0b3719cc65
7 changed files with 73 additions and 35 deletions

48
.gitattributes vendored
View File

@ -1 +1,49 @@
# TypeScript
*.ts text eol=lf
*.tsx text eol=lf
# JavaScript
*.js text eol=lf
*.jsx text eol=lf
*.mjs text eol=lf
*.cjs text eol=lf
# Svelte
*.svelte text eol=lf
# HTML/CSS
*.html text eol=lf
*.css text eol=lf
*.scss text eol=lf
*.less text eol=lf
# Config files and JSON
*.json text eol=lf
*.jsonc text eol=lf
*.yml text eol=lf
*.yaml text eol=lf
*.toml text eol=lf
# Shell scripts
*.sh text eol=lf *.sh text eol=lf
# Markdown & docs
*.md text eol=lf
*.mdx text eol=lf
*.txt text eol=lf
# Git-related
.gitattributes text eol=lf
.gitignore text eol=lf
# Prettier and other dotfiles
.prettierrc text eol=lf
.prettierignore text eol=lf
.eslintrc text eol=lf
.eslintignore text eol=lf
.stylelintrc text eol=lf
.editorconfig text eol=lf
# Misc
*.env text eol=lf
*.lock text eol=lf

View File

@ -5,5 +5,6 @@
"printWidth": 100, "printWidth": 100,
"plugins": ["prettier-plugin-svelte"], "plugins": ["prettier-plugin-svelte"],
"pluginSearchDirs": ["."], "pluginSearchDirs": ["."],
"overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }],
"endOfLine": "lf"
} }

View File

@ -25,6 +25,7 @@ from open_webui.socket.main import (
) )
from open_webui.models.users import UserModel
from open_webui.models.functions import Functions from open_webui.models.functions import Functions
from open_webui.models.models import Models from open_webui.models.models import Models
@ -227,12 +228,7 @@ async def generate_function_chat_completion(
"__task__": __task__, "__task__": __task__,
"__task_body__": __task_body__, "__task_body__": __task_body__,
"__files__": files, "__files__": files,
"__user__": { "__user__": user.model_dump() if isinstance(user, UserModel) else {},
"id": user.id,
"email": user.email,
"name": user.name,
"role": user.role,
},
"__metadata__": metadata, "__metadata__": metadata,
"__request__": request, "__request__": request,
} }

View File

@ -37,7 +37,7 @@ from fastapi import (
from fastapi.openapi.docs import get_swagger_ui_html from fastapi.openapi.docs import get_swagger_ui_html
from fastapi.middleware.cors import CORSMiddleware from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import JSONResponse, RedirectResponse from fastapi.responses import FileResponse, JSONResponse, RedirectResponse
from fastapi.staticfiles import StaticFiles from fastapi.staticfiles import StaticFiles
from starlette_compress import CompressMiddleware from starlette_compress import CompressMiddleware
@ -1634,7 +1634,20 @@ async def healthcheck_with_db():
app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static") app.mount("/static", StaticFiles(directory=STATIC_DIR), name="static")
app.mount("/cache", StaticFiles(directory=CACHE_DIR), name="cache")
@app.get("/cache/{path:path}")
async def serve_cache_file(
path: str,
user=Depends(get_verified_user),
):
file_path = os.path.abspath(os.path.join(CACHE_DIR, path))
# prevent path traversal
if not file_path.startswith(os.path.abspath(CACHE_DIR)):
raise HTTPException(status_code=404, detail="File not found")
if not os.path.isfile(file_path):
raise HTTPException(status_code=404, detail="File not found")
return FileResponse(file_path)
def swagger_ui_html(*args, **kwargs): def swagger_ui_html(*args, **kwargs):

View File

@ -320,12 +320,7 @@ async def chat_completed(request: Request, form_data: dict, user: Any):
extra_params = { extra_params = {
"__event_emitter__": get_event_emitter(metadata), "__event_emitter__": get_event_emitter(metadata),
"__event_call__": get_event_call(metadata), "__event_call__": get_event_call(metadata),
"__user__": { "__user__": user.model_dump() if isinstance(user, UserModel) else {},
"id": user.id,
"email": user.email,
"name": user.name,
"role": user.role,
},
"__metadata__": metadata, "__metadata__": metadata,
"__request__": request, "__request__": request,
"__model__": model, "__model__": model,
@ -424,12 +419,7 @@ async def chat_action(request: Request, action_id: str, form_data: dict, user: A
params[key] = value params[key] = value
if "__user__" in sig.parameters: if "__user__" in sig.parameters:
__user__ = { __user__ = (user.model_dump() if isinstance(user, UserModel) else {},)
"id": user.id,
"email": user.email,
"name": user.name,
"role": user.role,
}
try: try:
if hasattr(function_module, "UserValves"): if hasattr(function_module, "UserValves"):

View File

@ -727,12 +727,7 @@ async def process_chat_payload(request, form_data, user, metadata, model):
extra_params = { extra_params = {
"__event_emitter__": event_emitter, "__event_emitter__": event_emitter,
"__event_call__": event_call, "__event_call__": event_call,
"__user__": { "__user__": user.model_dump() if isinstance(user, UserModel) else {},
"id": user.id,
"email": user.email,
"name": user.name,
"role": user.role,
},
"__metadata__": metadata, "__metadata__": metadata,
"__request__": request, "__request__": request,
"__model__": model, "__model__": model,
@ -1327,12 +1322,7 @@ async def process_chat_response(
extra_params = { extra_params = {
"__event_emitter__": event_emitter, "__event_emitter__": event_emitter,
"__event_call__": event_caller, "__event_call__": event_caller,
"__user__": { "__user__": user.model_dump() if isinstance(user, UserModel) else {},
"id": user.id,
"email": user.email,
"name": user.name,
"role": user.role,
},
"__metadata__": metadata, "__metadata__": metadata,
"__request__": request, "__request__": request,
"__model__": model, "__model__": model,

View File

@ -28,7 +28,7 @@
<!-- svelte-ignore a11y-media-has-caption --> <!-- svelte-ignore a11y-media-has-caption -->
<video <video
class="w-full my-2" class="w-full my-2"
src={videoSrc} src={videoSrc.replaceAll('&amp;', '&')}
title="Video player" title="Video player"
frameborder="0" frameborder="0"
referrerpolicy="strict-origin-when-cross-origin" referrerpolicy="strict-origin-when-cross-origin"