{"record":{"id":"fefddf1f530cbee8","repo":"tirth8205/code-review-graph","slug":"unknown-embedding-provider-name-valid-local","errorCode":null,"errorMessage":"Unknown embedding provider '{name}'. Valid: local, openai, google, minimax, voyage","messagePattern":"Unknown embedding provider '(.+?)'\\. Valid: local, openai, google, minimax, voyage","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"code_review_graph/embeddings.py","lineNumber":906,"sourceCode":"                  CRG_OPENAI_API_KEY + CRG_OPENAI_BASE_URL + CRG_OPENAI_MODEL\n                  env vars (or the ``model`` arg). The egress warning is\n                  skipped when the base URL points to localhost.\n                  Cloud providers emit a one-time stderr warning before use\n                  unless ``CRG_ACCEPT_CLOUD_EMBEDDINGS=1`` is set. See: #174\n        model: Model name/path to use. For local provider this is any\n               sentence-transformers compatible model. Falls back to\n               CRG_EMBEDDING_MODEL env var, then to all-MiniLM-L6-v2.\n               For Google provider this is a Gemini model ID.\n               For OpenAI provider this overrides CRG_OPENAI_MODEL.\n               For Voyage provider this overrides CRG_VOYAGE_MODEL.\n\n    Raises:\n        ValueError: If the provider name is not one of the known providers,\n                    or if required environment variables are missing.\n    \"\"\"\n    name = provider.strip().lower() if provider else \"\"\n    if name and name not in _VALID_PROVIDERS:\n        raise ValueError(\n            f\"Unknown embedding provider '{name}'. \"\n            \"Valid: local, openai, google, minimax, voyage\"\n        )\n\n    # When no explicit provider is given but OpenAI-compatible env vars are\n    # configured, default to the openai provider so MCP tool calls that omit\n    # the optional `provider` parameter still use the configured backend\n    # (#551).\n    if (\n        provider is None\n        and os.environ.get(\"CRG_OPENAI_API_KEY\")\n        and os.environ.get(\"CRG_OPENAI_BASE_URL\")\n    ):\n        name = \"openai\"\n\n    if name == \"openai\":\n        api_key = os.environ.get(\"CRG_OPENAI_API_KEY\")\n        base_url = os.environ.get(\"CRG_OPENAI_BASE_URL\")","sourceCodeStart":888,"sourceCodeEnd":924,"githubUrl":"https://github.com/tirth8205/code-review-graph/blob/b58668751ab0c7670c078cf7cbd4d1f5b8e54f81/code_review_graph/embeddings.py#L888-L924","documentation":"get_provider() validates the provider name against a fixed allowlist (local, openai, google, minimax, voyage) after lowercasing/trimming. Any other non-empty name raises before any provider is constructed.","triggerScenarios":"Passing provider='azure' or similar to get_provider()/EmbeddingStore, or a CRG_EMBEDDING_PROVIDER env var with a typo like 'openai ' (whitespace is trimmed, but 'opennai' fails).","commonSituations":"Assuming an arbitrary OpenAI-compatible vendor name is accepted, typos in env config, or expecting an old provider name after a rename.","solutions":["Set provider to one of: local, openai, google, minimax, voyage","For OpenAI-compatible endpoints, use provider='openai' with CRG_OPENAI_BASE_URL pointing at the vendor","Fix typos/whitespace in CRG_EMBEDDING_PROVIDER","Check _VALID_PROVIDERS in the installed version if names changed"],"exampleFix":"# before\nprovider=\"azure\"\n# after\nprovider=\"openai\"  # + CRG_OPENAI_BASE_URL=https://your-endpoint/v1","handlingStrategy":"validation","validationCode":"VALID = {\"local\", \"openai\", \"google\", \"minimax\", \"voyage\"}\nname = (provider or \"\").strip().lower()\nif name and name not in VALID:\n    raise ValueError(f\"unsupported provider {name!r}; pick from {sorted(VALID)}\")","typeGuard":"def is_valid_provider(name: str) -> bool:\n    return (name or \"\").strip().lower() in {\"local\", \"openai\", \"google\", \"minimax\", \"voyage\"}","tryCatchPattern":"try:\n    store = get_provider(provider)\nexcept ValueError as e:\n    if \"Unknown embedding provider\" in str(e):\n        # fall back to local embeddings\n        store = get_provider(\"local\")\n    else:\n        raise","preventionTips":["Centralize provider selection in one configvalidated spot","For OpenAI-compatible vendors use 'openai' + CRG_OPENAI_BASE_URL, never the vendor name","Fail fast on unknown provider in CLI arg parsing"],"tags":["config","provider","validation","env-var"],"backgroundTag":"invalid-configuration-value","analyzedSha":"b58668751ab0c7670c078cf7cbd4d1f5b8e54f81","analyzedAt":"2026-08-28T13:19:08.966Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}