scitex 2.14.0__py3-none-any.whl → 2.15.2__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 (300) hide show
  1. scitex/__init__.py +71 -17
  2. scitex/_env_loader.py +156 -0
  3. scitex/_mcp_resources/__init__.py +37 -0
  4. scitex/_mcp_resources/_cheatsheet.py +135 -0
  5. scitex/_mcp_resources/_figrecipe.py +138 -0
  6. scitex/_mcp_resources/_formats.py +102 -0
  7. scitex/_mcp_resources/_modules.py +337 -0
  8. scitex/_mcp_resources/_session.py +149 -0
  9. scitex/_mcp_tools/__init__.py +4 -0
  10. scitex/_mcp_tools/audio.py +66 -0
  11. scitex/_mcp_tools/diagram.py +11 -95
  12. scitex/_mcp_tools/introspect.py +210 -0
  13. scitex/_mcp_tools/plt.py +260 -305
  14. scitex/_mcp_tools/scholar.py +74 -0
  15. scitex/_mcp_tools/social.py +244 -0
  16. scitex/_mcp_tools/template.py +24 -0
  17. scitex/_mcp_tools/writer.py +21 -204
  18. scitex/ai/_gen_ai/_PARAMS.py +10 -7
  19. scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
  20. scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
  21. scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
  22. scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
  23. scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
  24. scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
  25. scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
  26. scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
  27. scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
  28. scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
  29. scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
  30. scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
  31. scitex/audio/README.md +40 -36
  32. scitex/audio/__init__.py +129 -61
  33. scitex/audio/_branding.py +185 -0
  34. scitex/audio/_mcp/__init__.py +32 -0
  35. scitex/audio/_mcp/handlers.py +59 -6
  36. scitex/audio/_mcp/speak_handlers.py +238 -0
  37. scitex/audio/_relay.py +225 -0
  38. scitex/audio/_tts.py +18 -10
  39. scitex/audio/engines/base.py +17 -10
  40. scitex/audio/engines/elevenlabs_engine.py +7 -2
  41. scitex/audio/mcp_server.py +228 -75
  42. scitex/canvas/README.md +1 -1
  43. scitex/canvas/editor/_dearpygui/__init__.py +25 -0
  44. scitex/canvas/editor/_dearpygui/_editor.py +147 -0
  45. scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
  46. scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
  47. scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
  48. scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
  49. scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
  50. scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
  51. scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
  52. scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
  53. scitex/canvas/editor/_dearpygui/_selection.py +295 -0
  54. scitex/canvas/editor/_dearpygui/_state.py +93 -0
  55. scitex/canvas/editor/_dearpygui/_utils.py +61 -0
  56. scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
  57. scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
  58. scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
  59. scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
  60. scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
  61. scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
  62. scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
  63. scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
  64. scitex/canvas/editor/flask_editor/_core.py +25 -1684
  65. scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
  66. scitex/cli/__init__.py +38 -43
  67. scitex/cli/audio.py +76 -27
  68. scitex/cli/capture.py +13 -20
  69. scitex/cli/introspect.py +481 -0
  70. scitex/cli/main.py +200 -109
  71. scitex/cli/mcp.py +60 -34
  72. scitex/cli/plt.py +357 -0
  73. scitex/cli/repro.py +15 -8
  74. scitex/cli/resource.py +15 -8
  75. scitex/cli/scholar/__init__.py +23 -8
  76. scitex/cli/scholar/_crossref_scitex.py +296 -0
  77. scitex/cli/scholar/_fetch.py +25 -3
  78. scitex/cli/social.py +314 -0
  79. scitex/cli/stats.py +15 -8
  80. scitex/cli/template.py +129 -12
  81. scitex/cli/tex.py +15 -8
  82. scitex/cli/writer.py +132 -8
  83. scitex/cloud/__init__.py +41 -2
  84. scitex/config/README.md +1 -1
  85. scitex/config/__init__.py +16 -2
  86. scitex/config/_env_registry.py +256 -0
  87. scitex/context/__init__.py +22 -0
  88. scitex/dev/__init__.py +20 -1
  89. scitex/diagram/__init__.py +42 -19
  90. scitex/diagram/mcp_server.py +13 -125
  91. scitex/gen/__init__.py +50 -14
  92. scitex/gen/_list_packages.py +4 -4
  93. scitex/introspect/__init__.py +82 -0
  94. scitex/introspect/_call_graph.py +303 -0
  95. scitex/introspect/_class_hierarchy.py +163 -0
  96. scitex/introspect/_core.py +41 -0
  97. scitex/introspect/_docstring.py +131 -0
  98. scitex/introspect/_examples.py +113 -0
  99. scitex/introspect/_imports.py +271 -0
  100. scitex/{gen/_inspect_module.py → introspect/_list_api.py} +43 -54
  101. scitex/introspect/_mcp/__init__.py +41 -0
  102. scitex/introspect/_mcp/handlers.py +233 -0
  103. scitex/introspect/_members.py +155 -0
  104. scitex/introspect/_resolve.py +89 -0
  105. scitex/introspect/_signature.py +131 -0
  106. scitex/introspect/_source.py +80 -0
  107. scitex/introspect/_type_hints.py +172 -0
  108. scitex/io/_save.py +1 -2
  109. scitex/io/bundle/README.md +1 -1
  110. scitex/logging/_formatters.py +19 -9
  111. scitex/mcp_server.py +98 -5
  112. scitex/os/__init__.py +4 -0
  113. scitex/{gen → os}/_check_host.py +4 -5
  114. scitex/plt/__init__.py +245 -550
  115. scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
  116. scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  117. scitex/plt/gallery/README.md +1 -1
  118. scitex/plt/utils/_hitmap/__init__.py +82 -0
  119. scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
  120. scitex/plt/utils/_hitmap/_color_application.py +346 -0
  121. scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
  122. scitex/plt/utils/_hitmap/_constants.py +40 -0
  123. scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
  124. scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
  125. scitex/plt/utils/_hitmap/_query.py +113 -0
  126. scitex/plt/utils/_hitmap.py +46 -1616
  127. scitex/plt/utils/_metadata/__init__.py +80 -0
  128. scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
  129. scitex/plt/utils/_metadata/_artists/_base.py +195 -0
  130. scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
  131. scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
  132. scitex/plt/utils/_metadata/_artists/_images.py +80 -0
  133. scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
  134. scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
  135. scitex/plt/utils/_metadata/_artists/_text.py +106 -0
  136. scitex/plt/utils/_metadata/_csv.py +416 -0
  137. scitex/plt/utils/_metadata/_detect.py +225 -0
  138. scitex/plt/utils/_metadata/_legend.py +127 -0
  139. scitex/plt/utils/_metadata/_rounding.py +117 -0
  140. scitex/plt/utils/_metadata/_verification.py +202 -0
  141. scitex/schema/README.md +1 -1
  142. scitex/scholar/__init__.py +8 -0
  143. scitex/scholar/_mcp/crossref_handlers.py +265 -0
  144. scitex/scholar/core/Scholar.py +63 -1700
  145. scitex/scholar/core/_mixins/__init__.py +36 -0
  146. scitex/scholar/core/_mixins/_enrichers.py +270 -0
  147. scitex/scholar/core/_mixins/_library_handlers.py +100 -0
  148. scitex/scholar/core/_mixins/_loaders.py +103 -0
  149. scitex/scholar/core/_mixins/_pdf_download.py +375 -0
  150. scitex/scholar/core/_mixins/_pipeline.py +312 -0
  151. scitex/scholar/core/_mixins/_project_handlers.py +125 -0
  152. scitex/scholar/core/_mixins/_savers.py +69 -0
  153. scitex/scholar/core/_mixins/_search.py +103 -0
  154. scitex/scholar/core/_mixins/_services.py +88 -0
  155. scitex/scholar/core/_mixins/_url_finding.py +105 -0
  156. scitex/scholar/crossref_scitex.py +367 -0
  157. scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  158. scitex/scholar/examples/00_run_all.sh +120 -0
  159. scitex/scholar/jobs/_executors.py +27 -3
  160. scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
  161. scitex/scholar/pdf_download/_cli.py +154 -0
  162. scitex/scholar/pdf_download/strategies/__init__.py +11 -8
  163. scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
  164. scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
  165. scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
  166. scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
  167. scitex/scholar/pipelines/_single_steps.py +71 -36
  168. scitex/scholar/storage/_LibraryManager.py +97 -1695
  169. scitex/scholar/storage/_mixins/__init__.py +30 -0
  170. scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
  171. scitex/scholar/storage/_mixins/_library_operations.py +218 -0
  172. scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
  173. scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
  174. scitex/scholar/storage/_mixins/_resolution.py +376 -0
  175. scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
  176. scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
  177. scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
  178. scitex/scholar/url_finder/.tmp/open_url/README.md +223 -0
  179. scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +694 -0
  180. scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +1160 -0
  181. scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +344 -0
  182. scitex/scholar/url_finder/.tmp/open_url/__init__.py +24 -0
  183. scitex/security/README.md +3 -3
  184. scitex/session/README.md +1 -1
  185. scitex/session/__init__.py +26 -7
  186. scitex/session/_decorator.py +1 -1
  187. scitex/sh/README.md +1 -1
  188. scitex/sh/__init__.py +7 -4
  189. scitex/social/__init__.py +155 -0
  190. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  191. scitex/stats/_mcp/_handlers/__init__.py +31 -0
  192. scitex/stats/_mcp/_handlers/_corrections.py +113 -0
  193. scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
  194. scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
  195. scitex/stats/_mcp/_handlers/_format.py +94 -0
  196. scitex/stats/_mcp/_handlers/_normality.py +110 -0
  197. scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
  198. scitex/stats/_mcp/_handlers/_power.py +247 -0
  199. scitex/stats/_mcp/_handlers/_recommend.py +102 -0
  200. scitex/stats/_mcp/_handlers/_run_test.py +279 -0
  201. scitex/stats/_mcp/_handlers/_stars.py +48 -0
  202. scitex/stats/_mcp/handlers.py +19 -1171
  203. scitex/stats/auto/_stat_style.py +175 -0
  204. scitex/stats/auto/_style_definitions.py +411 -0
  205. scitex/stats/auto/_styles.py +22 -620
  206. scitex/stats/descriptive/__init__.py +11 -8
  207. scitex/stats/descriptive/_ci.py +39 -0
  208. scitex/stats/power/_power.py +15 -4
  209. scitex/str/__init__.py +2 -1
  210. scitex/str/_title_case.py +63 -0
  211. scitex/template/README.md +1 -1
  212. scitex/template/__init__.py +25 -10
  213. scitex/template/_code_templates.py +147 -0
  214. scitex/template/_mcp/handlers.py +81 -0
  215. scitex/template/_mcp/tool_schemas.py +55 -0
  216. scitex/template/_templates/__init__.py +51 -0
  217. scitex/template/_templates/audio.py +233 -0
  218. scitex/template/_templates/canvas.py +312 -0
  219. scitex/template/_templates/capture.py +268 -0
  220. scitex/template/_templates/config.py +43 -0
  221. scitex/template/_templates/diagram.py +294 -0
  222. scitex/template/_templates/io.py +107 -0
  223. scitex/template/_templates/module.py +53 -0
  224. scitex/template/_templates/plt.py +202 -0
  225. scitex/template/_templates/scholar.py +267 -0
  226. scitex/template/_templates/session.py +130 -0
  227. scitex/template/_templates/session_minimal.py +43 -0
  228. scitex/template/_templates/session_plot.py +67 -0
  229. scitex/template/_templates/session_stats.py +77 -0
  230. scitex/template/_templates/stats.py +323 -0
  231. scitex/template/_templates/writer.py +296 -0
  232. scitex/template/clone_writer_directory.py +5 -5
  233. scitex/ui/_backends/_email.py +10 -2
  234. scitex/ui/_backends/_webhook.py +5 -1
  235. scitex/web/_search_pubmed.py +10 -6
  236. scitex/writer/README.md +1 -1
  237. scitex/writer/_mcp/handlers.py +11 -744
  238. scitex/writer/_mcp/tool_schemas.py +5 -335
  239. scitex-2.15.2.dist-info/METADATA +648 -0
  240. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/RECORD +246 -150
  241. scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
  242. scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
  243. scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +0 -90
  244. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +0 -1571
  245. scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +0 -6262
  246. scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +0 -1274
  247. scitex/dev/plt/data/mpl/dir_ax.txt +0 -459
  248. scitex/diagram/_compile.py +0 -312
  249. scitex/diagram/_diagram.py +0 -355
  250. scitex/diagram/_mcp/__init__.py +0 -4
  251. scitex/diagram/_mcp/handlers.py +0 -400
  252. scitex/diagram/_mcp/tool_schemas.py +0 -157
  253. scitex/diagram/_presets.py +0 -173
  254. scitex/diagram/_schema.py +0 -182
  255. scitex/diagram/_split.py +0 -278
  256. scitex/gen/_ci.py +0 -12
  257. scitex/gen/_title_case.py +0 -89
  258. scitex/plt/_mcp/__init__.py +0 -4
  259. scitex/plt/_mcp/_handlers_annotation.py +0 -102
  260. scitex/plt/_mcp/_handlers_figure.py +0 -195
  261. scitex/plt/_mcp/_handlers_plot.py +0 -252
  262. scitex/plt/_mcp/_handlers_style.py +0 -219
  263. scitex/plt/_mcp/handlers.py +0 -74
  264. scitex/plt/_mcp/tool_schemas.py +0 -497
  265. scitex/plt/mcp_server.py +0 -231
  266. scitex/scholar/data/.gitkeep +0 -0
  267. scitex/scholar/data/README.md +0 -44
  268. scitex/scholar/data/bib_files/bibliography.bib +0 -1952
  269. scitex/scholar/data/bib_files/neurovista.bib +0 -277
  270. scitex/scholar/data/bib_files/neurovista_enriched.bib +0 -441
  271. scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +0 -441
  272. scitex/scholar/data/bib_files/neurovista_processed.bib +0 -338
  273. scitex/scholar/data/bib_files/openaccess.bib +0 -89
  274. scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +0 -2178
  275. scitex/scholar/data/bib_files/pac.bib +0 -698
  276. scitex/scholar/data/bib_files/pac_enriched.bib +0 -1061
  277. scitex/scholar/data/bib_files/pac_processed.bib +0 -0
  278. scitex/scholar/data/bib_files/pac_titles.txt +0 -75
  279. scitex/scholar/data/bib_files/paywalled.bib +0 -98
  280. scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +0 -58
  281. scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +0 -87
  282. scitex/scholar/data/bib_files/seizure_prediction.bib +0 -694
  283. scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
  284. scitex/scholar/data/bib_files/test_complete_enriched.bib +0 -437
  285. scitex/scholar/data/bib_files/test_final_enriched.bib +0 -437
  286. scitex/scholar/data/bib_files/test_seizure.bib +0 -46
  287. scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
  288. scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
  289. scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
  290. scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
  291. scitex/scholar/data/impact_factor.db +0 -0
  292. scitex/scholar/examples/SUGGESTIONS.md +0 -865
  293. scitex/scholar/examples/dev.py +0 -38
  294. scitex-2.14.0.dist-info/METADATA +0 -1238
  295. /scitex/{gen → context}/_detect_environment.py +0 -0
  296. /scitex/{gen → context}/_get_notebook_path.py +0 -0
  297. /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
  298. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/WHEEL +0 -0
  299. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/entry_points.txt +0 -0
  300. {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-25
3
+ # File: src/scitex/template/_templates/audio.py
4
+ # ----------------------------------------
5
+
6
+ """Template for stx.audio text-to-speech module usage."""
7
+
8
+ TEMPLATE = {
9
+ "name": "Audio Module",
10
+ "description": "stx.audio usage for text-to-speech with multiple backends (pyttsx3, gTTS, ElevenLabs)",
11
+ "filename": "audio_script.py",
12
+ "priority": 5,
13
+ "content": '''#!/usr/bin/env python3
14
+ # -*- coding: utf-8 -*-
15
+ # Timestamp: {timestamp}
16
+ # File: {filepath}
17
+
18
+ """
19
+ stx.audio - Text-to-Speech
20
+ ==========================
21
+
22
+ stx.audio provides:
23
+ - Multiple TTS backends (pyttsx3, gTTS, ElevenLabs)
24
+ - Automatic fallback between backends
25
+ - Local and relay playback modes
26
+ - Audio generation and caching
27
+ - Agent identification for multi-agent workflows
28
+
29
+ Usage Patterns
30
+ --------------
31
+ 1. MCP: audio_speak, audio_speak_local, audio_speak_relay
32
+ 2. Python API: stx.audio.speak()
33
+ 3. Environment: SCITEX_AUDIO_* variables
34
+
35
+ Backends
36
+ --------
37
+ - pyttsx3: Offline, fast, robotic voice
38
+ - gtts: Google TTS, natural voice, requires internet
39
+ - elevenlabs: Premium quality, requires API key
40
+ """
41
+
42
+ import scitex as stx
43
+
44
+ # ============================================================
45
+ # Pattern 1: Basic TTS (via MCP - Recommended)
46
+ # ============================================================
47
+
48
+ """
49
+ MCP Tools for Claude Code:
50
+ --------------------------
51
+
52
+ # Basic speech (auto-selects backend)
53
+ audio_speak(text="Hello, I completed the task")
54
+
55
+ # With specific backend
56
+ audio_speak(text="Processing complete", backend="gtts")
57
+
58
+ # With agent identification
59
+ audio_speak(text="Analysis done", agent_id="analyzer-1")
60
+
61
+ # Local playback (when MCP server is local)
62
+ audio_speak_local(text="Local notification")
63
+
64
+ # Relay playback (when MCP server is remote, audio plays on client)
65
+ audio_speak_relay(text="Remote notification")
66
+
67
+ # List available backends
68
+ audio_list_backends()
69
+
70
+ # Check audio status
71
+ audio_check_audio_status()
72
+ """
73
+
74
+ # ============================================================
75
+ # Pattern 2: Python API Usage
76
+ # ============================================================
77
+
78
+ def python_api_example():
79
+ """Direct Python API for TTS."""
80
+ from scitex.audio import speak, list_backends, check_audio_status
81
+
82
+ # Basic speech
83
+ speak("Hello from SciTeX")
84
+
85
+ # With options
86
+ speak(
87
+ text="Processing completed successfully",
88
+ backend="gtts", # or "pyttsx3", "elevenlabs"
89
+ speed=1.5, # Playback speed multiplier
90
+ wait=True, # Wait for completion
91
+ save=False, # Don't save audio file
92
+ )
93
+
94
+ # With agent identification (for multi-agent workflows)
95
+ speak(
96
+ text="Agent Alpha reporting",
97
+ agent_id="alpha",
98
+ signature=True # Add agent signature sound
99
+ )
100
+
101
+ # List available backends
102
+ backends = list_backends()
103
+ print(f"Available: {{backends}}")
104
+
105
+ # Check audio system status
106
+ status = check_audio_status()
107
+ print(f"Audio status: {{status}}")
108
+
109
+ # ============================================================
110
+ # Pattern 3: Audio Generation (Save to File)
111
+ # ============================================================
112
+
113
+ def generate_audio_example():
114
+ """Generate audio files without playing."""
115
+ from scitex.audio import generate_audio
116
+
117
+ # Generate audio file
118
+ result = generate_audio(
119
+ text="This is a test message",
120
+ output_path="notification.mp3",
121
+ backend="gtts"
122
+ )
123
+ print(f"Audio saved to: {{result['path']}}")
124
+
125
+ # Generate and get base64 (for embedding)
126
+ result_b64 = generate_audio(
127
+ text="Embedded audio",
128
+ return_base64=True
129
+ )
130
+ # result_b64['base64'] contains the audio data
131
+
132
+ # ============================================================
133
+ # Pattern 4: With @stx.session
134
+ # ============================================================
135
+
136
+ @stx.session
137
+ def main(
138
+ message="Analysis complete",
139
+ CONFIG=stx.INJECTED,
140
+ logger=stx.INJECTED,
141
+ ):
142
+ """Session with audio notifications."""
143
+ from scitex.audio import speak
144
+
145
+ logger.info("Starting analysis...")
146
+
147
+ # Do some work
148
+ import time
149
+ time.sleep(1)
150
+
151
+ # Notify via audio when done
152
+ speak(
153
+ text=f"{{message}}. Results saved to {{CONFIG.SDIR_OUT}}",
154
+ speed=1.5,
155
+ wait=True
156
+ )
157
+
158
+ logger.info("Done")
159
+ return 0
160
+
161
+ # ============================================================
162
+ # Pattern 5: Environment Configuration
163
+ # ============================================================
164
+
165
+ """
166
+ Environment Variables:
167
+ ----------------------
168
+ SCITEX_AUDIO_BACKEND=gtts # Default backend
169
+ SCITEX_AUDIO_SPEED=1.5 # Default playback speed
170
+ SCITEX_AUDIO_VOICE=en # Voice/language
171
+ SCITEX_AUDIO_ELEVENLABS_KEY=xxx # ElevenLabs API key
172
+ SCITEX_AUDIO_RELAY_URL=http://... # Relay server URL
173
+ """
174
+
175
+ # ============================================================
176
+ # Pattern 6: Multi-Agent Workflows
177
+ # ============================================================
178
+
179
+ """
180
+ Agent Identification:
181
+ ---------------------
182
+ In multi-agent workflows, each agent can identify itself:
183
+
184
+ # Agent 1 (Architect)
185
+ audio_speak(text="Architecture plan ready", agent_id="architect")
186
+
187
+ # Agent 2 (Developer)
188
+ audio_speak(text="Implementation complete", agent_id="developer")
189
+
190
+ # Agent 3 (Tester)
191
+ audio_speak(text="All tests passing", agent_id="tester")
192
+
193
+ The agent_id helps distinguish which agent is speaking,
194
+ especially useful when running concurrent agents.
195
+ """
196
+
197
+ # ============================================================
198
+ # MCP Tools Reference
199
+ # ============================================================
200
+
201
+ """
202
+ MCP Tools:
203
+ ----------
204
+
205
+ Speech:
206
+ - audio_speak(text, backend, speed, agent_id)
207
+ - audio_speak_local(text, ...) # Play on server
208
+ - audio_speak_relay(text, ...) # Play on client via relay
209
+
210
+ Generation:
211
+ - audio_generate_audio(text, output_path, backend)
212
+ - audio_play_audio(path)
213
+
214
+ Management:
215
+ - audio_list_backends()
216
+ - audio_list_voices(backend)
217
+ - audio_check_audio_status()
218
+ - audio_speech_queue_status()
219
+ - audio_list_audio_files(limit)
220
+ - audio_clear_audio_cache(max_age_hours)
221
+
222
+ Context:
223
+ - audio_announce_context() # Announce cwd and git branch
224
+ """
225
+
226
+ if __name__ == "__main__":
227
+ main()
228
+ ''',
229
+ }
230
+
231
+ __all__ = ["TEMPLATE"]
232
+
233
+ # EOF
@@ -0,0 +1,312 @@
1
+ #!/usr/bin/env python3
2
+ # Timestamp: 2026-01-25
3
+ # File: src/scitex/template/_templates/canvas.py
4
+ # ----------------------------------------
5
+
6
+ """Template for stx.canvas figure composition module usage."""
7
+
8
+ TEMPLATE = {
9
+ "name": "Canvas Module",
10
+ "description": "stx.canvas usage for composing multi-panel figures with panel labels",
11
+ "filename": "canvas_script.py",
12
+ "priority": 8,
13
+ "content": '''#!/usr/bin/env python3
14
+ # -*- coding: utf-8 -*-
15
+ # Timestamp: {timestamp}
16
+ # File: {filepath}
17
+
18
+ """
19
+ stx.canvas - Figure Composition
20
+ ===============================
21
+
22
+ stx.canvas provides:
23
+ - Multi-panel figure composition
24
+ - Automatic panel labels (A, B, C, ...)
25
+ - Millimeter-based positioning
26
+ - Export to PNG, PDF, SVG
27
+
28
+ For single figures: use stx.plt
29
+ For composed figures: use stx.canvas
30
+
31
+ Usage Patterns
32
+ --------------
33
+ 1. MCP: canvas_* tools for Claude Code integration
34
+ 2. Python API: stx.canvas.* functions
35
+ 3. Common for: paper figures with multiple panels
36
+ """
37
+
38
+ import scitex as stx
39
+
40
+ # ============================================================
41
+ # Pattern 1: Basic Composition (via MCP)
42
+ # ============================================================
43
+
44
+ """
45
+ MCP Tools for Claude Code:
46
+ --------------------------
47
+
48
+ # Create a new canvas
49
+ canvas_create_canvas(
50
+ parent_dir="/path/to/project",
51
+ canvas_name="figure1",
52
+ width_mm=180, # Single column width
53
+ height_mm=120
54
+ )
55
+
56
+ # Add panels from images
57
+ canvas_add_panel(
58
+ parent_dir="/path/to/project",
59
+ canvas_name="figure1",
60
+ panel_name="panel_a",
61
+ source="/path/to/plot1.png",
62
+ x_mm=0,
63
+ y_mm=0,
64
+ width_mm=85,
65
+ height_mm=60,
66
+ label="A"
67
+ )
68
+
69
+ canvas_add_panel(
70
+ parent_dir="/path/to/project",
71
+ canvas_name="figure1",
72
+ panel_name="panel_b",
73
+ source="/path/to/plot2.png",
74
+ x_mm=90,
75
+ y_mm=0,
76
+ width_mm=85,
77
+ height_mm=60,
78
+ label="B"
79
+ )
80
+
81
+ # List panels
82
+ canvas_list_panels(
83
+ parent_dir="/path/to/project",
84
+ canvas_name="figure1"
85
+ )
86
+
87
+ # Export canvas
88
+ canvas_export_canvas(
89
+ parent_dir="/path/to/project",
90
+ canvas_name="figure1",
91
+ format="png", # png, pdf, svg
92
+ dpi=300
93
+ )
94
+ """
95
+
96
+ # ============================================================
97
+ # Pattern 2: Common Paper Figure Layouts
98
+ # ============================================================
99
+
100
+ """
101
+ Journal-Specific Widths:
102
+ ------------------------
103
+ Single column: 85-90 mm (Nature, Science)
104
+ 1.5 column: 114 mm
105
+ Double column: 170-180 mm
106
+ Full page: 210 mm (A4)
107
+
108
+ Common Layouts:
109
+ ---------------
110
+
111
+ # 2-panel horizontal (A | B)
112
+ Panel A: x=0, y=0, w=85, h=60
113
+ Panel B: x=90, y=0, w=85, h=60
114
+ Canvas: w=180, h=60
115
+
116
+ # 2-panel vertical (A over B)
117
+ Panel A: x=0, y=0, w=85, h=55
118
+ Panel B: x=0, y=60, w=85, h=55
119
+ Canvas: w=85, h=120
120
+
121
+ # 4-panel grid (2x2)
122
+ Panel A: x=0, y=0, w=85, h=55
123
+ Panel B: x=90, y=0, w=85, h=55
124
+ Panel C: x=0, y=60, w=85, h=55
125
+ Panel D: x=90, y=60, w=85, h=55
126
+ Canvas: w=180, h=120
127
+ """
128
+
129
+ # ============================================================
130
+ # Pattern 3: Python API Usage
131
+ # ============================================================
132
+
133
+ def python_api_example():
134
+ """Direct Python API for canvas."""
135
+ from scitex.canvas import (
136
+ create_canvas,
137
+ add_panel,
138
+ list_panels,
139
+ export_canvas,
140
+ remove_panel,
141
+ )
142
+
143
+ # Create canvas
144
+ create_canvas(
145
+ parent_dir="./figures",
146
+ canvas_name="fig1",
147
+ width_mm=180,
148
+ height_mm=120
149
+ )
150
+
151
+ # Add panels
152
+ add_panel(
153
+ parent_dir="./figures",
154
+ canvas_name="fig1",
155
+ panel_name="scatter",
156
+ source="./plots/scatter.png",
157
+ x_mm=0, y_mm=0,
158
+ width_mm=85, height_mm=55,
159
+ label="A"
160
+ )
161
+
162
+ add_panel(
163
+ parent_dir="./figures",
164
+ canvas_name="fig1",
165
+ panel_name="histogram",
166
+ source="./plots/histogram.png",
167
+ x_mm=90, y_mm=0,
168
+ width_mm=85, height_mm=55,
169
+ label="B"
170
+ )
171
+
172
+ # List current panels
173
+ panels = list_panels(
174
+ parent_dir="./figures",
175
+ canvas_name="fig1"
176
+ )
177
+ print(f"Panels: {{panels}}")
178
+
179
+ # Export
180
+ export_canvas(
181
+ parent_dir="./figures",
182
+ canvas_name="fig1",
183
+ format="png",
184
+ dpi=300
185
+ )
186
+
187
+ # ============================================================
188
+ # Pattern 4: With @stx.session
189
+ # ============================================================
190
+
191
+ @stx.session
192
+ def main(
193
+ CONFIG=stx.INJECTED,
194
+ plt=stx.INJECTED,
195
+ logger=stx.INJECTED,
196
+ ):
197
+ """Create composed figure for paper."""
198
+ import numpy as np
199
+ from scitex.canvas import (
200
+ create_canvas,
201
+ add_panel,
202
+ export_canvas,
203
+ )
204
+
205
+ # Generate individual plots first
206
+ plots_dir = CONFIG.SDIR_OUT / "plots"
207
+ plots_dir.mkdir(exist_ok=True)
208
+
209
+ # Plot 1: Scatter
210
+ fig, ax = plt.subplots(figsize=(4, 3))
211
+ x = np.random.randn(100)
212
+ y = 2*x + np.random.randn(100)*0.5
213
+ ax.scatter(x, y, alpha=0.6)
214
+ ax.set_xyt("X", "Y", "Correlation")
215
+ stx.io.save(fig, plots_dir / "scatter.png")
216
+
217
+ # Plot 2: Histogram
218
+ fig, ax = plt.subplots(figsize=(4, 3))
219
+ ax.hist(np.random.randn(500), bins=30, edgecolor='black')
220
+ ax.set_xyt("Value", "Count", "Distribution")
221
+ stx.io.save(fig, plots_dir / "histogram.png")
222
+
223
+ # Plot 3: Time series
224
+ fig, ax = plt.subplots(figsize=(4, 3))
225
+ t = np.linspace(0, 10, 200)
226
+ ax.plot(t, np.sin(t) + np.random.randn(200)*0.1)
227
+ ax.set_xyt("Time (s)", "Amplitude", "Signal")
228
+ stx.io.save(fig, plots_dir / "timeseries.png")
229
+
230
+ # Create canvas and compose
231
+ canvas_dir = CONFIG.SDIR_OUT / "canvas"
232
+ canvas_dir.mkdir(exist_ok=True)
233
+
234
+ create_canvas(
235
+ parent_dir=str(canvas_dir),
236
+ canvas_name="figure1",
237
+ width_mm=180,
238
+ height_mm=120
239
+ )
240
+
241
+ # Add panels
242
+ add_panel(
243
+ parent_dir=str(canvas_dir),
244
+ canvas_name="figure1",
245
+ panel_name="scatter",
246
+ source=str(plots_dir / "scatter.png"),
247
+ x_mm=0, y_mm=0,
248
+ width_mm=85, height_mm=55,
249
+ label="A"
250
+ )
251
+
252
+ add_panel(
253
+ parent_dir=str(canvas_dir),
254
+ canvas_name="figure1",
255
+ panel_name="histogram",
256
+ source=str(plots_dir / "histogram.png"),
257
+ x_mm=90, y_mm=0,
258
+ width_mm=85, height_mm=55,
259
+ label="B"
260
+ )
261
+
262
+ add_panel(
263
+ parent_dir=str(canvas_dir),
264
+ canvas_name="figure1",
265
+ panel_name="timeseries",
266
+ source=str(plots_dir / "timeseries.png"),
267
+ x_mm=0, y_mm=60,
268
+ width_mm=180, height_mm=55,
269
+ label="C"
270
+ )
271
+
272
+ # Export final figure
273
+ export_canvas(
274
+ parent_dir=str(canvas_dir),
275
+ canvas_name="figure1",
276
+ format="png",
277
+ dpi=300
278
+ )
279
+
280
+ logger.info(f"Figure saved to {{canvas_dir}}/figure1.png")
281
+ return 0
282
+
283
+ # ============================================================
284
+ # MCP Tools Reference
285
+ # ============================================================
286
+
287
+ """
288
+ MCP Tools:
289
+ ----------
290
+
291
+ Canvas Management:
292
+ - canvas_create_canvas(parent_dir, canvas_name, width_mm, height_mm)
293
+ - canvas_list_canvases(parent_dir)
294
+ - canvas_canvas_exists(parent_dir, canvas_name)
295
+
296
+ Panel Operations:
297
+ - canvas_add_panel(parent_dir, canvas_name, panel_name, source, x_mm, y_mm, width_mm, height_mm, label)
298
+ - canvas_list_panels(parent_dir, canvas_name)
299
+ - canvas_remove_panel(parent_dir, canvas_name, panel_name)
300
+
301
+ Export:
302
+ - canvas_export_canvas(parent_dir, canvas_name, format, dpi, output_path)
303
+ """
304
+
305
+ if __name__ == "__main__":
306
+ main()
307
+ ''',
308
+ }
309
+
310
+ __all__ = ["TEMPLATE"]
311
+
312
+ # EOF