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.
- 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 +27 -0
- scitex/_mcp_tools/template.py +24 -0
- scitex/_mcp_tools/writer.py +17 -210
- 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 +160 -41
- scitex/cli/capture.py +133 -20
- scitex/cli/introspect.py +488 -0
- scitex/cli/main.py +200 -109
- scitex/cli/mcp.py +60 -34
- scitex/cli/plt.py +414 -0
- scitex/cli/repro.py +15 -8
- scitex/cli/resource.py +15 -8
- scitex/cli/scholar/__init__.py +154 -8
- scitex/cli/scholar/_crossref_scitex.py +296 -0
- scitex/cli/scholar/_fetch.py +25 -3
- scitex/cli/social.py +355 -0
- scitex/cli/stats.py +136 -11
- scitex/cli/template.py +129 -12
- scitex/cli/tex.py +15 -8
- scitex/cli/writer.py +49 -299
- 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} +48 -56
- 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/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/__init__.py +43 -34
- scitex/writer/_mcp/handlers.py +11 -744
- scitex/writer/_mcp/tool_schemas.py +5 -335
- scitex-2.15.3.dist-info/METADATA +667 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/RECORD +241 -120
- scitex/canvas/editor/flask_editor/templates/_scripts.py +0 -4933
- scitex/canvas/editor/flask_editor/templates/_styles.py +0 -1658
- 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/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.3.dist-info}/WHEEL +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/entry_points.txt +0 -0
- {scitex-2.14.0.dist-info → scitex-2.15.3.dist-info}/licenses/LICENSE +0 -0
scitex/_mcp_tools/scholar.py
CHANGED
|
@@ -369,5 +369,79 @@ def register_scholar_tools(mcp) -> None:
|
|
|
369
369
|
result = await get_job_result_handler(job_id=job_id)
|
|
370
370
|
return _json(result)
|
|
371
371
|
|
|
372
|
+
# =========================================================================
|
|
373
|
+
# CrossRef Tools (via crossref-local delegation - 167M+ papers)
|
|
374
|
+
# =========================================================================
|
|
375
|
+
|
|
376
|
+
@mcp.tool()
|
|
377
|
+
async def scholar_crossref_search(
|
|
378
|
+
query: str,
|
|
379
|
+
limit: int = 20,
|
|
380
|
+
offset: int = 0,
|
|
381
|
+
year_min: Optional[int] = None,
|
|
382
|
+
year_max: Optional[int] = None,
|
|
383
|
+
enrich: bool = False,
|
|
384
|
+
) -> str:
|
|
385
|
+
"""[scholar] Search CrossRef database (167M+ papers) via crossref-local. Fast full-text search with optional citation enrichment."""
|
|
386
|
+
from scitex.scholar._mcp.crossref_handlers import crossref_search_handler
|
|
387
|
+
|
|
388
|
+
result = await crossref_search_handler(
|
|
389
|
+
query=query,
|
|
390
|
+
limit=limit,
|
|
391
|
+
offset=offset,
|
|
392
|
+
year_min=year_min,
|
|
393
|
+
year_max=year_max,
|
|
394
|
+
enrich=enrich,
|
|
395
|
+
)
|
|
396
|
+
return _json(result)
|
|
397
|
+
|
|
398
|
+
@mcp.tool()
|
|
399
|
+
async def scholar_crossref_get(
|
|
400
|
+
doi: str,
|
|
401
|
+
include_citations: bool = False,
|
|
402
|
+
include_references: bool = False,
|
|
403
|
+
) -> str:
|
|
404
|
+
"""[scholar] Get paper metadata by DOI from CrossRef database."""
|
|
405
|
+
from scitex.scholar._mcp.crossref_handlers import crossref_get_handler
|
|
406
|
+
|
|
407
|
+
result = await crossref_get_handler(
|
|
408
|
+
doi=doi,
|
|
409
|
+
include_citations=include_citations,
|
|
410
|
+
include_references=include_references,
|
|
411
|
+
)
|
|
412
|
+
return _json(result)
|
|
413
|
+
|
|
414
|
+
@mcp.tool()
|
|
415
|
+
async def scholar_crossref_count(query: str) -> str:
|
|
416
|
+
"""[scholar] Count papers matching a query in CrossRef database."""
|
|
417
|
+
from scitex.scholar._mcp.crossref_handlers import crossref_count_handler
|
|
418
|
+
|
|
419
|
+
result = await crossref_count_handler(query=query)
|
|
420
|
+
return _json(result)
|
|
421
|
+
|
|
422
|
+
@mcp.tool()
|
|
423
|
+
async def scholar_crossref_citations(
|
|
424
|
+
doi: str,
|
|
425
|
+
direction: str = "citing",
|
|
426
|
+
limit: int = 100,
|
|
427
|
+
) -> str:
|
|
428
|
+
"""[scholar] Get citation relationships (citing/cited papers) for a DOI."""
|
|
429
|
+
from scitex.scholar._mcp.crossref_handlers import crossref_citations_handler
|
|
430
|
+
|
|
431
|
+
result = await crossref_citations_handler(
|
|
432
|
+
doi=doi,
|
|
433
|
+
direction=direction,
|
|
434
|
+
limit=limit,
|
|
435
|
+
)
|
|
436
|
+
return _json(result)
|
|
437
|
+
|
|
438
|
+
@mcp.tool()
|
|
439
|
+
async def scholar_crossref_info() -> str:
|
|
440
|
+
"""[scholar] Get CrossRef database configuration and status info."""
|
|
441
|
+
from scitex.scholar._mcp.crossref_handlers import crossref_info_handler
|
|
442
|
+
|
|
443
|
+
result = await crossref_info_handler()
|
|
444
|
+
return _json(result)
|
|
445
|
+
|
|
372
446
|
|
|
373
447
|
# EOF
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# Timestamp: 2026-01-27
|
|
3
|
+
# File: /home/ywatanabe/proj/scitex-python/src/scitex/_mcp_tools/social.py
|
|
4
|
+
"""Social module tools - thin wrapper delegating to socialia package.
|
|
5
|
+
|
|
6
|
+
Single source of truth: socialia MCP tools.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def register_social_tools(mcp) -> None:
|
|
13
|
+
"""Register social tools by delegating to socialia package."""
|
|
14
|
+
try:
|
|
15
|
+
from socialia._mcp.tools import register_all_tools
|
|
16
|
+
|
|
17
|
+
# Delegate all MCP tools to socialia
|
|
18
|
+
register_all_tools(mcp)
|
|
19
|
+
except ImportError:
|
|
20
|
+
# Fallback when socialia is not installed
|
|
21
|
+
@mcp.tool()
|
|
22
|
+
def social_status() -> str:
|
|
23
|
+
"""[social] Get social media status (not installed)."""
|
|
24
|
+
return "socialia is required. Install with: pip install socialia"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
# EOF
|
scitex/_mcp_tools/template.py
CHANGED
|
@@ -62,5 +62,29 @@ def register_template_tools(mcp) -> None:
|
|
|
62
62
|
result = await list_git_strategies_handler()
|
|
63
63
|
return _json(result)
|
|
64
64
|
|
|
65
|
+
@mcp.tool()
|
|
66
|
+
async def template_get_code_template(
|
|
67
|
+
template_id: str,
|
|
68
|
+
filepath: Optional[str] = None,
|
|
69
|
+
docstring: Optional[str] = None,
|
|
70
|
+
) -> str:
|
|
71
|
+
"""[template] Get a code template for scripts and modules. Core: session, io, config. Module usage: plt, stats, scholar, audio, capture, diagram, canvas, writer. Use 'all' for all templates combined."""
|
|
72
|
+
from scitex.template._mcp.handlers import get_code_template_handler
|
|
73
|
+
|
|
74
|
+
result = await get_code_template_handler(
|
|
75
|
+
template_id=template_id,
|
|
76
|
+
filepath=filepath,
|
|
77
|
+
docstring=docstring,
|
|
78
|
+
)
|
|
79
|
+
return _json(result)
|
|
80
|
+
|
|
81
|
+
@mcp.tool()
|
|
82
|
+
async def template_list_code_templates() -> str:
|
|
83
|
+
"""[template] List all available code templates for scripts and modules."""
|
|
84
|
+
from scitex.template._mcp.handlers import list_code_templates_handler
|
|
85
|
+
|
|
86
|
+
result = await list_code_templates_handler()
|
|
87
|
+
return _json(result)
|
|
88
|
+
|
|
65
89
|
|
|
66
90
|
# EOF
|
scitex/_mcp_tools/writer.py
CHANGED
|
@@ -1,220 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
|
-
# Timestamp: 2026-01-
|
|
2
|
+
# Timestamp: 2026-01-27
|
|
3
3
|
# File: /home/ywatanabe/proj/scitex-code/src/scitex/_mcp_tools/writer.py
|
|
4
|
-
"""Writer module tools
|
|
4
|
+
"""Writer module tools - thin wrapper delegating to scitex-writer package.
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import json
|
|
9
|
-
from typing import List, Optional, Union
|
|
6
|
+
Single source of truth: scitex-writer MCP tools.
|
|
7
|
+
"""
|
|
10
8
|
|
|
11
|
-
|
|
12
|
-
def _json(data: dict) -> str:
|
|
13
|
-
return json.dumps(data, indent=2, default=str)
|
|
9
|
+
from __future__ import annotations
|
|
14
10
|
|
|
15
11
|
|
|
16
12
|
def register_writer_tools(mcp) -> None:
|
|
17
|
-
"""Register writer tools
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
result = await clone_project_handler(
|
|
30
|
-
project_dir=project_dir,
|
|
31
|
-
git_strategy=git_strategy,
|
|
32
|
-
branch=branch,
|
|
33
|
-
tag=tag,
|
|
34
|
-
)
|
|
35
|
-
return _json(result)
|
|
36
|
-
|
|
37
|
-
@mcp.tool()
|
|
38
|
-
async def writer_compile_manuscript(
|
|
39
|
-
project_dir: str,
|
|
40
|
-
timeout: int = 300,
|
|
41
|
-
no_figs: bool = False,
|
|
42
|
-
ppt2tif: bool = False,
|
|
43
|
-
crop_tif: bool = False,
|
|
44
|
-
quiet: bool = False,
|
|
45
|
-
verbose: bool = False,
|
|
46
|
-
force: bool = False,
|
|
47
|
-
) -> str:
|
|
48
|
-
"""[writer] Compile manuscript LaTeX document to PDF."""
|
|
49
|
-
from scitex.writer._mcp.handlers import compile_manuscript_handler
|
|
50
|
-
|
|
51
|
-
result = await compile_manuscript_handler(
|
|
52
|
-
project_dir=project_dir,
|
|
53
|
-
timeout=timeout,
|
|
54
|
-
no_figs=no_figs,
|
|
55
|
-
ppt2tif=ppt2tif,
|
|
56
|
-
crop_tif=crop_tif,
|
|
57
|
-
quiet=quiet,
|
|
58
|
-
verbose=verbose,
|
|
59
|
-
force=force,
|
|
60
|
-
)
|
|
61
|
-
return _json(result)
|
|
62
|
-
|
|
63
|
-
@mcp.tool()
|
|
64
|
-
async def writer_compile_supplementary(
|
|
65
|
-
project_dir: str,
|
|
66
|
-
timeout: int = 300,
|
|
67
|
-
no_figs: bool = False,
|
|
68
|
-
ppt2tif: bool = False,
|
|
69
|
-
crop_tif: bool = False,
|
|
70
|
-
quiet: bool = False,
|
|
71
|
-
) -> str:
|
|
72
|
-
"""[writer] Compile supplementary materials LaTeX document to PDF."""
|
|
73
|
-
from scitex.writer._mcp.handlers import compile_supplementary_handler
|
|
74
|
-
|
|
75
|
-
result = await compile_supplementary_handler(
|
|
76
|
-
project_dir=project_dir,
|
|
77
|
-
timeout=timeout,
|
|
78
|
-
no_figs=no_figs,
|
|
79
|
-
ppt2tif=ppt2tif,
|
|
80
|
-
crop_tif=crop_tif,
|
|
81
|
-
quiet=quiet,
|
|
82
|
-
)
|
|
83
|
-
return _json(result)
|
|
84
|
-
|
|
85
|
-
@mcp.tool()
|
|
86
|
-
async def writer_compile_revision(
|
|
87
|
-
project_dir: str,
|
|
88
|
-
track_changes: bool = False,
|
|
89
|
-
timeout: int = 300,
|
|
90
|
-
) -> str:
|
|
91
|
-
"""[writer] Compile revision document to PDF with optional change tracking."""
|
|
92
|
-
from scitex.writer._mcp.handlers import compile_revision_handler
|
|
93
|
-
|
|
94
|
-
result = await compile_revision_handler(
|
|
95
|
-
project_dir=project_dir,
|
|
96
|
-
track_changes=track_changes,
|
|
97
|
-
timeout=timeout,
|
|
98
|
-
)
|
|
99
|
-
return _json(result)
|
|
100
|
-
|
|
101
|
-
@mcp.tool()
|
|
102
|
-
async def writer_get_project_info(project_dir: str) -> str:
|
|
103
|
-
"""[writer] Get writer project structure and status information."""
|
|
104
|
-
from scitex.writer._mcp.handlers import get_project_info_handler
|
|
105
|
-
|
|
106
|
-
result = await get_project_info_handler(project_dir=project_dir)
|
|
107
|
-
return _json(result)
|
|
108
|
-
|
|
109
|
-
@mcp.tool()
|
|
110
|
-
async def writer_get_pdf(
|
|
111
|
-
project_dir: str,
|
|
112
|
-
doc_type: str = "manuscript",
|
|
113
|
-
) -> str:
|
|
114
|
-
"""[writer] Get path to compiled PDF for a document type."""
|
|
115
|
-
from scitex.writer._mcp.handlers import get_pdf_handler
|
|
116
|
-
|
|
117
|
-
result = await get_pdf_handler(
|
|
118
|
-
project_dir=project_dir,
|
|
119
|
-
doc_type=doc_type,
|
|
120
|
-
)
|
|
121
|
-
return _json(result)
|
|
122
|
-
|
|
123
|
-
@mcp.tool()
|
|
124
|
-
async def writer_list_document_types() -> str:
|
|
125
|
-
"""[writer] List available document types in a writer project."""
|
|
126
|
-
from scitex.writer._mcp.handlers import list_document_types_handler
|
|
127
|
-
|
|
128
|
-
result = await list_document_types_handler()
|
|
129
|
-
return _json(result)
|
|
130
|
-
|
|
131
|
-
@mcp.tool()
|
|
132
|
-
async def writer_csv_to_latex(
|
|
133
|
-
csv_path: str,
|
|
134
|
-
output_path: Optional[str] = None,
|
|
135
|
-
caption: Optional[str] = None,
|
|
136
|
-
label: Optional[str] = None,
|
|
137
|
-
longtable: bool = False,
|
|
138
|
-
) -> str:
|
|
139
|
-
"""[writer] Convert CSV file to LaTeX table format."""
|
|
140
|
-
from scitex.writer._mcp.handlers import csv2latex_handler
|
|
141
|
-
|
|
142
|
-
result = await csv2latex_handler(
|
|
143
|
-
csv_path=csv_path,
|
|
144
|
-
output_path=output_path,
|
|
145
|
-
caption=caption,
|
|
146
|
-
label=label,
|
|
147
|
-
longtable=longtable,
|
|
148
|
-
)
|
|
149
|
-
return _json(result)
|
|
150
|
-
|
|
151
|
-
@mcp.tool()
|
|
152
|
-
async def writer_latex_to_csv(
|
|
153
|
-
latex_path: str,
|
|
154
|
-
output_path: Optional[str] = None,
|
|
155
|
-
table_index: int = 0,
|
|
156
|
-
) -> str:
|
|
157
|
-
"""[writer] Convert LaTeX table to CSV format."""
|
|
158
|
-
from scitex.writer._mcp.handlers import latex2csv_handler
|
|
159
|
-
|
|
160
|
-
result = await latex2csv_handler(
|
|
161
|
-
latex_path=latex_path,
|
|
162
|
-
output_path=output_path,
|
|
163
|
-
table_index=table_index,
|
|
164
|
-
)
|
|
165
|
-
return _json(result)
|
|
166
|
-
|
|
167
|
-
@mcp.tool()
|
|
168
|
-
async def writer_pdf_to_images(
|
|
169
|
-
pdf_path: str,
|
|
170
|
-
output_dir: Optional[str] = None,
|
|
171
|
-
pages: Optional[Union[int, List[int]]] = None,
|
|
172
|
-
dpi: int = 150,
|
|
173
|
-
format: str = "png",
|
|
174
|
-
) -> str:
|
|
175
|
-
"""[writer] Render PDF pages as images."""
|
|
176
|
-
from scitex.writer._mcp.handlers import pdf_to_images_handler
|
|
177
|
-
|
|
178
|
-
result = await pdf_to_images_handler(
|
|
179
|
-
pdf_path=pdf_path,
|
|
180
|
-
output_dir=output_dir,
|
|
181
|
-
pages=pages,
|
|
182
|
-
dpi=dpi,
|
|
183
|
-
format=format,
|
|
184
|
-
)
|
|
185
|
-
return _json(result)
|
|
186
|
-
|
|
187
|
-
@mcp.tool()
|
|
188
|
-
async def writer_list_figures(
|
|
189
|
-
project_dir: str,
|
|
190
|
-
extensions: Optional[List[str]] = None,
|
|
191
|
-
) -> str:
|
|
192
|
-
"""[writer] List all figures in a writer project directory."""
|
|
193
|
-
from scitex.writer._mcp.handlers import list_figures_handler
|
|
194
|
-
|
|
195
|
-
result = await list_figures_handler(
|
|
196
|
-
project_dir=project_dir,
|
|
197
|
-
extensions=extensions,
|
|
198
|
-
)
|
|
199
|
-
return _json(result)
|
|
200
|
-
|
|
201
|
-
@mcp.tool()
|
|
202
|
-
async def writer_convert_figure(
|
|
203
|
-
input_path: str,
|
|
204
|
-
output_path: str,
|
|
205
|
-
dpi: int = 300,
|
|
206
|
-
quality: int = 95,
|
|
207
|
-
) -> str:
|
|
208
|
-
"""[writer] Convert figure between formats (e.g., PDF to PNG, PNG to JPG)."""
|
|
209
|
-
from scitex.writer._mcp.handlers import convert_figure_handler
|
|
210
|
-
|
|
211
|
-
result = await convert_figure_handler(
|
|
212
|
-
input_path=input_path,
|
|
213
|
-
output_path=output_path,
|
|
214
|
-
dpi=dpi,
|
|
215
|
-
quality=quality,
|
|
216
|
-
)
|
|
217
|
-
return _json(result)
|
|
13
|
+
"""Register writer tools by delegating to scitex-writer package."""
|
|
14
|
+
try:
|
|
15
|
+
from scitex_writer._mcp.tools import register_all_tools
|
|
16
|
+
|
|
17
|
+
# Delegate all MCP tools to scitex-writer
|
|
18
|
+
register_all_tools(mcp)
|
|
19
|
+
except ImportError:
|
|
20
|
+
# Fallback when scitex-writer is not installed
|
|
21
|
+
@mcp.tool()
|
|
22
|
+
def writer_usage() -> str:
|
|
23
|
+
"""[writer] Get usage guide for SciTeX Writer (not installed)."""
|
|
24
|
+
return "scitex-writer is required. Install with: pip install scitex-writer"
|
|
218
25
|
|
|
219
26
|
|
|
220
27
|
# EOF
|
scitex/ai/_gen_ai/_PARAMS.py
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
# -*- coding: utf-8 -*-
|
|
3
|
-
# Timestamp: "
|
|
4
|
-
# File: /home/ywatanabe/proj/
|
|
5
|
-
|
|
6
|
-
from __future__ import annotations
|
|
7
|
-
import os
|
|
3
|
+
# Timestamp: "2026-01-16 04:02:17 (ywatanabe)"
|
|
4
|
+
# File: /home/ywatanabe/proj/scitex-code/src/scitex/ai/_gen_ai/_PARAMS.py
|
|
5
|
+
|
|
8
6
|
|
|
9
7
|
__FILE__ = __file__
|
|
10
|
-
__DIR__ = os.path.dirname(__FILE__)
|
|
11
|
-
# ----------------------------------------
|
|
12
8
|
|
|
13
9
|
THIS_FILE = "/home/ywatanabe/proj/scitex_repo/src/scitex/ai/_gen_ai/PARAMS.py"
|
|
14
10
|
|
|
@@ -202,6 +198,13 @@ OPENAI_MODELS = [
|
|
|
202
198
|
# https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching#pricing
|
|
203
199
|
# https://docs.anthropic.com/en/docs/about-claude/models#model-comparison-table
|
|
204
200
|
ANTHROPIC_MODELS = [
|
|
201
|
+
{
|
|
202
|
+
"name": "claude-opus-4-5-20251101",
|
|
203
|
+
"input_cost": 5.00,
|
|
204
|
+
"output_cost": 25.00,
|
|
205
|
+
"api_key_env": "ANTHROPIC_API_KEY",
|
|
206
|
+
"provider": "Anthropic",
|
|
207
|
+
},
|
|
205
208
|
{
|
|
206
209
|
"name": "claude-opus-4-1-20250805",
|
|
207
210
|
"input_cost": 15.00,
|