{"record":{"id":"1ca3883b368b6a19","repo":"router-for-me/CLIProxyAPI","slug":"plugin-executor-s-not-found","errorCode":null,"errorMessage":"plugin executor %s not found","messagePattern":"plugin executor (.+?) not found","errorType":"http","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/pluginhost/executor_route.go","lineNumber":138,"sourceCode":"\tfor _, record := range h.activeRecords() {\n\t\tif record.id != pluginID {\n\t\t\tcontinue\n\t\t}\n\t\tif h.isPluginFused(record.id) {\n\t\t\treturn nil, fmt.Errorf(\"plugin executor %s is unavailable\", pluginID)\n\t\t}\n\t\texecutor := record.plugin.Capabilities.Executor\n\t\tif executor == nil {\n\t\t\treturn nil, fmt.Errorf(\"plugin %s does not declare an executor\", pluginID)\n\t\t}\n\t\tprovider, okProvider := h.executorProvider(record, executor)\n\t\tif !okProvider {\n\t\t\treturn nil, fmt.Errorf(\"plugin executor %s has no provider identifier\", pluginID)\n\t\t}\n\t\tregistration := newExecutorAdapterRegistration(h, record, provider, executor)\n\t\treturn registration.adapter, nil\n\t}\n\treturn nil, fmt.Errorf(\"plugin executor %s not found\", pluginID)\n}\n","sourceCodeStart":120,"sourceCodeEnd":140,"githubUrl":"https://github.com/router-for-me/CLIProxyAPI/blob/78f0c4079e3e6273d65d03b5549cffc898703264/internal/pluginhost/executor_route.go#L120-L140","documentation":"executorAdapterForPlugin iterated all active plugin records and none matched the requested pluginID. The plugin is either not loaded, disabled, or its registered id differs (case/whitespace) from what the router passed.","triggerScenarios":"Routing a model to a plugin id that is not among activeRecords(): plugin not installed, failed to load at startup, excluded by config, or an id mismatch such as trailing characters or wrong case.","commonSituations":"Config references a plugin that was removed from the plugins directory; plugin file failed to load (check startup logs for load errors) so it never became active; id typo in model routing.","solutions":["List active plugins (host logs at startup, or management API) and compare ids with the routing config value.","Fix the id in the model-to-plugin mapping to match the plugin's registered id exactly.","If the plugin failed to load, resolve the load error first (missing dependency, bad manifest, wrong architecture)."],"exampleFix":"# before (config.yaml)\nmodels:\n  - name: \"my-model\"\n    plugin: \"MyExecutor-Plugin\"   # wrong case\n\n# after\nmodels:\n  - name: \"my-model\"\n    plugin: \"my-executor-plugin\" # exact registered id","handlingStrategy":"validation","validationCode":"known := map[string]bool{}\nfor _, rec := range host.ActiveRecords() {\n    known[rec.ID] = true\n}\nif !known[pluginID] {\n    return fmt.Errorf(\"plugin %q not loaded; active plugins: %v\", pluginID, keys(known))\n}","typeGuard":"func pluginLoaded(h *pluginhost.Host, id string) bool {\n    for _, rec := range h.ActiveRecords() {\n        if rec.ID == id {\n            return true\n        }\n    }\n    return false\n}","tryCatchPattern":"adapter, err := host.ExecutorAdapterForPlugin(pluginID)\nif err != nil && strings.Contains(err.Error(), \"not found\") {\n    return configErrorf(\"unknown plugin %q in model routing; check installed plugins\", pluginID)\n}","preventionTips":["Validate all configured plugin ids against loaded plugins at startup and fail fast.","Watch plugin load errors at boot — a plugin that fails to load will later show up as 'not found'."],"tags":["plugin","executor","routing","configuration","pluginhost"],"backgroundTag":null,"analyzedSha":"78f0c4079e3e6273d65d03b5549cffc898703264","analyzedAt":"2026-08-15T12:26:37.444Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}