dify - ✅(Solved) Fix sqlalchemy.orm.exc.DetachedInstanceError [1 pull requests, 1 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
langgenius/dify#34844Fetched 2026-04-10 03:45:44
View on GitHub
Comments
1
Participants
2
Timeline
4
Reactions
1
Author
Timeline (top)
closed ×1commented ×1cross-referenced ×1labeled ×1

Error Message

2026-04-10 13:56:49,623 DEBUG [_trace.py:47] 130af127ee response_closed.complete 2026-04-10 13:56:49,625 INFO [internal.py:97] 130af127ee 127.0.0.1 - - [10/Apr/2026 05:56:49] "GET /console/api/version?current_version=1.13.3 HTTP/1.1" 200 - 2026-04-10 13:56:50,294 ERROR [app.py:875] 6e1a72faa1 Exception on /console/api/workspaces/current/plugin/preferences/fetch [GET] Traceback (most recent call last): File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/api.py", line 404, in wrapper resp = resource(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/resource.py", line 41, in dispatch_request resp = meth(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 225, in decorated return view(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/libs/login.py", line 100, in decorated_view return current_app.ensure_sync(func)(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 44, in decorated return view(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/controllers/console/workspace/plugin.py", line 778, in get permission_dict["install_permission"] = permission.install_permission ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 569, in get return self.impl.get(state, dict) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1096, in get value = self._fire_loader_callables(state, key, passive) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1126, in _fire_loader_callables return state._load_expired(state, passive) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 828, in _load_expired self.manager.expired_attribute_loader(self, toload, passive) File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 1607, in load_scalar_attributes raise orm_exc.DetachedInstanceError( sqlalchemy.orm.exc.DetachedInstanceError: Instance <TenantPluginPermission at 0x7753a49580b0> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3) 2026-04-10 13:56:50,296 INFO [internal.py:97] 6e1a72faa1 127.0.0.1 - - [10/Apr/2026 05:56:50] "GET /console/api/workspaces/current/plugin/preferences/fetch HTTP/1.1" 500 - 2026-04-10 13:56:54,340 ERROR [app.py:875] 2178d74d30 Exception on /console/api/workspaces/current/plugin/preferences/fetch [GET] Traceback (most recent call last): File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request rv = self.dispatch_request() ^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/api.py", line 404, in wrapper resp = resource(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view return current_app.ensure_sync(self.dispatch_request)(**kwargs) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/resource.py", line 41, in dispatch_request resp = meth(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 225, in decorated return view(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/libs/login.py", line 100, in decorated_view return current_app.ensure_sync(func)(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 44, in decorated return view(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/controllers/console/workspace/plugin.py", line 778, in get permission_dict["install_permission"] = permission.install_permission ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 569, in get return self.impl.get(state, dict) # type: ignore[no-any-return] ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1096, in get value = self._fire_loader_callables(state, key, passive) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1126, in _fire_loader_callables return state._load_expired(state, passive) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 828, in _load_expired self.manager.expired_attribute_loader(self, toload, passive) File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 1607, in load_scalar_attributes raise orm_exc.DetachedInstanceError( sqlalchemy.orm.exc.DetachedInstanceError: Instance <TenantPluginPermission at 0x7753a4958770> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)

Fix Action

Fix / Workaround

2026-04-10 13:56:49,623 DEBUG [_trace.py:47] 130af127ee response_closed.complete
2026-04-10 13:56:49,625 INFO [_internal.py:97] 130af127ee 127.0.0.1 - - [10/Apr/2026 05:56:49] "GET /console/api/version?current_version=1.13.3 HTTP/1.1" 200 -
2026-04-10 13:56:50,294 ERROR [app.py:875] 6e1a72faa1 Exception on /console/api/workspaces/current/plugin/preferences/fetch [GET]
Traceback (most recent call last):
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/api.py", line 404, in wrapper
    resp = resource(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view
    return current_app.ensure_sync(self.dispatch_request)(**kwargs)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/resource.py", line 41, in dispatch_request
    resp = meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 225, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/libs/login.py", line 100, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 44, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/workspace/plugin.py", line 778, in get
    permission_dict["install_permission"] = permission.install_permission
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 569, in __get__
    return self.impl.get(state, dict_)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1096, in get
    value = self._fire_loader_callables(state, key, passive)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1126, in _fire_loader_callables
    return state._load_expired(state, passive)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 828, in _load_expired
    self.manager.expired_attribute_loader(self, toload, passive)
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 1607, in load_scalar_attributes
    raise orm_exc.DetachedInstanceError(
sqlalchemy.orm.exc.DetachedInstanceError: Instance <TenantPluginPermission at 0x7753a49580b0> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)
2026-04-10 13:56:50,296 INFO [_internal.py:97] 6e1a72faa1 127.0.0.1 - - [10/Apr/2026 05:56:50] "GET /console/api/workspaces/current/plugin/preferences/fetch HTTP/1.1" 500 -
2026-04-10 13:56:54,340 ERROR [app.py:875] 2178d74d30 Exception on /console/api/workspaces/current/plugin/preferences/fetch [GET]
Traceback (most recent call last):
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/api.py", line 404, in wrapper
    resp = resource(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view
    return current_app.ensure_sync(self.dispatch_request)(**kwargs)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/resource.py", line 41, in dispatch_request
    resp = meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 225, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/libs/login.py", line 100, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 44, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/workspace/plugin.py", line 778, in get
    permission_dict["install_permission"] = permission.install_permission
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 569, in __get__
    return self.impl.get(state, dict_)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1096, in get
    value = self._fire_loader_callables(state, key, passive)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1126, in _fire_loader_callables
    return state._load_expired(state, passive)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 828, in _load_expired
    self.manager.expired_attribute_loader(self, toload, passive)
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 1607, in load_scalar_attributes
    raise orm_exc.DetachedInstanceError(
sqlalchemy.orm.exc.DetachedInstanceError: Instance <TenantPluginPermission at 0x7753a4958770> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)

PR fix notes

PR #34910: fix: sqlalchemy.orm.exc.DetachedInstanceError

Description (problem / solution / changelog)

[!IMPORTANT]

  1. Make sure you have read our contribution guidelines
  2. Ensure there is an associated issue and you have been assigned to it
  3. Use the correct syntax to link this PR: Fixes #<issue number>.

Summary

<!-- Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change. -->

fixes https://github.com/langgenius/dify/issues/34907

Screenshots

BeforeAfter
......

Checklist

  • This change requires a documentation update, included: Dify Document
  • I understand that this PR may be closed in case there was no previous discussion or issues. (This doesn't apply to typos!)
  • I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change.
  • I've updated the documentation accordingly.
  • I ran make lint and make type-check (backend) and cd web && pnpm exec vp staged (frontend) to appease the lint gods

Changed files

  • api/services/plugin/plugin_permission_service.py (modified, +3/-4)
  • api/tests/unit_tests/services/plugin/test_plugin_permission_service.py (modified, +21/-15)

Code Example

2026-04-10 13:56:49,623 DEBUG [_trace.py:47] 130af127ee response_closed.complete
2026-04-10 13:56:49,625 INFO [_internal.py:97] 130af127ee 127.0.0.1 - - [10/Apr/2026 05:56:49] "GET /console/api/version?current_version=1.13.3 HTTP/1.1" 200 -
2026-04-10 13:56:50,294 ERROR [app.py:875] 6e1a72faa1 Exception on /console/api/workspaces/current/plugin/preferences/fetch [GET]
Traceback (most recent call last):
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/api.py", line 404, in wrapper
    resp = resource(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view
    return current_app.ensure_sync(self.dispatch_request)(**kwargs)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/resource.py", line 41, in dispatch_request
    resp = meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 225, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/libs/login.py", line 100, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 44, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/workspace/plugin.py", line 778, in get
    permission_dict["install_permission"] = permission.install_permission
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 569, in __get__
    return self.impl.get(state, dict_)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1096, in get
    value = self._fire_loader_callables(state, key, passive)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1126, in _fire_loader_callables
    return state._load_expired(state, passive)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 828, in _load_expired
    self.manager.expired_attribute_loader(self, toload, passive)
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 1607, in load_scalar_attributes
    raise orm_exc.DetachedInstanceError(
sqlalchemy.orm.exc.DetachedInstanceError: Instance <TenantPluginPermission at 0x7753a49580b0> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)
2026-04-10 13:56:50,296 INFO [_internal.py:97] 6e1a72faa1 127.0.0.1 - - [10/Apr/2026 05:56:50] "GET /console/api/workspaces/current/plugin/preferences/fetch HTTP/1.1" 500 -
2026-04-10 13:56:54,340 ERROR [app.py:875] 2178d74d30 Exception on /console/api/workspaces/current/plugin/preferences/fetch [GET]
Traceback (most recent call last):
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/api.py", line 404, in wrapper
    resp = resource(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view
    return current_app.ensure_sync(self.dispatch_request)(**kwargs)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/resource.py", line 41, in dispatch_request
    resp = meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 225, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/libs/login.py", line 100, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 44, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/workspace/plugin.py", line 778, in get
    permission_dict["install_permission"] = permission.install_permission
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 569, in __get__
    return self.impl.get(state, dict_)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1096, in get
    value = self._fire_loader_callables(state, key, passive)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1126, in _fire_loader_callables
    return state._load_expired(state, passive)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 828, in _load_expired
    self.manager.expired_attribute_loader(self, toload, passive)
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 1607, in load_scalar_attributes
    raise orm_exc.DetachedInstanceError(
sqlalchemy.orm.exc.DetachedInstanceError: Instance <TenantPluginPermission at 0x7753a4958770> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)
RAW_BUFFERClick to expand / collapse

Self Checks

  • I have read the Contributing Guide and Language Policy.
  • This is only for bug report, if you would like to ask a question, please head to Discussions.
  • I have searched for existing issues search for existing issues, including closed ones.
  • I confirm that I am using English to submit this report, otherwise it will be closed.
  • 【中文用户 & Non English User】请使用英语提交,否则会被关闭 :)
  • Please do not modify this template :) and fill in all the required fields.

Dify version

main(20260410)

Cloud or Self Hosted

Self Hosted (Source)

Steps to reproduce

2026-04-10 13:56:49,623 DEBUG [_trace.py:47] 130af127ee response_closed.complete
2026-04-10 13:56:49,625 INFO [_internal.py:97] 130af127ee 127.0.0.1 - - [10/Apr/2026 05:56:49] "GET /console/api/version?current_version=1.13.3 HTTP/1.1" 200 -
2026-04-10 13:56:50,294 ERROR [app.py:875] 6e1a72faa1 Exception on /console/api/workspaces/current/plugin/preferences/fetch [GET]
Traceback (most recent call last):
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/api.py", line 404, in wrapper
    resp = resource(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view
    return current_app.ensure_sync(self.dispatch_request)(**kwargs)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/resource.py", line 41, in dispatch_request
    resp = meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 225, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/libs/login.py", line 100, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 44, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/workspace/plugin.py", line 778, in get
    permission_dict["install_permission"] = permission.install_permission
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 569, in __get__
    return self.impl.get(state, dict_)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1096, in get
    value = self._fire_loader_callables(state, key, passive)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1126, in _fire_loader_callables
    return state._load_expired(state, passive)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 828, in _load_expired
    self.manager.expired_attribute_loader(self, toload, passive)
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 1607, in load_scalar_attributes
    raise orm_exc.DetachedInstanceError(
sqlalchemy.orm.exc.DetachedInstanceError: Instance <TenantPluginPermission at 0x7753a49580b0> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)
2026-04-10 13:56:50,296 INFO [_internal.py:97] 6e1a72faa1 127.0.0.1 - - [10/Apr/2026 05:56:50] "GET /console/api/workspaces/current/plugin/preferences/fetch HTTP/1.1" 500 -
2026-04-10 13:56:54,340 ERROR [app.py:875] 2178d74d30 Exception on /console/api/workspaces/current/plugin/preferences/fetch [GET]
Traceback (most recent call last):
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 917, in full_dispatch_request
    rv = self.dispatch_request()
         ^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/app.py", line 902, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/api.py", line 404, in wrapper
    resp = resource(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask/views.py", line 110, in view
    return current_app.ensure_sync(self.dispatch_request)(**kwargs)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/flask_restx/resource.py", line 41, in dispatch_request
    resp = meth(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 225, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/libs/login.py", line 100, in decorated_view
    return current_app.ensure_sync(func)(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/wraps.py", line 44, in decorated
    return view(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/controllers/console/workspace/plugin.py", line 778, in get
    permission_dict["install_permission"] = permission.install_permission
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 569, in __get__
    return self.impl.get(state, dict_)  # type: ignore[no-any-return]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1096, in get
    value = self._fire_loader_callables(state, key, passive)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/attributes.py", line 1126, in _fire_loader_callables
    return state._load_expired(state, passive)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/state.py", line 828, in _load_expired
    self.manager.expired_attribute_loader(self, toload, passive)
  File "/home/leslie/share/code/dify/api/.venv/lib/python3.12/site-packages/sqlalchemy/orm/loading.py", line 1607, in load_scalar_attributes
    raise orm_exc.DetachedInstanceError(
sqlalchemy.orm.exc.DetachedInstanceError: Instance <TenantPluginPermission at 0x7753a4958770> is not bound to a Session; attribute refresh operation cannot proceed (Background on this error at: https://sqlalche.me/e/20/bhk3)

✔️ Expected Behavior

no error

❌ Actual Behavior

No response

extent analysis

TL;DR

The most likely fix is to ensure that the TenantPluginAutoUpgradeStrategy instance is properly bound to a database session before attempting to access its attributes.

Guidance

  • Verify that the database session is properly configured and active when accessing the TenantPluginAutoUpgradeStrategy instance.
  • Check the code in workspace/plugin.py line 792 to ensure that the auto_upgrade object is properly initialized and bound to a session before accessing its strategy_setting attribute.
  • Review the SQLAlchemy documentation on detached instances (https://sqlalche.me/e/20/bhk3) to understand how to properly manage database sessions and avoid this error.
  • Consider adding error handling to catch and handle DetachedInstanceError exceptions, potentially by re-attaching the instance to a session or re-fetching the data.

Example

# Example of re-attaching a detached instance to a session
from sqlalchemy.orm import sessionmaker

# assuming 'session' is a valid SQLAlchemy session
session = sessionmaker()

# re-attach the detached instance to the session
session.add(auto_upgrade)
session.flush()

Notes

The provided stacktrace suggests a SQLAlchemy-related issue, but without more context about the code and database configuration, it's difficult to provide a more specific solution. The example code snippet is a general illustration of how to re-attach a detached instance to a session and may need to be adapted to the specific use case.

Recommendation

Apply a workaround by ensuring that the TenantPluginAutoUpgradeStrategy instance is properly bound to a database session before accessing its attributes, as this is the most likely cause of the error.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

dify - ✅(Solved) Fix sqlalchemy.orm.exc.DetachedInstanceError [1 pull requests, 1 comments, 2 participants]