diff --git a/backend/open_webui/models/prompts.py b/backend/open_webui/models/prompts.py index 544aea767..9562d957d 100644 --- a/backend/open_webui/models/prompts.py +++ b/backend/open_webui/models/prompts.py @@ -502,9 +502,10 @@ class PromptsTable: name: str, command: str, tags: Optional[list[str]] = None, + access_grants: Optional[list[dict]] = None, db: Optional[Session] = None, ) -> Optional[PromptModel]: - """Update only name and command (no history created).""" + """Update only name, command, tags, and access grants (no history created).""" try: with get_db_context(db) as db: prompt = db.query(Prompt).filter_by(id=prompt_id).first() @@ -516,6 +517,11 @@ class PromptsTable: if tags is not None: prompt.tags = tags + + if access_grants is not None: + AccessGrants.set_access_grants( + "prompt", prompt_id, access_grants, db=db + ) prompt.updated_at = int(time.time()) db.commit() diff --git a/backend/open_webui/routers/prompts.py b/backend/open_webui/routers/prompts.py index 77c2e84fc..f2580ef93 100644 --- a/backend/open_webui/routers/prompts.py +++ b/backend/open_webui/routers/prompts.py @@ -33,6 +33,7 @@ class PromptMetadataForm(BaseModel): name: str command: str tags: Optional[list[str]] = None + access_grants: Optional[list[dict]] = None router = APIRouter() @@ -372,7 +373,7 @@ async def update_prompt_metadata( ) updated_prompt = Prompts.update_prompt_metadata( - prompt.id, form_data.name, form_data.command, form_data.tags, db=db + prompt.id, form_data.name, form_data.command, form_data.tags, form_data.access_grants, db=db ) if updated_prompt: return updated_prompt diff --git a/src/lib/apis/prompts/index.ts b/src/lib/apis/prompts/index.ts index c227c9f71..7b2704cf0 100644 --- a/src/lib/apis/prompts/index.ts +++ b/src/lib/apis/prompts/index.ts @@ -331,7 +331,8 @@ export const updatePromptMetadata = async ( promptId: string, name: string, command: string, - tags: string[] = [] + tags: string[] = [], + accessGrants: any[] | null = null ) => { let error = null; @@ -342,7 +343,7 @@ export const updatePromptMetadata = async ( 'Content-Type': 'application/json', authorization: `Bearer ${token}` }, - body: JSON.stringify({ name, command, tags }) + body: JSON.stringify({ name, command, tags, access_grants: accessGrants }) }) .then(async (res) => { if (!res.ok) throw await res.json(); diff --git a/src/lib/components/workspace/Prompts/PromptEditor.svelte b/src/lib/components/workspace/Prompts/PromptEditor.svelte index 78f5c21b7..acd3c3fff 100644 --- a/src/lib/components/workspace/Prompts/PromptEditor.svelte +++ b/src/lib/components/workspace/Prompts/PromptEditor.svelte @@ -213,14 +213,6 @@ } debounceTimer = setTimeout(async () => { - // Skip if nothing changed - if ( - name === originalName && - command === originalCommand && - JSON.stringify(tags) === JSON.stringify(originalTags) - ) - return; - if (!validateCommandString(command)) { toast.error( $i18n.t('Only alphanumeric characters and hyphens are allowed in the command string.') @@ -235,7 +227,8 @@ prompt?.id, name, command, - tags.map((tag) => tag.name) + tags.map((tag) => tag.name), + accessGrants ); // Update originals on success originalName = name; @@ -290,6 +283,9 @@ accessRoles={['read', 'write']} share={$user?.permissions?.sharing?.prompts || $user?.role === 'admin'} sharePublic={$user?.permissions?.sharing?.public_prompts || $user?.role === 'admin' || edit} + onChange={() => { + debouncedSaveMetadata(); + }} />