avoigt1121 Claude Opus 4.8 commited on
Commit
b4e7ac0
·
1 Parent(s): 03059f6

Fix Space stuck on APP_STARTING: migrate gradio 5.49 -> 6.18

Browse files

The dev Space hung forever on APP_STARTING (app bound 7860, served, 49 tools
loaded) but HF never flipped it to Running. The earlier "disable SSR" change
(d38496a) was a red herring: the known-good orchestrator Space runs gradio 6.x
WITH SSR enabled and reaches Running, while this Space on 5.49.0 hangs
regardless of ssr_mode. Root cause is that gradio 5.49.0 no longer completes
HF's current Spaces readiness handshake; 6.x does.

Changes:
- README sdk_version 5.49.0 -> 6.18.0 (matches the running orchestrator Space).
- requirements.in: gradio[oauth,mcp] 5.49.0 -> 6.18.0. This lifts the old
mcp==1.10.1 hard-pin, so langchain-mcp-adapters floats 0.2.2 -> 0.3.0 and
mcp -> 1.28.0. fastmcp pinned ==3.2.3: 2.11.2 is incompatible with mcp>=1.28
(@mcp.tool returns a non-callable FunctionTool, breaking every direct tool
call + the whole suite) and 3.4.x breaks `from fastmcp import FastMCP`.
- gradio_ui.py: port to the 6.0 API — move theme+css off Blocks() onto
launch(); drop removed Chatbot(type=, show_copy_button=) and Textbox(
show_copy_button=) args; remove the obsolete ssr_mode=False override.

Verified locally on the pinned set (gradio 6.18.0 / mcp 1.28.0 /
langchain-mcp-adapters 0.3.0 / fastmcp 3.2.3): UI builds, 49 MCP tools
discover with no errors, full suite 851 passed / 55 skipped.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

Files changed (4) hide show
  1. README.md +1 -1
  2. gradio_ui.py +17 -16
  3. requirements.in +25 -11
  4. requirements.txt +79 -62
README.md CHANGED
@@ -4,7 +4,7 @@ colorFrom: blue
4
  python_version: 3.11
5
  colorTo: gray
6
  sdk: gradio
7
- sdk_version: 5.49.0
8
  app_file: app.py
9
  pinned: false
10
  ---
 
4
  python_version: 3.11
5
  colorTo: gray
6
  sdk: gradio
7
+ sdk_version: 6.18.0
8
  app_file: app.py
9
  pinned: false
10
  ---
gradio_ui.py CHANGED
@@ -756,14 +756,9 @@ class GradioAgentUI(_UIFormattingMixin):
756
  gr.DownloadButton(value=log, interactive=log is not None),
757
  )
758
 
