scitex 2.14.0__py3-none-any.whl → 2.15.3__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 (264) 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 +27 -0
  16. scitex/_mcp_tools/template.py +24 -0
  17. scitex/_mcp_tools/writer.py +17 -210
  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 +160 -41
  68. scitex/cli/capture.py +133 -20
  69. scitex/cli/introspect.py +488 -0
  70. scitex/cli/main.py +200 -109
  71. scitex/cli/mcp.py +60 -34
  72. scitex/cli/plt.py +414 -0
  73. scitex/cli/repro.py +15 -8
  74. scitex/cli/resource.py +15 -8
  75. scitex/cli/scholar/__init__.py +154 -8
  76. scitex/cli/scholar/_crossref_scitex.py +296 -0
  77. scitex/cli/scholar/_fetch.py +25 -3
  78. scitex/cli/social.py +355 -0
  79. scitex/cli/stats.py +136 -11
  80. scitex/cli/template.py +129 -12
  81. scitex/cli/tex.py +15 -8
  82. scitex/cli/writer.py +49 -299
  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} +48 -56
  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/security/README.md +3 -3
  178. scitex/session/README.md +1 -1
  179. scitex/session/__init__.py +26 -7
  180. scitex/session/_decorator.py +1 -1
  181. scitex/sh/README.md +1 -1
  182. scitex/sh/__init__.py +7 -4
  183. scitex/social/__init__.py +155 -0
  184. scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
  185. scitex/stats/_mcp/_handlers/__init__.py +31 -0
  186. scitex/stats/_mcp/_handlers/_corrections.py +113 -0
  187. scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
  188. scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
  189. scitex/stats/_mcp/_handlers/_format.py +94 -0
  190. scitex/stats/_mcp/_handlers/_normality.py +110 -0
  191. scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
  192. scitex/stats/_mcp/_handlers/_power.py +247 -0
  193. scitex/stats/_mcp/_handlers/_recommend.py +102 -0
  194. scitex/stats/_mcp/_handlers/_run_test.py +279 -0
  195. scitex/stats/_mcp/_handlers/_stars.py +48 -0
  196. scitex/stats/_mcp/handlers.py +19 -1171
  197. scitex/stats/auto/_stat_style.py +175 -0
  198. scitex/stats/auto/_style_definitions.py +411 -0
  199. scitex/stats/auto/_styles.py +22 -620
  200. scitex/stats/descriptive/__init__.py +11 -8
  201. scitex/stats/descriptive/_ci.py +39 -0
  202. scitex/stats/power/_power.py +15 -4
  203. scitex/str/__init__.py +2 -1
  204. scitex/str/_title_case.py +63 -0
  205. scitex/template/README.md +1 -1
  206. scitex/template/__init__.py +25 -10
  207. scitex/template/_code_templates.py +147 -0
  208. scitex/template/_mcp/handlers.py +81 -0
  209. scitex/template/_mcp/tool_schemas.py +55 -0
  210. scitex/template/_templates/__init__.py +51 -0
  211. scitex/template/_templates/audio.py +233 -0
  212. scitex/template/_templates/canvas.py +312 -0
  213. scitex/template/_templates/capture.py +268 -0
  214. scitex/template/_templates/config.py +43 -0
  215. scitex/template/_templates/diagram.py +294 -0
  216. scitex/template/_templates/io.py +107 -0
  217. scitex/template/_templates/module.py +53 -0
  218. scitex/template/_templates/plt.py +202 -0
  219. scitex/template/_templates/scholar.py +267 -0
  220. scitex/template/_templates/session.py +130 -0
  221. scitex/template/_templates/session_minimal.py +43 -0
  222. scitex/template/_templates/session_plot.py +67 -0
  223. scitex/template/_templates/session_stats.py +77 -0
  224. scitex/template/_templates/stats.py +323 -0
  225. scitex/template/_templates/writer.py +296 -0
  226. scitex/template/clone_writer_directory.py +5 -5
  227. scitex/ui/_backends/_email.py +10 -2
  228. scitex/ui/_backends/_webhook.py +5 -1
  229. scitex/web/_search_pubmed.py +10 -6
  230. scitex/writer/README.md +1 -1
  231. scitex/writer/__init__.py +43 -34
  232. scitex/writer/_mcp/handlers.py +11 -744
  233. scitex/writer/_mcp/tool_schemas.py +5 -335
  234. scitex-2.15.3.dist-info/METADATA +667 -0
  235. {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/RECORD +241 -120
  236. scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
  237. scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
  238. scitex/diagram/_compile.py +0 -312
  239. scitex/diagram/_diagram.py +0 -355
  240. scitex/diagram/_mcp/__init__.py +0 -4
  241. scitex/diagram/_mcp/handlers.py +0 -400
  242. scitex/diagram/_mcp/tool_schemas.py +0 -157
  243. scitex/diagram/_presets.py +0 -173
  244. scitex/diagram/_schema.py +0 -182
  245. scitex/diagram/_split.py +0 -278
  246. scitex/gen/_ci.py +0 -12
  247. scitex/gen/_title_case.py +0 -89
  248. scitex/plt/_mcp/__init__.py +0 -4
  249. scitex/plt/_mcp/_handlers_annotation.py +0 -102
  250. scitex/plt/_mcp/_handlers_figure.py +0 -195
  251. scitex/plt/_mcp/_handlers_plot.py +0 -252
  252. scitex/plt/_mcp/_handlers_style.py +0 -219
  253. scitex/plt/_mcp/handlers.py +0 -74
  254. scitex/plt/_mcp/tool_schemas.py +0 -497
  255. scitex/plt/mcp_server.py +0 -231
  256. scitex/scholar/examples/SUGGESTIONS.md +0 -865
  257. scitex/scholar/examples/dev.py +0 -38
  258. scitex-2.14.0.dist-info/METADATA +0 -1238
  259. /scitex/{gen → context}/_detect_environment.py +0 -0
  260. /scitex/{gen → context}/_get_notebook_path.py +0 -0
  261. /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
  262. {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/WHEEL +0 -0
  263. {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/entry_points.txt +0 -0
  264. {scitex-2.14.0.dist-info → scitex-2.15.3.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