Skip to content

feat: add user-configurable enable/disable of default global skills w…#13046

Merged
tofarr merged 43 commits intoOpenHands:mainfrom
statxc:feat/skill-disable-core
Mar 24, 2026
Merged

feat: add user-configurable enable/disable of default global skills w…#13046
tofarr merged 43 commits intoOpenHands:mainfrom
statxc:feat/skill-disable-core

Conversation

@statxc
Copy link
Copy Markdown
Contributor

@statxc statxc commented Feb 25, 2026

Summary of PR

Users have no way to turn off default global skills today - everything loads automatically. The disabled_microagents field already existed in AgentConfig but nothing in the UI or API ever used it.

This PR wires it up end-to-end:

  • Settings model now stores disabled_microagents, persisted per user
  • That list gets threaded through session startup into Memory, which skips disabled skills when building repo instructions, matching knowledge triggers, and loading MCP tools
  • New GET /api/skills endpoint so the frontend knows what skills exist
  • New Skills page under Settings with toggles for each skill
  • Works through both web and CLI paths

27 files changed: mostly plumbing through existing layers, the usual frontend boilerplate (types, hook, route, i18n, page component), and enterprise DB schema. Tests cover Memory filtering, the API endpoint, and settings persistence

Issue: #13034

Change Type

  • Bug fix
  • New feature
  • Breaking change
  • Refactor
  • Other (dependency update, docs, typo fixes, etc.)

…ith settings persistence, API endpoint, and frontend UI
@statxc statxc requested a review from chuckbutkus as a code owner February 25, 2026 16:23
@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Feb 25, 2026

@enyst would be really thankful to give me any feedback!

enyst
enyst previously requested changes Feb 25, 2026
Copy link
Copy Markdown
Collaborator

@enyst enyst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the PR!

May I ask what LLM and what agent are you using?

Also, I’d love to know the prompt(s).

I think this isn’t quite right: the PR code makes changes to V0 too, and it shouldn’t, it’s a legacy version we will remove soon. It also uses the old “microagents” term which we have changed to Skills.

Edited to add: we always appreciate proofs that a PR works for you. Screenshots, videos in case maybe.

@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Feb 25, 2026

Ok. I will revert changes legacy version V0.
I will attach screenshot

@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Feb 25, 2026

test.webm

@enyst could you please review the pr again? Thanks!

@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Feb 27, 2026

@enyst any update for me?

Comment thread openhands/server/routes/skills.py Outdated
from pydantic import BaseModel

from openhands.core.logger import openhands_logger as logger
from openhands.memory.memory import GLOBAL_MICROAGENTS_DIR, USER_MICROAGENTS_DIR
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think code here, including this, has a lot of legacy V0 😢

Comment thread openhands/runtime/utils/bash.py Outdated
if len(splited_commands) > 1:
cmd_list = '\n'.join(
f'({i + 1}) {cmd}' for i, cmd in enumerate(splited_commands)
)
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this file is legacy V0, your agent just went ahead for some reason

