132132 "olivya" : [], # httpx REST only (lfx core)
133133 "agentql" : [], # httpx REST only (lfx core)
134134 # --- tranche 7: google family + agent SDKs (markers preserved from base) ---
135- # google-auth-oauthlib: imported directly by the google_oauth_token component
136- # (from google_auth_oauthlib.flow import InstalledAppFlow). langchain-google-community
137- # only pulls it behind its [gmail,drive,calendar] extras, so declare it explicitly.
138- "google" : [
139- "langchain-google-genai~=4.1.2" ,
140- "langchain-google-community~=3.0.2" ,
141- "google-api-python-client~=2.161" ,
142- "google-auth-oauthlib>=1.2.0,<2.0.0" ,
143- ],
135+ # "google" graduated to the standalone lfx-google bundle so Gemini is
136+ # available in every default Langflow install.
144137 "vertexai" : ["langchain-google-vertexai>=3.2.0" ],
145138 "altk" : [
146139 "agent-lifecycle-toolkit>=0.10.1,<1.0; sys_platform != 'darwin' or platform_machine != 'x86_64'" ,
192185# the per-provider extras above: cuga -> cuga, codeagents -> smolagents.
193186TORCH_EXTRAS = frozenset ({"cuga" , "codeagents" })
194187
188+ # Deprecated aliases for providers that graduated to standalone bundles. They
189+ # remain installable for compatibility but are intentionally excluded from the
190+ # generated aggregate extras because Langflow already installs them directly.
191+ COMPATIBILITY_EXTRAS = {"google" : ["lfx-google>=0.1.0,<1.0.0" ]}
192+
195193
196194def normalize_extra (name : str ) -> str :
197195 """PEP 685 extra-name normalization (lowercase, runs of -_. -> single -)."""
@@ -317,6 +315,7 @@ def move_provider(provider: str, *, apply: bool) -> list[tuple[str, str]]:
317315
318316def _render_optional_deps (extras : dict [str , list [str ]]) -> str :
319317 keys = sorted (k for k in extras if k not in ("all" , "all-no-torch" ))
318+ aggregate_keys = [key for key in keys if key not in COMPATIBILITY_EXTRAS ]
320319 lines = ["[project.optional-dependencies]" , _OPTIONAL_DEPS_HEADER ]
321320 for key in keys :
322321 deps = extras [key ]
@@ -326,10 +325,10 @@ def _render_optional_deps(extras: dict[str, list[str]]) -> str:
326325 else :
327326 lines .append (f"{ key } = []" )
328327 lines .append ("all = [" )
329- lines .extend (f' "lfx-bundles[{ key } ]",' for key in keys )
328+ lines .extend (f' "lfx-bundles[{ key } ]",' for key in aggregate_keys )
330329 lines .append ("]" )
331330 lines .append ("all-no-torch = [" )
332- lines .extend (f' "lfx-bundles[{ key } ]",' for key in keys if key not in TORCH_EXTRAS )
331+ lines .extend (f' "lfx-bundles[{ key } ]",' for key in aggregate_keys if key not in TORCH_EXTRAS )
333332 lines .append ("]" )
334333 return "\n " .join (lines ) + "\n "
335334
@@ -343,6 +342,7 @@ def update_bundles_pyproject(new_extras: dict[str, list[str]], *, apply: bool) -
343342 extras = {k : list (v ) for k , v in parsed .get ("project" , {}).get ("optional-dependencies" , {}).items ()}
344343 extras .pop ("all" , None )
345344 extras .pop ("all-no-torch" , None )
345+ extras .update (COMPATIBILITY_EXTRAS )
346346 extras .update (new_extras )
347347
348348 section = _render_optional_deps (extras )
0 commit comments