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.
- scitex/__init__.py +71 -17
- scitex/_env_loader.py +156 -0
- scitex/_mcp_resources/__init__.py +37 -0
- scitex/_mcp_resources/_cheatsheet.py +135 -0
- scitex/_mcp_resources/_figrecipe.py +138 -0
- scitex/_mcp_resources/_formats.py +102 -0
- scitex/_mcp_resources/_modules.py +337 -0
- scitex/_mcp_resources/_session.py +149 -0
- scitex/_mcp_tools/__init__.py +4 -0
- scitex/_mcp_tools/audio.py +66 -0
- scitex/_mcp_tools/diagram.py +11 -95
- scitex/_mcp_tools/introspect.py +210 -0
- scitex/_mcp_tools/plt.py +260 -305
- scitex/_mcp_tools/scholar.py +74 -0
- scitex/_mcp_tools/social.py +244 -0
- scitex/_mcp_tools/template.py +24 -0
- scitex/_mcp_tools/writer.py +21 -204
- scitex/ai/_gen_ai/_PARAMS.py +10 -7
- scitex/ai/classification/reporters/_SingleClassificationReporter.py +45 -1603
- scitex/ai/classification/reporters/_mixins/__init__.py +36 -0
- scitex/ai/classification/reporters/_mixins/_constants.py +67 -0
- scitex/ai/classification/reporters/_mixins/_cv_summary.py +387 -0
- scitex/ai/classification/reporters/_mixins/_feature_importance.py +119 -0
- scitex/ai/classification/reporters/_mixins/_metrics.py +275 -0
- scitex/ai/classification/reporters/_mixins/_plotting.py +179 -0
- scitex/ai/classification/reporters/_mixins/_reports.py +153 -0
- scitex/ai/classification/reporters/_mixins/_storage.py +160 -0
- scitex/ai/classification/timeseries/_TimeSeriesSlidingWindowSplit.py +30 -1550
- scitex/ai/classification/timeseries/_sliding_window_core.py +467 -0
- scitex/ai/classification/timeseries/_sliding_window_plotting.py +369 -0
- scitex/audio/README.md +40 -36
- scitex/audio/__init__.py +129 -61
- scitex/audio/_branding.py +185 -0
- scitex/audio/_mcp/__init__.py +32 -0
- scitex/audio/_mcp/handlers.py +59 -6
- scitex/audio/_mcp/speak_handlers.py +238 -0
- scitex/audio/_relay.py +225 -0
- scitex/audio/_tts.py +18 -10
- scitex/audio/engines/base.py +17 -10
- scitex/audio/engines/elevenlabs_engine.py +7 -2
- scitex/audio/mcp_server.py +228 -75
- scitex/canvas/README.md +1 -1
- scitex/canvas/editor/_dearpygui/__init__.py +25 -0
- scitex/canvas/editor/_dearpygui/_editor.py +147 -0
- scitex/canvas/editor/_dearpygui/_handlers.py +476 -0
- scitex/canvas/editor/_dearpygui/_panels/__init__.py +17 -0
- scitex/canvas/editor/_dearpygui/_panels/_control.py +119 -0
- scitex/canvas/editor/_dearpygui/_panels/_element_controls.py +190 -0
- scitex/canvas/editor/_dearpygui/_panels/_preview.py +43 -0
- scitex/canvas/editor/_dearpygui/_panels/_sections.py +390 -0
- scitex/canvas/editor/_dearpygui/_plotting.py +187 -0
- scitex/canvas/editor/_dearpygui/_rendering.py +504 -0
- scitex/canvas/editor/_dearpygui/_selection.py +295 -0
- scitex/canvas/editor/_dearpygui/_state.py +93 -0
- scitex/canvas/editor/_dearpygui/_utils.py +61 -0
- scitex/canvas/editor/flask_editor/_core/__init__.py +27 -0
- scitex/canvas/editor/flask_editor/_core/_bbox_extraction.py +200 -0
- scitex/canvas/editor/flask_editor/_core/_editor.py +173 -0
- scitex/canvas/editor/flask_editor/_core/_export_helpers.py +353 -0
- scitex/canvas/editor/flask_editor/_core/_routes_basic.py +190 -0
- scitex/canvas/editor/flask_editor/_core/_routes_export.py +332 -0
- scitex/canvas/editor/flask_editor/_core/_routes_panels.py +252 -0
- scitex/canvas/editor/flask_editor/_core/_routes_save.py +218 -0
- scitex/canvas/editor/flask_editor/_core.py +25 -1684
- scitex/canvas/editor/flask_editor/templates/__init__.py +32 -70
- scitex/cli/__init__.py +38 -43
- scitex/cli/audio.py +76 -27
- scitex/cli/capture.py +13 -20
- scitex/cli/introspect.py +481 -0
- scitex/cli/main.py +200 -109
- scitex/cli/mcp.py +60 -34
- scitex/cli/plt.py +357 -0
- scitex/cli/repro.py +15 -8
- scitex/cli/resource.py +15 -8
- scitex/cli/scholar/__init__.py +23 -8
- scitex/cli/scholar/_crossref_scitex.py +296 -0
- scitex/cli/scholar/_fetch.py +25 -3
- scitex/cli/social.py +314 -0
- scitex/cli/stats.py +15 -8
- scitex/cli/template.py +129 -12
- scitex/cli/tex.py +15 -8
- scitex/cli/writer.py +132 -8
- scitex/cloud/__init__.py +41 -2
- scitex/config/README.md +1 -1
- scitex/config/__init__.py +16 -2
- scitex/config/_env_registry.py +256 -0
- scitex/context/__init__.py +22 -0
- scitex/dev/__init__.py +20 -1
- scitex/diagram/__init__.py +42 -19
- scitex/diagram/mcp_server.py +13 -125
- scitex/gen/__init__.py +50 -14
- scitex/gen/_list_packages.py +4 -4
- scitex/introspect/__init__.py +82 -0
- scitex/introspect/_call_graph.py +303 -0
- scitex/introspect/_class_hierarchy.py +163 -0
- scitex/introspect/_core.py +41 -0
- scitex/introspect/_docstring.py +131 -0
- scitex/introspect/_examples.py +113 -0
- scitex/introspect/_imports.py +271 -0
- scitex/{gen/_inspect_module.py → introspect/_list_api.py} +43 -54
- scitex/introspect/_mcp/__init__.py +41 -0
- scitex/introspect/_mcp/handlers.py +233 -0
- scitex/introspect/_members.py +155 -0
- scitex/introspect/_resolve.py +89 -0
- scitex/introspect/_signature.py +131 -0
- scitex/introspect/_source.py +80 -0
- scitex/introspect/_type_hints.py +172 -0
- scitex/io/_save.py +1 -2
- scitex/io/bundle/README.md +1 -1
- scitex/logging/_formatters.py +19 -9
- scitex/mcp_server.py +98 -5
- scitex/os/__init__.py +4 -0
- scitex/{gen → os}/_check_host.py +4 -5
- scitex/plt/__init__.py +245 -550
- scitex/plt/_subplots/_AxisWrapperMixins/_SeabornMixin/_wrappers.py +5 -10
- scitex/plt/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/plt/gallery/README.md +1 -1
- scitex/plt/utils/_hitmap/__init__.py +82 -0
- scitex/plt/utils/_hitmap/_artist_extraction.py +343 -0
- scitex/plt/utils/_hitmap/_color_application.py +346 -0
- scitex/plt/utils/_hitmap/_color_conversion.py +121 -0
- scitex/plt/utils/_hitmap/_constants.py +40 -0
- scitex/plt/utils/_hitmap/_hitmap_core.py +334 -0
- scitex/plt/utils/_hitmap/_path_extraction.py +357 -0
- scitex/plt/utils/_hitmap/_query.py +113 -0
- scitex/plt/utils/_hitmap.py +46 -1616
- scitex/plt/utils/_metadata/__init__.py +80 -0
- scitex/plt/utils/_metadata/_artists/__init__.py +25 -0
- scitex/plt/utils/_metadata/_artists/_base.py +195 -0
- scitex/plt/utils/_metadata/_artists/_collections.py +356 -0
- scitex/plt/utils/_metadata/_artists/_extract.py +57 -0
- scitex/plt/utils/_metadata/_artists/_images.py +80 -0
- scitex/plt/utils/_metadata/_artists/_lines.py +261 -0
- scitex/plt/utils/_metadata/_artists/_patches.py +247 -0
- scitex/plt/utils/_metadata/_artists/_text.py +106 -0
- scitex/plt/utils/_metadata/_csv.py +416 -0
- scitex/plt/utils/_metadata/_detect.py +225 -0
- scitex/plt/utils/_metadata/_legend.py +127 -0
- scitex/plt/utils/_metadata/_rounding.py +117 -0
- scitex/plt/utils/_metadata/_verification.py +202 -0
- scitex/schema/README.md +1 -1
- scitex/scholar/__init__.py +8 -0
- scitex/scholar/_mcp/crossref_handlers.py +265 -0
- scitex/scholar/core/Scholar.py +63 -1700
- scitex/scholar/core/_mixins/__init__.py +36 -0
- scitex/scholar/core/_mixins/_enrichers.py +270 -0
- scitex/scholar/core/_mixins/_library_handlers.py +100 -0
- scitex/scholar/core/_mixins/_loaders.py +103 -0
- scitex/scholar/core/_mixins/_pdf_download.py +375 -0
- scitex/scholar/core/_mixins/_pipeline.py +312 -0
- scitex/scholar/core/_mixins/_project_handlers.py +125 -0
- scitex/scholar/core/_mixins/_savers.py +69 -0
- scitex/scholar/core/_mixins/_search.py +103 -0
- scitex/scholar/core/_mixins/_services.py +88 -0
- scitex/scholar/core/_mixins/_url_finding.py +105 -0
- scitex/scholar/crossref_scitex.py +367 -0
- scitex/scholar/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/scholar/examples/00_run_all.sh +120 -0
- scitex/scholar/jobs/_executors.py +27 -3
- scitex/scholar/pdf_download/ScholarPDFDownloader.py +38 -416
- scitex/scholar/pdf_download/_cli.py +154 -0
- scitex/scholar/pdf_download/strategies/__init__.py +11 -8
- scitex/scholar/pdf_download/strategies/manual_download_fallback.py +80 -3
- scitex/scholar/pipelines/ScholarPipelineBibTeX.py +73 -121
- scitex/scholar/pipelines/ScholarPipelineParallel.py +80 -138
- scitex/scholar/pipelines/ScholarPipelineSingle.py +43 -63
- scitex/scholar/pipelines/_single_steps.py +71 -36
- scitex/scholar/storage/_LibraryManager.py +97 -1695
- scitex/scholar/storage/_mixins/__init__.py +30 -0
- scitex/scholar/storage/_mixins/_bibtex_handlers.py +128 -0
- scitex/scholar/storage/_mixins/_library_operations.py +218 -0
- scitex/scholar/storage/_mixins/_metadata_conversion.py +226 -0
- scitex/scholar/storage/_mixins/_paper_saving.py +456 -0
- scitex/scholar/storage/_mixins/_resolution.py +376 -0
- scitex/scholar/storage/_mixins/_storage_helpers.py +121 -0
- scitex/scholar/storage/_mixins/_symlink_handlers.py +226 -0
- scitex/scholar/url_finder/.tmp/open_url/KNOWN_RESOLVERS.py +462 -0
- scitex/scholar/url_finder/.tmp/open_url/README.md +223 -0
- scitex/scholar/url_finder/.tmp/open_url/_DOIToURLResolver.py +694 -0
- scitex/scholar/url_finder/.tmp/open_url/_OpenURLResolver.py +1160 -0
- scitex/scholar/url_finder/.tmp/open_url/_ResolverLinkFinder.py +344 -0
- scitex/scholar/url_finder/.tmp/open_url/__init__.py +24 -0
- scitex/security/README.md +3 -3
- scitex/session/README.md +1 -1
- scitex/session/__init__.py +26 -7
- scitex/session/_decorator.py +1 -1
- scitex/sh/README.md +1 -1
- scitex/sh/__init__.py +7 -4
- scitex/social/__init__.py +155 -0
- scitex/social/docs/EXTERNAL_PACKAGE_BRANDING.md +149 -0
- scitex/stats/_mcp/_handlers/__init__.py +31 -0
- scitex/stats/_mcp/_handlers/_corrections.py +113 -0
- scitex/stats/_mcp/_handlers/_descriptive.py +78 -0
- scitex/stats/_mcp/_handlers/_effect_size.py +106 -0
- scitex/stats/_mcp/_handlers/_format.py +94 -0
- scitex/stats/_mcp/_handlers/_normality.py +110 -0
- scitex/stats/_mcp/_handlers/_posthoc.py +224 -0
- scitex/stats/_mcp/_handlers/_power.py +247 -0
- scitex/stats/_mcp/_handlers/_recommend.py +102 -0
- scitex/stats/_mcp/_handlers/_run_test.py +279 -0
- scitex/stats/_mcp/_handlers/_stars.py +48 -0
- scitex/stats/_mcp/handlers.py +19 -1171
- scitex/stats/auto/_stat_style.py +175 -0
- scitex/stats/auto/_style_definitions.py +411 -0
- scitex/stats/auto/_styles.py +22 -620
- scitex/stats/descriptive/__init__.py +11 -8
- scitex/stats/descriptive/_ci.py +39 -0
- scitex/stats/power/_power.py +15 -4
- scitex/str/__init__.py +2 -1
- scitex/str/_title_case.py +63 -0
- scitex/template/README.md +1 -1
- scitex/template/__init__.py +25 -10
- scitex/template/_code_templates.py +147 -0
- scitex/template/_mcp/handlers.py +81 -0
- scitex/template/_mcp/tool_schemas.py +55 -0
- scitex/template/_templates/__init__.py +51 -0
- scitex/template/_templates/audio.py +233 -0
- scitex/template/_templates/canvas.py +312 -0
- scitex/template/_templates/capture.py +268 -0
- scitex/template/_templates/config.py +43 -0
- scitex/template/_templates/diagram.py +294 -0
- scitex/template/_templates/io.py +107 -0
- scitex/template/_templates/module.py +53 -0
- scitex/template/_templates/plt.py +202 -0
- scitex/template/_templates/scholar.py +267 -0
- scitex/template/_templates/session.py +130 -0
- scitex/template/_templates/session_minimal.py +43 -0
- scitex/template/_templates/session_plot.py +67 -0
- scitex/template/_templates/session_stats.py +77 -0
- scitex/template/_templates/stats.py +323 -0
- scitex/template/_templates/writer.py +296 -0
- scitex/template/clone_writer_directory.py +5 -5
- scitex/ui/_backends/_email.py +10 -2
- scitex/ui/_backends/_webhook.py +5 -1
- scitex/web/_search_pubmed.py +10 -6
- scitex/writer/README.md +1 -1
- scitex/writer/_mcp/handlers.py +11 -744
- scitex/writer/_mcp/tool_schemas.py +5 -335
- scitex-2.15.2.dist-info/METADATA +648 -0
- {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/RECORD +246 -150
- scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
- scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
- scitex/dev/plt/data/mpl/PLOTTING_FUNCTIONS.yaml +0 -90
- scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES.yaml +0 -1571
- scitex/dev/plt/data/mpl/PLOTTING_SIGNATURES_DETAILED.yaml +0 -6262
- scitex/dev/plt/data/mpl/SIGNATURES_FLATTENED.yaml +0 -1274
- scitex/dev/plt/data/mpl/dir_ax.txt +0 -459
- scitex/diagram/_compile.py +0 -312
- scitex/diagram/_diagram.py +0 -355
- scitex/diagram/_mcp/__init__.py +0 -4
- scitex/diagram/_mcp/handlers.py +0 -400
- scitex/diagram/_mcp/tool_schemas.py +0 -157
- scitex/diagram/_presets.py +0 -173
- scitex/diagram/_schema.py +0 -182
- scitex/diagram/_split.py +0 -278
- scitex/gen/_ci.py +0 -12
- scitex/gen/_title_case.py +0 -89
- scitex/plt/_mcp/__init__.py +0 -4
- scitex/plt/_mcp/_handlers_annotation.py +0 -102
- scitex/plt/_mcp/_handlers_figure.py +0 -195
- scitex/plt/_mcp/_handlers_plot.py +0 -252
- scitex/plt/_mcp/_handlers_style.py +0 -219
- scitex/plt/_mcp/handlers.py +0 -74
- scitex/plt/_mcp/tool_schemas.py +0 -497
- scitex/plt/mcp_server.py +0 -231
- scitex/scholar/data/.gitkeep +0 -0
- scitex/scholar/data/README.md +0 -44
- scitex/scholar/data/bib_files/bibliography.bib +0 -1952
- scitex/scholar/data/bib_files/neurovista.bib +0 -277
- scitex/scholar/data/bib_files/neurovista_enriched.bib +0 -441
- scitex/scholar/data/bib_files/neurovista_enriched_enriched.bib +0 -441
- scitex/scholar/data/bib_files/neurovista_processed.bib +0 -338
- scitex/scholar/data/bib_files/openaccess.bib +0 -89
- scitex/scholar/data/bib_files/pac-seizure_prediction_enriched.bib +0 -2178
- scitex/scholar/data/bib_files/pac.bib +0 -698
- scitex/scholar/data/bib_files/pac_enriched.bib +0 -1061
- scitex/scholar/data/bib_files/pac_processed.bib +0 -0
- scitex/scholar/data/bib_files/pac_titles.txt +0 -75
- scitex/scholar/data/bib_files/paywalled.bib +0 -98
- scitex/scholar/data/bib_files/related-papers-by-coauthors.bib +0 -58
- scitex/scholar/data/bib_files/related-papers-by-coauthors_enriched.bib +0 -87
- scitex/scholar/data/bib_files/seizure_prediction.bib +0 -694
- scitex/scholar/data/bib_files/seizure_prediction_processed.bib +0 -0
- scitex/scholar/data/bib_files/test_complete_enriched.bib +0 -437
- scitex/scholar/data/bib_files/test_final_enriched.bib +0 -437
- scitex/scholar/data/bib_files/test_seizure.bib +0 -46
- scitex/scholar/data/impact_factor/JCR_IF_2022.xlsx +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024.db +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024.xlsx +0 -0
- scitex/scholar/data/impact_factor/JCR_IF_2024_v01.db +0 -0
- scitex/scholar/data/impact_factor.db +0 -0
- scitex/scholar/examples/SUGGESTIONS.md +0 -865
- scitex/scholar/examples/dev.py +0 -38
- scitex-2.14.0.dist-info/METADATA +0 -1238
- /scitex/{gen → context}/_detect_environment.py +0 -0
- /scitex/{gen → context}/_get_notebook_path.py +0 -0
- /scitex/{gen/_shell.py → sh/_shell_legacy.py} +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/WHEEL +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.2.dist-info}/entry_points.txt +0 -0
- {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
|