tirth8205/code-review-graph · error · ValueError

Embedding refresh refused: existing embeddings use {existing

Error message

Embedding refresh refused: existing embeddings use {existing}; requested provider resolves to {resolved_identity}.

What it means

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.

Source

Thrown at code_review_graph/embeddings.py:1388

        graph_store.db_path,
        provider=provider,
        model=model,
    )
    try:
        if not embedding_store.available or embedding_store.provider is None:
            raise RuntimeError(
                f"Embedding provider '{provider}' is unavailable in this environment.",
            )
        resolved_identity = embedding_store.provider.name
        if provider == "minimax":
            resolved_model = resolved_identity.partition(":")[2]
            if model != resolved_model:
                raise ValueError(
                    f"MiniMax refresh model must be '{resolved_model}', got '{model}'.",
                )
        if identities != {resolved_identity}:
            existing = ", ".join(sorted(identities))
            raise ValueError(
                "Embedding refresh refused: existing embeddings use "
                f"{existing}; requested provider resolves to {resolved_identity}.",
            )

        purged = embedding_store.purge_orphans()
        all_nodes: list[GraphNode] = []
        for file_path in graph_store.get_all_files():
            all_nodes.extend(graph_store.get_nodes_by_file(file_path))
        embedded = embedding_store.embed_nodes(all_nodes)
        return {"embedded": embedded, "purged": purged}
    finally:
        embedding_store.close()


def semantic_search(
    query: str,
    graph_store: GraphStore,
    embedding_store: EmbeddingStore,

View on GitHub (pinned to b58668751a)

Solutions

  1. Refresh with the exact existing identity (the error lists 'existing' vs 'resolved')
  2. If a genuine migration is intended, run an explicit full re-embed under the new provider/model
  3. Restore the env config (base URL, model) that was active when the index was built

Example fix

# before
export CRG_OPENAI_BASE_URL=https://api.openai.com/v1
refresh_embeddings(gs, provider='openai', model='text-embedding-3-small')  # rows were embedded via custom gateway
# after
export CRG_OPENAI_BASE_URL=https://gateway.example.com/v1  # match original identity
refresh_embeddings(gs, provider='openai', model='text-embedding-3-small')
Defensive patterns

Strategy: validation

Validate before calling

rows = gs._conn.execute("SELECT DISTINCT provider FROM embeddings").fetchall()
identities = {r["provider"] for r in rows}
if identities and identities != {expected_identity}:
    raise RuntimeError(f"index uses {identities}; refusing refresh")

Try / catch

try:
    refresh_embeddings(gs, provider=p, model=m)
except ValueError as e:
    if "existing embeddings use" in str(e):
        # intentional migration → full re-embed instead of refresh
        embed_graph(gs, provider=p, model=m)
    else:
        raise

Prevention

When it happens

Trigger: 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.

Common situations: Changing CRG_OPENAI_BASE_URL/model between embed and refresh, switching providers, or pointing at the same model via a different gateway URL.

Related errors


AI-assisted analysis of tirth8205/code-review-graph@b58668751a (2026-08-28). Data as JSON: /api/errors/705057436fb4dc74. Report an issue: GitHub.