The embedding dimension is machine-enforced as immutable for the life of a deployment. The embedding model is operator-owned as immutable by contract. The supported way to change either is:
Stand up a new deployment at the desired configuration.
Replay or re-embed your data into it out-of-band.
Cut traffic over to the new deployment.
The rest of this page explains why, and what the safety boundaries actually are.
On boot, both the API (src/main.py lifespan) and the deriver (src/deriver/__main__.py) run the validator in src/startup/embedding_validator.py. It does a schema-qualified pg_attribute lookup against documents.embedding and message_embeddings.embedding, decodes the declared atttypmod, and compares it to EMBEDDING_VECTOR_DIMENSIONS. A mismatch crashes the process with an actionable error before any HTTP route is served or any queue task is processed.There is no equivalent check for the model. The pgvector column does not record what model produced the vectors inside it, and this design intentionally avoids adding new persistent metadata fields. The runtime has no way to detect that you swapped text-embedding-3-small for a different model that emits the same dimension.That last point is a real footgun:
Changing EMBEDDING_MODEL_CONFIG__MODEL to a different model at the same dimension (for example text-embedding-3-small@1536 → text-embedding-3-large truncated to 1536) will silently succeed. New writes will use the new model; existing rows still hold vectors from the old model; recall quality will degrade with no startup or runtime warning.Treat model identity as a contract you own. If you need to change it, follow the destroy + rebuild path below.
Concretely, for either a dim change or a model change:
Provision the new deployment with the target environment.
# On the new deployment:export EMBEDDING_VECTOR_DIMENSIONS=768export EMBEDDING_MODEL_CONFIG__TRANSPORT=openaiexport EMBEDDING_MODEL_CONFIG__MODEL=nomic-embed-textexport EMBEDDING_MODEL_CONFIG__OVERRIDES__BASE_URL=http://your-ollama:11434/v1alembic upgrade headuv run python scripts/configure_embeddings.py --dry-runuv run python scripts/configure_embeddings.py --yes
Replay your source data (messages, documents, ingested content) into the new deployment via your normal application path. Honcho’s existing message-creation API will re-derive embeddings using the new configuration. There is no in-place re-embedding tool — that would be a separate spec covering atomicity, cost-per-token, and dialectic-during-migration semantics.
Cut over at your application layer (DNS, load balancer, feature flag — whatever you use). The old deployment can stay running until you are confident in the new one; this design does not require an atomic switch.
The startup validator on the new deployment will refuse to start if step 1’s configure_embeddings.py did not run, so a misconfiguration cannot quietly write wrong-dim vectors into the new schema.
If you are using text-embedding-3-large but truncating to 1536 (the default), be aware that EMBEDDING_MODEL_CONFIG__DIMENSIONS_MODE=auto will not forward dimensions= to the API — auto interprets the default as “operator did not opt into a non-default dim.” The provider will return native 3072, the response-dim validator will reject it, and the request will fail.For this case, either set EMBEDDING_VECTOR_DIMENSIONS=1536 explicitly (so auto knows the operator opted in), or set EMBEDDING_MODEL_CONFIG__DIMENSIONS_MODE=always.
Backend swap (turbopuffer ↔ lancedb ↔ qdrant ↔ chromadb ↔ pgvector) is a different operation
Switching the storage backend at constant dim/model — for example moving from pgvector to Turbopuffer — is supported via src/reconciler/sync_vectors.py and VECTOR_STORE_MIGRATED. That flow is unchanged by the embedding-pipeline work and is documented separately. It is not the destroy + rebuild path described above.Note for external backends that lock dimensionality lazily: Turbopuffer namespaces and ChromaDB collections fix their vector dimension on first write, not at creation. The startup validator samples existing namespaces best-effort; a fresh deployment with no namespaces yet passes validation and locks the dim on the first ingested message.Deleting every record from a ChromaDB collection does not reset its dimension. Honcho reads a fresh collection schema during validation so an empty collection with the old dimension still blocks startup after a dimension change. Recreate the collection as part of a dimension rebuild.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Honcho","colors":{"primary":"#66AAFF","light":"#86BCF2","dark":"#151E27"},"logo":{"light":"https://mintcdn.com/plasticlabs/Tnh_xfGaSgXYiKRy/logo/honcho-dark.svg?fit=max\u0026auto=format\u0026n=Tnh_xfGaSgXYiKRy\u0026q=85\u0026s=5ea9abc83421c35574fc8baf38d67172","dark":"https://mintcdn.com/plasticlabs/Tnh_xfGaSgXYiKRy/logo/honcho-light.svg?fit=max\u0026auto=format\u0026n=Tnh_xfGaSgXYiKRy\u0026q=85\u0026s=44f6093c094ec1438eddfa6d6cf6412a"},"favicon":"https://mintcdn.com/plasticlabs/Tnh_xfGaSgXYiKRy/favicon.svg?fit=max\u0026auto=format\u0026n=Tnh_xfGaSgXYiKRy\u0026q=85\u0026s=a064f4bc53a4deaf55fcf76d863005a7","api":{"openapi":["v3/openapi.json"]},"navbar":{"primary":{"type":"github","href":"https://github.com/plastic-labs/honcho"}},"footer":{"socials":{"twitter":"https://x.com/honchodotdev","github":"https://github.com/plastic-labs/honcho","discord":"https://discord.gg/honcho","linkedin":"https://www.linkedin.com/company/plasticlabs","youtube":"https://www.youtube.com/@plasticlabs"}},"integrations":{"gtm":{"tagId":"GTM-NSPT9PJF"}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"plasticlabs","hasAudioNarration":false,"actualSubdomain":"plasticlabs","customDomains":["honcho.dev"],"gitSource":{"type":"github","owner":"plastic-labs","repo":"honcho","deployBranch":"main","contentDirectory":"docs","isPrivate":false,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6aeba46b04977880e7f32544","collectionId":"281bcf45-d6e4-4bea-ac54-2d55028f18af","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6aeba46b04977880e7f32544"},"feedback":{"issues":true,"edits":true,"thumbs":true,"agentFeedback":true},"entitlements":{},"buildId":"6aed07854e65e47d17b8fc7e","clientVersion":"0.0.4076","searchFilterCounts":[{"language":"default","tag":"API Reference","count":57},{"language":"default","tag":"Documentation","count":30},{"language":"default","tag":"Integrations","count":26},{"language":"default","tag":"Features","count":19},{"language":"default","tag":"Advanced","count":16},{"language":"default","tag":"sessions","count":14},{"language":"default","tag":"peers","count":10},{"language":"default","tag":"workspaces","count":8},{"language":"default","tag":"scopes","count":7},{"language":"default","tag":"Coding Agents","count":7}]},"assistantConfig":{},"basePath":"/docs","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"comment-mode","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"style.css","content":".dark img[src^=\"https://cdn.jsdelivr.net/\"]{filter:invert(1)}"}],"page":{"pagePath":"v3/contributing/changing-embeddings","slug":"/v3/contributing/changing-embeddings","pageMetadata":{"title":"Changing Embeddings","description":"How to switch embedding dimension or model on a Honcho deployment","icon":"rotate","href":"/v3/contributing/changing-embeddings"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"How to switch embedding dimension or model on a Honcho deployment\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,Heading,Warning}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsx(Heading,{level:`2`,id:`short-answer-you-can’t-in-place`,children:`Short answer: you can’t, in place.`}),`\n`,_jsxs(_components.p,{children:[`The embedding dimension is `,_jsx(_components.strong,{children:`machine-enforced`}),` as immutable for the life of a deployment. The embedding model is `,_jsx(_components.strong,{children:`operator-owned`}),` as immutable by contract. The supported way to change either is:`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Stand up a new deployment at the desired configuration.`}),`\n`,_jsx(_components.li,{children:`Replay or re-embed your data into it out-of-band.`}),`\n`,_jsx(_components.li,{children:`Cut traffic over to the new deployment.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`The rest of this page explains why, and what the safety boundaries actually are.`}),`\n`,_jsx(Heading,{level:`2`,id:`why-dimension-is-enforced-and-model-is-not`,children:`Why dimension is enforced and model is not`}),`\n`,_jsxs(_components.p,{children:[`On boot, both the API (`,_jsx(_components.code,{children:`src/main.py`}),` lifespan) and the deriver (`,_jsx(_components.code,{children:`src/deriver/__main__.py`}),`) run the validator in `,_jsx(_components.code,{children:`src/startup/embedding_validator.py`}),`. It does a schema-qualified `,_jsx(_components.code,{children:`pg_attribute`}),` lookup against `,_jsx(_components.code,{children:`documents.embedding`}),` and `,_jsx(_components.code,{children:`message_embeddings.embedding`}),`, decodes the declared `,_jsx(_components.code,{children:`atttypmod`}),`, and compares it to `,_jsx(_components.code,{children:`EMBEDDING_VECTOR_DIMENSIONS`}),`. A mismatch crashes the process with an actionable error before any HTTP route is served or any queue task is processed.`]}),`\n`,_jsxs(_components.p,{children:[`There is no equivalent check for the model. The pgvector column does not record what model produced the vectors inside it, and this design intentionally avoids adding new persistent metadata fields. The runtime has no way to detect that you swapped `,_jsx(_components.code,{children:`text-embedding-3-small`}),` for a different model that emits the same dimension.`]}),`\n`,_jsx(_components.p,{children:`That last point is a real footgun:`}),`\n`,_jsxs(Warning,{children:[_jsxs(_components.p,{children:[`Changing `,_jsx(_components.code,{children:`EMBEDDING_MODEL_CONFIG__MODEL`}),` to a different model at the `,_jsx(_components.strong,{children:`same dimension`}),` (for example `,_jsx(_components.code,{children:`text-embedding-3-small@1536`}),` → `,_jsx(_components.code,{children:`text-embedding-3-large`}),` truncated to 1536) will silently succeed. New writes will use the new model; existing rows still hold vectors from the old model; recall quality will degrade with no startup or runtime warning.`]}),_jsx(_components.p,{children:`Treat model identity as a contract you own. If you need to change it, follow the destroy + rebuild path below.`})]}),`\n`,_jsx(Heading,{level:`2`,id:`recipe-changing-dim-or-model`,children:`Recipe: changing dim or model`}),`\n`,_jsx(_components.p,{children:`Concretely, for either a dim change or a model change:`}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Provision the new deployment`}),` with the target environment.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`8`,language:`shellscript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`shellscript`,children:_jsxs(_components.code,{language:`shellscript`,numberOfLines:`8`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:`# On the new deployment:`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` EMBEDDING_VECTOR_DIMENSIONS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`768`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` EMBEDDING_MODEL_CONFIG__TRANSPORT`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`openai`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` EMBEDDING_MODEL_CONFIG__MODEL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`nomic-embed-text`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`export`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` EMBEDDING_MODEL_CONFIG__OVERRIDES__BASE_URL`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`http`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`://`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`your-ollama`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`11434`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`/`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`v1`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`alembic`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` upgrade`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` head`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`uv`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` python`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` scripts/configure_embeddings.py`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --dry-run`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#DCDCAA`},children:`uv`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` run`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` python`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` scripts/configure_embeddings.py`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` --yes`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Replay your source data`}),` (messages, documents, ingested content) into the new deployment via your normal application path. Honcho’s existing message-creation API will re-derive embeddings using the new configuration. There is no in-place re-embedding tool — that would be a separate spec covering atomicity, cost-per-token, and dialectic-during-migration semantics.`]}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Cut over`}),` at your application layer (DNS, load balancer, feature flag — whatever you use). The old deployment can stay running until you are confident in the new one; this design does not require an atomic switch.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`The startup validator on the new deployment will refuse to start if step 1’s `,_jsx(_components.code,{children:`configure_embeddings.py`}),` did not run, so a misconfiguration cannot quietly write wrong-dim vectors into the new schema.`]}),`\n`,_jsx(Heading,{level:`2`,id:`edge-case-truncation-at-the-default-dimension`,children:`Edge case: truncation at the default dimension`}),`\n`,_jsxs(_components.p,{children:[`If you are using `,_jsx(_components.code,{children:`text-embedding-3-large`}),` but truncating to 1536 (the default), be aware that `,_jsx(_components.code,{children:`EMBEDDING_MODEL_CONFIG__DIMENSIONS_MODE=auto`}),` will `,_jsx(_components.strong,{children:`not`}),` forward `,_jsx(_components.code,{children:`dimensions=`}),` to the API — `,_jsx(_components.code,{children:`auto`}),` interprets the default as “operator did not opt into a non-default dim.” The provider will return native 3072, the response-dim validator will reject it, and the request will fail.`]}),`\n`,_jsxs(_components.p,{children:[`For this case, either set `,_jsx(_components.code,{children:`EMBEDDING_VECTOR_DIMENSIONS=1536`}),` explicitly (so `,_jsx(_components.code,{children:`auto`}),` knows the operator opted in), or set `,_jsx(_components.code,{children:`EMBEDDING_MODEL_CONFIG__DIMENSIONS_MODE=always`}),`.`]}),`\n`,_jsx(Heading,{level:`2`,id:`backend-swap-turbopuffer--lancedb--qdrant--chromadb--pgvector-is-a-different-operation`,children:`Backend swap (turbopuffer ↔ lancedb ↔ qdrant ↔ chromadb ↔ pgvector) is a different operation`}),`\n`,_jsxs(_components.p,{children:[`Switching the `,_jsx(_components.em,{children:`storage backend`}),` at constant dim/model — for example moving from pgvector to Turbopuffer — is supported via `,_jsx(_components.code,{children:`src/reconciler/sync_vectors.py`}),` and `,_jsx(_components.code,{children:`VECTOR_STORE_MIGRATED`}),`. That flow is unchanged by the embedding-pipeline work and is documented separately. It is `,_jsx(_components.strong,{children:`not`}),` the destroy + rebuild path described above.`]}),`\n`,_jsx(_components.p,{children:`Note for external backends that lock dimensionality lazily: Turbopuffer namespaces and ChromaDB collections fix their vector dimension on first write, not at creation. The startup validator samples existing namespaces best-effort; a fresh deployment with no namespaces yet passes validation and locks the dim on the first ingested message.`}),`\n`,_jsx(_components.p,{children:`Deleting every record from a ChromaDB collection does not reset its dimension. Honcho reads a fresh collection schema during validation so an empty collection with the old dimension still blocks startup after a dimension change. Recreate the collection as part of a dimension rebuild.`})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Changing Embeddings","description":"How to switch embedding dimension or model on a Honcho deployment","icon":"rotate","href":"/v3/contributing/changing-embeddings"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Short answer: you can’t, in place.","slug":"short-answer-you-can’t-in-place","depth":2,"children":[]},{"title":"Why dimension is enforced and model is not","slug":"why-dimension-is-enforced-and-model-is-not","depth":2,"children":[]},{"title":"Recipe: changing dim or model","slug":"recipe-changing-dim-or-model","depth":2,"children":[]},{"title":"Edge case: truncation at the default dimension","slug":"edge-case-truncation-at-the-default-dimension","depth":2,"children":[]},{"title":"Backend swap (turbopuffer ↔ lancedb ↔ qdrant ↔ chromadb ↔ pgvector) is a different operation","slug":"backend-swap-turbopuffer--lancedb--qdrant--chromadb--pgvector-is-a-different-operation","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/plasticlabs/7b27419a986dcdea/posthog-consent.js"],"subdomain":"plasticlabs","siteName":"Honcho","title":"Changing Embeddings - Honcho","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-30T18:39:11.008Z","originalFileLocation":"v3/contributing/changing-embeddings.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"How to switch embedding dimension or model on a Honcho deployment\">\u003cmeta data-mint-head name=\"application-name\" content=\"Honcho\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Changing Embeddings - Honcho\">\u003cmeta data-mint-head property=\"og:description\" content=\"How to switch embedding dimension or model on a Honcho deployment\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Honcho\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://honcho.dev/docs/v3/contributing/changing-embeddings\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://plasticlabs.mintlify.site/docs/_mintlify/api/og/v2?division=Self-Hosting\u0026amp;title=Changing+Embeddings\u0026amp;description=How+to+switch+embedding+dimension+or+model+on+a+Honcho+deployment\u0026amp;theme=f6a7151d44163e9cebee0751\u0026amp;signature=07a8300b36008b52f219d75080cadc9923b9d50af9b21695c79bdf93b273101a\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Changing Embeddings - Honcho\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"How to switch embedding dimension or model on a Honcho deployment\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://plasticlabs.mintlify.site/docs/_mintlify/api/og/v2?division=Self-Hosting\u0026amp;title=Changing+Embeddings\u0026amp;description=How+to+switch+embedding+dimension+or+model+on+a+Honcho+deployment\u0026amp;theme=f6a7151d44163e9cebee0751\u0026amp;signature=07a8300b36008b52f219d75080cadc9923b9d50af9b21695c79bdf93b273101a\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/plasticlabs/poYIg0pscrQ64eaT/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Honcho\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#66AAFF\">\u003clink data-mint-head rel=\"canonical\" href=\"https://honcho.dev/docs/v3/contributing/changing-embeddings\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/v3/contributing/changing-embeddings.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://honcho.dev/#organization\",\"name\":\"Honcho\",\"url\":\"https://honcho.dev\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/plasticlabs/Tnh_xfGaSgXYiKRy/logo/honcho-dark.svg?fit=max\u0026auto=format\u0026n=Tnh_xfGaSgXYiKRy\u0026q=85\u0026s=5ea9abc83421c35574fc8baf38d67172\"}},{\"@type\":\"WebSite\",\"@id\":\"https://honcho.dev/docs#website\",\"name\":\"Honcho\",\"url\":\"https://honcho.dev/docs\",\"publisher\":{\"@id\":\"https://honcho.dev/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://honcho.dev/docs/v3/contributing/changing-embeddings#webpage\",\"url\":\"https://honcho.dev/docs/v3/contributing/changing-embeddings\",\"name\":\"Changing Embeddings\",\"description\":\"How to switch embedding dimension or model on a Honcho deployment\",\"dateModified\":\"2026-09-30T18:39:11.008Z\",\"isPartOf\":{\"@id\":\"https://honcho.dev/docs#website\"},\"breadcrumb\":{\"@id\":\"https://honcho.dev/docs/v3/contributing/changing-embeddings#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://honcho.dev/docs/v3/contributing/changing-embeddings#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Self-Hosting\",\"item\":\"https://honcho.dev/docs/v3/contributing/self-hosting\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Changing Embeddings\",\"item\":\"https://honcho.dev/docs/v3/contributing/changing-embeddings\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://honcho.dev/docs/v3/contributing/changing-embeddings#article\",\"headline\":\"Changing Embeddings\",\"name\":\"Changing Embeddings\",\"description\":\"How to switch embedding dimension or model on a Honcho deployment\",\"url\":\"https://honcho.dev/docs/v3/contributing/changing-embeddings\",\"mainEntityOfPage\":{\"@id\":\"https://honcho.dev/docs/v3/contributing/changing-embeddings#webpage\"},\"dateModified\":\"2026-09-30T18:39:11.008Z\",\"publisher\":{\"@id\":\"https://honcho.dev/#organization\"},\"isPartOf\":{\"@id\":\"https://honcho.dev/docs#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Honcho\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Honcho","nav":{"global":null,"tabs":[{"tab":"Documentation","pages":[{"title":"Documentation","href":"/v3/documentation/introduction/overview"}]},{"tab":"Integrations","pages":[{"title":"Integrations","href":"/v3/guides/overview"}]},{"tab":"Open Source","groups":[{"group":"Self-Hosting","pages":[{"title":"Local Environment Setup","sidebarTitle":"Local Environment","icon":"computer","href":"/v3/contributing/self-hosting"},{"title":"Configuration Guide","description":"Complete reference for configuring Honcho providers, features, and infrastructure","icon":"gear","href":"/v3/contributing/configuration"},{"title":"Changing Embeddings","icon":"rotate","href":"/v3/contributing/changing-embeddings"},{"title":"Troubleshooting","sidebarTitle":"Troubleshooting","description":"Common issues and solutions when self-hosting Honcho","icon":"wrench","href":"/v3/contributing/troubleshooting"}]},{"group":"Contributing","pages":[{"title":"Contributing Guidelines","icon":"handshake","href":"/v3/contributing/guidelines"},{"title":"License","icon":"scroll","href":"/v3/contributing/license"}]}]},{"tab":"API Reference","pages":[{"title":"API Reference","href":"/v3/api-reference/introduction"}]},{"tab":"Changelog","pages":[{"title":"Changelog","href":"/changelog/introduction"}]}]},"basePath":"","title":"Changing Embeddings - Honcho","buildId":"dpl_ATnXPMW25DMPUr9VBw6kL6MfBt6T","deploymentId":"dpl_ATnXPMW25DMPUr9VBw6kL6MfBt6T","dynamics":[],"chunks":[]}