{"record":{"id":"8e2773fd54d13c70","repo":"HeyPuter/puter","slug":"not-found-8e2773","errorCode":"not_found","errorMessage":"Driver not found: ${ifaceName}:${resolvedName ?? '(no default)'}","messagePattern":"Driver not found: (.+?):(.+?)","errorType":"http","errorClass":"HttpError","httpStatus":404,"severity":"error","filePath":"src/backend/controllers/drivers/DriverController.ts","lineNumber":254,"sourceCode":"        } = (req.body ?? {}) as Record<string, unknown>;\n\n        if (!ifaceName || typeof ifaceName !== 'string') {\n            throw new HttpError(400, 'Missing or invalid `interface`', {\n                legacyCode: 'bad_request',\n            });\n        }\n        if (!method || typeof method !== 'string') {\n            throw new HttpError(400, 'Missing or invalid `method`', {\n                legacyCode: 'bad_request',\n            });\n        }\n        const requestedDriver =\n            typeof driverName === 'string' ? driverName : undefined;\n\n        const driver = this.resolve(ifaceName, requestedDriver);\n        if (!driver) {\n            const resolvedName = requestedDriver ?? this.getDefault(ifaceName);\n            throw new HttpError(\n                404,\n                `Driver not found: ${ifaceName}:${resolvedName ?? '(no default)'}`,\n                { legacyCode: 'not_found' },\n            );\n        }\n\n        // Only methods in the pre-resolved callable set are dispatchable.\n        // This excludes framework/lifecycle hooks (onServerStart, etc.),\n        // inherited base methods, and Object.prototype members, none of\n        // which are part of any interface's RPC contract.\n        const callable = this.#callableMethods.get(driver);\n        if (!callable?.has(method)) {\n            throw new HttpError(\n                404,\n                `Method '${method}' not found on driver '${ifaceName}'`,\n                { legacyCode: 'not_found' },\n            );\n        }","sourceCodeStart":236,"sourceCodeEnd":272,"githubUrl":"https://github.com/HeyPuter/puter/blob/908ec23eda38526170322c3edf71ba45ecb1ca95/src/backend/controllers/drivers/DriverController.ts#L236-L272","documentation":"Thrown by POST /drivers/call (404 not_found) when resolve(interface, requestedDriver) returns null: no driver is registered for that interface, and either no default exists or the named driver isn't registered. The message echoes both the interface and the resolved driver name (or '(no default)').","triggerScenarios":"POST /drivers/call with an interface that has no registered driver; an explicit driver name that is misspelled or belongs to a different interface; calling before the driver's registerClient/Store/Service hook has run (e.g. during early boot or a disabled extension).","commonSituations":"Extension that provides the driver is disabled or failed to load; typo in the interface or driver token; calling an AI driver interface on a self-hosted install that hasn't configured any provider; version skew where the interface was renamed.","solutions":["Verify the interface token is spelled exactly as registered (e.g. 'puter-chat-completion'); check the driver's registration call.","If naming a driver explicitly, ensure that driver class is registered for that interface (getDefault + resolve walk only registered entries).","On self-hosted, confirm the provider extension is enabled and onServerStart completed without errors so registration ran."],"exampleFix":"// before\n{ interface: 'puter-chat-completions', method: 'complete' }  // typo\n// after\n{ interface: 'puter-chat-completion', method: 'complete' }","handlingStrategy":"validation","validationCode":"// can't fully validate client-side; at least check known interface tokens\nconst KNOWN = new Set(['puter-chat-completion', /* ... */]);\nif (!KNOWN.has(ifaceName)) throw new Error('unknown interface');","typeGuard":null,"tryCatchPattern":"try {\n  await callDriver(...);\n} catch (e) {\n  if (isHttpError(e, 404) && /Driver not found/.test(e.message)) {\n    // driver not registered — surface config error, don't retry\n  } else throw e;\n}","preventionTips":["Confirm the driver extension is enabled and onServerStart succeeded.","Spell interface/driver tokens exactly as registered.","On self-hosted, verify provider configuration before calling AI drivers."],"tags":["drivers","not-found","rpc","registration"],"backgroundTag":null,"analyzedSha":"908ec23eda38526170322c3edf71ba45ecb1ca95","analyzedAt":"2026-08-12T20:53:15.911Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}