plandex-ai/plandex · warning · http

Built-in local model pack %s can't be used on Plandex Cloud

Error message

Built-in local model pack %s can't be used on Plandex Cloud

What it means

On Plandex Cloud (IS_CLOUD env var set), built-in model packs that rely on a local provider are rejected with HTTP 422, because local providers (e.g. Ollama) cannot be reached from the cloud service. The pack name is interpolated into the message.

Source

Thrown at app/server/handlers/settings.go:120

	if err != nil {
		log.Println("Error decoding request body: ", err)
		http.Error(w, "Error decoding request body", http.StatusInternalServerError)
		return
	}

	if req.ModelPackName == "" && req.ModelPack == nil {
		log.Println("No model pack name or model pack provided")
		http.Error(w, "No model pack name or model pack provided", http.StatusBadRequest)
		return
	}

	if req.ModelPackName != "" {
		if mp, builtIn := shared.BuiltInModelPacksByName[req.ModelPackName]; builtIn {
			if os.Getenv("IS_CLOUD") != "" && mp.LocalProvider != "" {
				msg := fmt.Sprintf("Built-in local model pack %s can't be used on Plandex Cloud", req.ModelPackName)
				log.Println(msg)
				http.Error(w, msg, http.StatusUnprocessableEntity)
				return
			}
		}
	}

	if req.ModelPack != nil {
		if req.ModelPack.LocalProvider != "" {
			msg := fmt.Sprintf("Local model pack %s can't be used on Plandex Cloud", req.ModelPack.Name)
			log.Println(msg)
			http.Error(w, msg, http.StatusUnprocessableEntity)
			return
		}

		ids := req.ModelPack.ToModelPackSchema().AllModelIds()
		for _, id := range ids {
			bm, builtIn := shared.BuiltInBaseModelsById[id]
			if builtIn && os.Getenv("IS_CLOUD") != "" && bm.IsLocalOnly() {
				msg := fmt.Sprintf("Built-in local model %s can't be used on Plandex Cloud", id)

View on GitHub (pinned to e2d772072e)

Solutions

  1. Choose a cloud-compatible built-in model pack (no local provider)
  2. Run a self-hosted Plandex server if you need local-provider packs
  3. Remove/override the LocalProvider setting in a custom pack instead of using the built-in local pack

Example fix

// before
{"modelPackName": "ollama-local"}
// after
{"modelPackName": "plandex-strong"}
Defensive patterns

Strategy: validation

Validate before calling

if os.Getenv("IS_CLOUD") != "" {
    if mp, ok := shared.BuiltInModelPacksByName[packName]; ok && mp.LocalProvider != "" {
        return fmt.Errorf("pack %q uses a local provider and is unavailable on cloud", packName)
    }
}

Try / catch

resp, err := client.UpdateSettings(ctx, req)
if err != nil {
    var apiErr *APIError
    if errors.As(err, &apiErr) && apiErr.StatusCode == 422 {
        // pick a cloud-compatible pack
    }
    return err
}

Prevention

When it happens

Trigger: UpdateSettingsHandler called with ModelPackName set to a built-in pack from shared.BuiltInModelPacksByName whose LocalProvider != "" while os.Getenv("IS_CLOUD") != "".

Common situations: Developer points a cloud-hosted Plandex deployment at a locally-configured pack (e.g. an Ollama pack) copied from a local setup; CLI sends a local pack name that worked against a self-hosted server.

Related errors


AI-assisted analysis of plandex-ai/plandex@e2d772072e (2026-09-05). Data as JSON: /api/errors/66734b9aac6c08c0. Report an issue: GitHub.