{"record":{"id":"705057436fb4dc74","repo":"tirth8205/code-review-graph","slug":"embedding-refresh-refused-existing-embeddings-use","errorCode":null,"errorMessage":"Embedding refresh refused: existing embeddings use {existing}; requested provider resolves to {resolved_identity}.","messagePattern":"Embedding refresh refused: existing embeddings use (.+?); requested provider resolves to (.+?)\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"code_review_graph/embeddings.py","lineNumber":1388,"sourceCode":"        graph_store.db_path,\n        provider=provider,\n        model=model,\n    )\n    try:\n        if not embedding_store.available or embedding_store.provider is None:\n            raise RuntimeError(\n                f\"Embedding provider '{provider}' is unavailable in this environment.\",\n            )\n        resolved_identity = embedding_store.provider.name\n        if provider == \"minimax\":\n            resolved_model = resolved_identity.partition(\":\")[2]\n            if model != resolved_model:\n                raise ValueError(\n                    f\"MiniMax refresh model must be '{resolved_model}', got '{model}'.\",\n                )\n        if identities != {resolved_identity}:\n            existing = \", \".join(sorted(identities))\n            raise ValueError(\n                \"Embedding refresh refused: existing embeddings use \"\n                f\"{existing}; requested provider resolves to {resolved_identity}.\",\n            )\n\n        purged = embedding_store.purge_orphans()\n        all_nodes: list[GraphNode] = []\n        for file_path in graph_store.get_all_files():\n            all_nodes.extend(graph_store.get_nodes_by_file(file_path))\n        embedded = embedding_store.embed_nodes(all_nodes)\n        return {\"embedded\": embedded, \"purged\": purged}\n    finally:\n        embedding_store.close()\n\n\ndef semantic_search(\n    query: str,\n    graph_store: GraphStore,\n    embedding_store: EmbeddingStore,","sourceCodeStart":1370,"sourceCodeEnd":1406,"githubUrl":"https://github.com/tirth8205/code-review-graph/blob/b58668751ab0c7670c078cf7cbd4d1f5b8e54f81/code_review_graph/embeddings.py#L1370-L1406","documentation":"refresh refuses when the set of provider identities stored in the embeddings table differs from what the requested provider resolves to (including endpoint for OpenAI-compatible setups). This prevents mixing vectors from different models/endpoints in one index.","triggerScenarios":"Calling refresh_embeddings(provider=P, model=M) when existing rows were written under a different identity — e.g. rows say 'openai:https://old/v1:text-embedding-3-small' but the request resolves to 'openai:https://new/v1:...' or a different provider entirely.","commonSituations":"Changing CRG_OPENAI_BASE_URL/model between embed and refresh, switching providers, or pointing at the same model via a different gateway URL.","solutions":["Refresh with the exact existing identity (the error lists 'existing' vs 'resolved')","If a genuine migration is intended, run an explicit full re-embed under the new provider/model","Restore the env config (base URL, model) that was active when the index was built"],"exampleFix":"# before\nexport CRG_OPENAI_BASE_URL=https://api.openai.com/v1\nrefresh_embeddings(gs, provider='openai', model='text-embedding-3-small')  # rows were embedded via custom gateway\n# after\nexport CRG_OPENAI_BASE_URL=https://gateway.example.com/v1  # match original identity\nrefresh_embeddings(gs, provider='openai', model='text-embedding-3-small')","handlingStrategy":"validation","validationCode":"rows = gs._conn.execute(\"SELECT DISTINCT provider FROM embeddings\").fetchall()\nidentities = {r[\"provider\"] for r in rows}\nif identities and identities != {expected_identity}:\n    raise RuntimeError(f\"index uses {identities}; refusing refresh\")","typeGuard":null,"tryCatchPattern":"try:\n    refresh_embeddings(gs, provider=p, model=m)\nexcept ValueError as e:\n    if \"existing embeddings use\" in str(e):\n        # intentional migration → full re-embed instead of refresh\n        embed_graph(gs, provider=p, model=m)\n    else:\n        raise","preventionTips":["Freeze provider/base-url/model config between embed and refresh","Store the embed-time identity in your pipeline metadata","Treat identity mismatch as a signal to re-embed, never to force refresh"],"tags":["embeddings","refresh","identity-mismatch","data-integrity"],"backgroundTag":"model-version-mismatch","analyzedSha":"b58668751ab0c7670c078cf7cbd4d1f5b8e54f81","analyzedAt":"2026-08-28T13:19:08.966Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}