{"record":{"id":"064503d854b0bc5f","repo":"chroma-core/chroma","slug":"missing-api-key-env-var-or-api-base-in-configu","errorCode":null,"errorMessage":"Missing 'api_key_env_var' or 'api_base' in configuration for BasetenEmbeddingFunction.","messagePattern":"Missing 'api_key_env_var' or 'api_base' in configuration for BasetenEmbeddingFunction\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"chromadb/utils/embedding_functions/baseten_embedding_function.py","lineNumber":87,"sourceCode":"    def get_config(self) -> Dict[str, Any]:\n        return {\"api_base\": self.api_base, \"api_key_env_var\": self.api_key_env_var}\n\n    @staticmethod\n    def build_from_config(config: Dict[str, Any]) -> \"BasetenEmbeddingFunction\":\n        \"\"\"\n        Build the BasetenEmbeddingFunction from a configuration dictionary.\n\n        Args:\n            config (Dict[str, Any]): A dictionary containing the configuration parameters.\n                                     Expected keys: 'api_key', 'api_base', 'api_key_env_var'.\n\n        Returns:\n            BasetenEmbeddingFunction: An instance of BasetenEmbeddingFunction.\n        \"\"\"\n        api_key_env_var = config.get(\"api_key_env_var\")\n        api_base = config.get(\"api_base\")\n        if api_key_env_var is None or api_base is None:\n            raise ValueError(\n                \"Missing 'api_key_env_var' or 'api_base' in configuration for BasetenEmbeddingFunction.\"\n            )\n\n        # Note: We rely on the __init__ method to handle potential missing api_key\n        # by checking the environment variable if the config value is None.\n        # However, api_base must be present either in config or have a default.\n        if api_base is None:\n            raise ValueError(\n                \"Missing 'api_base' in configuration for BasetenEmbeddingFunction.\"\n            )\n\n        return BasetenEmbeddingFunction(\n            api_key=None,  # Pass None if not in config, __init__ will check env var\n            api_base=api_base,\n            api_key_env_var=api_key_env_var,\n        )\n\n    @staticmethod","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/chroma-core/chroma/blob/aecdd12c8a891610db8653630b066b32ceb678b5/chromadb/utils/embedding_functions/baseten_embedding_function.py#L69-L105","documentation":"When a \"baseten\" embedding function is rebuilt from a persisted config, build_from_config requires both the \"api_key_env_var\" and \"api_base\" keys to be present (non-None); if either is missing it raises this ValueError naming both. Note that ef.get_config() always returns both keys, so a faithful round-trip never fails — the error indicates a hand-written, edited, or schema-drifted config dict.","triggerScenarios":"config_to_embedding_function({\"name\": \"baseten\", \"config\": {\"api_base\": \"...\"}}) with api_key_env_var absent (or vice versa); configs from older versions or external stores missing the key.","commonSituations":"Hand-assembled config dicts; JSON configs edited by hand where one key was dropped; migrating persisted collection metadata between systems that trimmed fields.","solutions":["Always generate the config via ef.get_config() and re-attach the name — it emits exactly the keys build_from_config expects.","If hand-writing, include both: {\"name\": \"baseten\", \"config\": {\"api_base\": \"https://...\", \"api_key_env_var\": \"CHROMA_BASETEN_API_KEY\"}}.","Validate the two required keys before calling and raise your own descriptive error."],"exampleFix":"# before: ValueError \"Missing 'api_key_env_var' or 'api_base' in configuration for BasetenEmbeddingFunction.\"\nef = config_to_embedding_function({\"name\": \"baseten\", \"config\": {\"api_base\": \"https://app.baseten.co/...\"}})\n\n# after\nef = config_to_embedding_function({\n    \"name\": \"baseten\",\n    \"config\": {\"api_base\": \"https://app.baseten.co/...\", \"api_key_env_var\": \"CHROMA_BASETEN_API_KEY\"},\n})","handlingStrategy":"validation","validationCode":"REQUIRED = {\"api_key_env_var\", \"api_base\"}\n\ndef validate_baseten_config(cfg: dict) -> None:\n    missing = REQUIRED - set(cfg)\n    if missing:\n        raise ValueError(f\"baseten config missing required keys: {sorted(missing)}\")\n\nvalidate_baseten_config(inner_cfg)\nef = config_to_embedding_function({\"name\": \"baseten\", \"config\": inner_cfg})","typeGuard":"def is_complete_baseten_config(cfg: object) -> bool:\n    return (\n        isinstance(cfg, dict)\n        and isinstance(cfg.get(\"api_base\"), str)\n        and isinstance(cfg.get(\"api_key_env_var\"), str)\n    )","tryCatchPattern":"from chromadb.utils.embedding_functions import config_to_embedding_function\ntry:\n    ef = config_to_embedding_function(cfg)\nexcept ValueError as e:\n    if \"Missing 'api_key_env_var' or 'api_base'\" in str(e):\n        cfg.setdefault(\"config\", {}).setdefault(\"api_key_env_var\", \"CHROMA_BASETEN_API_KEY\")\n        ef = config_to_embedding_function(cfg)  # api_base still required from real config\n    else:\n        raise","preventionTips":["Round-trip configs through ef.get_config() instead of authoring them by hand.","Validate required keys at the boundary where configs enter your system (API payload, job queue).","Add contract tests that build_from_config accepts everything get_config emits."],"tags":["python","baseten","config","deserialization","required-fields","chromadb"],"backgroundTag":"missing-config-field","analyzedSha":"aecdd12c8a891610db8653630b066b32ceb678b5","analyzedAt":"2026-08-16T21:53:27.228Z","schemaVersion":2},"datasetVersion":"2026-08-16T23:17:17.608Z"}