{"record":{"id":"fe4ad104ba1106f6","repo":"HeyPuter/puter","slug":"unauthorized-fe4ad1","errorCode":"unauthorized","errorMessage":"actor not found in context","messagePattern":"actor not found in context","errorType":"http","errorClass":"HttpError","httpStatus":401,"severity":"critical","filePath":"src/backend/drivers/ai-image/providers/replicate/ReplicateImageGenerationProvider.ts","lineNumber":86,"sourceCode":"    async generate(params: IGenerateParams): Promise<string> {\n        const { prompt, test_mode } = params;\n\n        const selectedModel = this.#getModel(params.model);\n        const ratio = this.#normalizeRatio(params.ratio);\n\n        if (test_mode) {\n            return 'https://puter-sample-data.puter.site/image_example.png';\n        }\n\n        if (typeof prompt !== 'string' || prompt.trim().length === 0) {\n            throw new HttpError(400, '`prompt` must be a non-empty string', {\n                legacyCode: 'bad_request',\n            });\n        }\n\n        const actor = Context.get('actor');\n        if (!actor) {\n            throw new HttpError(401, 'actor not found in context', {\n                legacyCode: 'unauthorized',\n            });\n        }\n\n        const filtered = this.#filterAllowedParams(params, selectedModel);\n        const aliased = this.#applyParamAliases(filtered, selectedModel);\n        const transformed = this.#applyTransforms(aliased, selectedModel);\n\n        const goFast = !!transformed.go_fast;\n        const generationMode =\n            typeof transformed.generation_mode === 'string'\n                ? transformed.generation_mode\n                : undefined;\n\n        const inputImages: string[] = [];\n        if (selectedModel.imageInputKey) {\n            if (params.input_image) inputImages.push(params.input_image);\n            if (params.input_images?.length)","sourceCodeStart":68,"sourceCodeEnd":104,"githubUrl":"https://github.com/HeyPuter/puter/blob/908ec23eda38526170322c3edf71ba45ecb1ca95/src/backend/drivers/ai-image/providers/replicate/ReplicateImageGenerationProvider.ts#L68-L104","documentation":"Thrown by ReplicateImageGenerationProvider.generate() (ReplicateImageGenerationProvider.ts:86) when Context.get('actor') is falsy. The Replicate provider needs the actor for credit checks and usage recording. Same root cause as Gemini error 365: the call is executing outside the ALS context that populates `actor`. HTTP 401 unauthorized.","triggerScenarios":"Invoking the Replicate provider outside a request lifecycle that sets Context actor; tests calling generate() directly without Context.run or setupPuterTestEnv; a background task without an established actor; middleware ordering issue.","commonSituations":"Direct unit tests of the provider missing context setup; refactored code path losing ALS propagation; cron/internal jobs invoking generation without actor context.","solutions":["Call generate() only within a context that has set actor (controllers do this normally).","In tests, wrap with Context.run({ actor: testActor }, async () => ...) or use setupPuterTestEnv().","Verify middleware sets actor before the provider is reached.","For background jobs, establish an explicit actor context."],"exampleFix":"// before (test — actor missing)\nawait provider.generate({ prompt: 'cat' });\n\n// after\nimport { Context } from '../../core/context.js';\nawait Context.run({ actor: testActor }, async () => {\n  await provider.generate({ prompt: 'cat' });\n});","handlingStrategy":"validation","validationCode":"import { Context } from '../../core/context.js';\nfunction ensureActor(): Actor {\n  const actor = Context.get('actor');\n  if (!actor) throw new Error('actor not found in context — wrap call in Context.run');\n  return actor;\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Invoke providers only within a request context that sets actor.","In tests, use Context.run({ actor }, ...) or setupPuterTestEnv().","Never call provider.generate() from a context-less top-level script."],"tags":["auth","context","als","replicate","ai-image","unauthorized","wiring"],"backgroundTag":null,"analyzedSha":"908ec23eda38526170322c3edf71ba45ecb1ca95","analyzedAt":"2026-08-12T20:53:15.911Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}