scmcp-shared 0.3.7__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.
Files changed (172) hide show
  1. scmcp_shared/__init__.py +1 -3
  2. scmcp_shared/agent.py +80 -0
  3. scmcp_shared/backend.py +44 -0
  4. scmcp_shared/cli.py +76 -37
  5. scmcp_shared/kb.py +38 -0
  6. scmcp_shared/logging_config.py +6 -8
  7. scmcp_shared/mcp_base.py +184 -0
  8. scmcp_shared/schema/io.py +101 -59
  9. scmcp_shared/schema/pl.py +386 -490
  10. scmcp_shared/schema/pp.py +514 -265
  11. scmcp_shared/schema/preset/__init__.py +15 -0
  12. scmcp_shared/schema/preset/io.py +103 -0
  13. scmcp_shared/schema/preset/pl.py +843 -0
  14. scmcp_shared/schema/preset/pp.py +616 -0
  15. scmcp_shared/schema/preset/tl.py +917 -0
  16. scmcp_shared/schema/preset/util.py +123 -0
  17. scmcp_shared/schema/tl.py +355 -407
  18. scmcp_shared/schema/tool.py +11 -0
  19. scmcp_shared/schema/util.py +57 -72
  20. scmcp_shared/server/__init__.py +0 -12
  21. scmcp_shared/server/auto.py +54 -0
  22. scmcp_shared/server/code.py +3 -0
  23. scmcp_shared/server/preset/__init__.py +14 -0
  24. scmcp_shared/server/{io.py → preset/io.py} +26 -22
  25. scmcp_shared/server/{pl.py → preset/pl.py} +162 -78
  26. scmcp_shared/server/{pp.py → preset/pp.py} +127 -65
  27. scmcp_shared/server/{tl.py → preset/tl.py} +142 -79
  28. scmcp_shared/server/{util.py → preset/util.py} +123 -66
  29. scmcp_shared/util.py +109 -38
  30. scmcp_shared/vector_db/decoupler.lance/_transactions/0-9499b1b5-85d4-44c2-8f05-1bcce87fe4ef.txn +3 -0
  31. scmcp_shared/vector_db/decoupler.lance/_transactions/1-1632e7a3-4427-4077-8d03-57437144443d.txn +0 -0
  32. scmcp_shared/vector_db/decoupler.lance/_transactions/10-dcf66479-eafb-4193-9358-198154aea1c1.txn +0 -0
  33. scmcp_shared/vector_db/decoupler.lance/_transactions/11-2c6ddc17-49f5-47b5-8764-753297cf9e1b.txn +0 -0
  34. scmcp_shared/vector_db/decoupler.lance/_transactions/12-f079d0a2-9c1c-4e7a-abf6-3e3c4cddac11.txn +0 -0
  35. scmcp_shared/vector_db/decoupler.lance/_transactions/13-5bda9382-a06e-493d-85cb-e066172778ce.txn +0 -0
  36. scmcp_shared/vector_db/decoupler.lance/_transactions/14-6f9c669f-25e2-4096-b7ea-9b421a37e110.txn +0 -0
  37. scmcp_shared/vector_db/decoupler.lance/_transactions/15-2068cca9-31e8-45a3-86d1-bcb8924c72b9.txn +0 -0
  38. scmcp_shared/vector_db/decoupler.lance/_transactions/16-72356bb2-5c98-424e-97aa-a92fa3453da6.txn +0 -0
  39. scmcp_shared/vector_db/decoupler.lance/_transactions/17-9baa67ce-f6d3-478c-9511-20d01988d4d5.txn +0 -0
  40. scmcp_shared/vector_db/decoupler.lance/_transactions/18-b9f2e28e-c4c5-4ce7-bf58-402d53a39558.txn +0 -0
  41. scmcp_shared/vector_db/decoupler.lance/_transactions/19-d199d9f9-7990-4ec0-adde-e98c1c927202.txn +0 -0
  42. scmcp_shared/vector_db/decoupler.lance/_transactions/2-3827747c-095e-41cb-af69-3814bab3a588.txn +0 -0
  43. scmcp_shared/vector_db/decoupler.lance/_transactions/20-31c197a3-7a23-472f-a7e3-056c0ff11e3a.txn +0 -0
  44. scmcp_shared/vector_db/decoupler.lance/_transactions/21-066e3024-36f8-4557-83ae-d2f338ec045c.txn +0 -0
  45. scmcp_shared/vector_db/decoupler.lance/_transactions/22-1d1ccbe5-7c4c-4882-986a-c61ec2f7925e.txn +0 -0
  46. scmcp_shared/vector_db/decoupler.lance/_transactions/23-b2c41628-b2d6-49f1-81b5-3cd9100894b4.txn +0 -0
  47. scmcp_shared/vector_db/decoupler.lance/_transactions/24-e43e2e8d-9dd8-479f-b63c-d147e737c49f.txn +0 -0
  48. scmcp_shared/vector_db/decoupler.lance/_transactions/25-188708e9-5ee1-4b5c-8e13-45dec8efd60d.txn +0 -0
  49. scmcp_shared/vector_db/decoupler.lance/_transactions/26-4f4b6316-5680-4b31-8dd6-215cce66d7b5.txn +0 -0
  50. scmcp_shared/vector_db/decoupler.lance/_transactions/27-c1855f86-abab-44ef-9e61-1312dffc9b06.txn +0 -0
  51. scmcp_shared/vector_db/decoupler.lance/_transactions/28-650d2be0-e977-4177-b457-b733eea8b6ea.txn +0 -0
  52. scmcp_shared/vector_db/decoupler.lance/_transactions/29-e47751d8-0e44-46da-82bd-4836b00a8431.txn +0 -0
  53. scmcp_shared/vector_db/decoupler.lance/_transactions/3-518fc9b8-67de-48f7-94c8-f2398c63dbc5.txn +0 -0
  54. scmcp_shared/vector_db/decoupler.lance/_transactions/30-0db3ea0f-deca-4b5b-9d70-9fb5f741f90c.txn +0 -0
  55. scmcp_shared/vector_db/decoupler.lance/_transactions/31-ef76f0bb-bcfa-4031-b3ad-94b51ee818a9.txn +0 -0
  56. scmcp_shared/vector_db/decoupler.lance/_transactions/32-a763e0f1-5c8d-460f-a455-0c6f6c4f1450.txn +0 -0
  57. scmcp_shared/vector_db/decoupler.lance/_transactions/33-30bce2aa-8e6f-4f42-a323-c420133aa20f.txn +0 -0
  58. scmcp_shared/vector_db/decoupler.lance/_transactions/34-f91ec2f9-d34b-4fcf-8bc7-564c28e50538.txn +0 -0
  59. scmcp_shared/vector_db/decoupler.lance/_transactions/35-7f36a75c-96a7-4868-a4db-5d5f78ecf850.txn +0 -0
  60. scmcp_shared/vector_db/decoupler.lance/_transactions/36-f2df7f99-a37c-458a-958d-7eb5e81eee18.txn +0 -0
  61. scmcp_shared/vector_db/decoupler.lance/_transactions/37-e0af7415-955b-4167-8705-fa9ddb643e9a.txn +0 -0
  62. scmcp_shared/vector_db/decoupler.lance/_transactions/38-6c24a9f0-ce71-4dda-8193-479aa23c5456.txn +0 -0
  63. scmcp_shared/vector_db/decoupler.lance/_transactions/39-72b8a20c-3112-4cf1-8b05-b74a2c02c3f2.txn +0 -0
  64. scmcp_shared/vector_db/decoupler.lance/_transactions/4-42904942-5a79-4f28-90ce-35a4ae8c40d1.txn +0 -0
  65. scmcp_shared/vector_db/decoupler.lance/_transactions/40-95ac7526-6a2e-4914-9654-288c41bff370.txn +0 -0
  66. scmcp_shared/vector_db/decoupler.lance/_transactions/41-13430464-5e62-4aa8-9709-513693a75095.txn +0 -0
  67. scmcp_shared/vector_db/decoupler.lance/_transactions/42-cbb1ad83-a906-4540-bc37-4db158eac618.txn +0 -0
  68. scmcp_shared/vector_db/decoupler.lance/_transactions/43-3c246401-d742-49a9-b24d-cfc457685461.txn +0 -0
  69. scmcp_shared/vector_db/decoupler.lance/_transactions/44-11315c14-ecf4-4e3d-8690-46d57cb3e8c0.txn +0 -0
  70. scmcp_shared/vector_db/decoupler.lance/_transactions/45-7bbf4bc6-96d4-425a-afa2-34aec7121c85.txn +0 -0
  71. scmcp_shared/vector_db/decoupler.lance/_transactions/5-82dda0b4-7838-4f04-90f3-4b1e932c6891.txn +0 -0
  72. scmcp_shared/vector_db/decoupler.lance/_transactions/6-c78352d8-16ba-4814-bd7f-74b8c0c5efe7.txn +0 -0
  73. scmcp_shared/vector_db/decoupler.lance/_transactions/7-bb882b35-63f3-4c52-870f-6a64e3ac7f3c.txn +0 -0
  74. scmcp_shared/vector_db/decoupler.lance/_transactions/8-fc84ad1b-1b59-4822-8fc7-70f4eb18f6d9.txn +0 -0
  75. scmcp_shared/vector_db/decoupler.lance/_transactions/9-3404dcf1-bb17-40e6-9e5d-d9942dff90b2.txn +0 -0
  76. scmcp_shared/vector_db/decoupler.lance/_versions/1.manifest +0 -0
  77. scmcp_shared/vector_db/decoupler.lance/_versions/10.manifest +0 -0
  78. scmcp_shared/vector_db/decoupler.lance/_versions/11.manifest +0 -0
  79. scmcp_shared/vector_db/decoupler.lance/_versions/12.manifest +0 -0
  80. scmcp_shared/vector_db/decoupler.lance/_versions/13.manifest +0 -0
  81. scmcp_shared/vector_db/decoupler.lance/_versions/14.manifest +0 -0
  82. scmcp_shared/vector_db/decoupler.lance/_versions/15.manifest +0 -0
  83. scmcp_shared/vector_db/decoupler.lance/_versions/16.manifest +0 -0
  84. scmcp_shared/vector_db/decoupler.lance/_versions/17.manifest +0 -0
  85. scmcp_shared/vector_db/decoupler.lance/_versions/18.manifest +0 -0
  86. scmcp_shared/vector_db/decoupler.lance/_versions/19.manifest +0 -0
  87. scmcp_shared/vector_db/decoupler.lance/_versions/2.manifest +0 -0
  88. scmcp_shared/vector_db/decoupler.lance/_versions/20.manifest +0 -0
  89. scmcp_shared/vector_db/decoupler.lance/_versions/21.manifest +0 -0
  90. scmcp_shared/vector_db/decoupler.lance/_versions/22.manifest +0 -0
  91. scmcp_shared/vector_db/decoupler.lance/_versions/23.manifest +0 -0
  92. scmcp_shared/vector_db/decoupler.lance/_versions/24.manifest +0 -0
  93. scmcp_shared/vector_db/decoupler.lance/_versions/25.manifest +0 -0
  94. scmcp_shared/vector_db/decoupler.lance/_versions/26.manifest +0 -0
  95. scmcp_shared/vector_db/decoupler.lance/_versions/27.manifest +0 -0
  96. scmcp_shared/vector_db/decoupler.lance/_versions/28.manifest +0 -0
  97. scmcp_shared/vector_db/decoupler.lance/_versions/29.manifest +0 -0
  98. scmcp_shared/vector_db/decoupler.lance/_versions/3.manifest +0 -0
  99. scmcp_shared/vector_db/decoupler.lance/_versions/30.manifest +0 -0
  100. scmcp_shared/vector_db/decoupler.lance/_versions/31.manifest +0 -0
  101. scmcp_shared/vector_db/decoupler.lance/_versions/32.manifest +0 -0
  102. scmcp_shared/vector_db/decoupler.lance/_versions/33.manifest +0 -0
  103. scmcp_shared/vector_db/decoupler.lance/_versions/34.manifest +0 -0
  104. scmcp_shared/vector_db/decoupler.lance/_versions/35.manifest +0 -0
  105. scmcp_shared/vector_db/decoupler.lance/_versions/36.manifest +0 -0
  106. scmcp_shared/vector_db/decoupler.lance/_versions/37.manifest +0 -0
  107. scmcp_shared/vector_db/decoupler.lance/_versions/38.manifest +0 -0
  108. scmcp_shared/vector_db/decoupler.lance/_versions/39.manifest +0 -0
  109. scmcp_shared/vector_db/decoupler.lance/_versions/4.manifest +0 -0
  110. scmcp_shared/vector_db/decoupler.lance/_versions/40.manifest +0 -0
  111. scmcp_shared/vector_db/decoupler.lance/_versions/41.manifest +0 -0
  112. scmcp_shared/vector_db/decoupler.lance/_versions/42.manifest +0 -0
  113. scmcp_shared/vector_db/decoupler.lance/_versions/43.manifest +0 -0
  114. scmcp_shared/vector_db/decoupler.lance/_versions/44.manifest +0 -0
  115. scmcp_shared/vector_db/decoupler.lance/_versions/45.manifest +0 -0
  116. scmcp_shared/vector_db/decoupler.lance/_versions/46.manifest +0 -0
  117. scmcp_shared/vector_db/decoupler.lance/_versions/5.manifest +0 -0
  118. scmcp_shared/vector_db/decoupler.lance/_versions/6.manifest +0 -0
  119. scmcp_shared/vector_db/decoupler.lance/_versions/7.manifest +0 -0
  120. scmcp_shared/vector_db/decoupler.lance/_versions/8.manifest +0 -0
  121. scmcp_shared/vector_db/decoupler.lance/_versions/9.manifest +0 -0
  122. scmcp_shared/vector_db/decoupler.lance/data/0cc94dc3-2ca3-403c-a9df-59753f24b3f2.lance +0 -0
  123. scmcp_shared/vector_db/decoupler.lance/data/254a1a71-cdd2-4cca-b7ec-a50540fed62c.lance +0 -0
  124. scmcp_shared/vector_db/decoupler.lance/data/2574d216-5f05-4794-9e1c-986fafde6ab4.lance +0 -0
  125. scmcp_shared/vector_db/decoupler.lance/data/26c7bbe7-5f97-4453-b065-123b764448b3.lance +0 -0
  126. scmcp_shared/vector_db/decoupler.lance/data/286595a6-88f6-4b05-861e-e4f607a6fcdb.lance +0 -0
  127. scmcp_shared/vector_db/decoupler.lance/data/33219b1a-7575-46ef-bb64-2bdbde1e692b.lance +0 -0
  128. scmcp_shared/vector_db/decoupler.lance/data/344ad7dd-98bb-41de-b347-2f17bf5735cb.lance +0 -0
  129. scmcp_shared/vector_db/decoupler.lance/data/395b1ecb-68fe-4dd3-a770-4b3ed393ae0c.lance +0 -0
  130. scmcp_shared/vector_db/decoupler.lance/data/3db97f4c-9c35-44b7-9042-82b4006c5a22.lance +0 -0
  131. scmcp_shared/vector_db/decoupler.lance/data/4540246e-b0bb-4f4d-8f98-60a64f1c42ed.lance +0 -0
  132. scmcp_shared/vector_db/decoupler.lance/data/4643dbc0-9e45-4b63-81e1-e06cf9bddcec.lance +0 -0
  133. scmcp_shared/vector_db/decoupler.lance/data/4f28eb52-d409-43f2-ae17-d1826f209006.lance +0 -0
  134. scmcp_shared/vector_db/decoupler.lance/data/4fda4a22-35f0-4897-b4c5-6cedefba66e6.lance +0 -0
  135. scmcp_shared/vector_db/decoupler.lance/data/51ee77b6-ab24-44c0-916e-b81ff3912731.lance +0 -0
  136. scmcp_shared/vector_db/decoupler.lance/data/539d15c9-e88b-400c-9ab7-08f5e8dca10d.lance +0 -0
  137. scmcp_shared/vector_db/decoupler.lance/data/54007132-91f5-4909-8678-c471ef4d100f.lance +0 -0
  138. scmcp_shared/vector_db/decoupler.lance/data/546d88ec-0d5c-42bb-bccc-3271f3f183a4.lance +0 -0
  139. scmcp_shared/vector_db/decoupler.lance/data/6912ad8a-343c-4ca1-b1b7-4300125e688e.lance +0 -0
  140. scmcp_shared/vector_db/decoupler.lance/data/6b72e4f7-3051-40a4-a492-6d9eff1c647d.lance +0 -0
  141. scmcp_shared/vector_db/decoupler.lance/data/6d7ee320-ae1c-4e49-8ce5-c85971b11ce6.lance +0 -0
  142. scmcp_shared/vector_db/decoupler.lance/data/6ea47b70-69d4-43e9-b2c6-442fe50e4dd1.lance +0 -0
  143. scmcp_shared/vector_db/decoupler.lance/data/72adb5ed-bf11-4d06-b146-0272d333db08.lance +0 -0
  144. scmcp_shared/vector_db/decoupler.lance/data/745907df-e261-4f4b-a757-2c01c058bf27.lance +0 -0
  145. scmcp_shared/vector_db/decoupler.lance/data/78988307-4c66-4ad7-b295-7463ecd53609.lance +0 -0
  146. scmcp_shared/vector_db/decoupler.lance/data/798ce305-6d60-4f28-b82a-e1f647907abf.lance +0 -0
  147. scmcp_shared/vector_db/decoupler.lance/data/7c159cce-2741-442b-9c63-f44bf2996718.lance +0 -0
  148. scmcp_shared/vector_db/decoupler.lance/data/7cd7a818-e68b-4fa8-bad3-23b60c386670.lance +0 -0
  149. scmcp_shared/vector_db/decoupler.lance/data/7ec553ed-0c7a-4bac-99b2-2ad976b40466.lance +0 -0
  150. scmcp_shared/vector_db/decoupler.lance/data/83efdc85-d990-4762-b69a-fb1c3938f60f.lance +0 -0
  151. scmcp_shared/vector_db/decoupler.lance/data/8c1613b3-8d69-49c5-bfd0-a021bb516faf.lance +0 -0
  152. scmcp_shared/vector_db/decoupler.lance/data/95cd1b22-1f93-4133-9841-de21549ad8c5.lance +0 -0
  153. scmcp_shared/vector_db/decoupler.lance/data/9a2ea5d4-087e-4d3a-b64b-6c568b8a0010.lance +0 -0
  154. scmcp_shared/vector_db/decoupler.lance/data/b1c47dc6-450a-4dca-b465-badb6a3619c2.lance +0 -0
  155. scmcp_shared/vector_db/decoupler.lance/data/b21d183a-c51d-463b-932e-9beb2e0da9aa.lance +0 -0
  156. scmcp_shared/vector_db/decoupler.lance/data/b2598625-8683-4c33-be40-6f1a7555dc2c.lance +0 -0
  157. scmcp_shared/vector_db/decoupler.lance/data/b7297b39-1fc5-4886-be21-708b369bef59.lance +0 -0
  158. scmcp_shared/vector_db/decoupler.lance/data/b7d90085-5bd6-48f9-8a73-17eb7cf556fa.lance +0 -0
  159. scmcp_shared/vector_db/decoupler.lance/data/b988ceee-57fc-423b-8e67-5729086c6946.lance +0 -0
  160. scmcp_shared/vector_db/decoupler.lance/data/bfd68ea6-ddf4-44bb-aa87-2669f0462f7d.lance +0 -0
  161. scmcp_shared/vector_db/decoupler.lance/data/cb8ac58e-0e59-4391-95ab-6195e71b9625.lance +0 -0
  162. scmcp_shared/vector_db/decoupler.lance/data/d0f10434-afb5-49c5-9e77-d39a4f8cca94.lance +0 -0
  163. scmcp_shared/vector_db/decoupler.lance/data/d3f89fec-5795-4e11-8c15-bc2206a7fae2.lance +0 -0
  164. scmcp_shared/vector_db/decoupler.lance/data/e063c8a4-5ef1-4933-a049-b41049d9be5f.lance +0 -0
  165. scmcp_shared/vector_db/decoupler.lance/data/e2348b24-f290-4fe2-a6c8-e98009ae4c1b.lance +0 -0
  166. scmcp_shared/vector_db/decoupler.lance/data/e5d3f893-6763-40dc-9d02-04e2f56a4883.lance +0 -0
  167. {scmcp_shared-0.3.7.dist-info → scmcp_shared-0.5.0.dist-info}/METADATA +3 -1
  168. scmcp_shared-0.5.0.dist-info/RECORD +171 -0
  169. scmcp_shared/server/base.py +0 -148
  170. scmcp_shared-0.3.7.dist-info/RECORD +0 -21
  171. {scmcp_shared-0.3.7.dist-info → scmcp_shared-0.5.0.dist-info}/WHEEL +0 -0
  172. {scmcp_shared-0.3.7.dist-info → scmcp_shared-0.5.0.dist-info}/licenses/LICENSE +0 -0
