Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog. Package version numbers follow the Open WebUI mapping described in the README (they are not independent SemVer).
[Unreleased]
[11.0.0] - 2026-07-31
Upgrades the target from Open WebUI 0.10.2 to 0.11.0 and resolves all detected drift against the 0.11.0 backend.
Changed
- Updated target Open WebUI version from 0.10.2 to 0.11.0.
- Updated reference source (
refs/owui_source_main/) to Open WebUI 0.11.0 (v0.11.0) and regeneratedrefs/owui_openapi_main.jsonfrom the 0.11.0 OpenAPI spec (476 paths, up from 458). OWUIClientBasenow creates its httpxAsyncClientwith a 60s default timeout (httpx's 5s default was too short for 0.11.0 endpoints that aggregate connections / proxy to upstream providers — e.g.GET /api/models, the OpenAI Responses proxy, and retrieval). Fixes the ReadTimeout regressions seen against 0.11.0.
Added
Routers - New Endpoints
ChatsClient:mark_chats_read()(POST /v1/chats/read),fork()(POST /v1/chats/{id}/fork),mark_chat_unread()(POST /v1/chats/{id}/unread).UsersClient:get_user_variables()(GET /v1/users/user/variables),update_user_variables()(POST /v1/users/user/variables/update),get_user_usage()(GET /v1/users/usage).NotesClient:get_note_chat_by_id()(GET /v1/notes/{id}/chat),get_note_chats_by_id()(GET /v1/notes/{id}/chats),create_note_chat_by_id()(POST /v1/notes/{id}/chat) — the note↔chat linkage introduced in 0.11.0.ConfigsClient:get_subagents_config()/set_subagents_config()(GET/POST /v1/configs/subagents) — the new subagents configuration.FoldersClient:mark_folder_chats_read()(POST /v1/folders/{id}/read).OllamaClient:generate_openai_embeddings()(POST /ollama/v1/embeddings[/{url_idx}]) — OpenAI-compatible embeddings proxy; mirrors the existing/v1/responsesand/v1/messagesproxies.
Models - New Classes
- chats:
ForkForm - users:
UserVariablesForm,UserVariablesResponse,UserUsageResponseand its supporting usage models - configs:
SubagentsConfigForm
Models - New Fields
ChatModel:current_message_id,variablesChatForm:variablesChatImportForm:current_message_idChatResponse:current_message_id,variables,context_usageChatTitleIdResponse:activeUserModel:variables(with backend-mirroringfield_validatorcoercion andexclude=True)SharingPermissions:foldersAccessGrantsPermissions:allow_groupsAdminConfig:CHANNEL_MODEL_RESPONSE_MODELdapServerConfig:attribute_for_groups,enable_group_management,enable_group_creationOAuthConfigForm:ENABLE_OAUTHModelMeta:knowledgeAutomationModel/AutomationForm:folder_idWebConfig(retrieval):OPENSERP_BASE_URLConfigForm(retrieval):CONTENT_EXTRACTION_SUPPORTED_MEDIA_MIME_TYPESFolderNameIdResponse:unread_countKnowledgeUserModel:file_count
Tests
- Added coverage for every new endpoint (
tests/test_chats.py,tests/test_users.py,tests/test_notes.py,tests/test_configs.py,tests/test_folders.py,tests/test_ollama.py). Themock_ollama_serverfixture (tests/conftest.py) now serves a proper OpenAI-shaped/v1/embeddingsresponse.
Removed
TasksClient.check_active_chats()and theActiveChatsForm/ActiveChatsResponsemodels — the underlyingPOST /v1/tasks/active/chatsendpoint was removed in Open WebUI 0.11.0 (no replacement; confirmed absent from both backend and frontend).
[10.2.1] - 2026-07-06
Client-only feature release (still targets Open WebUI 0.10.2).
Added
- Command-line interface. The package now installs an
owui-clientconsole script (entry pointowui_client.cli:main), built with Cyclopts. Connection defaults come from theOWUI_SERVERandOWUI_API_KEYenvironment variables (overridable with--server/--api-key); seeexample.env. sync-skillcommand and theShortcuts.sync_skillworkflow it exposes: idempotently syncs a local skill Markdown file (YAML frontmatter withnameanddescription) into Open WebUI — creates if absent, updates ifcontent/name/descriptionchanged, and reportsunchanged(no write) when nothing differs, so the server'supdated_atis not bumped. One-way; never deletes. Matching is by id or name, with a create-to-update fallback onID_TAKEN.sync-skillscommand andShortcuts.sync_skills: recursively sync every valid skill Markdown file under a directory (arbitrary depth —skill/SKILL.mdorskill.md). Existing skills are fetched once per run; each file is created, leftunchanged(no write), orupdated. Non-skill files areskippedwith a reason; duplicate skill names across files are detected and skipped; a server error on one file is recorded asfailedand does not abort the rest. On update, the matched skill's existingis_activeis preserved (a content change does not re-enable a skill disabled in the UI). One-way; never deletes.owui_client.skillfiles: pure (no-network) parser for skill Markdown files into the fields used by the client, plusdiscover_skill_filesfor recursively scanning a directory (with duplicate-name detection).- New core dependencies:
cycloptsandpyyaml.
[10.2.0] - 2026-07-04
Small patch tracking Open WebUI 0.10.2. No new endpoints or models; two configuration fields were added upstream.
Changed
- Updated target Open WebUI version from 0.10.1 to 0.10.2.
- Updated reference source (
refs/owui_source_main/) and regeneratedrefs/owui_openapi_main.jsonfrom Open WebUI 0.10.2 (458 paths, unchanged from 0.10.1).
Added
Models - New Fields
AdminConfig:ENABLE_MEMORY_SYSTEM_CONTEXT— admin toggle for the new "Memory System Context" setting. WhenFalse, memory tools remain available but stored memories are not injected into the system context; whenTrue(the env default) they are. Maps to thememories.system_context.enableconfig key.STTConfigForm:OPENAI_API_REQUEST_FORMAT(default'multipart') — how audio is sent to the OpenAI-compatible speech-to-text API:'multipart'uploads audio as a multipart form (default),'json'sends it as base64-encoded JSON. Compared case-insensitively; any value other than'json'uses multipart.
[10.1.0] - 2026-06-30
Upgrades the target from Open WebUI 0.9.6 to 0.10.1. Open WebUI 0.10.0 was a large release; this client version adds support for its headline features (event webhooks, external knowledge bases, shared folders, the reworked memory system, admin OAuth configuration, terminal-server orchestration, context compaction, and the new web-search providers) and resolves all detected drift against the 0.10.1 backend.
Changed
- Updated target Open WebUI version from 0.9.6 to 0.10.1.
- Updated reference source (
refs/owui_source_main/) and regeneratedrefs/owui_openapi_main.jsonfrom Open WebUI 0.10.1. ModelsClient.update_model_by_id()now preserves a model's existing access grants whenaccess_grantsis omitted from theModelForm. Previously (as a workaround for an OWUI 0.9.6-0.10.1 backend bug where the handler re-validatesModelForm(...)and 500s onaccess_grants=None) it defaulted to[], which the backend interprets as "delete all grants" and would silently wipe a model's sharing grants. It now fetches the current grants and re-sends them. Passing an explicit[]still clears grants, and a populated list still replaces them.EvaluationsClient: migrated to the restructured 0.10.1 feedback endpoints. The oldGET /feedbacks/all(returningList[FeedbackResponse]) no longer exists; the client now usesGET /feedbacks/all/idsandGET /feedbacks/all/export(theget_all_feedbacks-style method was removed).
Added
New resource: EventsClient (event webhooks system)
- New
owui_client.models.eventsmodule andowui_client.routers.events(client.events) implementing Open WebUI's 0.10.0 event-webhooks system, which replaced the legacy per-user webhook. - Models:
EventWebhook,EventWebhookTarget,EventWebhookForm,EventWebhookUpdateForm. - Endpoints:
get_event_webhooks()(GET /events/webhooks),create_event_webhook()(POST),update_event_webhook()(PUT /events/webhooks/{id}),delete_event_webhook()(DELETE).
Routers - New Endpoints
KnowledgeClient: full External Knowledge Bases / Connections feature (11 endpoints) —get/create/get/update/delete_external_knowledge_connection,test_external_knowledge_connection,test_external_knowledge_source,test_external_knowledge_retrieval,create_external_knowledge,create_external_knowledge_source,update_external_knowledge_source(under/external/connections,/external/source,/external/knowledge).FoldersClient: shared-folders feature —get_shared_folders()(GET /shared),update_folder_access_by_id()(POST /{id}/access/update),get_shared_folder_chats()(GET /{id}/shared/chats).MemoriesClient: reworked memory system —list_memory_paths()(POST /paths),read_memory_path()(POST /path).AuthsClient: admin OAuth configuration —get_oauth_config()/update_oauth_config()(GET/POST /admin/config/oauth).ConfigsClient:get_config_namespace()(GET /namespace/{namespace}),put_terminal_server_lifecycle()(POST /terminal_servers/lifecycle),refresh_terminal_server_terminals()(POST /terminal_servers/refresh).ChatsClient:get_archived_count()(GET /archived/count),unshare_all()(DELETE /share/all),compact()(POST /{id}/compact, automatic context compaction).UsersClient:get_default_user_permission_defaults()(GET /default/permissions/defaults).FilesClient:count_files()(GET /count).ModelsClient:get_base_model_tags()(GET /base/tags).
Models - New Classes
- events:
EventWebhook,EventWebhookTarget,EventWebhookForm,EventWebhookUpdateForm - knowledge:
ExternalKnowledgeConnectionForm,ExternalKnowledgeSourceForm,ExternalKnowledgeCreateForm,ExternalKnowledgeSourceCreateForm,ExternalKnowledgeSourceUpdateForm,ExternalKnowledgeSourceTestForm,ExternalKnowledgeRetrieveTestForm,ExternalKnowledgeConnectionListResponse - folders:
SharedFolderResponse,FolderAccessGrantsForm - memories:
ListMemoryPathsForm,ReadMemoryPathForm - auths:
OAuthConfigForm - configs:
TerminalServerLifecycleForm,TerminalServerRefreshForm - chats:
CompactChatForm - folders:
FolderModelgained anaccess_grantsfield (the backend already returns it onget_folder_by_id/update_folder_access_by_id; previously it was silently dropped during parsing, so the shared-folders feature could write grants but not read them back)
Models - New Fields
TaskConfigForm:AUTOCOMPLETE_GENERATION_PROMPT_TEMPLATEToolMeta:has_user_valvesModelAnalyticsEntry:unique_users,unique_chatsWorkspacePermissions:skills_import,skills_exportChatPermissions:import_(JSON keyimport; serialized via field alias)FeaturesPermissions:webhooksWebConfig(retrieval):ENABLE_WEB_SEARCH_CONFIRMATION,WEB_SEARCH_CONFIRMATION_CONTENT,SERPHOUSE_API_KEY,SERPHOUSE_DOMAIN,MICROSOFT_WEB_IQ_API_KEY,MICROSOFT_WEB_IQ_API_BASE_URL,MICROSOFT_WEB_IQ_LANGUAGEConfigForm(retrieval):EXTERNAL_DOCUMENT_LOADER_HEADERS,MISTRAL_OCR_USE_BASE64,RAG_TOKENIZER_MODELChatTitleIdResponse:snippetMemoryModel/AddMemoryForm/MemoryUpdateModel:type("user"/"context"),path, (MemoryModelonly)metaOAuthClientRegistrationForm:oauth_scope
Fixed
tests/test_tasks.pytest_tasks_config/test_title_generation: now sendAUTOCOMPLETE_GENERATION_PROMPT_TEMPLATE(required by the 0.10.1 backend); previously 422.tests/test_root.pytest_webhook_url: removed (the legacy/api/webhookendpoints were removed in OWUI 0.10.0 and replaced by the event-webhooks system).- Removed obsolete
xfailmarkers that targeted 0.9.6 backend bugs now fixed upstream:test_ollama.test_ollama_models,test_evaluations.test_feedback_lifecycle,test_models.test_model_lifecycle— all now pass against 0.10.1. UsersClient.update_default_user_permissions()now serializes permissions withby_alias=True, so theChatPermissions.import_field is sent under its JSON keyimport(matching the backend's storage key). Previously it relied on the backend'spopulate_by_nameto acceptimport_; the round-trip is now covered by a test.KnowledgeClient.get_pending_knowledge_files()(pre-existing latent bug) usedmodel=list, which corrupted list-of-dicts responses into lists of dict keys. Fixed tolist[dict].
Removed
RootClient.get_webhook_url()andupdate_webhook_url(), plusmodels.root.UrlForm— the underlying/api/webhookendpoints were removed in Open WebUI 0.10.0. Use the newEventsClientinstead.EvaluationsClient.get_all_feedbacks()— theGET /feedbacks/allendpoint was removed in 0.10.1; useget_all_feedback_ids()/export_all_feedbacks().
Known Issues (OWUI 0.10.1 Backend / Test Environment)
These tests are marked xfail due to upstream behavior unrelated to the client:
- tests/test_utils.py::test_markdown — the /v1/utils/markdown endpoint was removed in Open WebUI 0.9.6 and remains absent through 0.10.2. The client method and MarkdownForm model are retained for forward compatibility but return 404/405 against current backends.
- tests/test_openai.py::test_speech — /audio/speech hardcodes https://api.openai.com/v1, so it cannot be exercised against the mock inference provider in tests.
[9.6.0] - 2026-06-02
Changed
- Updated target Open WebUI version from 0.9.5 to 0.9.6.
- Updated reference source (
refs/owui_source_main/) to Open WebUI 0.9.6 (commit 1a97751e37). KnowledgeDirectoryUpdateForm.parent_iddefault changed fromNoneto'__unset__'sentinel (matches backend).RetrievalClient.update_config()now serializes theConfigFormwithexclude_none=Trueso partial config updates (where most fields remain unset) do not sendNonevalues for list-typed fields. Required because OWUI 0.9.6 strictly validates list types and rejectsNonewhere a list is expected (e.g.ALLOWED_FILE_EXTENSIONS,YOUTUBE_LOADER_LANGUAGE).ToolsClient,PromptsClient,ModelsClient, andEvaluationsClientPOST endpoints that send a partial form (most notably those withaccess_grants: Optional[list[dict]] = None) now serialize withexclude_none=True. Required because OWUI 0.9.6 strictly validates list-typed fields and rejectsNone(e.g.access_grants). TheConfigsClientendpoints were intentionally left unchanged because the 0.9.6 backend requires every form field to be present (even whenNone).
Fixed
RetrievalClient.update_config()returning 422 Unprocessable Entity on partialConfigFormsubmissions against OWUI 0.9.6 (regression from 0.9.5; the previous backend acceptedNonefor list fields, the new backend does not).UtilsClient.get_html_from_markdown()marked as expected-to-fail in tests: the/v1/utils/markdownendpoint was removed in OWUI 0.9.6. The client method andMarkdownFormmodel are retained for forward compatibility, but will return 405/404 against current backends.
Known Issues (OWUI 0.9.6 Backend)
The following tests are marked xfail due to apparent bugs or behavior changes in the OWUI 0.9.6 backend. The client behavior is unchanged from 9.5.0; the failures are caused by the backend, not the client. These are expected to be addressed in a future release once the upstream issues are resolved.
tests/test_evaluations.py::test_feedback_lifecycle—GET /v1/evaluations/feedbacks/allreturns data the client cannot iterate asList[FeedbackResponse]. The endpoint may have been renamed or its response wrapper changed in 0.9.6.tests/test_models.py::test_model_lifecycle—POST /v1/models/model/updatereturns 500 on partialModelFormsubmissions with emptyModelParams(). Appears to be a 0.9.6 backend bug.tests/test_ollama.py::test_ollama_models—GET /ollama/api/psreturns 500 when proxying to a mock Ollama backend. Appears to be a 0.9.6 backend bug in proxy response handling.
Added
Models - New Classes
KnowledgeDirectoryModel(knowledge) — represents nested directories within a knowledge baseKnowledgeDirectoryCreateForm(knowledge) — form for creating directoriesKnowledgeDirectoryUpdateForm(knowledge) — form for renaming/relocating directoriesKnowledgeFileMoveForm(knowledge) — form for moving files between directoriesFileManifestEntry,SyncDiffForm,SyncDiffResponse,SyncCleanupForm(knowledge) — sync manifest and diff modelsFileRenameForm(files) — form for renaming a fileResourcePreviewItem,ResourcePreviewList,UserPreviewUser,UserPreview(users) — admin access preview for usersGroupPreviewGroup,GroupPreview(groups) — admin access preview for groups
Models - New Fields
KnowledgeFileListResponse:directories,breadcrumbsKnowledgeFileIdForm:directory_idWebConfig:LINKUP_API_KEY,LINKUP_SEARCH_PARAMSConfigForm(retrieval):MINERU_FILE_EXTENSIONS
Routers - New Endpoints
KnowledgeClient.create_knowledge_directory()—POST /{id}/dirs/createKnowledgeClient.update_knowledge_directory()—POST /{id}/dirs/{dir_id}/updateKnowledgeClient.delete_knowledge_directory()—DELETE /{id}/dirs/{dir_id}/deleteKnowledgeClient.move_file_in_knowledge()—POST /{id}/file/moveKnowledgeClient.get_pending_knowledge_files()—GET /{id}/files/pendingKnowledgeClient.sync_knowledge_diff()—POST /{id}/sync/diffKnowledgeClient.sync_knowledge_cleanup()—POST /{id}/sync/cleanupFilesClient.rename_file_by_id()—POST /v1/files/{id}/renameUsersClient.get_user_preview_by_id()—GET /v1/users/{user_id}/previewGroupsClient.get_group_preview_by_id()—GET /v1/groups/id/{id}/preview
Tests - New Endpoint Coverage
tests/test_knowledge.py—test_knowledge_directory_crud,test_knowledge_move_file_form_validation,test_knowledge_get_pending_files,test_knowledge_sync_diff,test_knowledge_sync_cleanup(5 new tests covering the 7 new knowledge endpoints)tests/test_files.py—test_rename_file_by_idtests/test_users.py—test_get_user_preview_by_id_admin_selftests/test_groups.py—test_get_group_preview_by_id
[9.5.0] - 2026-05-16
Changed
- Updated target Open WebUI version from 0.8.10 to 0.9.5.
- Updated reference source (
refs/owui_source_main/) to Open WebUI 0.9.5 (commit 3660bc00f). FunctionUserResponsenow inherits fromFunctionResponseinstead ofFunctionModel(matches backend).FunctionUserResponse.userfield type changed fromOptional[UserModel]toOptional[UserResponse].retrieval.get_status()now callsGET /v1/retrieval/configinstead of the oldGET /v1/retrieval/endpoint.
Added
Models - New Fields
AdminConfig:ENABLE_AUTOMATIONS,AUTOMATION_MAX_COUNT,ENABLE_CALENDAR,AUTOMATION_MIN_INTERVALChatModel:last_read_at,tasks,summaryChatResponse:tasks,summaryChatTitleIdResponse:last_read_atConfigForm(retrieval):PADDLEOCR_VL_TOKEN,PADDLEOCR_VL_BASE_URL,RAG_RERANKING_BATCH_SIZEFeaturesPermissions:calendar,automationsNoteModel:is_pinnedNoteItemResponse:is_pinnedOAuthClientRegistrationForm:client_secret,oauth_server_urlSTTConfigForm:ALLOWED_EXTENSIONSSharingPermissions:public_chats,public_calendarsTaskConfigForm:ENABLE_VOICE_MODE_PROMPTTerminalServerConnection:policy,server_type,policy_idTTSConfigForm:MISTRAL_API_BASE_URL,MISTRAL_API_KEYToolServerConnection:infoWebConfig:WEB_FETCH_MAX_CONTENT_LENGTH,BRAVE_SEARCH_CONTEXT_TOKENS
Models - New Classes
ChatAccessGrantsForm(chats)TerminalServerPolicyForm(configs)
Routers - New Endpoints
AuthsClient.delete_oauth_session()-DELETE /v1/auths/oauth/sessions/{provider}ChatsClient.update_shared_chat_access()-POST /v1/chats/shared/{id}/access/updateChatsClient.get_shared_chat_access()-GET /v1/chats/shared/{id}/accessConfigsClient.verify_terminal_server()-POST /v1/configs/terminal_servers/verifyConfigsClient.put_terminal_server_policy()-POST /v1/configs/terminal_servers/policyConfigsClient.get_models_defaults()-GET /v1/configs/models/defaultsEvaluationsClient.get_feedback_model_ids()-GET /v1/evaluations/feedbacks/modelsModelsClient.unload_model()-POST /api/models/unloadNotesClient.get_pinned_notes()-GET /v1/notes/pinnedNotesClient.pin_note_by_id()-POST /v1/notes/{id}/pinOllamaClient.generate_anthropic_messages()-POST /ollama/v1/messages[/{url_idx}]OllamaClient.generate_responses()-POST /ollama/v1/responses[/{url_idx}]TasksClient.stop_tasks_by_chat_api()-POST /api/tasks/chat/{chat_id}/stop
Routers - New Modules
- Skills router (
client.skills) — 9 endpoints for skill CRUD, access management, and listing - Analytics router (
client.analytics) — 8 read-only admin endpoints for message counts, token usage, daily stats, and model overview - Automations router (
client.automations) — 8 endpoints for scheduled automation CRUD, toggle, run, and run history - Calendar router (
client.calendar) — 13 endpoints for calendar and event CRUD, RSVP, search, and default calendar management - Terminals router (
client.terminals) — 2 HTTP endpoints for listing terminal servers and proxying requests (WebSocket proxy not supported)
[8.10.0] - 2026-04-15
Changed
- Adopted Open-WebUI-aligned versioning:
client.major/client.minormap to Open WebUI0.{minor}.{patch};client.patchis for client-only fixes while targeting the same Open WebUI release. Baseline is now 8.10.0 for Open WebUI 0.8.10 (supersedes prior 1.6.x-style numbering). - README: explicit target Open WebUI version, mapping rules, and compatibility guidance tied to that target instead of “latest”.
tests/conftest.py: Docker Open WebUI image for session tests is selected frompyproject.tomlusing the same mapping.AGENTS.md: orchestrator and update workflows, clearer versioning rules, and documentation expectations.
Added
tests/versioning.pyandtests/test_versions.pyto encode and test the version mapping.