nextcloud / nextcloud/app_api

[Bug]: Context Agent crashes with TypeError (tool_status NoneType) due to 400 Bad Request on config init

Open
#886 7 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

bug priority: normal question
Dominant language
PHP
Stars
196
Forks
26
Avg merge
4d 15h
Merged PRs (30d)
31

Description

Description

Upon freshly deploying the Context Agent, it fails to initialize its default tool configuration. Any attempt to interact with the agent results in a crash because nc.appconfig_ex.get_value('tool_status') returns None.

Under the hood, it appears the enabled_handler is attempting to POST its default preferences to the AppAPI config endpoint, but the Nextcloud server rejects it with a 400 Bad Request. Because the save is rejected, the JSON is never written, causing json.loads() to throw a TypeError on every subsequent task.

Environment
  • Nextcloud Version: NC 32.0.8 AIO 12.9.2
  • AppAPI Version: Latest
  • Context Agent Version: Latest
  • LLM Backend: Ollama
Steps to Reproduce
  1. Deploy the Context Agent via AppAPI.
  2. Send a message to the Nextcloud Assistant assigned to the Context Agent provider.
  3. Observe the "Error generating a response" banner in the UI.
  4. Attempt to go to Administration Settings -> Context Agent and toggle a permission (e.g., Calendar) to force a save. The UI fails to write the config.
Expected Behavior

The Agent should successfully write its default tool_status JSON via the AppAPI upon deployment, and correctly read those permissions to handle tool-calling tasks.

Actual Behavior & Logs

The container fails to set the configuration during the enabled callback, throwing a 400 error:

2026-04-20 14:54:13,252 - context_agent - INFO - enabled=True
2026-04-20 14:54:13,612 - context_agent - WARNING - App enabled: context_agent
INFO:      - "PUT /enabled?enabled=1 HTTP/1.1" 500 Internal Server Error

# ... [Traceback skipped for brevity] ...

  File "/ex_app/lib/main.py", line 126, in enabled_handler
    await nc.appconfig_ex.set_value('tool_status', json.dumps(pref_settings))
  File "/root/.cache/pypoetry/virtualenvs/context-agent-il7asoJj-py3.11/lib/python3.11/site-packages/nc_py_api/_preferences_ex.py", line 135, in set_value
    await self._session.ocs("POST", f"{self._session.ae_url}/{self._url_suffix}", json=params)
  File "/root/.cache/pypoetry/virtualenvs/context-agent-il7asoJj-py3.11/lib/python3.11/site-packages/nc_py_api/_session.py", line 371, in ocs
    raise NextcloudException(
nc_py_api._exceptions.NextcloudException: [400] Error setting app config value <request: POST /ocs/v1.php/apps/app_api/api/v1/ex-app/config>

When a task is received, it instantly crashes trying to read the blank config:

2026-04-20 14:55:43,874 - context_agent - INFO - {'input': 'Hi there, would you tell me my evening programs from my calendar for today?', 'confirmation': 0, 'conversation_token': '<skipped>', 'memories': None}
2026-04-20 14:55:44,235 - context_agent - ERROR - Error: Traceback (most recent call last):
  File "/ex_app/lib/main.py", line 180, in handle_task
    output = await react(task, nextcloud)
  File "/ex_app/lib/agent.py", line 97, in react
    safe_tools, dangerous_tools = await get_tools(nc)
  File "/ex_app/lib/tools.py", line 21, in get_tools
    is_activated = json.loads(await nc.appconfig_ex.get_value('tool_status'))
  File "/usr/local/lib/python3.11/json/__init__.py", line 339, in loads
    raise TypeError(f'the JSON object must be str, bytes or bytearray, '
TypeError: the JSON object must be str, bytes or bytearray, not NoneType

Troubleshooting Attempted

I attempted to bypass the 400 API error by hardcoding the configuration directly into Nextcloud via OCC:
docker exec --user www-data nextcloud-aio-nextcloud php occ config:app:set context_agent tool_status --value='{"calendar":true}'

This successfully saved to the fast cache, but the nc_py_api bridge still fetched NoneType upon container restart, indicating a disconnect between standard occ configs and appconfig_ex ExApp storage.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start in /ex_app/lib/main.py at enabled_handler, then inspect /ex_app/lib/tools.py at get_tools and the failing AppAPI config POST shown in the traceback. Reproduce the deployment and configuration toggle, trace why tool_status is not persisted or returned, and verify that the default JSON survives restart and tasks no longer raise the NoneType TypeError.

Written by the indexing model from the issue text.

Assessment

Tech stack
php, python
Domain
api, backend
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
45/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.