759
- def create_app(self):
760
- """Create the Gradio app with sidebar layout."""
761
- modern_theme = gr.themes.Monochrome(
762
- font=fonts.GoogleFont("Inter"),
763
- font_mono=fonts.GoogleFont("JetBrains Mono")
764
- )
765
-
766
- with gr.Blocks(theme=modern_theme, fill_height=True, title=self.name, css="""
767
  .footer {display: none !important;}
768
  footer {display: none !important;}
769
  .gradio-footer {display: none !important;}
@@ -773,7 +768,17 @@ class GradioAgentUI(_UIFormattingMixin):
773
  .block.svelte-1scc9gv {display: none !important;}
774
  .built-with-gradio {display: none !important;}
775
  .gradio-container footer {display: none !important;}
776
- """) as demo:
 
 
 
 
 
 
 
 
 
 
777
  demo.load(js="""
778
  () => {
779
  document.body.classList.remove('dark');
@@ -869,9 +874,7 @@ class GradioAgentUI(_UIFormattingMixin):
869
  with gr.Column(scale=3):
870
  chatbot = gr.Chatbot(
871
  label="Agent Conversation",
872
- type="messages",
873
  height=700,
874
- show_copy_button=True,
875
  avatar_images=(None, "images.png"),
876
  latex_delimiters=[
877
  {"left": r"$$", "right": r"$$", "display": True},
@@ -898,7 +901,6 @@ class GradioAgentUI(_UIFormattingMixin):
898
  lines=10,
899
  visible=False,
900
  interactive=False,
901
- show_copy_button=True,
902
  )
903
 
904
  def _inputs_dir():
@@ -1081,8 +1083,7 @@ class GradioAgentUI(_UIFormattingMixin):
1081
  kwargs.setdefault('server_name', '0.0.0.0')
1082
  kwargs.setdefault('server_port', 7860)
1083
  kwargs.setdefault('show_error', True)
1084
- # Disable Gradio 5.x experimental SSR: on HF Spaces it auto-enables (Node
1085
- # present) and the readiness check hangs the Space on "Starting" forever
1086
- # even though the app binds 7860. Overridable via kwargs / GRADIO_SSR_MODE.
1087
- kwargs.setdefault('ssr_mode', False)
1088
  app.queue(max_size=10).launch(share=share, show_api=False, favicon_path=None, **kwargs)
 
756
  gr.DownloadButton(value=log, interactive=log is not None),
757
  )
758
 
759
+ # theme + css moved out of the gr.Blocks() constructor: Gradio 6.0 removed
760
+ # those args from Blocks and only accepts them on launch().
761
+ _GRADIO_CSS = """
 
 
 
 
 
762
  .footer {display: none !important;}
763
  footer {display: none !important;}
764
  .gradio-footer {display: none !important;}
 
768
  .block.svelte-1scc9gv {display: none !important;}
769
  .built-with-gradio {display: none !important;}
770
  .gradio-container footer {display: none !important;}
771
+ """
772
+
773
+ def _gradio_theme(self):
774
+ return gr.themes.Monochrome(
775
+ font=fonts.GoogleFont("Inter"),
776
+ font_mono=fonts.GoogleFont("JetBrains Mono")
777
+ )
778
+
779
+ def create_app(self):
780
+ """Create the Gradio app with sidebar layout."""
781
+ with gr.Blocks(fill_height=True, title=self.name) as demo:
782
  demo.load(js="""
783
  () => {
784
  document.body.classList.remove('dark');
 
874
  with gr.Column(scale=3):
875
  chatbot = gr.Chatbot(
876
  label="Agent Conversation",
 
877
  height=700,
 
878
  avatar_images=(None, "images.png"),
879
  latex_delimiters=[
880
  {"left": r"$$", "right": r"$$", "display": True},
 
901
  lines=10,
902
  visible=False,
903
  interactive=False,
 
904
  )
905
 
906
  def _inputs_dir():
 
1083
  kwargs.setdefault('server_name', '0.0.0.0')
1084
  kwargs.setdefault('server_port', 7860)
1085
  kwargs.setdefault('show_error', True)
1086
+ # Gradio 6.0 moved theme + css off the Blocks() constructor onto launch().
1087
+ kwargs.setdefault('theme', self._gradio_theme())
1088
+ kwargs.setdefault('css', self._GRADIO_CSS)
 
1089
  app.queue(max_size=10).launch(share=share, show_api=False, favicon_path=None, **kwargs)
requirements.in CHANGED
@@ -21,10 +21,14 @@ biodata-registry @ https://huggingface.co/anne-voigt/biodata-registry/resolve/56
21
  GEOparse==2.0.4
22
 
23
  # --- Agent / UI ---
24
- # Pinned to match the Space's sdk_version (README frontmatter) exactly; the
25
- # [oauth,mcp] extras hard-pin mcp==1.10.1 (see langchain-mcp-adapters note).
26
- # Do not float to gradio 6.x it diverges from the Space runtime.
27
- gradio[oauth,mcp]==5.49.0
 
 
 
 
28
  huggingface_hub
29
  python-dotenv
30
  jinja2
@@ -40,15 +44,25 @@ langchain-core
40
  # Pinned: 1.x requires a thread_id in graph config when a checkpointer is
41
  # attached (see workflow_engine.run_workflow). Verified working on 1.1.6.
42
  langgraph>=1.1.6,<2
43
- # Pinned <=0.2.2: 0.3.0 imports the renamed `streamable_http_client` from
44
- # mcp.client.streamable_http, absent in mcp==1.10.1 (hard-pinned by
45
- # gradio[oauth,mcp]==5.49.0 on this Space). Fails at import time in
46
- # MCPManager.add_mcp(), silently yielding 0 MCP tools. 0.2.2 uses the old name.
47
- langchain-mcp-adapters<=0.2.2
 
48
 
49
  # --- MCP ---
50
- fastmcp
51
- mcp
 
 
 
 
 
 
 
 
 
52
  starlette
53
  nest_asyncio
54
 
 
21
  GEOparse==2.0.4
22
 
23
  # --- Agent / UI ---
24
+ # Pinned to match the Space's sdk_version (README frontmatter) exactly.
25
+ # gradio 5.49.0 stopped completing HF's Spaces readiness handshake on the
26
+ # current runtime (Space hangs forever on APP_STARTING even though the app
27
+ # binds 7860). 6.x is what the current HF runtime expects; 6.18.0 matches the
28
+ # known-good orchestrator Space on this account. The [oauth,mcp] extras no
29
+ # longer hard-pin the old mcp==1.10.1, so langchain-mcp-adapters can float up
30
+ # (see its note below).
31
+ gradio[oauth,mcp]==6.18.0
32
  huggingface_hub
33
  python-dotenv
34
  jinja2
 
44
  # Pinned: 1.x requires a thread_id in graph config when a checkpointer is
45
  # attached (see workflow_engine.run_workflow). Verified working on 1.1.6.
46
  langgraph>=1.1.6,<2
47
+ # Floats up now that gradio 6.x no longer hard-pins mcp==1.10.1. 0.3.0+ imports
48
+ # `streamable_http_client` from mcp.client.streamable_http, which exists in the
49
+ # newer mcp that gradio 6.x pulls. (The old <=0.2.2 cap was required only by the
50
+ # mcp==1.10.1 pin that gradio 5.49.0 forced.) Verify 49 MCP tools still load
51
+ # after any bump — a mismatch silently yields 0 tools.
52
+ langchain-mcp-adapters>=0.3.0
53
 
54
  # --- MCP ---
55
+ # fastmcp pinned to 3.2.3 exactly:
56
+ # - 2.11.2 (what gradio 5.49 forced) is incompatible with the newer mcp (>=1.28)
57
+ # that gradio 6.x + langchain-mcp-adapters 0.3.0 pull in: under that combo
58
+ # `@mcp.tool` returns a non-callable FunctionTool and every direct tool call
59
+ # (and the whole test suite) breaks.
60
+ # - 3.4.x breaks the top-level `from fastmcp import FastMCP` import ("unknown
61
+ # location"), so don't float up.
62
+ # 3.2.3 keeps tools callable, imports cleanly, discovers all 49, and the full
63
+ # test suite passes (851).
64
+ fastmcp==3.2.3
65
+ mcp>=1.28
66
  starlette
67
  nest_asyncio
68
 
requirements.txt CHANGED
@@ -1,15 +1,9 @@
1
- # GENERATED do not hand-edit. Source of truth: requirements.in
2
- # Regenerate after editing requirements.in:
3
- # uv pip compile requirements.in -o requirements.txt \
4
- # --python-version 3.11 --python-platform linux
5
- # Fully version-pinned for reproducible HF builds. biodata-registry installs
6
- # from an immutable HF resolve URL (a wheel), so full --generate-hashes is now
7
- # possible (no git dep) but not yet applied. See requirements.in.
8
- #
9
  adjusttext==1.4.0
10
  # via decoupler
11
- aiofiles==24.1.0
12
- # via gradio
13
  anndata==0.12.17
14
  # via
15
  # -r requirements.in
@@ -31,8 +25,10 @@ anyio==4.14.0
31
  # httpx
32
  # mcp
33
  # openai
 
34
  # sse-starlette
35
  # starlette
 
36
  array-api-compat==1.15.0
37
  # via anndata
38
  attrs==26.1.0
@@ -44,10 +40,18 @@ authlib==1.7.2
44
  # via
45
  # fastmcp
46
  # gradio
 
 
 
 
47
  biodata-registry @ https://huggingface.co/anne-voigt/biodata-registry/resolve/5654e86a8f3f5b369bf6ee2f71f51fc68ef912a8/biodata_registry-0.1.3-py3-none-any.whl
48
  # via -r requirements.in
49
  brotli==1.2.0
50
  # via gradio
 
 
 
 
51
  certifi==2026.5.20
52
  # via
53
  # httpcore
@@ -70,6 +74,8 @@ cryptography==49.0.0
70
  # via
71
  # authlib
72
  # joserfc
 
 
73
  cycler==0.12.1
74
  # via matplotlib
75
  cyclopts==4.18.0
@@ -98,10 +104,8 @@ exceptiongroup==1.3.1
98
  # via fastmcp
99
  fastapi==0.137.1
100
  # via gradio
101
- fastmcp==2.11.2
102
  # via -r requirements.in
103
- ffmpy==1.0.0
104
- # via gradio
105
  filelock==3.29.4
106
  # via huggingface-hub
107
  fonttools==4.63.0
@@ -124,10 +128,12 @@ geoparse==2.0.4
124
  # via -r requirements.in
125
  google-crc32c==1.8.0
126
  # via zarr
127
- gradio==5.49.0
128
  # via -r requirements.in
129
- gradio-client==1.13.3
130
- # via gradio
 
 
131
  groovy==0.1.2
132
  # via gradio
133
  h11==0.16.0
@@ -138,6 +144,8 @@ h5py==3.16.0
138
  # via
139
  # anndata
140
  # scanpy
 
 
141
  hf-xet==1.5.1
142
  # via huggingface-hub
143
  httpcore==1.0.9
@@ -167,12 +175,22 @@ idna==3.18
167
  # email-validator
168
  # httpx
169
  # requests
 
 
170
  interface-meta==2.0.1
171
  # via formulaic
172
- isodate==0.7.2
173
- # via openapi-core
174
  itsdangerous==2.2.0
175
  # via gradio
 
 
 
 
 
 
 
 
 
 
176
  jinja2==3.1.6
177
  # via
178
  # -r requirements.in
@@ -193,20 +211,16 @@ jsonpatch==1.33
193
  # via langchain-core
194
  jsonpointer==3.1.1
195
  # via jsonpatch
 
 
196
  jsonschema==4.26.0
197
- # via
198
- # mcp
199
- # openapi-core
200
- # openapi-schema-validator
201
- # openapi-spec-validator
202
  jsonschema-path==0.4.6
203
- # via
204
- # openapi-core
205
- # openapi-spec-validator
206
  jsonschema-specifications==2025.9.1
207
- # via
208
- # jsonschema
209
- # openapi-schema-validator
210
  kiwisolver==1.5.0
211
  # via matplotlib
212
  langchain-anthropic==1.4.6
@@ -221,7 +235,7 @@ langchain-core==1.4.7
221
  # langgraph-checkpoint
222
  # langgraph-prebuilt
223
  # langgraph-sdk
224
- langchain-mcp-adapters==0.2.2
225
  # via -r requirements.in
226
  langchain-openai==1.3.2
227
  # via -r requirements.in
@@ -241,8 +255,6 @@ langgraph-sdk==0.4.2
241
  # via langgraph
242
  langsmith==0.8.16
243
  # via langchain-core
244
- lazy-object-proxy==1.12.0
245
- # via openapi-spec-validator
246
  legacy-api-wrap==1.5
247
  # via
248
  # anndata
@@ -261,7 +273,6 @@ markupsafe==3.0.3
261
  # via
262
  # gradio
263
  # jinja2
264
- # werkzeug
265
  marsilea==0.6.2
266
  # via decoupler
267
  matplotlib==3.11.0
@@ -274,7 +285,7 @@ matplotlib==3.11.0
274
  # pydeseq2
275
  # scanpy
276
  # seaborn
277
- mcp==1.10.1
278
  # via
279
  # -r requirements.in
280
  # fastmcp
@@ -285,7 +296,9 @@ mdurl==0.1.2
285
  mizani==0.14.4
286
  # via plotnine
287
  more-itertools==11.1.0
288
- # via openapi-core
 
 
289
  narwhals==2.22.1
290
  # via
291
  # formulaic
@@ -334,16 +347,10 @@ numpy==2.4.6
334
  # zarr
335
  openai==2.41.1
336
  # via langchain-openai
337
- openapi-core==0.23.1
338
- # via fastmcp
339
  openapi-pydantic==0.5.1
340
  # via fastmcp
341
- openapi-schema-validator==0.8.1
342
- # via
343
- # openapi-core
344
- # openapi-spec-validator
345
- openapi-spec-validator==0.8.5
346
- # via openapi-core
347
  orjson==3.11.9
348
  # via
349
  # gradio
@@ -354,6 +361,7 @@ ormsgpack==1.12.2
354
  packaging==26.2
355
  # via
356
  # anndata
 
357
  # gradio
358
  # gradio-client
359
  # huggingface-hub
@@ -390,9 +398,13 @@ pillow==11.3.0
390
  # gradio
391
  # matplotlib
392
  platformdirs==4.10.0
393
- # via marsilea
 
 
394
  plotnine==0.15.7
395
  # via -r requirements.in
 
 
396
  pyarrow==24.0.0
397
  # via pandas
398
  pycparser==3.0
@@ -411,16 +423,11 @@ pydantic==2.11.10
411
  # mcp
412
  # openai
413
  # openapi-pydantic
414
- # openapi-schema-validator
415
- # openapi-spec-validator
416
  # pydantic-settings
417
  pydantic-core==2.33.2
418
  # via pydantic
419
  pydantic-settings==2.14.1
420
- # via
421
- # mcp
422
- # openapi-schema-validator
423
- # openapi-spec-validator
424
  pydeseq2==0.5.4
425
  # via -r requirements.in
426
  pydub==0.25.1
@@ -429,6 +436,8 @@ pygments==2.20.0
429
  # via
430
  # rich
431
  # rich-rst
 
 
432
  pynndescent==0.6.0
433
  # via
434
  # scanpy
@@ -453,12 +462,15 @@ python-multipart==0.0.32
453
  # gradio
454
  # mcp
455
  pytz==2026.2
456
- # via pandas
 
 
457
  pyyaml==6.0.3
458
  # via
459
  # -r requirements.in
460
  # biodata-registry
461
  # donfig
 
462
  # gradio
463
  # huggingface-hub
464
  # jsonschema-path
@@ -468,7 +480,6 @@ referencing==0.37.0
468
  # jsonschema
469
  # jsonschema-path
470
  # jsonschema-specifications
471
- # openapi-schema-validator
472
  regex==2026.5.9
473
  # via tiktoken
474
  requests==2.34.2
@@ -480,8 +491,6 @@ requests==2.34.2
480
  # tiktoken
481
  requests-toolbelt==1.0.0
482
  # via langsmith
483
- rfc3339-validator==0.1.4
484
- # via openapi-schema-validator
485
  rich==15.0.0
486
  # via
487
  # -r requirements.in
@@ -503,8 +512,6 @@ rpy2-rinterface==3.6.6
503
  # rpy2-robjects
504
  rpy2-robjects==3.6.5
505
  # via rpy2
506
- ruff==0.15.17
507
- # via gradio
508
  safehttpx==0.1.7
509
  # via gradio
510
  scanpy==1.11.5
@@ -536,6 +543,8 @@ seaborn==0.13.2
536
  # via
537
  # marsilea
538
  # scanpy
 
 
539
  semantic-version==2.10.0
540
  # via gradio
541
  session-info==1.0.1
@@ -551,14 +560,13 @@ six==1.17.0
551
  # via
552
  # docrep
553
  # python-dateutil
554
- # rfc3339-validator
555
  sniffio==1.3.1
556
  # via
557
  # anthropic
558
  # openai
559
  sse-starlette==3.4.4
560
  # via mcp
561
- starlette==0.52.1
562
  # via
563
  # -r requirements.in
564
  # fastapi
@@ -590,6 +598,7 @@ tqdm==4.68.2
590
  typer==0.25.1
591
  # via
592
  # gradio
 
593
  # huggingface-hub
594
  typing-extensions==4.15.0
595
  # via
@@ -604,9 +613,11 @@ typing-extensions==4.15.0
604
  # langchain-core
605
  # langchain-mcp-adapters
606
  # langchain-protocol
 
607
  # numcodecs
608
  # openai
609
- # openapi-core
 
610
  # pydantic
611
  # pydantic-core
612
  # python-docx
@@ -619,6 +630,7 @@ typing-extensions==4.15.0
619
  typing-inspection==0.4.2
620
  # via
621
  # fastapi
 
622
  # pydantic
623
  # pydantic-settings
624
  tzdata==2026.2
@@ -627,6 +639,8 @@ tzlocal==5.4.2
627
  # via rpy2-robjects
628
  umap-learn==0.5.12
629
  # via scanpy
 
 
630
  urllib3==2.7.0
631
  # via requests
632
  uuid-utils==0.16.1
@@ -635,15 +649,16 @@ uuid-utils==0.16.1
635
  # langsmith
636
  uvicorn==0.49.0
637
  # via
 
638
  # gradio
639
  # mcp
 
 
640
  websockets==15.0.1
641
  # via
642
- # gradio-client
643
  # langgraph-sdk
644
  # langsmith
645
- werkzeug==3.1.8
646
- # via openapi-core
647
  wrapt==2.2.1
648
  # via formulaic
649
  xxhash==3.7.0
@@ -652,5 +667,7 @@ xxhash==3.7.0
652
  # langsmith
653
  zarr==3.1.6
654
  # via anndata
 
 
655
  zstandard==0.25.0
656
  # via langsmith
 
1
+ # This file was autogenerated by uv via the following command:
2
+ # uv pip compile requirements.in -o requirements.txt --python-version 3.11 --python-platform linux
 
 
 
 
 
 
3
  adjusttext==1.4.0
4
  # via decoupler
5
+ aiofile==3.11.1
6
+ # via py-key-value-aio
7
  anndata==0.12.17
8
  # via
9
  # -r requirements.in
 
25
  # httpx
26
  # mcp
27
  # openai
28
+ # py-key-value-aio
29
  # sse-starlette
30
  # starlette
31
+ # watchfiles
32
  array-api-compat==1.15.0
33
  # via anndata
34
  attrs==26.1.0
 
40
  # via
41
  # fastmcp
42
  # gradio
43
+ backports-tarfile==1.2.0
44
+ # via jaraco-context
45
+ beartype==0.22.9
46
+ # via py-key-value-aio
47
  biodata-registry @ https://huggingface.co/anne-voigt/biodata-registry/resolve/5654e86a8f3f5b369bf6ee2f71f51fc68ef912a8/biodata_registry-0.1.3-py3-none-any.whl
48
  # via -r requirements.in
49
  brotli==1.2.0
50
  # via gradio
51
+ cachetools==7.1.4
52
+ # via py-key-value-aio
53
+ caio==0.9.25
54
+ # via aiofile
55
  certifi==2026.5.20
56
  # via
57
  # httpcore
 
74
  # via
75
  # authlib
76
  # joserfc
77
+ # pyjwt
78
+ # secretstorage
79
  cycler==0.12.1
80
  # via matplotlib
81
  cyclopts==4.18.0
 
104
  # via fastmcp
105
  fastapi==0.137.1
106
  # via gradio
107
+ fastmcp==3.2.3
108
  # via -r requirements.in
 
 
109
  filelock==3.29.4
110
  # via huggingface-hub
111
  fonttools==4.63.0
 
128
  # via -r requirements.in
129
  google-crc32c==1.8.0
130
  # via zarr
131
+ gradio==6.18.0
132
  # via -r requirements.in
133
+ gradio-client==2.5.0
134
+ # via
135
+ # gradio
136
+ # hf-gradio
137
  groovy==0.1.2
138
  # via gradio
139
  h11==0.16.0
 
144
  # via
145
  # anndata
146
  # scanpy
147
+ hf-gradio==0.4.1
148
+ # via gradio
149
  hf-xet==1.5.1
150
  # via huggingface-hub
151
  httpcore==1.0.9
 
175
  # email-validator
176
  # httpx
177
  # requests
178
+ importlib-metadata==9.0.0
179
+ # via keyring
180
  interface-meta==2.0.1
181
  # via formulaic
 
 
182
  itsdangerous==2.2.0
183
  # via gradio
184
+ jaraco-classes==3.4.0
185
+ # via keyring
186
+ jaraco-context==6.1.2
187
+ # via keyring
188
+ jaraco-functools==4.5.0
189
+ # via keyring
190
+ jeepney==0.9.0
191
+ # via
192
+ # keyring
193
+ # secretstorage
194
  jinja2==3.1.6
195
  # via
196
  # -r requirements.in
 
211
  # via langchain-core
212
  jsonpointer==3.1.1
213
  # via jsonpatch
214
+ jsonref==1.1.0
215
+ # via fastmcp
216
  jsonschema==4.26.0
217
+ # via mcp
 
 
 
 
218
  jsonschema-path==0.4.6
219
+ # via fastmcp
 
 
220
  jsonschema-specifications==2025.9.1
221
+ # via jsonschema
222
+ keyring==25.7.0
223
+ # via py-key-value-aio
224
  kiwisolver==1.5.0
225
  # via matplotlib
226
  langchain-anthropic==1.4.6
 
235
  # langgraph-checkpoint
236
  # langgraph-prebuilt
237
  # langgraph-sdk
238
+ langchain-mcp-adapters==0.3.0
239
  # via -r requirements.in
240
  langchain-openai==1.3.2
241
  # via -r requirements.in
 
255
  # via langgraph
256
  langsmith==0.8.16
257
  # via langchain-core
 
 
258
  legacy-api-wrap==1.5
259
  # via
260
  # anndata
 
273
  # via
274
  # gradio
275
  # jinja2
 
276
  marsilea==0.6.2
277
  # via decoupler
278
  matplotlib==3.11.0
 
285
  # pydeseq2
286
  # scanpy
287
  # seaborn
288
+ mcp==1.28.0
289
  # via
290
  # -r requirements.in
291
  # fastmcp
 
296
  mizani==0.14.4
297
  # via plotnine
298
  more-itertools==11.1.0
299
+ # via
300
+ # jaraco-classes
301
+ # jaraco-functools
302
  narwhals==2.22.1
303
  # via
304
  # formulaic
 
347
  # zarr
348
  openai==2.41.1
349
  # via langchain-openai
 
 
350
  openapi-pydantic==0.5.1
351
  # via fastmcp
352
+ opentelemetry-api==1.42.1
353
+ # via fastmcp
 
 
 
 
354
  orjson==3.11.9
355
  # via
356
  # gradio
 
361
  packaging==26.2
362
  # via
363
  # anndata
364
+ # fastmcp
365
  # gradio
366
  # gradio-client
367
  # huggingface-hub
 
398
  # gradio
399
  # matplotlib
400
  platformdirs==4.10.0
401
+ # via
402
+ # fastmcp
403
+ # marsilea
404
  plotnine==0.15.7
405
  # via -r requirements.in
406
+ py-key-value-aio==0.4.5
407
+ # via fastmcp
408
  pyarrow==24.0.0
409
  # via pandas
410
  pycparser==3.0
 
423
  # mcp
424
  # openai
425
  # openapi-pydantic
 
 
426
  # pydantic-settings
427
  pydantic-core==2.33.2
428
  # via pydantic
429
  pydantic-settings==2.14.1
430
+ # via mcp
 
 
 
431
  pydeseq2==0.5.4
432
  # via -r requirements.in
433
  pydub==0.25.1
 
436
  # via
437
  # rich
438
  # rich-rst
439
+ pyjwt==2.13.0
440
+ # via mcp
441
  pynndescent==0.6.0
442
  # via
443
  # scanpy
 
462
  # gradio
463
  # mcp
464
  pytz==2026.2
465
+ # via
466
+ # gradio
467
+ # pandas
468
  pyyaml==6.0.3
469
  # via
470
  # -r requirements.in
471
  # biodata-registry
472
  # donfig
473
+ # fastmcp
474
  # gradio
475
  # huggingface-hub
476
  # jsonschema-path
 
480
  # jsonschema
481
  # jsonschema-path
482
  # jsonschema-specifications
 
483
  regex==2026.5.9
484
  # via tiktoken
485
  requests==2.34.2
 
491
  # tiktoken
492
  requests-toolbelt==1.0.0
493
  # via langsmith
 
 
494
  rich==15.0.0
495
  # via
496
  # -r requirements.in
 
512
  # rpy2-robjects
513
  rpy2-robjects==3.6.5
514
  # via rpy2
 
 
515
  safehttpx==0.1.7
516
  # via gradio
517
  scanpy==1.11.5
 
543
  # via
544
  # marsilea
545
  # scanpy
546
+ secretstorage==3.5.0
547
+ # via keyring
548
  semantic-version==2.10.0
549
  # via gradio
550
  session-info==1.0.1
 
560
  # via
561
  # docrep
562
  # python-dateutil
 
563
  sniffio==1.3.1
564
  # via
565
  # anthropic
566
  # openai
567
  sse-starlette==3.4.4
568
  # via mcp
569
+ starlette==1.3.1
570
  # via
571
  # -r requirements.in
572
  # fastapi
 
598
  typer==0.25.1
599
  # via
600
  # gradio
601
+ # hf-gradio
602
  # huggingface-hub
603
  typing-extensions==4.15.0
604
  # via
 
613
  # langchain-core
614
  # langchain-mcp-adapters
615
  # langchain-protocol
616
+ # mcp
617
  # numcodecs
618
  # openai
619
+ # opentelemetry-api
620
+ # py-key-value-aio
621
  # pydantic
622
  # pydantic-core
623
  # python-docx
 
630
  typing-inspection==0.4.2
631
  # via
632
  # fastapi
633
+ # mcp
634
  # pydantic
635
  # pydantic-settings
636
  tzdata==2026.2
 
639
  # via rpy2-robjects
640
  umap-learn==0.5.12
641
  # via scanpy
642
+ uncalled-for==0.3.2
643
+ # via fastmcp
644
  urllib3==2.7.0
645
  # via requests
646
  uuid-utils==0.16.1
 
649
  # langsmith
650
  uvicorn==0.49.0
651
  # via
652
+ # fastmcp
653
  # gradio
654
  # mcp
655
+ watchfiles==1.2.0
656
+ # via fastmcp
657
  websockets==15.0.1
658
  # via
659
+ # fastmcp
660
  # langgraph-sdk
661
  # langsmith
 
 
662
  wrapt==2.2.1
663
  # via formulaic
664
  xxhash==3.7.0
 
667
  # langsmith
668
  zarr==3.1.6
669
  # via anndata
670
+ zipp==4.1.0
671
+ # via importlib-metadata
672
  zstandard==0.25.0
673
  # via langsmith