scmcp_shared/schema/io.py CHANGED
@@ -1,113 +1,155 @@
1
- from pydantic import (
2
- Field,
3
- field_validator,
4
- model_validator, BaseModel
5
- )
1
+ from pydantic import Field, field_validator, model_validator, BaseModel
6
2
  from typing import Optional, Literal
7
3
 
8
4
 
9
-
10
- class ReadParams(BaseModel):
5
+ class ReadParam(BaseModel):
11
6
  """Input schema for the read tool."""
7
+
8
+ adata: str = Field(
9
+ ..., description="The AnnData object variable name will be stored in."
10
+ )
12
11
  filename: str = Field(
13
12
  ...,
14
- description="Path to the file to read."
13
+ description="Path to the file to read. If the filename has no file extension, it is interpreted as a key for generating a filename via sc.settings.writedir / (filename + sc.settings.file_format_data).",
15
14
  )
16
15
 
17
- backed: Literal['r', 'r+'] = Field(
16
+ backed: Optional[Literal["r", "r+"]] = Field(
18
17
  default=None,
19
- description="If 'r', load AnnData in 'backed' mode instead of fully loading it into memory ('memory' mode). If you want to modify backed attributes of the AnnData object, you need to choose 'r+'."
18
+ description="If 'r', load AnnData in backed mode instead of fully loading it into memory (memory mode). If you want to modify backed attributes of the AnnData object, you need to choose 'r+'.",
20
19
  )
21
- sheet: str = Field(
20
+
21
+ sheet: Optional[str] = Field(
22
+ default=None, description="Name of sheet/table in hdf5 or Excel file."
23
+ )
24
+
25
+ ext: Optional[str] = Field(
22
26
  default=None,
23
- description="Name of sheet/table in hdf5 or Excel file."
27
+ description="Extension that indicates the file type. If None, uses extension of filename.",
24
28
  )
25
- delimiter: str = Field(
29
+
30
+ delimiter: Optional[str] = Field(
26
31
  default=None,
27
- description="Delimiter that separates data within text file. If None, will split at arbitrary number of white spaces, which is different from enforcing splitting at any single white space."
32
+ description="Delimiter that separates data within text file. If None, will split at arbitrary number of white spaces, which is different from enforcing splitting at any single white space ' '.",
28
33
  )
34
+
29
35
  first_column_names: bool = Field(
30
36
  default=False,
31
- description="Assume the first column stores row names. This is only necessary if these are not strings: strings in the first column are automatically assumed to be row names."
32
- )
33
- transpose: bool = Field(
34
- default=False,
35
- description="If True, the data will be transposed."
37
+ description="Assume the first column stores row names. This is only necessary if these are not strings: strings in the first column are automatically assumed to be row names.",
36
38
  )
37
- backup_url: str = Field(
39
+
40
+ backup_url: Optional[str] = Field(
38
41
  default=None,
39
- description="Retrieve the file from an URL if not present on disk."
42
+ description="Retrieve the file from an URL if not present on disk.",
40
43
  )
44
+
41
45
  cache: bool = Field(
42
46
  default=False,
43
- description="If False, read from source, if True, read from fast 'h5ad' cache."
47
+ description="If False, read from source, if True, read from fast 'h5ad' cache.",
44
48
  )
45
- cache_compression: Literal['gzip', 'lzf'] = Field(
49
+
50
+ cache_compression: Optional[Literal["gzip", "lzf"]] = Field(
46
51
  default=None,
47
- description="See the h5py dataset_compression. (Default: settings.cache_compression)"
52
+ description="See the h5py Filter pipeline. (Default: settings.cache_compression)",
53
+ )
54
+
55
+ @field_validator("backed")
56
+ def validate_backed(cls, v: Optional[str]) -> Optional[str]:
57
+ if v is not None and v not in ["r", "r+"]:
58
+ raise ValueError("If backed is provided, it must be either 'r' or 'r+'")
59
+ return v
60
+
61
+ @field_validator("cache_compression")
62
+ def validate_cache_compression(cls, v: Optional[str]) -> Optional[str]:
63
+ if v is not None and v not in ["gzip", "lzf"]:
64
+ raise ValueError("cache_compression must be either 'gzip', 'lzf', or None")
65
+ return v
66
+
67
+
68
+ class Read10xMtxParam(BaseModel):
69
+ """Input schema for the read_10x_mtx tool."""
70
+
71
+ path: str = Field(
72
+ ...,
73
+ description="Path to directory for .mtx and .tsv files, e.g. './filtered_gene_bc_matrices/hg19/'.",
48
74
  )
49
- var_names: str = Field(
50
- default="gene_symbols",
51
- description="The variables index for 10x mtx format. Either 'gene_symbols' or 'gene_ids'."
75
+
76
+ var_names: Literal["gene_symbols", "gene_ids"] = Field(
77
+ default="gene_symbols", description="The variables index."
52
78
  )
79
+
53
80
  make_unique: bool = Field(
54
81
  default=True,
55
- description="Whether to make the variables index unique by appending '-1', '-2' etc. or not. Used for 10x mtx format."
82
+ description="Whether to make the variables index unique by appending '-1', '-2' etc. or not.",
83
+ )
84
+
85
+ cache: bool = Field(
86
+ default=False,
87
+ description="If False, read from source, if True, read from fast 'h5ad' cache.",
56
88
  )
89
+
90
+ cache_compression: Optional[Literal["gzip", "lzf"]] = Field(
91
+ default=None,
92
+ description="See the h5py Filter pipeline. (Default: settings.cache_compression)",
93
+ )
94
+
57
95
  gex_only: bool = Field(
58
96
  default=True,
59
- description="Only keep 'Gene Expression' data and ignore other feature types, e.g. 'Antibody Capture', 'CRISPR Guide Capture', or 'Custom'. Used for 10x formats."
97
+ description="Only keep 'Gene Expression' data and ignore other feature types, e.g. 'Antibody Capture', 'CRISPR Guide Capture', or 'Custom'",
60
98
  )
61
- prefix: str = Field(
99
+
100
+ prefix: Optional[str] = Field(
62
101
  default=None,
63
- description="Any prefix before matrix.mtx, genes.tsv and barcodes.tsv. For instance, if the files are named patientA_matrix.mtx, patientA_genes.tsv and patientA_barcodes.tsv the prefix is patientA_. Used for 10x mtx format."
102
+ description="Any prefix before matrix.mtx, genes.tsv and barcodes.tsv. For instance, if the files are named patientA_matrix.mtx, patientA_genes.tsv and patientA_barcodes.tsv the prefix is patientA_. (Default: no prefix)",
64
103
  )
65
-
66
- @field_validator('backed')
67
- def validate_backed(cls, v: Optional[str]) -> Optional[str]:
68
- if v is not None and v not in ['r', 'r+']:
69
- raise ValueError("If backed is provided, it must be either 'r' or 'r+'")
104
+
105
+ @field_validator("path")
106
+ def validate_path(cls, v: str) -> str:
107
+ """Validate path is not empty"""
108
+ if not v.strip():
109
+ raise ValueError("path cannot be empty")
110
+ return v
111
+
112
+ @field_validator("var_names")
113
+ def validate_var_names(cls, v: str) -> str:
114
+ """Validate var_names is supported"""
115
+ if v not in ["gene_symbols", "gene_ids"]:
116
+ raise ValueError("var_names must be either 'gene_symbols' or 'gene_ids'")
70
117
  return v
71
-
72
- @field_validator('cache_compression')
118
+
119
+ @field_validator("cache_compression")
73
120
  def validate_cache_compression(cls, v: Optional[str]) -> Optional[str]:
74
- if v is not None and v not in ['gzip', 'lzf']:
121
+ """Validate cache_compression is supported if provided"""
122
+ if v is not None and v not in ["gzip", "lzf"]:
75
123
  raise ValueError("cache_compression must be either 'gzip', 'lzf', or None")
76
124
  return v
77
-
78
- @field_validator('var_names')
79
- def validate_var_names(cls, v: Optional[str]) -> Optional[str]:
80
- if v is not None and v not in ['gene_symbols', 'gene_ids']:
81
- raise ValueError("var_names must be either 'gene_symbols' or 'gene_ids'")
82
- return v
83
125
 
84
126
 
85
- class WriteParams(BaseModel):
127
+ class WriteParam(BaseModel):
86
128
  """Input schema for the write tool."""
129
+
130
+ adata: str = Field(..., description="The AnnData object variable name.")
87
131
  filename: str = Field(
88
132
  description="Path to save the file. If no extension is provided, the default format will be used."
89
133
  )
90
- ext: Literal['h5', 'csv', 'txt', 'npz'] = Field(
134
+ ext: Literal["h5", "csv", "txt", "npz"] = Field(
91
135
  default=None,
92
- description="File extension to infer file format. If None, defaults to scanpy's settings.file_format_data."
136
+ description="File extension to infer file format. If None, defaults to scanpy's settings.file_format_data.",
93
137
  )
94
- compression: Literal['gzip', 'lzf'] = Field(
95
- default='gzip',
96
- description="Compression format for h5 files."
138
+ compression: Literal["gzip", "lzf"] = Field(
139
+ default="gzip", description="Compression format for h5 files."
97
140
  )
98
141
  compression_opts: int = Field(
99
- default=None,
100
- description="Compression options for h5 files."
142
+ default=None, description="Compression options for h5 files."
101
143
  )
102
-
103
- @field_validator('filename')
144
+
145
+ @field_validator("filename")
104
146
  def validate_filename(cls, v: str) -> str:
105
147
  # Allow any filename since the extension is optional and can be inferred
106
148
  return v
107
-
108
- @model_validator(mode='after')
109
- def validate_extension_compression(self) -> 'WriteModel':
149
+
150
+ @model_validator(mode="after")
151
+ def validate_extension_compression(self) -> "WriteParam":
110
152
  # If ext is provided and not h5, compression should be None
111
- if self.ext is not None and self.ext != 'h5' and self.compression is not None:
153
+ if self.ext is not None and self.ext != "h5" and self.compression is not None:
112
154
  raise ValueError("Compression can only be used with h5 files")
113
155
  return self