From 4368cce6bf6da6411f561d4e081553f6a2b2b31e Mon Sep 17 00:00:00 2001 From: suyua9 <1521777066@qq.com> Date: Sat, 4 Apr 2026 00:52:17 +0800 Subject: [PATCH] fix: query prompt tags by JSON elements Signed-off-by: suyua9 <1521777066@qq.com> --- backend/open_webui/models/prompts.py | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/backend/open_webui/models/prompts.py b/backend/open_webui/models/prompts.py index bb77f32f31..010d591b01 100644 --- a/backend/open_webui/models/prompts.py +++ b/backend/open_webui/models/prompts.py @@ -11,7 +11,7 @@ from open_webui.models.access_grants import AccessGrantModel, AccessGrants from pydantic import BaseModel, ConfigDict, Field -from sqlalchemy import BigInteger, Boolean, Column, String, Text, JSON, or_, func, cast +from sqlalchemy import BigInteger, Boolean, Column, String, Text, JSON, or_, func, cast, text #################### # Prompts DB Schema @@ -284,10 +284,23 @@ class PromptsTable: tag = filter.get('tag') if tag: - # Search for tag in JSON array field - like_pattern = f'%"{tag.lower()}"%' - tags_text = func.lower(cast(Prompt.tags, String)) - query = query.filter(tags_text.like(like_pattern)) + dialect = db.bind.dialect.name + + if dialect == 'sqlite': + query = query.filter( + text("EXISTS (SELECT 1 FROM json_each(prompt.tags) WHERE json_each.value = :tag)") + ).params(tag=tag) + elif dialect == 'postgresql': + query = query.filter( + text( + "EXISTS (SELECT 1 FROM json_array_elements_text(prompt.tags) AS tag_elem " + "WHERE tag_elem = :tag)" + ) + ).params(tag=tag) + else: + like_pattern = f'%"{tag.lower()}"%' + tags_text = func.lower(cast(Prompt.tags, String)) + query = query.filter(tags_text.like(like_pattern)) order_by = filter.get('order_by') direction = filter.get('direction')