From 8f890f0b43aed3d42b9e3d954e25e54e37d526d0 Mon Sep 17 00:00:00 2001 From: Timothy Jaeryang Baek Date: Thu, 25 Jun 2026 15:56:10 +0100 Subject: [PATCH] refac --- backend/open_webui/events.py | 348 ++++++++++++++-------------- backend/open_webui/utils/webhook.py | 24 +- 2 files changed, 198 insertions(+), 174 deletions(-) diff --git a/backend/open_webui/events.py b/backend/open_webui/events.py index ff86d093c3..873af84af7 100644 --- a/backend/open_webui/events.py +++ b/backend/open_webui/events.py @@ -42,177 +42,177 @@ class EventDefinition(BaseModel): class EventDefinitions(BaseModel): model_config = ConfigDict(frozen=True) - SYSTEM_STARTUP_STARTED: EventDefinition = EventDefinition(name='system.startup.started') - SYSTEM_STARTUP_COMPLETED: EventDefinition = EventDefinition(name='system.startup.completed') - SYSTEM_SHUTDOWN_STARTED: EventDefinition = EventDefinition(name='system.shutdown.started') - SYSTEM_SHUTDOWN_COMPLETED: EventDefinition = EventDefinition(name='system.shutdown.completed') - CONFIG_IMPORTED: EventDefinition = EventDefinition(name='config.imported') - CONFIG_UPDATED: EventDefinition = EventDefinition(name='config.updated') - CONFIG_WEBHOOK_UPDATED: EventDefinition = EventDefinition(name='config.webhook.updated') - CONFIG_CONNECTIONS_UPDATED: EventDefinition = EventDefinition(name='config.connections.updated') - CONFIG_TOOL_SERVERS_UPDATED: EventDefinition = EventDefinition(name='config.tool_servers.updated') - CONFIG_TERMINAL_SERVERS_UPDATED: EventDefinition = EventDefinition(name='config.terminal_servers.updated') - CONFIG_CODE_EXECUTION_UPDATED: EventDefinition = EventDefinition(name='config.code_execution.updated') - CONFIG_MODELS_UPDATED: EventDefinition = EventDefinition(name='config.models.updated') - CONFIG_BANNERS_UPDATED: EventDefinition = EventDefinition(name='config.banners.updated') - CONFIG_SUGGESTIONS_UPDATED: EventDefinition = EventDefinition(name='config.suggestions.updated') - AUTH_SIGNUP: EventDefinition = EventDefinition(name='auth.signup') - AUTH_LOGIN: EventDefinition = EventDefinition(name='auth.login') - AUTH_LOGOUT: EventDefinition = EventDefinition(name='auth.logout') - AUTH_PASSWORD_CHANGED: EventDefinition = EventDefinition(name='auth.password_changed') - AUTH_API_KEY_CREATED: EventDefinition = EventDefinition(name='auth.api_key.created') - AUTH_API_KEY_DELETED: EventDefinition = EventDefinition(name='auth.api_key.deleted') - AUTH_OAUTH_SESSION_DELETED: EventDefinition = EventDefinition(name='auth.oauth_session.deleted') + SYSTEM_STARTUP_STARTED: EventDefinition = EventDefinition(name='system.startup.started', description='Application startup began.', message='Startup started') + SYSTEM_STARTUP_COMPLETED: EventDefinition = EventDefinition(name='system.startup.completed', description='Application startup completed.', message='Startup completed') + SYSTEM_SHUTDOWN_STARTED: EventDefinition = EventDefinition(name='system.shutdown.started', description='Application shutdown began.', message='Shutdown started') + SYSTEM_SHUTDOWN_COMPLETED: EventDefinition = EventDefinition(name='system.shutdown.completed', description='Application shutdown completed.', message='Shutdown completed') + CONFIG_IMPORTED: EventDefinition = EventDefinition(name='config.imported', description='Configuration was imported.', message='Config imported') + CONFIG_UPDATED: EventDefinition = EventDefinition(name='config.updated', description='Configuration was updated.', message='Config updated') + CONFIG_WEBHOOK_UPDATED: EventDefinition = EventDefinition(name='config.webhook.updated', description='Event webhook configuration was updated.', message='Webhook configuration updated') + CONFIG_CONNECTIONS_UPDATED: EventDefinition = EventDefinition(name='config.connections.updated', description='Connection configuration was updated.', message='Config Connections updated') + CONFIG_TOOL_SERVERS_UPDATED: EventDefinition = EventDefinition(name='config.tool_servers.updated', description='Tool server configuration was updated.', message='Config Tool Servers updated') + CONFIG_TERMINAL_SERVERS_UPDATED: EventDefinition = EventDefinition(name='config.terminal_servers.updated', description='Terminal server configuration was updated.', message='Config Terminal Servers updated') + CONFIG_CODE_EXECUTION_UPDATED: EventDefinition = EventDefinition(name='config.code_execution.updated', description='Code execution configuration was updated.', message='Config Code Execution updated') + CONFIG_MODELS_UPDATED: EventDefinition = EventDefinition(name='config.models.updated', description='Model configuration was updated.', message='Config Models updated') + CONFIG_BANNERS_UPDATED: EventDefinition = EventDefinition(name='config.banners.updated', description='Banner configuration was updated.', message='Config Banners updated') + CONFIG_SUGGESTIONS_UPDATED: EventDefinition = EventDefinition(name='config.suggestions.updated', description='Suggestion configuration was updated.', message='Config Suggestions updated') + AUTH_SIGNUP: EventDefinition = EventDefinition(name='auth.signup', description='A user account was created through signup.', message='User signed up') + AUTH_LOGIN: EventDefinition = EventDefinition(name='auth.login', description='A user successfully logged in.', message='User logged in') + AUTH_LOGOUT: EventDefinition = EventDefinition(name='auth.logout', description='A user logged out.', message='User logged out') + AUTH_PASSWORD_CHANGED: EventDefinition = EventDefinition(name='auth.password_changed', description='A user password was changed.', message='Password changed') + AUTH_API_KEY_CREATED: EventDefinition = EventDefinition(name='auth.api_key.created', description='A user API key was created.', message='API key created') + AUTH_API_KEY_DELETED: EventDefinition = EventDefinition(name='auth.api_key.deleted', description='A user API key was deleted.', message='API key deleted') + AUTH_OAUTH_SESSION_DELETED: EventDefinition = EventDefinition(name='auth.oauth_session.deleted', description='An OAuth session was deleted.', message='OAuth session deleted') USER_CREATED: EventDefinition = EventDefinition(name='user.created', description='A user account was created.', message='User created') - USER_UPDATED: EventDefinition = EventDefinition(name='user.updated') - USER_DELETED: EventDefinition = EventDefinition(name='user.deleted') - USER_ROLE_UPDATED: EventDefinition = EventDefinition(name='user.role_updated') - USER_STATUS_UPDATED: EventDefinition = EventDefinition(name='user.status_updated') - USER_SETTINGS_UPDATED: EventDefinition = EventDefinition(name='user.settings_updated') - USER_PROFILE_UPDATED: EventDefinition = EventDefinition(name='user.profile_updated') - USER_PERMISSIONS_UPDATED: EventDefinition = EventDefinition(name='user.permissions_updated') - GROUP_CREATED: EventDefinition = EventDefinition(name='group.created') - GROUP_UPDATED: EventDefinition = EventDefinition(name='group.updated') - GROUP_DELETED: EventDefinition = EventDefinition(name='group.deleted') - GROUP_MEMBER_ADDED: EventDefinition = EventDefinition(name='group.member_added') - GROUP_MEMBER_REMOVED: EventDefinition = EventDefinition(name='group.member_removed') - CHAT_CREATED: EventDefinition = EventDefinition(name='chat.created') - CHAT_IMPORTED: EventDefinition = EventDefinition(name='chat.imported') - CHAT_UPDATED: EventDefinition = EventDefinition(name='chat.updated') - CHAT_DELETED: EventDefinition = EventDefinition(name='chat.deleted') - CHAT_DELETED_ALL: EventDefinition = EventDefinition(name='chat.deleted_all') - CHAT_COMPACTED: EventDefinition = EventDefinition(name='chat.compacted') - CHAT_PINNED: EventDefinition = EventDefinition(name='chat.pinned') - CHAT_UNPINNED: EventDefinition = EventDefinition(name='chat.unpinned') - CHAT_CLONED: EventDefinition = EventDefinition(name='chat.cloned') - CHAT_ARCHIVED: EventDefinition = EventDefinition(name='chat.archived') - CHAT_UNARCHIVED: EventDefinition = EventDefinition(name='chat.unarchived') - CHAT_SHARED: EventDefinition = EventDefinition(name='chat.shared') - CHAT_UNSHARED: EventDefinition = EventDefinition(name='chat.unshared') - CHAT_FOLDER_UPDATED: EventDefinition = EventDefinition(name='chat.folder_updated') - CHAT_TAG_ADDED: EventDefinition = EventDefinition(name='chat.tag_added') - CHAT_TAG_REMOVED: EventDefinition = EventDefinition(name='chat.tag_removed') - MESSAGE_CREATED: EventDefinition = EventDefinition(name='message.created') - MESSAGE_UPDATED: EventDefinition = EventDefinition(name='message.updated') - MESSAGE_DELETED: EventDefinition = EventDefinition(name='message.deleted') - MESSAGE_EVENT_RECEIVED: EventDefinition = EventDefinition(name='message.event_received') - MESSAGE_REACTION_ADDED: EventDefinition = EventDefinition(name='message.reaction_added') - MESSAGE_REACTION_REMOVED: EventDefinition = EventDefinition(name='message.reaction_removed') - MESSAGE_PINNED: EventDefinition = EventDefinition(name='message.pinned') - MESSAGE_UNPINNED: EventDefinition = EventDefinition(name='message.unpinned') - CHANNEL_CREATED: EventDefinition = EventDefinition(name='channel.created') - CHANNEL_UPDATED: EventDefinition = EventDefinition(name='channel.updated') - CHANNEL_DELETED: EventDefinition = EventDefinition(name='channel.deleted') - CHANNEL_MEMBER_ADDED: EventDefinition = EventDefinition(name='channel.member_added') - CHANNEL_MEMBER_REMOVED: EventDefinition = EventDefinition(name='channel.member_removed') - CHANNEL_MEMBER_ACTIVE_UPDATED: EventDefinition = EventDefinition(name='channel.member_active_updated') - CHANNEL_WEBHOOK_CREATED: EventDefinition = EventDefinition(name='channel.webhook.created') - CHANNEL_WEBHOOK_UPDATED: EventDefinition = EventDefinition(name='channel.webhook.updated') - CHANNEL_WEBHOOK_DELETED: EventDefinition = EventDefinition(name='channel.webhook.deleted') - FILE_UPLOADED: EventDefinition = EventDefinition(name='file.uploaded') - FILE_CONTENT_UPDATED: EventDefinition = EventDefinition(name='file.content_updated') - FILE_RENAMED: EventDefinition = EventDefinition(name='file.renamed') - FILE_DELETED: EventDefinition = EventDefinition(name='file.deleted') - FILE_DELETED_ALL: EventDefinition = EventDefinition(name='file.deleted_all') - FOLDER_CREATED: EventDefinition = EventDefinition(name='folder.created') - FOLDER_UPDATED: EventDefinition = EventDefinition(name='folder.updated') - FOLDER_PARENT_UPDATED: EventDefinition = EventDefinition(name='folder.parent_updated') - FOLDER_ACCESS_UPDATED: EventDefinition = EventDefinition(name='folder.access_updated') - FOLDER_DELETED: EventDefinition = EventDefinition(name='folder.deleted') - NOTE_CREATED: EventDefinition = EventDefinition(name='note.created') - NOTE_UPDATED: EventDefinition = EventDefinition(name='note.updated') - NOTE_ACCESS_UPDATED: EventDefinition = EventDefinition(name='note.access_updated') - NOTE_PINNED: EventDefinition = EventDefinition(name='note.pinned') - NOTE_UNPINNED: EventDefinition = EventDefinition(name='note.unpinned') - NOTE_DELETED: EventDefinition = EventDefinition(name='note.deleted') - MEMORY_CREATED: EventDefinition = EventDefinition(name='memory.created') - MEMORY_UPDATED: EventDefinition = EventDefinition(name='memory.updated') - MEMORY_DELETED: EventDefinition = EventDefinition(name='memory.deleted') - MEMORY_RESET: EventDefinition = EventDefinition(name='memory.reset') - KNOWLEDGE_CREATED: EventDefinition = EventDefinition(name='knowledge.created') - KNOWLEDGE_UPDATED: EventDefinition = EventDefinition(name='knowledge.updated') - KNOWLEDGE_DELETED: EventDefinition = EventDefinition(name='knowledge.deleted') - KNOWLEDGE_RESET: EventDefinition = EventDefinition(name='knowledge.reset') - KNOWLEDGE_REINDEXED: EventDefinition = EventDefinition(name='knowledge.reindexed') - KNOWLEDGE_ACCESS_UPDATED: EventDefinition = EventDefinition(name='knowledge.access_updated') - KNOWLEDGE_FILE_ADDED: EventDefinition = EventDefinition(name='knowledge.file.added') - KNOWLEDGE_FILE_UPDATED: EventDefinition = EventDefinition(name='knowledge.file.updated') - KNOWLEDGE_FILE_REMOVED: EventDefinition = EventDefinition(name='knowledge.file.removed') - KNOWLEDGE_FILE_MOVED: EventDefinition = EventDefinition(name='knowledge.file.moved') - KNOWLEDGE_DIRECTORY_CREATED: EventDefinition = EventDefinition(name='knowledge.directory.created') - KNOWLEDGE_DIRECTORY_UPDATED: EventDefinition = EventDefinition(name='knowledge.directory.updated') - KNOWLEDGE_DIRECTORY_DELETED: EventDefinition = EventDefinition(name='knowledge.directory.deleted') - KNOWLEDGE_EXTERNAL_CONNECTION_CREATED: EventDefinition = EventDefinition(name='knowledge.external_connection.created') - KNOWLEDGE_EXTERNAL_CONNECTION_UPDATED: EventDefinition = EventDefinition(name='knowledge.external_connection.updated') - KNOWLEDGE_EXTERNAL_CONNECTION_DELETED: EventDefinition = EventDefinition(name='knowledge.external_connection.deleted') - RETRIEVAL_CONTENT_PROCESSED: EventDefinition = EventDefinition(name='retrieval.content.processed') - RETRIEVAL_COLLECTION_DELETED: EventDefinition = EventDefinition(name='retrieval.collection.deleted') - RETRIEVAL_VECTOR_DB_RESET: EventDefinition = EventDefinition(name='retrieval.vector_db.reset') - RETRIEVAL_UPLOADS_RESET: EventDefinition = EventDefinition(name='retrieval.uploads.reset') - MODEL_CREATED: EventDefinition = EventDefinition(name='model.created') - MODEL_IMPORTED: EventDefinition = EventDefinition(name='model.imported') - MODEL_SYNCED: EventDefinition = EventDefinition(name='model.synced') - MODEL_UPDATED: EventDefinition = EventDefinition(name='model.updated') - MODEL_DELETED: EventDefinition = EventDefinition(name='model.deleted') - MODEL_ENABLED: EventDefinition = EventDefinition(name='model.enabled') - MODEL_DISABLED: EventDefinition = EventDefinition(name='model.disabled') - MODEL_ACCESS_UPDATED: EventDefinition = EventDefinition(name='model.access_updated') - MODEL_PROVIDER_CONFIG_UPDATED: EventDefinition = EventDefinition(name='model.provider_config.updated') - MODEL_PROVIDER_MODEL_CREATED: EventDefinition = EventDefinition(name='model.provider_model.created') - MODEL_PROVIDER_MODEL_DELETED: EventDefinition = EventDefinition(name='model.provider_model.deleted') - FUNCTION_CREATED: EventDefinition = EventDefinition(name='function.created') - FUNCTION_UPDATED: EventDefinition = EventDefinition(name='function.updated') - FUNCTION_DELETED: EventDefinition = EventDefinition(name='function.deleted') - FUNCTION_ENABLED: EventDefinition = EventDefinition(name='function.enabled') - FUNCTION_DISABLED: EventDefinition = EventDefinition(name='function.disabled') - FUNCTION_VALVES_UPDATED: EventDefinition = EventDefinition(name='function.valves_updated') - TOOL_CREATED: EventDefinition = EventDefinition(name='tool.created') - TOOL_UPDATED: EventDefinition = EventDefinition(name='tool.updated') - TOOL_DELETED: EventDefinition = EventDefinition(name='tool.deleted') - TOOL_ACCESS_UPDATED: EventDefinition = EventDefinition(name='tool.access_updated') - TOOL_VALVES_UPDATED: EventDefinition = EventDefinition(name='tool.valves_updated') - SKILL_CREATED: EventDefinition = EventDefinition(name='skill.created') - SKILL_UPDATED: EventDefinition = EventDefinition(name='skill.updated') - SKILL_DELETED: EventDefinition = EventDefinition(name='skill.deleted') - SKILL_ENABLED: EventDefinition = EventDefinition(name='skill.enabled') - SKILL_DISABLED: EventDefinition = EventDefinition(name='skill.disabled') - PROMPT_CREATED: EventDefinition = EventDefinition(name='prompt.created') - PROMPT_UPDATED: EventDefinition = EventDefinition(name='prompt.updated') - PROMPT_DELETED: EventDefinition = EventDefinition(name='prompt.deleted') - PROMPT_ENABLED: EventDefinition = EventDefinition(name='prompt.enabled') - PROMPT_DISABLED: EventDefinition = EventDefinition(name='prompt.disabled') - PROMPT_VERSION_UPDATED: EventDefinition = EventDefinition(name='prompt.version_updated') - PROMPT_ACCESS_UPDATED: EventDefinition = EventDefinition(name='prompt.access_updated') - PIPELINE_UPLOADED: EventDefinition = EventDefinition(name='pipeline.uploaded') - PIPELINE_ADDED: EventDefinition = EventDefinition(name='pipeline.added') - PIPELINE_DELETED: EventDefinition = EventDefinition(name='pipeline.deleted') - PIPELINE_VALVES_UPDATED: EventDefinition = EventDefinition(name='pipeline.valves_updated') - CALENDAR_CREATED: EventDefinition = EventDefinition(name='calendar.created') - CALENDAR_UPDATED: EventDefinition = EventDefinition(name='calendar.updated') - CALENDAR_DELETED: EventDefinition = EventDefinition(name='calendar.deleted') - CALENDAR_DEFAULT_UPDATED: EventDefinition = EventDefinition(name='calendar.default_updated') - CALENDAR_EVENT_CREATED: EventDefinition = EventDefinition(name='calendar.event.created') - CALENDAR_EVENT_UPDATED: EventDefinition = EventDefinition(name='calendar.event.updated') - CALENDAR_EVENT_DELETED: EventDefinition = EventDefinition(name='calendar.event.deleted') - CALENDAR_EVENT_RSVP_UPDATED: EventDefinition = EventDefinition(name='calendar.event.rsvp_updated') - AUTOMATION_CREATED: EventDefinition = EventDefinition(name='automation.created') - AUTOMATION_UPDATED: EventDefinition = EventDefinition(name='automation.updated') - AUTOMATION_ENABLED: EventDefinition = EventDefinition(name='automation.enabled') - AUTOMATION_DISABLED: EventDefinition = EventDefinition(name='automation.disabled') - AUTOMATION_DELETED: EventDefinition = EventDefinition(name='automation.deleted') - AUTOMATION_RUN_STARTED: EventDefinition = EventDefinition(name='automation.run_started') - AUTOMATION_RUN_COMPLETED: EventDefinition = EventDefinition(name='automation.run_completed') - AUTOMATION_RUN_FAILED: EventDefinition = EventDefinition(name='automation.run_failed') - FEEDBACK_CREATED: EventDefinition = EventDefinition(name='feedback.created') - FEEDBACK_UPDATED: EventDefinition = EventDefinition(name='feedback.updated') - FEEDBACK_DELETED: EventDefinition = EventDefinition(name='feedback.deleted') - FEEDBACK_DELETED_ALL: EventDefinition = EventDefinition(name='feedback.deleted_all') - IMAGE_GENERATED: EventDefinition = EventDefinition(name='image.generated') - IMAGE_EDITED: EventDefinition = EventDefinition(name='image.edited') - AUDIO_SPEECH_REQUESTED: EventDefinition = EventDefinition(name='audio.speech_requested') - AUDIO_TRANSCRIPTION_REQUESTED: EventDefinition = EventDefinition(name='audio.transcription_requested') - TERMINAL_SESSION_OPENED: EventDefinition = EventDefinition(name='terminal.session.opened') - TERMINAL_SESSION_CLOSED: EventDefinition = EventDefinition(name='terminal.session.closed') + USER_UPDATED: EventDefinition = EventDefinition(name='user.updated', description='A user account was updated.', message='User updated') + USER_DELETED: EventDefinition = EventDefinition(name='user.deleted', description='A user account was deleted.', message='User deleted') + USER_ROLE_UPDATED: EventDefinition = EventDefinition(name='user.role_updated', description='A user role was updated.', message='User role updated') + USER_STATUS_UPDATED: EventDefinition = EventDefinition(name='user.status_updated', description='A user status was updated.', message='User status updated') + USER_SETTINGS_UPDATED: EventDefinition = EventDefinition(name='user.settings_updated', description='A user settings object was updated.', message='User settings updated') + USER_PROFILE_UPDATED: EventDefinition = EventDefinition(name='user.profile_updated', description='A user profile was updated.', message='User profile updated') + USER_PERMISSIONS_UPDATED: EventDefinition = EventDefinition(name='user.permissions_updated', description='A user permissions object was updated.', message='User permissions updated') + GROUP_CREATED: EventDefinition = EventDefinition(name='group.created', description='A group was created.', message='Group created') + GROUP_UPDATED: EventDefinition = EventDefinition(name='group.updated', description='A group was updated.', message='Group updated') + GROUP_DELETED: EventDefinition = EventDefinition(name='group.deleted', description='A group was deleted.', message='Group deleted') + GROUP_MEMBER_ADDED: EventDefinition = EventDefinition(name='group.member_added', description='A user was added to a group.', message='Group member added') + GROUP_MEMBER_REMOVED: EventDefinition = EventDefinition(name='group.member_removed', description='A user was removed from a group.', message='Group member removed') + CHAT_CREATED: EventDefinition = EventDefinition(name='chat.created', description='A chat was created.', message='Chat created') + CHAT_IMPORTED: EventDefinition = EventDefinition(name='chat.imported', description='A chat was imported.', message='Chat imported') + CHAT_UPDATED: EventDefinition = EventDefinition(name='chat.updated', description='A chat was updated.', message='Chat updated') + CHAT_DELETED: EventDefinition = EventDefinition(name='chat.deleted', description='A chat was deleted.', message='Chat deleted') + CHAT_DELETED_ALL: EventDefinition = EventDefinition(name='chat.deleted_all', description='All chats for a scope were deleted.', message='Chat deleted all') + CHAT_COMPACTED: EventDefinition = EventDefinition(name='chat.compacted', description='A chat was compacted.', message='Chat compacted') + CHAT_PINNED: EventDefinition = EventDefinition(name='chat.pinned', description='A chat was pinned.', message='Chat pinned') + CHAT_UNPINNED: EventDefinition = EventDefinition(name='chat.unpinned', description='A chat was unpinned.', message='Chat unpinned') + CHAT_CLONED: EventDefinition = EventDefinition(name='chat.cloned', description='A chat was cloned.', message='Chat cloned') + CHAT_ARCHIVED: EventDefinition = EventDefinition(name='chat.archived', description='A chat was archived.', message='Chat archived') + CHAT_UNARCHIVED: EventDefinition = EventDefinition(name='chat.unarchived', description='A chat was unarchived.', message='Chat unarchived') + CHAT_SHARED: EventDefinition = EventDefinition(name='chat.shared', description='A chat was shared.', message='Chat shared') + CHAT_UNSHARED: EventDefinition = EventDefinition(name='chat.unshared', description='A chat was unshared.', message='Chat unshared') + CHAT_FOLDER_UPDATED: EventDefinition = EventDefinition(name='chat.folder_updated', description='A chat folder assignment was updated.', message='Chat folder updated') + CHAT_TAG_ADDED: EventDefinition = EventDefinition(name='chat.tag_added', description='A tag was added to a chat.', message='Chat tag added') + CHAT_TAG_REMOVED: EventDefinition = EventDefinition(name='chat.tag_removed', description='A tag was removed from a chat.', message='Chat tag removed') + MESSAGE_CREATED: EventDefinition = EventDefinition(name='message.created', description='A message was created.', message='Message created') + MESSAGE_UPDATED: EventDefinition = EventDefinition(name='message.updated', description='A message was updated.', message='Message updated') + MESSAGE_DELETED: EventDefinition = EventDefinition(name='message.deleted', description='A message was deleted.', message='Message deleted') + MESSAGE_EVENT_RECEIVED: EventDefinition = EventDefinition(name='message.event_received', description='A message-level event was received.', message='Message event received') + MESSAGE_REACTION_ADDED: EventDefinition = EventDefinition(name='message.reaction_added', description='A reaction was added to a message.', message='Message reaction added') + MESSAGE_REACTION_REMOVED: EventDefinition = EventDefinition(name='message.reaction_removed', description='A reaction was removed from a message.', message='Message reaction removed') + MESSAGE_PINNED: EventDefinition = EventDefinition(name='message.pinned', description='A message was pinned.', message='Message pinned') + MESSAGE_UNPINNED: EventDefinition = EventDefinition(name='message.unpinned', description='A message was unpinned.', message='Message unpinned') + CHANNEL_CREATED: EventDefinition = EventDefinition(name='channel.created', description='A channel was created.', message='Channel created') + CHANNEL_UPDATED: EventDefinition = EventDefinition(name='channel.updated', description='A channel was updated.', message='Channel updated') + CHANNEL_DELETED: EventDefinition = EventDefinition(name='channel.deleted', description='A channel was deleted.', message='Channel deleted') + CHANNEL_MEMBER_ADDED: EventDefinition = EventDefinition(name='channel.member_added', description='A member was added to a channel.', message='Channel member added') + CHANNEL_MEMBER_REMOVED: EventDefinition = EventDefinition(name='channel.member_removed', description='A member was removed from a channel.', message='Channel member removed') + CHANNEL_MEMBER_ACTIVE_UPDATED: EventDefinition = EventDefinition(name='channel.member_active_updated', description='A channel member active state was updated.', message='Channel member active updated') + CHANNEL_WEBHOOK_CREATED: EventDefinition = EventDefinition(name='channel.webhook.created', description='A channel incoming webhook was created.', message='Channel Webhook created') + CHANNEL_WEBHOOK_UPDATED: EventDefinition = EventDefinition(name='channel.webhook.updated', description='A channel incoming webhook was updated.', message='Channel Webhook updated') + CHANNEL_WEBHOOK_DELETED: EventDefinition = EventDefinition(name='channel.webhook.deleted', description='A channel incoming webhook was deleted.', message='Channel Webhook deleted') + FILE_UPLOADED: EventDefinition = EventDefinition(name='file.uploaded', description='A file was uploaded.', message='File uploaded') + FILE_CONTENT_UPDATED: EventDefinition = EventDefinition(name='file.content_updated', description='File content was updated.', message='File content updated') + FILE_RENAMED: EventDefinition = EventDefinition(name='file.renamed', description='A file was renamed.', message='File renamed') + FILE_DELETED: EventDefinition = EventDefinition(name='file.deleted', description='A file was deleted.', message='File deleted') + FILE_DELETED_ALL: EventDefinition = EventDefinition(name='file.deleted_all', description='All files for a scope were deleted.', message='File deleted all') + FOLDER_CREATED: EventDefinition = EventDefinition(name='folder.created', description='A folder was created.', message='Folder created') + FOLDER_UPDATED: EventDefinition = EventDefinition(name='folder.updated', description='A folder was updated.', message='Folder updated') + FOLDER_PARENT_UPDATED: EventDefinition = EventDefinition(name='folder.parent_updated', description='A folder parent was updated.', message='Folder parent updated') + FOLDER_ACCESS_UPDATED: EventDefinition = EventDefinition(name='folder.access_updated', description='Folder access was updated.', message='Folder access updated') + FOLDER_DELETED: EventDefinition = EventDefinition(name='folder.deleted', description='A folder was deleted.', message='Folder deleted') + NOTE_CREATED: EventDefinition = EventDefinition(name='note.created', description='A note was created.', message='Note created') + NOTE_UPDATED: EventDefinition = EventDefinition(name='note.updated', description='A note was updated.', message='Note updated') + NOTE_ACCESS_UPDATED: EventDefinition = EventDefinition(name='note.access_updated', description='Note access was updated.', message='Note access updated') + NOTE_PINNED: EventDefinition = EventDefinition(name='note.pinned', description='A note was pinned.', message='Note pinned') + NOTE_UNPINNED: EventDefinition = EventDefinition(name='note.unpinned', description='A note was unpinned.', message='Note unpinned') + NOTE_DELETED: EventDefinition = EventDefinition(name='note.deleted', description='A note was deleted.', message='Note deleted') + MEMORY_CREATED: EventDefinition = EventDefinition(name='memory.created', description='A memory was created.', message='Memory created') + MEMORY_UPDATED: EventDefinition = EventDefinition(name='memory.updated', description='A memory was updated.', message='Memory updated') + MEMORY_DELETED: EventDefinition = EventDefinition(name='memory.deleted', description='A memory was deleted.', message='Memory deleted') + MEMORY_RESET: EventDefinition = EventDefinition(name='memory.reset', description='A memory was reset.', message='Memory reset') + KNOWLEDGE_CREATED: EventDefinition = EventDefinition(name='knowledge.created', description='A knowledge was created.', message='Knowledge created') + KNOWLEDGE_UPDATED: EventDefinition = EventDefinition(name='knowledge.updated', description='A knowledge was updated.', message='Knowledge updated') + KNOWLEDGE_DELETED: EventDefinition = EventDefinition(name='knowledge.deleted', description='A knowledge was deleted.', message='Knowledge deleted') + KNOWLEDGE_RESET: EventDefinition = EventDefinition(name='knowledge.reset', description='A knowledge was reset.', message='Knowledge reset') + KNOWLEDGE_REINDEXED: EventDefinition = EventDefinition(name='knowledge.reindexed', description='A knowledge was reindexed.', message='Knowledge reindexed') + KNOWLEDGE_ACCESS_UPDATED: EventDefinition = EventDefinition(name='knowledge.access_updated', description='Knowledge access was updated.', message='Knowledge access updated') + KNOWLEDGE_FILE_ADDED: EventDefinition = EventDefinition(name='knowledge.file.added', description='A file was added to a knowledge base.', message='Knowledge File added') + KNOWLEDGE_FILE_UPDATED: EventDefinition = EventDefinition(name='knowledge.file.updated', description='A knowledge file was updated.', message='Knowledge File updated') + KNOWLEDGE_FILE_REMOVED: EventDefinition = EventDefinition(name='knowledge.file.removed', description='A file was removed from a knowledge base.', message='Knowledge File removed') + KNOWLEDGE_FILE_MOVED: EventDefinition = EventDefinition(name='knowledge.file.moved', description='A knowledge file was moved.', message='Knowledge File moved') + KNOWLEDGE_DIRECTORY_CREATED: EventDefinition = EventDefinition(name='knowledge.directory.created', description='A knowledge directory was created.', message='Knowledge Directory created') + KNOWLEDGE_DIRECTORY_UPDATED: EventDefinition = EventDefinition(name='knowledge.directory.updated', description='A knowledge directory was updated.', message='Knowledge Directory updated') + KNOWLEDGE_DIRECTORY_DELETED: EventDefinition = EventDefinition(name='knowledge.directory.deleted', description='A knowledge directory was deleted.', message='Knowledge Directory deleted') + KNOWLEDGE_EXTERNAL_CONNECTION_CREATED: EventDefinition = EventDefinition(name='knowledge.external_connection.created', description='A knowledge external connection was created.', message='Knowledge External Connection created') + KNOWLEDGE_EXTERNAL_CONNECTION_UPDATED: EventDefinition = EventDefinition(name='knowledge.external_connection.updated', description='A knowledge external connection was updated.', message='Knowledge External Connection updated') + KNOWLEDGE_EXTERNAL_CONNECTION_DELETED: EventDefinition = EventDefinition(name='knowledge.external_connection.deleted', description='A knowledge external connection was deleted.', message='Knowledge External Connection deleted') + RETRIEVAL_CONTENT_PROCESSED: EventDefinition = EventDefinition(name='retrieval.content.processed', description='Retrieval content was processed.', message='Retrieval Content processed') + RETRIEVAL_COLLECTION_DELETED: EventDefinition = EventDefinition(name='retrieval.collection.deleted', description='A retrieval collection was deleted.', message='Retrieval Collection deleted') + RETRIEVAL_VECTOR_DB_RESET: EventDefinition = EventDefinition(name='retrieval.vector_db.reset', description='The retrieval vector database was reset.', message='Retrieval Vector Db reset') + RETRIEVAL_UPLOADS_RESET: EventDefinition = EventDefinition(name='retrieval.uploads.reset', description='Retrieval uploads were reset.', message='Retrieval Uploads reset') + MODEL_CREATED: EventDefinition = EventDefinition(name='model.created', description='A model was created.', message='Model created') + MODEL_IMPORTED: EventDefinition = EventDefinition(name='model.imported', description='A model was imported.', message='Model imported') + MODEL_SYNCED: EventDefinition = EventDefinition(name='model.synced', description='A model was synced.', message='Model synced') + MODEL_UPDATED: EventDefinition = EventDefinition(name='model.updated', description='A model was updated.', message='Model updated') + MODEL_DELETED: EventDefinition = EventDefinition(name='model.deleted', description='A model was deleted.', message='Model deleted') + MODEL_ENABLED: EventDefinition = EventDefinition(name='model.enabled', description='A model was enabled.', message='Model enabled') + MODEL_DISABLED: EventDefinition = EventDefinition(name='model.disabled', description='A model was disabled.', message='Model disabled') + MODEL_ACCESS_UPDATED: EventDefinition = EventDefinition(name='model.access_updated', description='Model access was updated.', message='Model access updated') + MODEL_PROVIDER_CONFIG_UPDATED: EventDefinition = EventDefinition(name='model.provider_config.updated', description='Model provider configuration was updated.', message='Model Provider Config updated') + MODEL_PROVIDER_MODEL_CREATED: EventDefinition = EventDefinition(name='model.provider_model.created', description='A provider model was created.', message='Provider model created') + MODEL_PROVIDER_MODEL_DELETED: EventDefinition = EventDefinition(name='model.provider_model.deleted', description='A provider model was deleted.', message='Provider model deleted') + FUNCTION_CREATED: EventDefinition = EventDefinition(name='function.created', description='A function was created.', message='Function created') + FUNCTION_UPDATED: EventDefinition = EventDefinition(name='function.updated', description='A function was updated.', message='Function updated') + FUNCTION_DELETED: EventDefinition = EventDefinition(name='function.deleted', description='A function was deleted.', message='Function deleted') + FUNCTION_ENABLED: EventDefinition = EventDefinition(name='function.enabled', description='A function was enabled.', message='Function enabled') + FUNCTION_DISABLED: EventDefinition = EventDefinition(name='function.disabled', description='A function was disabled.', message='Function disabled') + FUNCTION_VALVES_UPDATED: EventDefinition = EventDefinition(name='function.valves_updated', description='Function valves were updated.', message='Function valves updated') + TOOL_CREATED: EventDefinition = EventDefinition(name='tool.created', description='A tool was created.', message='Tool created') + TOOL_UPDATED: EventDefinition = EventDefinition(name='tool.updated', description='A tool was updated.', message='Tool updated') + TOOL_DELETED: EventDefinition = EventDefinition(name='tool.deleted', description='A tool was deleted.', message='Tool deleted') + TOOL_ACCESS_UPDATED: EventDefinition = EventDefinition(name='tool.access_updated', description='Tool access was updated.', message='Tool access updated') + TOOL_VALVES_UPDATED: EventDefinition = EventDefinition(name='tool.valves_updated', description='Tool valves were updated.', message='Tool valves updated') + SKILL_CREATED: EventDefinition = EventDefinition(name='skill.created', description='A skill was created.', message='Skill created') + SKILL_UPDATED: EventDefinition = EventDefinition(name='skill.updated', description='A skill was updated.', message='Skill updated') + SKILL_DELETED: EventDefinition = EventDefinition(name='skill.deleted', description='A skill was deleted.', message='Skill deleted') + SKILL_ENABLED: EventDefinition = EventDefinition(name='skill.enabled', description='A skill was enabled.', message='Skill enabled') + SKILL_DISABLED: EventDefinition = EventDefinition(name='skill.disabled', description='A skill was disabled.', message='Skill disabled') + PROMPT_CREATED: EventDefinition = EventDefinition(name='prompt.created', description='A prompt was created.', message='Prompt created') + PROMPT_UPDATED: EventDefinition = EventDefinition(name='prompt.updated', description='A prompt was updated.', message='Prompt updated') + PROMPT_DELETED: EventDefinition = EventDefinition(name='prompt.deleted', description='A prompt was deleted.', message='Prompt deleted') + PROMPT_ENABLED: EventDefinition = EventDefinition(name='prompt.enabled', description='A prompt was enabled.', message='Prompt enabled') + PROMPT_DISABLED: EventDefinition = EventDefinition(name='prompt.disabled', description='A prompt was disabled.', message='Prompt disabled') + PROMPT_VERSION_UPDATED: EventDefinition = EventDefinition(name='prompt.version_updated', description='A prompt version was updated.', message='Prompt version updated') + PROMPT_ACCESS_UPDATED: EventDefinition = EventDefinition(name='prompt.access_updated', description='Prompt access was updated.', message='Prompt access updated') + PIPELINE_UPLOADED: EventDefinition = EventDefinition(name='pipeline.uploaded', description='A pipeline was uploaded.', message='Pipeline uploaded') + PIPELINE_ADDED: EventDefinition = EventDefinition(name='pipeline.added', description='A pipeline was added.', message='Pipeline added') + PIPELINE_DELETED: EventDefinition = EventDefinition(name='pipeline.deleted', description='A pipeline was deleted.', message='Pipeline deleted') + PIPELINE_VALVES_UPDATED: EventDefinition = EventDefinition(name='pipeline.valves_updated', description='Pipeline valves were updated.', message='Pipeline valves updated') + CALENDAR_CREATED: EventDefinition = EventDefinition(name='calendar.created', description='A calendar was created.', message='Calendar created') + CALENDAR_UPDATED: EventDefinition = EventDefinition(name='calendar.updated', description='A calendar was updated.', message='Calendar updated') + CALENDAR_DELETED: EventDefinition = EventDefinition(name='calendar.deleted', description='A calendar was deleted.', message='Calendar deleted') + CALENDAR_DEFAULT_UPDATED: EventDefinition = EventDefinition(name='calendar.default_updated', description='The default calendar was updated.', message='Calendar default updated') + CALENDAR_EVENT_CREATED: EventDefinition = EventDefinition(name='calendar.event.created', description='A calendar event was created.', message='Calendar Event created') + CALENDAR_EVENT_UPDATED: EventDefinition = EventDefinition(name='calendar.event.updated', description='A calendar event was updated.', message='Calendar Event updated') + CALENDAR_EVENT_DELETED: EventDefinition = EventDefinition(name='calendar.event.deleted', description='A calendar event was deleted.', message='Calendar Event deleted') + CALENDAR_EVENT_RSVP_UPDATED: EventDefinition = EventDefinition(name='calendar.event.rsvp_updated', description='A calendar event RSVP was updated.', message='Calendar Event rsvp updated') + AUTOMATION_CREATED: EventDefinition = EventDefinition(name='automation.created', description='An automation was created.', message='Automation created') + AUTOMATION_UPDATED: EventDefinition = EventDefinition(name='automation.updated', description='An automation was updated.', message='Automation updated') + AUTOMATION_ENABLED: EventDefinition = EventDefinition(name='automation.enabled', description='An automation was enabled.', message='Automation enabled') + AUTOMATION_DISABLED: EventDefinition = EventDefinition(name='automation.disabled', description='An automation was disabled.', message='Automation disabled') + AUTOMATION_DELETED: EventDefinition = EventDefinition(name='automation.deleted', description='An automation was deleted.', message='Automation deleted') + AUTOMATION_RUN_STARTED: EventDefinition = EventDefinition(name='automation.run_started', description='An automation run started.', message='Automation run started') + AUTOMATION_RUN_COMPLETED: EventDefinition = EventDefinition(name='automation.run_completed', description='An automation run completed.', message='Automation run completed') + AUTOMATION_RUN_FAILED: EventDefinition = EventDefinition(name='automation.run_failed', description='An automation run failed.', message='Automation run failed') + FEEDBACK_CREATED: EventDefinition = EventDefinition(name='feedback.created', description='A feedback was created.', message='Feedback created') + FEEDBACK_UPDATED: EventDefinition = EventDefinition(name='feedback.updated', description='A feedback was updated.', message='Feedback updated') + FEEDBACK_DELETED: EventDefinition = EventDefinition(name='feedback.deleted', description='A feedback was deleted.', message='Feedback deleted') + FEEDBACK_DELETED_ALL: EventDefinition = EventDefinition(name='feedback.deleted_all', description='All feedback for a scope was deleted.', message='Feedback deleted all') + IMAGE_GENERATED: EventDefinition = EventDefinition(name='image.generated', description='An image was generated.', message='Image generated') + IMAGE_EDITED: EventDefinition = EventDefinition(name='image.edited', description='An image was edited.', message='Image edited') + AUDIO_SPEECH_REQUESTED: EventDefinition = EventDefinition(name='audio.speech_requested', description='Speech generation was requested.', message='Speech requested') + AUDIO_TRANSCRIPTION_REQUESTED: EventDefinition = EventDefinition(name='audio.transcription_requested', description='Audio transcription was requested.', message='Transcription requested') + TERMINAL_SESSION_OPENED: EventDefinition = EventDefinition(name='terminal.session.opened', description='A terminal session was opened.', message='Terminal Session opened') + TERMINAL_SESSION_CLOSED: EventDefinition = EventDefinition(name='terminal.session.closed', description='A terminal session was closed.', message='Terminal Session closed') EVENTS = EventDefinitions() @@ -594,7 +594,13 @@ async def dispatch_webhook_event(app: Any, event: Event) -> None: continue try: - await post_webhook(name, webhook['url'], message, event.model_dump()) + await post_webhook( + name, + webhook['url'], + message, + event.model_dump(), + description=definition.description if definition else None, + ) except Exception: log.exception('Event webhook failed for %s', webhook.get('id')) diff --git a/backend/open_webui/utils/webhook.py b/backend/open_webui/utils/webhook.py index 5c4163c031..fb61a24d7b 100644 --- a/backend/open_webui/utils/webhook.py +++ b/backend/open_webui/utils/webhook.py @@ -16,7 +16,21 @@ log = logging.getLogger(__name__) # Let this message reach those for whom it was written, and # may no network partition deny the word its destination. -async def post_webhook(name: str, url: str, message: str, event_data: dict) -> bool: +def _event_text(message: str, description: str | None = None, event_data: dict | None = None) -> str: + lines = [message] + if description and description != message: + lines.append(description) + + event_name = (event_data or {}).get('event') + if event_name: + lines.append(f'Event: {event_name}') + + return '\n'.join(lines) + + +async def post_webhook( + name: str, url: str, message: str, event_data: dict, description: str | None = None +) -> bool: try: log.debug(f'post_webhook: {url}, {message}, {event_data}') # Block private-IP / loopback / cloud-metadata targets — the URL is @@ -27,10 +41,11 @@ async def post_webhook(name: str, url: str, message: str, event_data: dict) -> b # Slack and Google Chat Webhooks if 'https://hooks.slack.com' in url or 'https://chat.googleapis.com' in url: - payload['text'] = message + payload['text'] = _event_text(message, description, event_data) # Discord Webhooks elif 'https://discord.com/api/webhooks' in url: - payload['content'] = message if len(message) < 2000 else f'{message[: 2000 - 20]}... (truncated)' + content = _event_text(message, description, event_data) + payload['content'] = content if len(content) < 2000 else f'{content[: 2000 - 20]}... (truncated)' # Microsoft Teams Webhooks elif 'webhook.office.com' in url: action = event_data.get('action', 'undefined') @@ -42,6 +57,8 @@ async def post_webhook(name: str, url: str, message: str, event_data: dict) -> b facts = [{'name': key, 'value': value} for key, value in user_dict.items()] if event_data.get('event'): facts.insert(0, {'name': 'event', 'value': event_data.get('event')}) + if description: + facts.insert(0, {'name': 'description', 'value': description}) payload = { '@type': 'MessageCard', '@context': 'http://schema.org/extensions', @@ -52,6 +69,7 @@ async def post_webhook(name: str, url: str, message: str, event_data: dict) -> b 'activityTitle': message, 'activitySubtitle': f'{name} ({VERSION}) - {action}', 'activityImage': WEBUI_FAVICON_URL, + 'text': description, 'facts': facts, 'markdown': True, }