Comment thread openhands/runtime/utils/windows_bash.py Outdated
splited_cmds = [
str(s.Extent.Text) for s in statements
] # Try to get text
cmd_list = '\n'.join(
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same here, not in use

Comment thread frontend/src/api/skills-service.ts Outdated

class SkillsService {
/**
* Get the list of available skills (global + user microagents)
Copy link
Copy Markdown
Collaborator

@enyst enyst Feb 28, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The fact that the LLM says "user microagents" (V0) seems to me a bit of a warning flag. Unfortunately, we have some chaos in this codebase, with the legacy version + the current version + a bunch of things on top

It's maybe not so "agent ready" as we may want it to be 😓 Sorry about that

@enyst
Copy link
Copy Markdown
Collaborator

enyst commented Feb 28, 2026

If I may suggest, @statxc , maybe try to focus on issues labeled good-first-issue, or please note: this functionality is discussed in multiple issues across V1 agent (software-agent-sdk repository), CLI repo, and this repo, which is actually the Web application repo. Please feel free to participate to discussions and let's figure out what we want.

On this PR, I like the video, it makes sense, maybe that's how we want it on the web! I think we should show it to people working on the web interface. Could you maybe join Slack and propose it in #proj-gui channel?


On another note, I'm still curious: what LLM, what agent, and what prompts you used? 😅 It's becoming the more important and fun stuff these days.

@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Mar 2, 2026

@enyst Sorry for the inconvenience. I’ve updated it again based on your feedback. thanks a lot. 🙏

I also reviewed the legacy V0 on my hand and re-tested everything, and I confirmed it’s working properly. Could you please review and test it again?

About the LLM agent: I’m using Claude Opus 4.6, but I always review the changes and test them myself. I only submit a PR after I’ve confirmed all tests pass. 😊

@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Mar 6, 2026

@enyst please any update for me. Hope to merge this pr if it has no problem.

@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Mar 18, 2026

@enyst Updated! Testing errors don't seem to relate to my changes.

@statxc statxc requested a review from enyst March 18, 2026 00:17
@statxc statxc force-pushed the feat/skill-disable-core branch from 01f71d7 to 7e0fdfc Compare March 19, 2026 18:06
@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Mar 24, 2026

@enyst Sorry to bother you. What else should I need to update more? I submitted this PR a month ago. I want to wrap up this PR. Thanks

Copy link
Copy Markdown
Collaborator

@enyst enyst left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me now, thank you!

cc: @tofarr @hieptl This PR contains enterprise migrations. I will defer to you for the rest of the PR process.

@enyst enyst dismissed their stale review March 24, 2026 15:47

The PR was cleaned up from v0 and issues, thank you!

@@ -0,0 +1,28 @@
"""add disabled_skills to user_settings
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There have been other migrations since this - I think the number will need to be 102 to prevent collisions

Comment thread openhands/app_server/user/skills_router.py
'',
response_model=SkillListResponse,
)
async def list_skills() -> SkillListResponse:
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In our API we have generally steered away from having list methods - all endpoints are designed with pagination in mind up front. Even if it is not likely that there will be a prohibitive number of skills it maintains consistency - the first question is always "What if there are 10,000 of them?" We can change the internal structure more easily to accommodate large numbers but once we have exposed an unpaginated API endpoint is is much harder to put that toothpaste back in the tube.

see: https://github.com/search?q=repo%3AOpenHands%2FOpenHands+search_+path%3A*_router.py&type=code

  • search implies we are searching - list implies we get them all.
  • search methods return a page object with a next_page_id and items

Copy link
Copy Markdown
Collaborator

@tofarr tofarr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work! I have a few small changes to request on the backend and will look into the frontend now.

@statxc
Copy link
Copy Markdown
Contributor Author

statxc commented Mar 24, 2026

@tofarr Could you please review again? I updated backend following your feedback

@tofarr
Copy link
Copy Markdown
Collaborator

tofarr commented Mar 24, 2026

Backend looks really good!
I have a few requests for the frontend code:

  • Please remove the second Skills header
  • Please move the description Enable or disable default skills. Disabled skills will not be loaded into agent context. outside the scroll div below the first Skills header.
  • Please make sure that skills handle special characters correctly. e.g.: Triggers: /add_repo_inst global / knowledge should be Triggers: /add_repo_inst global / knowledge
image

Copy link
Copy Markdown
Collaborator

@tofarr tofarr left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Great work here! Thank you!

@tofarr tofarr merged commit c9b2ce2 into OpenHands:main Mar 24, 2026
22 of 23 checks passed
@statxc statxc deleted the feat/skill-disable-core branch March 24, 2026 20:51
@mamoodi mamoodi added the release:cloud-1.19.0 Included in release 1.19.0 label Mar 30, 2026 — with OpenHands AI
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

release:cloud-1.19.0 Included in release 1.19.0

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants