scmcp-shared 0.4.0__py3-none-any.whl → 0.5.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scmcp_shared/__init__.py +1 -3
- scmcp_shared/agent.py +58 -8
- scmcp_shared/backend.py +44 -0
- scmcp_shared/cli.py +75 -46
- scmcp_shared/kb.py +38 -0
- scmcp_shared/logging_config.py +6 -8
- scmcp_shared/mcp_base.py +184 -0
- scmcp_shared/schema/io.py +101 -59
- scmcp_shared/schema/pl.py +386 -490
- scmcp_shared/schema/pp.py +514 -265
- scmcp_shared/schema/preset/__init__.py +15 -0
- scmcp_shared/schema/preset/io.py +103 -0
- scmcp_shared/schema/preset/pl.py +843 -0
- scmcp_shared/schema/preset/pp.py +616 -0
- scmcp_shared/schema/preset/tl.py +917 -0
- scmcp_shared/schema/preset/util.py +123 -0
- scmcp_shared/schema/tl.py +355 -407
- scmcp_shared/schema/util.py +57 -72
- scmcp_shared/server/__init__.py +0 -12
- scmcp_shared/server/auto.py +10 -8
- scmcp_shared/server/code.py +3 -0
- scmcp_shared/server/preset/__init__.py +14 -0
- scmcp_shared/server/{io.py → preset/io.py} +26 -22
- scmcp_shared/server/{pl.py → preset/pl.py} +162 -78
- scmcp_shared/server/{pp.py → preset/pp.py} +123 -65
- scmcp_shared/server/{tl.py → preset/tl.py} +142 -79
- scmcp_shared/server/{util.py → preset/util.py} +123 -66
- scmcp_shared/util.py +109 -38
- scmcp_shared/vector_db/decoupler.lance/_transactions/0-9499b1b5-85d4-44c2-8f05-1bcce87fe4ef.txn +3 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/1-1632e7a3-4427-4077-8d03-57437144443d.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/10-dcf66479-eafb-4193-9358-198154aea1c1.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/11-2c6ddc17-49f5-47b5-8764-753297cf9e1b.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/12-f079d0a2-9c1c-4e7a-abf6-3e3c4cddac11.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/13-5bda9382-a06e-493d-85cb-e066172778ce.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/14-6f9c669f-25e2-4096-b7ea-9b421a37e110.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/15-2068cca9-31e8-45a3-86d1-bcb8924c72b9.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/16-72356bb2-5c98-424e-97aa-a92fa3453da6.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/17-9baa67ce-f6d3-478c-9511-20d01988d4d5.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/18-b9f2e28e-c4c5-4ce7-bf58-402d53a39558.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/19-d199d9f9-7990-4ec0-adde-e98c1c927202.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/2-3827747c-095e-41cb-af69-3814bab3a588.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/20-31c197a3-7a23-472f-a7e3-056c0ff11e3a.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/21-066e3024-36f8-4557-83ae-d2f338ec045c.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/22-1d1ccbe5-7c4c-4882-986a-c61ec2f7925e.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/23-b2c41628-b2d6-49f1-81b5-3cd9100894b4.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/24-e43e2e8d-9dd8-479f-b63c-d147e737c49f.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/25-188708e9-5ee1-4b5c-8e13-45dec8efd60d.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/26-4f4b6316-5680-4b31-8dd6-215cce66d7b5.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/27-c1855f86-abab-44ef-9e61-1312dffc9b06.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/28-650d2be0-e977-4177-b457-b733eea8b6ea.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/29-e47751d8-0e44-46da-82bd-4836b00a8431.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/3-518fc9b8-67de-48f7-94c8-f2398c63dbc5.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/30-0db3ea0f-deca-4b5b-9d70-9fb5f741f90c.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/31-ef76f0bb-bcfa-4031-b3ad-94b51ee818a9.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/32-a763e0f1-5c8d-460f-a455-0c6f6c4f1450.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/33-30bce2aa-8e6f-4f42-a323-c420133aa20f.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/34-f91ec2f9-d34b-4fcf-8bc7-564c28e50538.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/35-7f36a75c-96a7-4868-a4db-5d5f78ecf850.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/36-f2df7f99-a37c-458a-958d-7eb5e81eee18.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/37-e0af7415-955b-4167-8705-fa9ddb643e9a.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/38-6c24a9f0-ce71-4dda-8193-479aa23c5456.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/39-72b8a20c-3112-4cf1-8b05-b74a2c02c3f2.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/4-42904942-5a79-4f28-90ce-35a4ae8c40d1.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/40-95ac7526-6a2e-4914-9654-288c41bff370.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/41-13430464-5e62-4aa8-9709-513693a75095.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/42-cbb1ad83-a906-4540-bc37-4db158eac618.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/43-3c246401-d742-49a9-b24d-cfc457685461.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/44-11315c14-ecf4-4e3d-8690-46d57cb3e8c0.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/45-7bbf4bc6-96d4-425a-afa2-34aec7121c85.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/5-82dda0b4-7838-4f04-90f3-4b1e932c6891.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/6-c78352d8-16ba-4814-bd7f-74b8c0c5efe7.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/7-bb882b35-63f3-4c52-870f-6a64e3ac7f3c.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/8-fc84ad1b-1b59-4822-8fc7-70f4eb18f6d9.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_transactions/9-3404dcf1-bb17-40e6-9e5d-d9942dff90b2.txn +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/1.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/10.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/11.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/12.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/13.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/14.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/15.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/16.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/17.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/18.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/19.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/2.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/20.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/21.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/22.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/23.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/24.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/25.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/26.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/27.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/28.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/29.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/3.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/30.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/31.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/32.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/33.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/34.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/35.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/36.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/37.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/38.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/39.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/4.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/40.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/41.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/42.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/43.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/44.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/45.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/46.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/5.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/6.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/7.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/8.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/_versions/9.manifest +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/0cc94dc3-2ca3-403c-a9df-59753f24b3f2.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/254a1a71-cdd2-4cca-b7ec-a50540fed62c.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/2574d216-5f05-4794-9e1c-986fafde6ab4.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/26c7bbe7-5f97-4453-b065-123b764448b3.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/286595a6-88f6-4b05-861e-e4f607a6fcdb.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/33219b1a-7575-46ef-bb64-2bdbde1e692b.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/344ad7dd-98bb-41de-b347-2f17bf5735cb.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/395b1ecb-68fe-4dd3-a770-4b3ed393ae0c.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/3db97f4c-9c35-44b7-9042-82b4006c5a22.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/4540246e-b0bb-4f4d-8f98-60a64f1c42ed.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/4643dbc0-9e45-4b63-81e1-e06cf9bddcec.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/4f28eb52-d409-43f2-ae17-d1826f209006.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/4fda4a22-35f0-4897-b4c5-6cedefba66e6.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/51ee77b6-ab24-44c0-916e-b81ff3912731.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/539d15c9-e88b-400c-9ab7-08f5e8dca10d.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/54007132-91f5-4909-8678-c471ef4d100f.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/546d88ec-0d5c-42bb-bccc-3271f3f183a4.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/6912ad8a-343c-4ca1-b1b7-4300125e688e.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/6b72e4f7-3051-40a4-a492-6d9eff1c647d.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/6d7ee320-ae1c-4e49-8ce5-c85971b11ce6.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/6ea47b70-69d4-43e9-b2c6-442fe50e4dd1.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/72adb5ed-bf11-4d06-b146-0272d333db08.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/745907df-e261-4f4b-a757-2c01c058bf27.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/78988307-4c66-4ad7-b295-7463ecd53609.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/798ce305-6d60-4f28-b82a-e1f647907abf.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/7c159cce-2741-442b-9c63-f44bf2996718.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/7cd7a818-e68b-4fa8-bad3-23b60c386670.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/7ec553ed-0c7a-4bac-99b2-2ad976b40466.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/83efdc85-d990-4762-b69a-fb1c3938f60f.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/8c1613b3-8d69-49c5-bfd0-a021bb516faf.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/95cd1b22-1f93-4133-9841-de21549ad8c5.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/9a2ea5d4-087e-4d3a-b64b-6c568b8a0010.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/b1c47dc6-450a-4dca-b465-badb6a3619c2.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/b21d183a-c51d-463b-932e-9beb2e0da9aa.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/b2598625-8683-4c33-be40-6f1a7555dc2c.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/b7297b39-1fc5-4886-be21-708b369bef59.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/b7d90085-5bd6-48f9-8a73-17eb7cf556fa.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/b988ceee-57fc-423b-8e67-5729086c6946.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/bfd68ea6-ddf4-44bb-aa87-2669f0462f7d.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/cb8ac58e-0e59-4391-95ab-6195e71b9625.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/d0f10434-afb5-49c5-9e77-d39a4f8cca94.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/d3f89fec-5795-4e11-8c15-bc2206a7fae2.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/e063c8a4-5ef1-4933-a049-b41049d9be5f.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/e2348b24-f290-4fe2-a6c8-e98009ae4c1b.lance +0 -0
- scmcp_shared/vector_db/decoupler.lance/data/e5d3f893-6763-40dc-9d02-04e2f56a4883.lance +0 -0
- {scmcp_shared-0.4.0.dist-info → scmcp_shared-0.5.0.dist-info}/METADATA +2 -1
- scmcp_shared-0.5.0.dist-info/RECORD +171 -0
- scmcp_shared/server/base.py +0 -148
- scmcp_shared-0.4.0.dist-info/RECORD +0 -24
- {scmcp_shared-0.4.0.dist-info → scmcp_shared-0.5.0.dist-info}/WHEEL +0 -0
- {scmcp_shared-0.4.0.dist-info → scmcp_shared-0.5.0.dist-info}/licenses/LICENSE +0 -0
@@ -1,22 +1,22 @@
|
|
1
|
-
import os
|
2
|
-
import inspect
|
3
|
-
from functools import partial
|
4
1
|
import scanpy as sc
|
5
|
-
from fastmcp import FastMCP, Context
|
6
2
|
from fastmcp.tools.tool import Tool
|
7
3
|
from fastmcp.exceptions import ToolError
|
8
|
-
from
|
9
|
-
from
|
10
|
-
from
|
11
|
-
from
|
12
|
-
from .base import BaseMCP
|
4
|
+
from scmcp_shared.schema.preset.pl import *
|
5
|
+
from scmcp_shared.schema.preset import AdataInfo
|
6
|
+
from scmcp_shared.util import forward_request, sc_like_plot, get_ads
|
7
|
+
from scmcp_shared.mcp_base import BaseMCP
|
13
8
|
|
14
9
|
|
15
10
|
class ScanpyPlottingMCP(BaseMCP):
|
16
|
-
def __init__(
|
11
|
+
def __init__(
|
12
|
+
self,
|
13
|
+
include_tools: list = None,
|
14
|
+
exclude_tools: list = None,
|
15
|
+
AdataInfo: AdataInfo = AdataInfo,
|
16
|
+
):
|
17
17
|
"""
|
18
18
|
Initialize ScanpyPreprocessingMCP with optional tool filtering.
|
19
|
-
|
19
|
+
|
20
20
|
Args:
|
21
21
|
include_tools (list, optional): List of tool names to include. If None, all tools are included.
|
22
22
|
exclude_tools (list, optional): List of tool names to exclude. If None, no tools are excluded.
|
@@ -25,7 +25,7 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
25
25
|
super().__init__("ScanpyMCP-PL-Server", include_tools, exclude_tools, AdataInfo)
|
26
26
|
|
27
27
|
def _tool_pca(self):
|
28
|
-
def _pca(request:
|
28
|
+
def _pca(request: PCAParam, adinfo: self.AdataInfo = self.AdataInfo()):
|
29
29
|
"""Scatter plot in PCA coordinates. default figure for PCA plot"""
|
30
30
|
try:
|
31
31
|
if (res := forward_request("pl_pca", request, adinfo)) is not None:
|
@@ -36,14 +36,17 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
36
36
|
except ToolError as e:
|
37
37
|
raise ToolError(e)
|
38
38
|
except Exception as e:
|
39
|
-
if hasattr(e,
|
39
|
+
if hasattr(e, "__context__") and e.__context__:
|
40
40
|
raise ToolError(e.__context__)
|
41
41
|
else:
|
42
42
|
raise ToolError(e)
|
43
|
-
|
43
|
+
|
44
|
+
return Tool.from_function(_pca, name="pca", enabled=True)
|
44
45
|
|
45
46
|
def _tool_diffmap(self):
|
46
|
-
def _diffmap(
|
47
|
+
def _diffmap(
|
48
|
+
request: DiffusionMapParam, adinfo: self.AdataInfo = self.AdataInfo()
|
49
|
+
):
|
47
50
|
"""Plot diffusion map embedding of cells."""
|
48
51
|
try:
|
49
52
|
if (res := forward_request("pl_diffmap", request, adinfo)) is not None:
|
@@ -54,14 +57,15 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
54
57
|
except ToolError as e:
|
55
58
|
raise ToolError(e)
|
56
59
|
except Exception as e:
|
57
|
-
if hasattr(e,
|
60
|
+
if hasattr(e, "__context__") and e.__context__:
|
58
61
|
raise ToolError(e.__context__)
|
59
62
|
else:
|
60
63
|
raise ToolError(e)
|
61
|
-
|
64
|
+
|
65
|
+
return Tool.from_function(_diffmap, name="diffmap", enabled=True)
|
62
66
|
|
63
67
|
def _tool_violin(self):
|
64
|
-
def _violin(request:
|
68
|
+
def _violin(request: ViolinParam, adinfo: self.AdataInfo = self.AdataInfo()):
|
65
69
|
"""Plot violin plot of one or more variables."""
|
66
70
|
try:
|
67
71
|
if (res := forward_request("pl_violin", request, adinfo)) is not None:
|
@@ -70,54 +74,65 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
70
74
|
fig_path = sc_like_plot(sc.pl.violin, adata, request, adinfo)
|
71
75
|
return {"figpath": fig_path}
|
72
76
|
except KeyError as e:
|
73
|
-
raise ToolError(
|
77
|
+
raise ToolError(
|
78
|
+
f"doest found {e} in current sampleid with adtype {adinfo.adtype}"
|
79
|
+
)
|
74
80
|
except ToolError as e:
|
75
81
|
raise ToolError(e)
|
76
82
|
except Exception as e:
|
77
|
-
if hasattr(e,
|
83
|
+
if hasattr(e, "__context__") and e.__context__:
|
78
84
|
raise ToolError(e.__context__)
|
79
85
|
else:
|
80
86
|
raise ToolError(e)
|
81
|
-
|
87
|
+
|
88
|
+
return Tool.from_function(_violin, name="violin", enabled=True)
|
82
89
|
|
83
90
|
def _tool_stacked_violin(self):
|
84
|
-
def _stacked_violin(
|
91
|
+
def _stacked_violin(
|
92
|
+
request: StackedViolinParam, adinfo: self.AdataInfo = self.AdataInfo()
|
93
|
+
):
|
85
94
|
"""Plot stacked violin plots. Makes a compact image composed of individual violin plots stacked on top of each other."""
|
86
95
|
try:
|
87
|
-
if (
|
88
|
-
|
96
|
+
if (
|
97
|
+
res := forward_request("pl_stacked_violin", request, adinfo)
|
98
|
+
) is not None:
|
99
|
+
return res
|
89
100
|
adata = get_ads().get_adata(adinfo=adinfo)
|
90
101
|
fig_path = sc_like_plot(sc.pl.stacked_violin, adata, request, adinfo)
|
91
102
|
return {"figpath": fig_path}
|
92
103
|
except ToolError as e:
|
93
104
|
raise ToolError(e)
|
94
105
|
except Exception as e:
|
95
|
-
if hasattr(e,
|
106
|
+
if hasattr(e, "__context__") and e.__context__:
|
96
107
|
raise ToolError(e.__context__)
|
97
108
|
else:
|
98
109
|
raise ToolError(e)
|
99
|
-
|
110
|
+
|
111
|
+
return Tool.from_function(_stacked_violin, name="stacked_violin", enabled=True)
|
100
112
|
|
101
113
|
def _tool_heatmap(self):
|
102
|
-
async def _heatmap(
|
114
|
+
async def _heatmap(
|
115
|
+
request: HeatmapParam, adinfo: self.AdataInfo = self.AdataInfo()
|
116
|
+
):
|
103
117
|
"""Heatmap of the expression values of genes."""
|
104
118
|
try:
|
105
119
|
if (res := forward_request("pl_heatmap", request, adinfo)) is not None:
|
106
|
-
return res
|
120
|
+
return res
|
107
121
|
adata = get_ads().get_adata(adinfo=adinfo)
|
108
122
|
fig_path = sc_like_plot(sc.pl.heatmap, adata, request, adinfo)
|
109
123
|
return {"figpath": fig_path}
|
110
124
|
except ToolError as e:
|
111
125
|
raise ToolError(e)
|
112
126
|
except Exception as e:
|
113
|
-
if hasattr(e,
|
127
|
+
if hasattr(e, "__context__") and e.__context__:
|
114
128
|
raise ToolError(e.__context__)
|
115
129
|
else:
|
116
130
|
raise ToolError(e)
|
117
|
-
|
131
|
+
|
132
|
+
return Tool.from_function(_heatmap, name="heatmap", enabled=True)
|
118
133
|
|
119
134
|
def _tool_dotplot(self):
|
120
|
-
def _dotplot(request:
|
135
|
+
def _dotplot(request: DotplotParam, adinfo: self.AdataInfo = self.AdataInfo()):
|
121
136
|
"""Plot dot plot of expression values per gene for each group."""
|
122
137
|
try:
|
123
138
|
if (res := forward_request("pl_dotplot", request, adinfo)) is not None:
|
@@ -128,17 +143,22 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
128
143
|
except ToolError as e:
|
129
144
|
raise ToolError(e)
|
130
145
|
except Exception as e:
|
131
|
-
if hasattr(e,
|
146
|
+
if hasattr(e, "__context__") and e.__context__:
|
132
147
|
raise ToolError(e.__context__)
|
133
148
|
else:
|
134
149
|
raise ToolError(e)
|
135
|
-
|
150
|
+
|
151
|
+
return Tool.from_function(_dotplot, name="dotplot", enabled=True)
|
136
152
|
|
137
153
|
def _tool_matrixplot(self):
|
138
|
-
def _matrixplot(
|
154
|
+
def _matrixplot(
|
155
|
+
request: MatrixplotParam, adinfo: self.AdataInfo = self.AdataInfo()
|
156
|
+
):
|
139
157
|
"""matrixplot, Create a heatmap of the mean expression values per group of each var_names."""
|
140
158
|
try:
|
141
|
-
if (
|
159
|
+
if (
|
160
|
+
res := forward_request("pl_matrixplot", request, adinfo)
|
161
|
+
) is not None:
|
142
162
|
return res
|
143
163
|
adata = get_ads().get_adata(adinfo=adinfo)
|
144
164
|
fig_path = sc_like_plot(sc.pl.matrixplot, adata, request, adinfo)
|
@@ -146,17 +166,22 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
146
166
|
except ToolError as e:
|
147
167
|
raise ToolError(e)
|
148
168
|
except Exception as e:
|
149
|
-
if hasattr(e,
|
169
|
+
if hasattr(e, "__context__") and e.__context__:
|
150
170
|
raise ToolError(e.__context__)
|
151
171
|
else:
|
152
172
|
raise ToolError(e)
|
153
|
-
|
173
|
+
|
174
|
+
return Tool.from_function(_matrixplot, name="matrixplot", enabled=True)
|
154
175
|
|
155
176
|
def _tool_tracksplot(self):
|
156
|
-
def _tracksplot(
|
177
|
+
def _tracksplot(
|
178
|
+
request: TracksplotParam, adinfo: self.AdataInfo = self.AdataInfo()
|
179
|
+
):
|
157
180
|
"""tracksplot, compact plot of expression of a list of genes."""
|
158
181
|
try:
|
159
|
-
if (
|
182
|
+
if (
|
183
|
+
res := forward_request("pl_tracksplot", request, adinfo)
|
184
|
+
) is not None:
|
160
185
|
return res
|
161
186
|
adata = get_ads().get_adata(adinfo=adinfo)
|
162
187
|
fig_path = sc_like_plot(sc.pl.tracksplot, adata, request, adinfo)
|
@@ -164,71 +189,93 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
164
189
|
except ToolError as e:
|
165
190
|
raise ToolError(e)
|
166
191
|
except Exception as e:
|
167
|
-
if hasattr(e,
|
192
|
+
if hasattr(e, "__context__") and e.__context__:
|
168
193
|
raise ToolError(e.__context__)
|
169
194
|
else:
|
170
195
|
raise ToolError(e)
|
196
|
+
|
171
197
|
return Tool.from_function(_tracksplot, name="tracksplot")
|
172
198
|
|
173
199
|
def _tool_scatter(self):
|
174
|
-
def _scatter(
|
200
|
+
def _scatter(
|
201
|
+
request: EnhancedScatterParam, adinfo: self.AdataInfo = self.AdataInfo()
|
202
|
+
):
|
175
203
|
"""Plot a scatter plot of two variables, Scatter plot along observations or variables axes."""
|
176
204
|
try:
|
177
205
|
if (res := forward_request("pl_scatter", request, adinfo)) is not None:
|
178
|
-
return res
|
206
|
+
return res
|
179
207
|
adata = get_ads().get_adata(adinfo=adinfo)
|
180
208
|
fig_path = sc_like_plot(sc.pl.scatter, adata, request, adinfo)
|
181
209
|
return {"figpath": fig_path}
|
182
210
|
except ToolError as e:
|
183
211
|
raise ToolError(e)
|
184
212
|
except Exception as e:
|
185
|
-
if hasattr(e,
|
213
|
+
if hasattr(e, "__context__") and e.__context__:
|
186
214
|
raise ToolError(e.__context__)
|
187
215
|
else:
|
188
216
|
raise ToolError(e)
|
189
|
-
|
217
|
+
|
218
|
+
return Tool.from_function(_scatter, name="scatter", enabled=True)
|
190
219
|
|
191
220
|
def _tool_embedding(self):
|
192
|
-
def _embedding(
|
221
|
+
def _embedding(
|
222
|
+
request: EmbeddingParam, adinfo: self.AdataInfo = self.AdataInfo()
|
223
|
+
):
|
193
224
|
"""Scatter plot for user specified embedding basis (e.g. umap, tsne, etc)."""
|
194
225
|
try:
|
195
|
-
if (
|
196
|
-
|
226
|
+
if (
|
227
|
+
res := forward_request("pl_embedding", request, adinfo)
|
228
|
+
) is not None:
|
229
|
+
return res
|
197
230
|
adata = get_ads().get_adata(adinfo=adinfo)
|
198
231
|
fig_path = sc_like_plot(sc.pl.embedding, adata, request, adinfo)
|
199
232
|
return {"figpath": fig_path}
|
200
233
|
except KeyError as e:
|
201
|
-
raise ToolError(
|
234
|
+
raise ToolError(
|
235
|
+
f"doest found {e} in current sampleid with adtype {adinfo.adtype}"
|
236
|
+
)
|
202
237
|
except Exception as e:
|
203
|
-
if hasattr(e,
|
238
|
+
if hasattr(e, "__context__") and e.__context__:
|
204
239
|
raise ToolError(e.__context__)
|
205
240
|
else:
|
206
241
|
raise ToolError(e)
|
207
|
-
|
242
|
+
|
243
|
+
return Tool.from_function(_embedding, name="embedding", enabled=True)
|
208
244
|
|
209
245
|
def _tool_embedding_density(self):
|
210
|
-
def _embedding_density(
|
246
|
+
def _embedding_density(
|
247
|
+
request: EmbeddingDensityParam, adinfo: self.AdataInfo = self.AdataInfo()
|
248
|
+
):
|
211
249
|
"""Plot the density of cells in an embedding."""
|
212
250
|
try:
|
213
|
-
if (
|
214
|
-
|
251
|
+
if (
|
252
|
+
res := forward_request("pl_embedding_density", request, adinfo)
|
253
|
+
) is not None:
|
254
|
+
return res
|
215
255
|
adata = get_ads().get_adata(adinfo=adinfo)
|
216
256
|
fig_path = sc_like_plot(sc.pl.embedding_density, adata, request, adinfo)
|
217
257
|
return {"figpath": fig_path}
|
218
258
|
except ToolError as e:
|
219
259
|
raise ToolError(e)
|
220
260
|
except Exception as e:
|
221
|
-
if hasattr(e,
|
261
|
+
if hasattr(e, "__context__") and e.__context__:
|
222
262
|
raise ToolError(e.__context__)
|
223
263
|
else:
|
224
264
|
raise ToolError(e)
|
225
|
-
|
265
|
+
|
266
|
+
return Tool.from_function(
|
267
|
+
_embedding_density, name="embedding_density", enabled=True
|
268
|
+
)
|
226
269
|
|
227
270
|
def _tool_rank_genes_groups(self):
|
228
|
-
def _rank_genes_groups(
|
271
|
+
def _rank_genes_groups(
|
272
|
+
request: RankGenesGroupsParam, adinfo: self.AdataInfo = self.AdataInfo()
|
273
|
+
):
|
229
274
|
"""Plot ranking of genes based on differential expression."""
|
230
275
|
try:
|
231
|
-
if (
|
276
|
+
if (
|
277
|
+
res := forward_request("pl_rank_genes_groups", request, adinfo)
|
278
|
+
) is not None:
|
232
279
|
return res
|
233
280
|
adata = get_ads().get_adata(adinfo=adinfo)
|
234
281
|
fig_path = sc_like_plot(sc.pl.rank_genes_groups, adata, request, adinfo)
|
@@ -236,35 +283,54 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
236
283
|
except ToolError as e:
|
237
284
|
raise ToolError(e)
|
238
285
|
except Exception as e:
|
239
|
-
if hasattr(e,
|
286
|
+
if hasattr(e, "__context__") and e.__context__:
|
240
287
|
raise ToolError(e.__context__)
|
241
288
|
else:
|
242
289
|
raise ToolError(e)
|
243
|
-
|
290
|
+
|
291
|
+
return Tool.from_function(
|
292
|
+
_rank_genes_groups, name="rank_genes_groups", enabled=True
|
293
|
+
)
|
244
294
|
|
245
295
|
def _tool_rank_genes_groups_dotplot(self):
|
246
|
-
def _rank_genes_groups_dotplot(
|
296
|
+
def _rank_genes_groups_dotplot(
|
297
|
+
request: RankGenesGroupsDotplotParam,
|
298
|
+
adinfo: self.AdataInfo = self.AdataInfo(),
|
299
|
+
):
|
247
300
|
"""Plot ranking of genes(DEGs) using dotplot visualization. Defualt plot DEGs for rank_genes_groups tool"""
|
248
301
|
try:
|
249
|
-
if (
|
302
|
+
if (
|
303
|
+
res := forward_request(
|
304
|
+
"pl_rank_genes_groups_dotplot", request, adinfo
|
305
|
+
)
|
306
|
+
) is not None:
|
250
307
|
return res
|
251
308
|
adata = get_ads().get_adata(adinfo=adinfo)
|
252
|
-
fig_path = sc_like_plot(
|
309
|
+
fig_path = sc_like_plot(
|
310
|
+
sc.pl.rank_genes_groups_dotplot, adata, request, adinfo
|
311
|
+
)
|
253
312
|
return {"figpath": fig_path}
|
254
313
|
except ToolError as e:
|
255
314
|
raise ToolError(e)
|
256
315
|
except Exception as e:
|
257
|
-
if hasattr(e,
|
316
|
+
if hasattr(e, "__context__") and e.__context__:
|
258
317
|
raise ToolError(e.__context__)
|
259
318
|
else:
|
260
319
|
raise ToolError(e)
|
261
|
-
|
320
|
+
|
321
|
+
return Tool.from_function(
|
322
|
+
_rank_genes_groups_dotplot, name="rank_genes_groups_dotplot", enabled=True
|
323
|
+
)
|
262
324
|
|
263
325
|
def _tool_clustermap(self):
|
264
|
-
def _clustermap(
|
326
|
+
def _clustermap(
|
327
|
+
request: ClusterMapParam, adinfo: self.AdataInfo = self.AdataInfo()
|
328
|
+
):
|
265
329
|
"""Plot hierarchical clustering of cells and genes."""
|
266
330
|
try:
|
267
|
-
if (
|
331
|
+
if (
|
332
|
+
res := forward_request("pl_clustermap", request, adinfo)
|
333
|
+
) is not None:
|
268
334
|
return res
|
269
335
|
adata = get_ads().get_adata(adinfo=adinfo)
|
270
336
|
fig_path = sc_like_plot(sc.pl.clustermap, adata, request, adinfo)
|
@@ -272,45 +338,63 @@ class ScanpyPlottingMCP(BaseMCP):
|
|
272
338
|
except ToolError as e:
|
273
339
|
raise ToolError(e)
|
274
340
|
except Exception as e:
|
275
|
-
if hasattr(e,
|
341
|
+
if hasattr(e, "__context__") and e.__context__:
|
276
342
|
raise ToolError(e.__context__)
|
277
343
|
else:
|
278
344
|
raise ToolError(e)
|
279
|
-
|
345
|
+
|
346
|
+
return Tool.from_function(_clustermap, name="clustermap", enabled=True)
|
280
347
|
|
281
348
|
def _tool_highly_variable_genes(self):
|
282
|
-
def _highly_variable_genes(
|
349
|
+
def _highly_variable_genes(
|
350
|
+
request: HighlyVariableGenesParam, adinfo: self.AdataInfo = self.AdataInfo()
|
351
|
+
):
|
283
352
|
"""plot highly variable genes; Plot dispersions or normalized variance versus means for genes."""
|
284
353
|
try:
|
285
|
-
if (
|
354
|
+
if (
|
355
|
+
res := forward_request("pl_highly_variable_genes", request, adinfo)
|
356
|
+
) is not None:
|
286
357
|
return res
|
287
358
|
adata = get_ads().get_adata(adinfo=adinfo)
|
288
|
-
fig_path = sc_like_plot(
|
359
|
+
fig_path = sc_like_plot(
|
360
|
+
sc.pl.highly_variable_genes, adata, request, adinfo
|
361
|
+
)
|
289
362
|
return {"figpath": fig_path}
|
290
363
|
except ToolError as e:
|
291
364
|
raise ToolError(e)
|
292
365
|
except Exception as e:
|
293
|
-
if hasattr(e,
|
366
|
+
if hasattr(e, "__context__") and e.__context__:
|
294
367
|
raise ToolError(e.__context__)
|
295
368
|
else:
|
296
369
|
raise ToolError(e)
|
297
|
-
|
370
|
+
|
371
|
+
return Tool.from_function(
|
372
|
+
_highly_variable_genes, name="highly_variable_genes", enabled=True
|
373
|
+
)
|
298
374
|
|
299
375
|
def _tool_pca_variance_ratio(self):
|
300
|
-
def _pca_variance_ratio(
|
376
|
+
def _pca_variance_ratio(
|
377
|
+
request: PCAVarianceRatioParam, adinfo: self.AdataInfo = self.AdataInfo()
|
378
|
+
):
|
301
379
|
"""Plot the PCA variance ratio to visualize explained variance."""
|
302
380
|
try:
|
303
|
-
if (
|
381
|
+
if (
|
382
|
+
res := forward_request("pl_pca_variance_ratio", request, adinfo)
|
383
|
+
) is not None:
|
304
384
|
return res
|
305
385
|
adata = get_ads().get_adata(adinfo=adinfo)
|
306
|
-
fig_path = sc_like_plot(
|
386
|
+
fig_path = sc_like_plot(
|
387
|
+
sc.pl.pca_variance_ratio, adata, request, adinfo
|
388
|
+
)
|
307
389
|
return {"figpath": fig_path}
|
308
390
|
except ToolError as e:
|
309
391
|
raise ToolError(e)
|
310
392
|
except Exception as e:
|
311
|
-
if hasattr(e,
|
393
|
+
if hasattr(e, "__context__") and e.__context__:
|
312
394
|
raise ToolError(e.__context__)
|
313
395
|
else:
|
314
396
|
raise ToolError(e)
|
315
|
-
return Tool.from_function(_pca_variance_ratio, name="pca_variance_ratio")
|
316
397
|
|
398
|
+
return Tool.from_function(
|
399
|
+
_pca_variance_ratio, name="pca_variance_ratio", enabled=True
|
400
|
+
)
|