{"record":{"id":"bb6a90af692be0b4","repo":"plandex-ai/plandex","slug":"local-model-pack-s-can-t-be-used-on-plandex-cloud","errorCode":null,"errorMessage":"Local model pack %s can't be used on Plandex Cloud","messagePattern":"Local model pack (.+?) can't be used on Plandex Cloud","errorType":"http","errorClass":"http","httpStatus":422,"severity":"warning","filePath":"app/server/handlers/settings.go","lineNumber":130,"sourceCode":"\t\treturn\n\t}\n\n\tif req.ModelPackName != \"\" {\n\t\tif mp, builtIn := shared.BuiltInModelPacksByName[req.ModelPackName]; builtIn {\n\t\t\tif os.Getenv(\"IS_CLOUD\") != \"\" && mp.LocalProvider != \"\" {\n\t\t\t\tmsg := fmt.Sprintf(\"Built-in local model pack %s can't be used on Plandex Cloud\", req.ModelPackName)\n\t\t\t\tlog.Println(msg)\n\t\t\t\thttp.Error(w, msg, http.StatusUnprocessableEntity)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tif req.ModelPack != nil {\n\t\tif req.ModelPack.LocalProvider != \"\" {\n\t\t\tmsg := fmt.Sprintf(\"Local model pack %s can't be used on Plandex Cloud\", req.ModelPack.Name)\n\t\t\tlog.Println(msg)\n\t\t\thttp.Error(w, msg, http.StatusUnprocessableEntity)\n\t\t\treturn\n\t\t}\n\n\t\tids := req.ModelPack.ToModelPackSchema().AllModelIds()\n\t\tfor _, id := range ids {\n\t\t\tbm, builtIn := shared.BuiltInBaseModelsById[id]\n\t\t\tif builtIn && os.Getenv(\"IS_CLOUD\") != \"\" && bm.IsLocalOnly() {\n\t\t\t\tmsg := fmt.Sprintf(\"Built-in local model %s can't be used on Plandex Cloud\", id)\n\t\t\t\tlog.Println(msg)\n\t\t\t\thttp.Error(w, msg, http.StatusUnprocessableEntity)\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n\n\tctx, cancel := context.WithCancel(r.Context())\n\n\tvar commitMsg string","sourceCodeStart":112,"sourceCodeEnd":148,"githubUrl":"https://github.com/plandex-ai/plandex/blob/e2d772072efadbe41d2946d97d79be55532dbab5/app/server/handlers/settings.go#L112-L148","documentation":"When the request supplies a custom ModelPack object with a non-empty LocalProvider while the server runs on Plandex Cloud, the handler rejects it with HTTP 422. Same rationale as built-in packs: custom local-provider packs cannot work in the cloud environment.","triggerScenarios":"UpdateSettingsHandler called with req.ModelPack != nil, req.ModelPack.LocalProvider != \"\", and IS_CLOUD set on the server.","commonSituations":"User exports their local custom pack and uploads it unchanged to a cloud account; migration tooling copies local settings to cloud; template config includes localProvider by default.","solutions":["Clear the LocalProvider field (set it to \"\") or use API-hosted providers in the pack before uploading","Use only cloud-supported providers (OpenAI, Anthropic, etc.) in custom packs","Run the pack against a self-hosted server if local providers are required"],"exampleFix":"// before\n{name: \"my-pack\", localProvider: \"ollama\", ...}\n// after\n{name: \"my-pack\", localProvider: \"\", ...}","handlingStrategy":"validation","validationCode":"if os.Getenv(\"IS_CLOUD\") != \"\" && pack.LocalProvider != \"\" {\n    return fmt.Errorf(\"custom pack %q uses a local provider and is unavailable on cloud\", pack.Name)\n}","typeGuard":null,"tryCatchPattern":"resp, err := client.UpdateSettings(ctx, req)\nif err != nil {\n    var apiErr *APIError\n    if errors.As(err, &apiErr) && apiErr.StatusCode == 422 {\n        // strip LocalProvider or switch providers before resending\n    }\n    return err\n}","preventionTips":["Strip LocalProvider when exporting custom packs for cloud use","Validate packs in CI against the cloud provider allowlist","Document provider restrictions in pack templates"],"tags":["http","configuration","cloud"],"backgroundTag":"local-model-on-cloud","analyzedSha":"e2d772072efadbe41d2946d97d79be55532dbab5","analyzedAt":"2026-09-05T20:56:53.631Z","contentChangedAt":"2026-09-05T20:56:53.631Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}