Symptom
Users upgrading past bfc8e07 (and fresh installs that don't set HIVEMIND_EMBEDDINGS=true) get embeddings persistently disabled on first SDK call. ~/.deeplake/config.json ends up with {embeddings: {enabled: false}} forever — until the user explicitly runs hivemind embeddings install (which writes enabled: true).
Root cause
src/user-config.ts:67 documents the migration rule as:
HIVEMIND_EMBEDDINGS=false OR unset → enabled: false
HIVEMIND_EMBEDDINGS=true (or any other truthy) → enabled: true
And migrationValueFromEnv() at line 96 implements that literally:
if (raw === undefined) return false;
So on first call to getEmbeddingsEnabled() (no config yet, env var unset), it returns false and persists that to disk. The decision becomes sticky.
Impact
Suggested fix
Per CodeRabbit on #182:
function migrationValueFromEnv() {
const raw = process.env.HIVEMIND_EMBEDDINGS;
- if (raw === undefined) return false;
+ if (raw === undefined) return undefined;
if (raw === "false") return false;
return true;
}
And update getEmbeddingsEnabled() to treat undefined from migration as "default true" (no opt-out signal present).
Why not in PR #182
#182's scope is the user-visible banner removal. Changing the migration default touches Emanuele's intentional design rule (bfc8e07) — needs his judgment call on opt-in vs opt-out.
Related
Symptom
Users upgrading past
bfc8e07(and fresh installs that don't setHIVEMIND_EMBEDDINGS=true) get embeddings persistently disabled on first SDK call.~/.deeplake/config.jsonends up with{embeddings: {enabled: false}}forever — until the user explicitly runshivemind embeddings install(which writesenabled: true).Root cause
src/user-config.ts:67documents the migration rule as:And
migrationValueFromEnv()at line 96 implements that literally:So on first call to
getEmbeddingsEnabled()(no config yet, env var unset), it returnsfalseand persists that to disk. The decision becomes sticky.Impact
Suggested fix
Per CodeRabbit on #182:
function migrationValueFromEnv() { const raw = process.env.HIVEMIND_EMBEDDINGS; - if (raw === undefined) return false; + if (raw === undefined) return undefined; if (raw === "false") return false; return true; }And update
getEmbeddingsEnabled()to treatundefinedfrom migration as "default true" (no opt-out signal present).Why not in PR #182
#182's scope is the user-visible banner removal. Changing the migration default touches Emanuele's intentional design rule (
bfc8e07) — needs his judgment call on opt-in vs opt-out.Related
bfc8e07(feat(embeddings): hello handshake + stuck-daemon recycle + visible signal) — where the rule was introduced