{"record":{"id":"516c2027500d3f35","repo":"langchain-ai/deepagents","slug":"a-different-cli-provider-is-already-installed-for","errorCode":null,"errorMessage":"a different CLI provider is already installed for this process","messagePattern":"a different CLI provider is already installed for this process","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"libs/code/deepagents_code/configuration/resolver.py","lineNumber":561,"sourceCode":"            provider would misreport every flag the other one carries.\n    \"\"\"\n    from deepagents_code.configuration.providers import TomlFileProvider\n    from deepagents_code.configuration.service import get_managed_snapshot\n    from deepagents_code.model_config import DEFAULT_CONFIG_PATH\n\n    if managed_snapshot is not None:\n        managed = managed_snapshot\n    elif refresh_managed:\n        managed = _reload_enforceable_managed_snapshot()\n    else:\n        managed = get_managed_snapshot()\n    key = _ResolverKey(DEFAULT_CONFIG_PATH, managed.status.path)\n    with _resolver_cache_lock:\n        installed_cli = _resolver_cache.cli_provider\n        if cli_provider is not None:\n            if installed_cli is not None and installed_cli != cli_provider:\n                msg = \"a different CLI provider is already installed for this process\"\n                raise ValueError(msg)\n            _resolver_cache.cli_provider = cli_provider\n            installed_cli = cli_provider\n        entry = _resolver_cache.entry\n        if (\n            entry is None\n            or entry[0] != key\n            or (\n                cli_provider is not None\n                and CLI_RANK not in entry[1].provider_statuses()\n            )\n        ):\n            user_provider = TomlFileProvider(\n                name=\"config.toml\", path=DEFAULT_CONFIG_PATH\n            )\n            user = user_provider.load()\n            resolver = resolver_from_snapshots(\n                managed=managed,\n                user=user,","sourceCodeStart":543,"sourceCodeEnd":579,"githubUrl":"https://github.com/langchain-ai/deepagents/blob/a1af029e6e73cb17c36bff823d227747b28e91e1/libs/code/deepagents_code/configuration/resolver.py#L543-L579","documentation":"get_config_resolver keeps one CLI-tier provider per process in the shared resolver cache. Passing a `cli_provider` that differs from the one already installed raises ValueError: one argv must map to one CLI tier, and silently keeping either provider would misreport the flags the other carries.","triggerScenarios":"Calling `get_config_resolver(cli_provider=A)` after a previous call in the same process installed `cli_provider=B` (A != B) — e.g. re-parsing arguments mid-process and rebuilding a different argparse provider, or test code swapping CLI providers without resetting the `_resolver_cache`.","commonSituations":"Re-running argument parsing twice with different flags in one process (scripts embedding dcode internals); unit tests leaking a cached CLI provider between cases because they didn't reset the module-level cache; programmatic overrides layered on top of real argv.","solutions":["Reuse the same CLI provider instance for all get_config_resolver calls in the process.","Reset the resolver cache (the module's `_resolver_cache`) between logically distinct phases, e.g. in test setup/teardown.","If flags genuinely changed, restart the process or build a fresh resolver instead of the shared cached one."],"exampleFix":"// before (test)\nget_config_resolver(cli_provider=provider_a)\nget_config_resolver(cli_provider=provider_b)  # ValueError\n// after: reset the shared cache between phases\nreset_resolver_cache()  # or fixture that clears _resolver_cache\nget_config_resolver(cli_provider=provider_b)","handlingStrategy":"validation","validationCode":"def cli_provider_matches_cached(cached_cli, new_cli) -> bool:\n    return cached_cli is None or cached_cli == new_cli\n\nassert cli_provider_matches_cached(_resolver_cache.cli_provider, cli_provider), (\n    \"Process already installed a different CLI provider; reset the cache or reuse it.\"\n)","typeGuard":null,"tryCatchPattern":"try:\n    resolver = get_config_resolver(cli_provider=new_cli)\nexcept ValueError as exc:\n    if \"different CLI provider\" in str(exc):\n        reset_resolver_cache()  # e.g. between test phases / re-parse\n        resolver = get_config_resolver(cli_provider=new_cli)\n    else:\n        raise","preventionTips":["Parse CLI arguments once per process and reuse the resulting provider for all resolver lookups.","Reset the module-level `_resolver_cache` in test setup/teardown when swapping CLI providers.","Never rebuild an argparse-derived CLI provider mid-process with different flags."],"tags":["configuration","resolver","cli","process-state","caching"],"backgroundTag":"duplicate-registration-conflict","analyzedSha":"a1af029e6e73cb17c36bff823d227747b28e91e1","analyzedAt":"2026-08-29T11:43:24.718Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}