先把当时的情况摆出来。semantic-kernel 1.18 Python 版里用 Kernel().add_plugin(plugin_name="math", functions=[add]) 注册,随后 kernel.invoke("math", "add", a=1, b=2) 报 Function math-add not found,函数本身带 kernel_function 装饰器。
这类报错背后常见的原因有几处,逐个排除就行。add_plugin 传的是函数列表,但函数名没有带 plugin 前缀。还有一种是invoke 的第一个参数要写成 math-add,而不是分开传。
少数情况下是装饰器所在类没实例化,函数根本没进注册表。不容易想到的是,异步函数没有 await,注册时静默失败。
上来先把已注册的插件与函数全部列出来
python -c "from semantic_kernel import Kernel;k=Kernel();print([f.fully_qualified_name for p in k.plugins.values() for f in p.functions.values()])"
接着按全名方式调用一次
python -c "from semantic_kernel import Kernel;k=Kernel();print(k.invoke('math-add', a=1, b=2))"
再往下改用带 kernel_function 的类并实例化后注册
python -c "from semantic_kernel.functions import kernel_function;print('class MathPlugin: pass')"
注册完立刻断言函数存在于 plugins 字典
python -c "print('math' in k.plugins)"
这次没动代码,只在配置和运行环境上找原因。
隔了一天再看,现象没变,说明不是偶发。
恢复的判定其实很直接。invoke 返回 FunctionResult,值为 3,plugins 字典里能看到 math 插件下的 add 函数。
1.x 之后插件是命名空间,函数全名由插件名和函数名拼接,调用时要么传全名,要么明确传 plugin_name 与 function_name 两个参数。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。
