先把当时的情况摆出来。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 两个参数。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189