Fix Space stuck on APP_STARTING: migrate gradio 5.49 -> 6.18
Browse filesThe 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>
- README.md +1 -1
- gradio_ui.py +17 -16
- requirements.in +25 -11
- requirements.txt +79 -62
|
@@ -4,7 +4,7 @@ colorFrom: blue
|
|
| 4 |
python_version: 3.11
|
| 5 |
colorTo: gray
|
| 6 |
sdk: gradio
|
| 7 |
-
sdk_version:
|
| 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 |
---
|
|
@@ -756,14 +756,9 @@ class GradioAgentUI(_UIFormattingMixin):
|
|
| 756 |
gr.DownloadButton(value=log, interactive=log is not None),
|
| 757 |
)
|
| 758 |
|
| 759 |
-
|
| 760 |
-
|
| 761 |
-
|
| 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 |
-
"""
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
#
|
| 1085 |
-
|
| 1086 |
-
|
| 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)
|
|
@@ -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
|
| 25 |
-
#
|
| 26 |
-
#
|
| 27 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
#
|
| 44 |
-
# mcp.client.streamable_http,
|
| 45 |
-
#
|
| 46 |
-
#
|
| 47 |
-
|
|
|
|
| 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 |
|
|
@@ -1,15 +1,9 @@
|
|
| 1 |
-
#
|
| 2 |
-
#
|
| 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 |
-
|
| 12 |
-
# via
|
| 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==
|
| 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==
|
| 128 |
# via -r requirements.in
|
| 129 |
-
gradio-client==
|
| 130 |
-
# via
|
|
|
|
|
|
|
| 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 |
-
|
| 209 |
-
#
|
| 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.
|
| 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.
|
| 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
|
|
|
|
|
|
|
| 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 |
-
|
| 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
|
|
|
|
|
|
|
| 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
|
|
|
|
|
|
|
| 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==
|
| 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 |
-
#
|
|
|
|
| 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 |
-
#
|
| 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
|