{"id":6732,"date":"2026-07-08T12:50:42","date_gmt":"2026-07-08T05:50:42","guid":{"rendered":"https:\/\/daiilynews.cu.ma\/?p=6732"},"modified":"2026-07-08T12:50:42","modified_gmt":"2026-07-08T05:50:42","slug":"chonsong-skill-retriever-agentskillos-powered-semantic-skill-retrieval-for-hermes-agent-%c2%b7-github","status":"publish","type":"post","link":"https:\/\/daiilynews.cu.ma\/?p=6732","title":{"rendered":"ChonSong\/skill-retriever: AgentSkillOS-powered semantic skill retrieval for Hermes Agent. \u00b7 GitHub"},"content":{"rendered":"<p> <br \/>\n<\/p>\n<p>AgentSkillOS-powered semantic skill retrieval for Hermes Agent.<\/p>\n<p>Pre-filters 1,200+ skills (998 community corpus + 211 Hermes skills) organized in a 10,000-category capability taxonomy to the top-5 most relevant per query. Runs as a Hermes pre_llm_call plugin \u2014 zero core modification, zero additional API cost (borrows your existing Hermes LLMs via borrow-mode).<\/p>\n<p>Pure semantic retrieval prioritizes textual similarity and misses skills that look unrelated in embedding space but are crucial for solving the task. Our LLM + Skill Tree navigates the capability hierarchy to surface non-obvious but functionally relevant skills.<\/p>\n<p>Left: Pure semantic retrieval is narrow and myopic. Right: Skill Tree navigation surfaces functionally relevant skills the embedding space hides.<\/p>\n<p>Skills are organized into a coarse-to-fine capability hierarchy. At scale, this is the difference between finding the right skill and drowning in an invisible pile.<\/p>\n<p>The 10,000-category capability tree \u2014 the structure our 1,200 skills are mapped into.<\/p>\n<p>User Query<br \/>\n    \u2502<br \/>\n    \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 pre_llm_call hook (plugin)           \u2502<br \/>\n\u2502 Checks DISABLE flag, skips short Qs  \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n               \u2502<br \/>\n               \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 Searcher.search()                    \u2502<br \/>\n\u2502 1. Load capability tree from YAML    \u2502<br \/>\n\u2502 2. LLM-navigate tree (select nodes)  \u2502<br \/>\n\u2502 3. Parallel child search (ThreadPool)\u2502<br \/>\n\u2502 4. LLM prune (dedup + rank)          \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<br \/>\n               \u2502<br \/>\n               \u25bc<br \/>\n\u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n\u2502 Hint Injection                       \u2502<br \/>\n\u2502 Prepends top-5 skill hints as        \u2502<br \/>\n\u2502 natural-language block. LLM may call \u2502<br \/>\n\u2502 skill_view(name) to load any.        \u2502<br \/>\n\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518<\/p>\n<p>Why not just use Hermes OOTB?<br \/>\nHermes already ships with skill discovery \u2014 every user-installed skill appears in the  block of the system prompt. The LLM scans this flat list every turn and calls skill_view() when needed. For small sets it works fine.<br \/>\nskill-retriever adds a semantic retrieval layer that transforms skill discovery from &#8220;read the catalog&#8221; into &#8220;search for what you need&#8221;:<\/p>\n<p>Dimension<br \/>\nHermes OOTB<br \/>\nskill-retriever<\/p>\n<p>Skill source<br \/>\nYour local ~\/.hermes\/skills\/ only (~100-200)<br \/>\nCommunity corpus (998) + Hermes skills (200) = 1,198 total<\/p>\n<p>Discovery<br \/>\nFlat name+desc list in system prompt every turn<br \/>\nLLM-navigated taxonomy tree \u2192 top-5 relevant injected as hints<\/p>\n<p>Token cost<br \/>\nEvery turn burns tokens for all skills, even irrelevant ones<br \/>\nZero system prompt overhead \u2014 hints only in user message, only when found<\/p>\n<p>Categorization<br \/>\nFilesystem directory names<br \/>\n10,000-category AgentSkillOS capability taxonomy<\/p>\n<p>Scales to<br \/>\n~200 skills before prompt bloat<br \/>\n10K+ (tree handles it)<\/p>\n<p>Latency per turn<br \/>\n0 (passive \u2014 always visible)<br \/>\n+1-3 cheap LLM calls for tree traversal (when it has results)<\/p>\n<p>Community corpus<br \/>\nNo<br \/>\nYes \u2014 998 community skills alongside yours<\/p>\n<p>The difference: OOTB gives you a flat skill catalog you read every turn. skill-retriever turns it into a search engine \u2014 describe what you need, the tree navigates to the right category, and only relevant suggestions appear. The tradeoff is a small latency cost per turn vs constant system prompt bloat.<\/p>\n<p>git clone https:\/\/github.com\/ChonSong\/skill-retriever.git<br \/>\ncd skill-retriever<br \/>\nbash scripts\/install.sh<br \/>\nhermes gateway restart<\/p>\n<p>Every skill carries a source tag and a safety scan result:<\/p>\n<p>Badge<br \/>\nMeaning<\/p>\n<p>\ud83d\udd12hermes<br \/>\nInstalled via Hermes \u2014 trusted<\/p>\n<p>\ud83c\udf10community<br \/>\nFrom AgentSkillOS corpus \u2014 unreviewed<\/p>\n<p>\u26a0\ufe0f (suffix)<br \/>\nFlagged by safety scan \u2014 review before loading<\/p>\n<p>All 1,200 skills were scanned for dangerous patterns (rm -rf \/, curl | sh to raw IPs, base64 payloads, crypto miners). Zero flagged \u2014 every match was standard installer documentation inside code blocks.<\/p>\n<p>python -m skill_retriever search &#8220;set up CI\/CD pipeline&#8221;<br \/>\npython -m skill_retriever build              # rebuild capability tree<br \/>\npython -m skill_retriever list               # list all skills in corpus<br \/>\npython -m skill_retriever info               # system info + tree stats<\/p>\n<p>All settings via environment variables \u2014 no config files needed.<\/p>\n<p>Env Variable<br \/>\nDefault<br \/>\nDescription<\/p>\n<p>SKILL_RETRIEVER_DISABLE<br \/>\n\u2014<br \/>\nSet 1 to disable entirely<\/p>\n<p>SKILL_RETRIEVER_LLM_MODEL<br \/>\ngpt-4o<br \/>\nLLM model for skill gate<\/p>\n<p>SKILL_RETRIEVER_LLM_API_KEY<br \/>\nOPENAI_API_KEY<br \/>\nAPI key<\/p>\n<p>SKILL_RETRIEVER_LLM_BASE_URL<br \/>\nOPENAI_BASE_URL<br \/>\nBase URL<\/p>\n<p>SKILL_RETRIEVER_BRANCHING_FACTOR<br \/>\n3<br \/>\nTree branching (search)<\/p>\n<p>SKILL_RETRIEVER_MAX_PARALLEL<br \/>\n5<br \/>\nParallel search branches<\/p>\n<p>SKILL_RETRIEVER_TEMPERATURE<br \/>\n0.3<br \/>\nLLM temperature<\/p>\n<p>SKILL_RETRIEVER_PRUNE<br \/>\ntrue<br \/>\nEnable dedup\/ranking step<\/p>\n<p>SKILL_RETRIEVER_TREE_PATH<br \/>\nbundled tree_10000.yaml<br \/>\nOverride capability tree<\/p>\n<p>See ARCHITECTURE.md for a technical deep-dive covering:<\/p>\n<p>Capability tree structure and build process<br \/>\nLLM node selection algorithm<br \/>\nSearcher internals (parallel search, early stop, pruning)<br \/>\nPlugin hook integration<br \/>\nDirectory layout<\/p>\n<p>Hermes Agent v0.18+<br \/>\nPython 3.10+<br \/>\n~500MB for capability tree index<br \/>\n~4GB for full skill corpus (optional, for rebuilding tree)<\/p>\n<p>skill-retriever\/<br \/>\n\u251c\u2500\u2500 plugin\/                 # Hermes plugin (pre_llm_call hook)<br \/>\n\u251c\u2500\u2500 src\/<br \/>\n\u2502   \u251c\u2500\u2500 skill_retriever\/    # Core engine<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 cli.py          # CLI (search, build, list, info)<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 search\/         # Searcher (multi-level LLM tree search)<br \/>\n\u2502   \u2502   \u251c\u2500\u2500 tree\/           # Tree builder, schema, prompts, scanner<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 capability_tree\/# Pre-built trees (YAML + HTML)<br \/>\n\u2502   \u2514\u2500\u2500 scanner.py  # Hermes skills scanner<br \/>\n\u251c\u2500\u2500 data\/                   # Skill corpus (gitignored)<br \/>\n\u251c\u2500\u2500 tests\/                  # 40 tests<br \/>\n\u251c\u2500\u2500 scripts\/install.sh      # One-click Hermes plugin install<br \/>\n\u2514\u2500\u2500 ARCHITECTURE.md<\/p>\n<p>MIT. Built on AgentSkillOS (MIT).<br \/>\n<br \/><br \/>\n<br \/><a href=\"https:\/\/github.com\/ChonSong\/skill-retriever\">Source link <\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>AgentSkillOS-powered semantic skill retrieval for Hermes Agent. Pre-filters 1,200+ skills (998 community corpus + 211 Hermes skills) organized in a 10,000-category capability taxonomy to the top-5 most relevant per query. Runs as a Hermes pre_llm_call plugin \u2014 zero core modification, zero additional API cost (borrows your existing Hermes LLMs via borrow-mode). Pure semantic retrieval prioritizes [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":6733,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[676],"tags":[],"class_list":["post-6732","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tech-ai"],"_links":{"self":[{"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=\/wp\/v2\/posts\/6732","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6732"}],"version-history":[{"count":0,"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=\/wp\/v2\/posts\/6732\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=\/wp\/v2\/media\/6733"}],"wp:attachment":[{"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6732"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6732"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daiilynews.cu.ma\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6732"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}