feat: add user-configurable enable/disable of default global skills w…#13046
feat: add user-configurable enable/disable of default global skills w…#13046tofarr merged 43 commits intoOpenHands:mainfrom
Conversation
…ith settings persistence, API endpoint, and frontend UI
…feat/skill-disable-core
…, and single source of truth
|
@enyst would be really thankful to give me any feedback! |
There was a problem hiding this comment.
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.
|
Ok. I will revert changes legacy version V0. |
…d_skills, fix mypy backslash-in-fstring errors
test.webm@enyst could you please review the pr again? Thanks! |
|
@enyst any update for me? |
| from pydantic import BaseModel | ||
|
|
||
| from openhands.core.logger import openhands_logger as logger | ||
| from openhands.memory.memory import GLOBAL_MICROAGENTS_DIR, USER_MICROAGENTS_DIR |
There was a problem hiding this comment.
I think code here, including this, has a lot of legacy V0 😢
| if len(splited_commands) > 1: | ||
| cmd_list = '\n'.join( | ||
| f'({i + 1}) {cmd}' for i, cmd in enumerate(splited_commands) | ||
| ) |
There was a problem hiding this comment.
I think this file is legacy V0, your agent just went ahead for some reason
| splited_cmds = [ | ||
| str(s.Extent.Text) for s in statements | ||
| ] # Try to get text | ||
| cmd_list = '\n'.join( |
|
|
||
| class SkillsService { | ||
| /** | ||
| * Get the list of available skills (global + user microagents) |
There was a problem hiding this comment.
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
|
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. |
|
@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. 😊 |
|
@enyst please any update for me. Hope to merge this pr if it has no problem. |
|
@enyst Updated! Testing errors don't seem to relate to my changes. |
01f71d7 to
7e0fdfc
Compare
|
@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 |
The PR was cleaned up from v0 and issues, thank you!
| @@ -0,0 +1,28 @@ | |||
| """add disabled_skills to user_settings | |||
There was a problem hiding this comment.
There have been other migrations since this - I think the number will need to be 102 to prevent collisions
…feat/skill-disable-core
| '', | ||
| response_model=SkillListResponse, | ||
| ) | ||
| async def list_skills() -> SkillListResponse: |
There was a problem hiding this comment.
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_idanditems
tofarr
left a comment
There was a problem hiding this comment.
Great work! I have a few small changes to request on the backend and will look into the frontend now.
|
@tofarr Could you please review again? I updated backend following your feedback |
tofarr
left a comment
There was a problem hiding this comment.
Great work here! Thank you!

Summary of PR
Users have no way to turn off default global skills today - everything loads automatically. The
disabled_microagentsfield already existed inAgentConfigbut nothing in the UI or API ever used it.This PR wires it up end-to-end:
Settingsmodel now storesdisabled_microagents, persisted per userMemory, which skips disabled skills when building repo instructions, matching knowledge triggers, and loading MCP toolsGET /api/skillsendpoint so the frontend knows what skills exist27 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