mantisdk 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of mantisdk might be problematic. Click here for more details.

Files changed (190) hide show
  1. mantisdk/__init__.py +22 -0
  2. mantisdk/adapter/__init__.py +15 -0
  3. mantisdk/adapter/base.py +94 -0
  4. mantisdk/adapter/messages.py +270 -0
  5. mantisdk/adapter/triplet.py +1028 -0
  6. mantisdk/algorithm/__init__.py +39 -0
  7. mantisdk/algorithm/apo/__init__.py +5 -0
  8. mantisdk/algorithm/apo/apo.py +889 -0
  9. mantisdk/algorithm/apo/prompts/apply_edit_variant01.poml +22 -0
  10. mantisdk/algorithm/apo/prompts/apply_edit_variant02.poml +18 -0
  11. mantisdk/algorithm/apo/prompts/text_gradient_variant01.poml +18 -0
  12. mantisdk/algorithm/apo/prompts/text_gradient_variant02.poml +16 -0
  13. mantisdk/algorithm/apo/prompts/text_gradient_variant03.poml +107 -0
  14. mantisdk/algorithm/base.py +162 -0
  15. mantisdk/algorithm/decorator.py +264 -0
  16. mantisdk/algorithm/fast.py +250 -0
  17. mantisdk/algorithm/gepa/__init__.py +59 -0
  18. mantisdk/algorithm/gepa/adapter.py +459 -0
  19. mantisdk/algorithm/gepa/gepa.py +364 -0
  20. mantisdk/algorithm/gepa/lib/__init__.py +18 -0
  21. mantisdk/algorithm/gepa/lib/adapters/README.md +12 -0
  22. mantisdk/algorithm/gepa/lib/adapters/__init__.py +0 -0
  23. mantisdk/algorithm/gepa/lib/adapters/anymaths_adapter/README.md +341 -0
  24. mantisdk/algorithm/gepa/lib/adapters/anymaths_adapter/__init__.py +1 -0
  25. mantisdk/algorithm/gepa/lib/adapters/anymaths_adapter/anymaths_adapter.py +174 -0
  26. mantisdk/algorithm/gepa/lib/adapters/anymaths_adapter/requirements.txt +1 -0
  27. mantisdk/algorithm/gepa/lib/adapters/default_adapter/README.md +0 -0
  28. mantisdk/algorithm/gepa/lib/adapters/default_adapter/__init__.py +0 -0
  29. mantisdk/algorithm/gepa/lib/adapters/default_adapter/default_adapter.py +209 -0
  30. mantisdk/algorithm/gepa/lib/adapters/dspy_adapter/README.md +7 -0
  31. mantisdk/algorithm/gepa/lib/adapters/dspy_adapter/__init__.py +0 -0
  32. mantisdk/algorithm/gepa/lib/adapters/dspy_adapter/dspy_adapter.py +307 -0
  33. mantisdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/README.md +99 -0
  34. mantisdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/dspy_program_proposal_signature.py +137 -0
  35. mantisdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/full_program_adapter.py +266 -0
  36. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/GEPA_RAG.md +621 -0
  37. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/__init__.py +56 -0
  38. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/evaluation_metrics.py +226 -0
  39. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/generic_rag_adapter.py +496 -0
  40. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/rag_pipeline.py +238 -0
  41. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_store_interface.py +212 -0
  42. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/__init__.py +2 -0
  43. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/chroma_store.py +196 -0
  44. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/lancedb_store.py +422 -0
  45. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/milvus_store.py +409 -0
  46. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/qdrant_store.py +368 -0
  47. mantisdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/weaviate_store.py +418 -0
  48. mantisdk/algorithm/gepa/lib/adapters/mcp_adapter/README.md +552 -0
  49. mantisdk/algorithm/gepa/lib/adapters/mcp_adapter/__init__.py +37 -0
  50. mantisdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_adapter.py +705 -0
  51. mantisdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_client.py +364 -0
  52. mantisdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/README.md +9 -0
  53. mantisdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/__init__.py +0 -0
  54. mantisdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/terminal_bench_adapter.py +217 -0
  55. mantisdk/algorithm/gepa/lib/api.py +375 -0
  56. mantisdk/algorithm/gepa/lib/core/__init__.py +0 -0
  57. mantisdk/algorithm/gepa/lib/core/adapter.py +180 -0
  58. mantisdk/algorithm/gepa/lib/core/data_loader.py +74 -0
  59. mantisdk/algorithm/gepa/lib/core/engine.py +356 -0
  60. mantisdk/algorithm/gepa/lib/core/result.py +233 -0
  61. mantisdk/algorithm/gepa/lib/core/state.py +636 -0
  62. mantisdk/algorithm/gepa/lib/examples/__init__.py +0 -0
  63. mantisdk/algorithm/gepa/lib/examples/aime.py +24 -0
  64. mantisdk/algorithm/gepa/lib/examples/anymaths-bench/eval_default.py +111 -0
  65. mantisdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/instruction_prompt.txt +9 -0
  66. mantisdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/optimal_prompt.txt +24 -0
  67. mantisdk/algorithm/gepa/lib/examples/anymaths-bench/train_anymaths.py +177 -0
  68. mantisdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/arc_agi.ipynb +25705 -0
  69. mantisdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/example.ipynb +348 -0
  70. mantisdk/algorithm/gepa/lib/examples/mcp_adapter/__init__.py +4 -0
  71. mantisdk/algorithm/gepa/lib/examples/mcp_adapter/mcp_optimization_example.py +455 -0
  72. mantisdk/algorithm/gepa/lib/examples/rag_adapter/RAG_GUIDE.md +613 -0
  73. mantisdk/algorithm/gepa/lib/examples/rag_adapter/__init__.py +9 -0
  74. mantisdk/algorithm/gepa/lib/examples/rag_adapter/rag_optimization.py +824 -0
  75. mantisdk/algorithm/gepa/lib/examples/rag_adapter/requirements-rag.txt +29 -0
  76. mantisdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/instruction_prompt.txt +16 -0
  77. mantisdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/terminus.txt +9 -0
  78. mantisdk/algorithm/gepa/lib/examples/terminal-bench/train_terminus.py +161 -0
  79. mantisdk/algorithm/gepa/lib/gepa_utils.py +117 -0
  80. mantisdk/algorithm/gepa/lib/logging/__init__.py +0 -0
  81. mantisdk/algorithm/gepa/lib/logging/experiment_tracker.py +187 -0
  82. mantisdk/algorithm/gepa/lib/logging/logger.py +75 -0
  83. mantisdk/algorithm/gepa/lib/logging/utils.py +103 -0
  84. mantisdk/algorithm/gepa/lib/proposer/__init__.py +0 -0
  85. mantisdk/algorithm/gepa/lib/proposer/base.py +31 -0
  86. mantisdk/algorithm/gepa/lib/proposer/merge.py +357 -0
  87. mantisdk/algorithm/gepa/lib/proposer/reflective_mutation/__init__.py +0 -0
  88. mantisdk/algorithm/gepa/lib/proposer/reflective_mutation/base.py +49 -0
  89. mantisdk/algorithm/gepa/lib/proposer/reflective_mutation/reflective_mutation.py +176 -0
  90. mantisdk/algorithm/gepa/lib/py.typed +0 -0
  91. mantisdk/algorithm/gepa/lib/strategies/__init__.py +0 -0
  92. mantisdk/algorithm/gepa/lib/strategies/batch_sampler.py +77 -0
  93. mantisdk/algorithm/gepa/lib/strategies/candidate_selector.py +50 -0
  94. mantisdk/algorithm/gepa/lib/strategies/component_selector.py +36 -0
  95. mantisdk/algorithm/gepa/lib/strategies/eval_policy.py +64 -0
  96. mantisdk/algorithm/gepa/lib/strategies/instruction_proposal.py +127 -0
  97. mantisdk/algorithm/gepa/lib/utils/__init__.py +10 -0
  98. mantisdk/algorithm/gepa/lib/utils/stop_condition.py +196 -0
  99. mantisdk/algorithm/gepa/tracing.py +105 -0
  100. mantisdk/algorithm/utils.py +177 -0
  101. mantisdk/algorithm/verl/__init__.py +5 -0
  102. mantisdk/algorithm/verl/interface.py +202 -0
  103. mantisdk/cli/__init__.py +56 -0
  104. mantisdk/cli/prometheus.py +115 -0
  105. mantisdk/cli/store.py +131 -0
  106. mantisdk/cli/vllm.py +29 -0
  107. mantisdk/client.py +408 -0
  108. mantisdk/config.py +348 -0
  109. mantisdk/emitter/__init__.py +43 -0
  110. mantisdk/emitter/annotation.py +370 -0
  111. mantisdk/emitter/exception.py +54 -0
  112. mantisdk/emitter/message.py +61 -0
  113. mantisdk/emitter/object.py +117 -0
  114. mantisdk/emitter/reward.py +320 -0
  115. mantisdk/env_var.py +156 -0
  116. mantisdk/execution/__init__.py +15 -0
  117. mantisdk/execution/base.py +64 -0
  118. mantisdk/execution/client_server.py +443 -0
  119. mantisdk/execution/events.py +69 -0
  120. mantisdk/execution/inter_process.py +16 -0
  121. mantisdk/execution/shared_memory.py +282 -0
  122. mantisdk/instrumentation/__init__.py +119 -0
  123. mantisdk/instrumentation/agentops.py +314 -0
  124. mantisdk/instrumentation/agentops_langchain.py +45 -0
  125. mantisdk/instrumentation/litellm.py +83 -0
  126. mantisdk/instrumentation/vllm.py +81 -0
  127. mantisdk/instrumentation/weave.py +500 -0
  128. mantisdk/litagent/__init__.py +11 -0
  129. mantisdk/litagent/decorator.py +536 -0
  130. mantisdk/litagent/litagent.py +252 -0
  131. mantisdk/llm_proxy.py +1890 -0
  132. mantisdk/logging.py +370 -0
  133. mantisdk/reward.py +7 -0
  134. mantisdk/runner/__init__.py +11 -0
  135. mantisdk/runner/agent.py +845 -0
  136. mantisdk/runner/base.py +182 -0
  137. mantisdk/runner/legacy.py +309 -0
  138. mantisdk/semconv.py +170 -0
  139. mantisdk/server.py +401 -0
  140. mantisdk/store/__init__.py +23 -0
  141. mantisdk/store/base.py +897 -0
  142. mantisdk/store/client_server.py +2092 -0
  143. mantisdk/store/collection/__init__.py +30 -0
  144. mantisdk/store/collection/base.py +587 -0
  145. mantisdk/store/collection/memory.py +970 -0
  146. mantisdk/store/collection/mongo.py +1412 -0
  147. mantisdk/store/collection_based.py +1823 -0
  148. mantisdk/store/insight.py +648 -0
  149. mantisdk/store/listener.py +58 -0
  150. mantisdk/store/memory.py +396 -0
  151. mantisdk/store/mongo.py +165 -0
  152. mantisdk/store/sqlite.py +3 -0
  153. mantisdk/store/threading.py +357 -0
  154. mantisdk/store/utils.py +142 -0
  155. mantisdk/tracer/__init__.py +16 -0
  156. mantisdk/tracer/agentops.py +242 -0
  157. mantisdk/tracer/base.py +287 -0
  158. mantisdk/tracer/dummy.py +106 -0
  159. mantisdk/tracer/otel.py +555 -0
  160. mantisdk/tracer/weave.py +677 -0
  161. mantisdk/trainer/__init__.py +6 -0
  162. mantisdk/trainer/init_utils.py +263 -0
  163. mantisdk/trainer/legacy.py +367 -0
  164. mantisdk/trainer/registry.py +12 -0
  165. mantisdk/trainer/trainer.py +618 -0
  166. mantisdk/types/__init__.py +6 -0
  167. mantisdk/types/core.py +553 -0
  168. mantisdk/types/resources.py +204 -0
  169. mantisdk/types/tracer.py +515 -0
  170. mantisdk/types/tracing.py +218 -0
  171. mantisdk/utils/__init__.py +1 -0
  172. mantisdk/utils/id.py +18 -0
  173. mantisdk/utils/metrics.py +1025 -0
  174. mantisdk/utils/otel.py +578 -0
  175. mantisdk/utils/otlp.py +536 -0
  176. mantisdk/utils/server_launcher.py +1045 -0
  177. mantisdk/utils/system_snapshot.py +81 -0
  178. mantisdk/verl/__init__.py +8 -0
  179. mantisdk/verl/__main__.py +6 -0
  180. mantisdk/verl/async_server.py +46 -0
  181. mantisdk/verl/config.yaml +27 -0
  182. mantisdk/verl/daemon.py +1154 -0
  183. mantisdk/verl/dataset.py +44 -0
  184. mantisdk/verl/entrypoint.py +248 -0
  185. mantisdk/verl/trainer.py +549 -0
  186. mantisdk-0.1.0.dist-info/METADATA +119 -0
  187. mantisdk-0.1.0.dist-info/RECORD +190 -0
  188. mantisdk-0.1.0.dist-info/WHEEL +4 -0
  189. mantisdk-0.1.0.dist-info/entry_points.txt +2 -0
  190. mantisdk-0.1.0.dist-info/licenses/LICENSE +19 -0
@@ -0,0 +1,56 @@
1
+ # Copyright (c) Microsoft. All rights reserved.
2
+
3
+ """Mantisdk command line interface entry point."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import argparse
8
+ import importlib
9
+ import sys
10
+ from typing import Dict, Iterable, Tuple
11
+
12
+ _SUBCOMMANDS: Dict[str, Tuple[str, str]] = {
13
+ "vllm": ("mantisdk.cli.vllm", "Run the vLLM CLI with Mantisdk instrumentation."),
14
+ "store": ("mantisdk.cli.store", "Run a LightningStore server."),
15
+ "prometheus": ("mantisdk.cli.prometheus", "Serve Prometheus metrics from the multiprocess registry."),
16
+ "agentops": ("mantisdk.cli.agentops_server", "Start the AgentOps server manager."),
17
+ }
18
+
19
+ _DESCRIPTION = "Mantisdk CLI entry point.\n\nAvailable subcommands:\n" + "\n".join(
20
+ f" {name:<10}{desc}" for name, (_, desc) in _SUBCOMMANDS.items()
21
+ )
22
+
23
+
24
+ def main(argv: Iterable[str] | None = None) -> int:
25
+ """Dispatch to the requested Mantisdk subcommand."""
26
+ parser = argparse.ArgumentParser(
27
+ prog="msk",
28
+ description=_DESCRIPTION,
29
+ formatter_class=argparse.RawDescriptionHelpFormatter,
30
+ )
31
+ parser.add_argument("subcommand", choices=_SUBCOMMANDS.keys(), help="Subcommand to run.")
32
+ parser.add_argument("args", nargs=argparse.REMAINDER, help=argparse.SUPPRESS)
33
+
34
+ parsed = parser.parse_args(list(argv) if argv is not None else None)
35
+ module_name, _ = _SUBCOMMANDS[parsed.subcommand]
36
+ module = importlib.import_module(module_name)
37
+
38
+ entry_point = getattr(module, "main", None)
39
+ if entry_point is None:
40
+ parser.error(f"Subcommand '{parsed.subcommand}' does not define a callable 'main'")
41
+
42
+ dispatch_args = parsed.args
43
+ original_argv = sys.argv
44
+ sys.argv = [f"{parser.prog} {parsed.subcommand}", *dispatch_args]
45
+ try:
46
+ result = entry_point(dispatch_args or None)
47
+ finally:
48
+ sys.argv = original_argv
49
+
50
+ if isinstance(result, int):
51
+ return result
52
+ return 0
53
+
54
+
55
+ if __name__ == "__main__":
56
+ raise SystemExit(main())
@@ -0,0 +1,115 @@
1
+ # Copyright (c) Microsoft. All rights reserved.
2
+
3
+ """Serve Prometheus metrics from the Mantisdk multiprocess registry."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import argparse
8
+ import asyncio
9
+ import logging
10
+ import os
11
+ from pathlib import Path
12
+ from typing import Iterable
13
+
14
+ from fastapi import FastAPI
15
+ from prometheus_client import make_asgi_app # pyright: ignore[reportUnknownVariableType]
16
+
17
+ from mantisdk.logging import setup as setup_logging
18
+ from mantisdk.utils.metrics import get_prometheus_registry
19
+ from mantisdk.utils.server_launcher import PythonServerLauncher, PythonServerLauncherArgs
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+
24
+ def ensure_prometheus_dir() -> str:
25
+ """Ensure PROMETHEUS_MULTIPROC_DIR is set and the directory exists."""
26
+
27
+ directory = os.getenv("PROMETHEUS_MULTIPROC_DIR")
28
+ if directory is None:
29
+ raise ValueError("PROMETHEUS_MULTIPROC_DIR is not set.")
30
+
31
+ Path(directory).mkdir(parents=True, exist_ok=True)
32
+ logger.info("Serving Prometheus multiprocess metrics from %s", directory)
33
+ return directory
34
+
35
+
36
+ def create_prometheus_app(metrics_path: str = "/v1/prometheus") -> FastAPI:
37
+ """Create a FastAPI app that exposes Prometheus metrics and a health endpoint.
38
+
39
+ Args:
40
+ metrics_path: URL path to expose the Prometheus metrics endpoint on.
41
+
42
+ Returns:
43
+ A FastAPI application ready to serve metrics.
44
+ """
45
+
46
+ if not metrics_path.startswith("/"):
47
+ raise ValueError("metrics_path must start with '/'.")
48
+
49
+ normalized_path = metrics_path.rstrip("/")
50
+ if normalized_path in ("", "/"):
51
+ raise ValueError("metrics_path must not be '/'. Choose a sub-path such as /v1/prometheus.")
52
+
53
+ app = FastAPI(title="Mantisdk Prometheus exporter", docs_url=None, redoc_url=None)
54
+ metrics_app = make_asgi_app(registry=get_prometheus_registry()) # pyright: ignore[reportUnknownVariableType]
55
+ app.mount(normalized_path, metrics_app) # pyright: ignore[reportUnknownArgumentType]
56
+
57
+ @app.get("/health")
58
+ async def healthcheck() -> dict[str, str]: # pyright: ignore[reportUnusedFunction]
59
+ return {"status": "ok"}
60
+
61
+ return app
62
+
63
+
64
+ def main(argv: Iterable[str] | None = None) -> int:
65
+ parser = argparse.ArgumentParser(description="Serve Prometheus metrics outside the LightningStore server.")
66
+ parser.add_argument("--host", default="0.0.0.0", help="Host to bind the metrics server to.")
67
+ parser.add_argument("--port", type=int, default=4748, help="Port to expose the Prometheus metrics on.")
68
+ parser.add_argument(
69
+ "--metrics-path",
70
+ default="/v1/prometheus",
71
+ help="HTTP path used to expose metrics. Must start with '/' and not be the root path.",
72
+ )
73
+ parser.add_argument(
74
+ "--log-level",
75
+ default="INFO",
76
+ choices=["DEBUG", "INFO", "WARNING", "ERROR"],
77
+ help="Configure the logging level for the metrics server.",
78
+ )
79
+ parser.add_argument(
80
+ "--access-log",
81
+ action="store_true",
82
+ help="Enable uvicorn access logs. Disabled by default to reduce noise.",
83
+ )
84
+ args = parser.parse_args(list(argv) if argv is not None else None)
85
+
86
+ setup_logging(args.log_level)
87
+ ensure_prometheus_dir()
88
+
89
+ try:
90
+ app = create_prometheus_app(args.metrics_path)
91
+ except ValueError as exc:
92
+ logger.error("Failed to configure prometheus app: %s", exc)
93
+ return 1
94
+
95
+ launcher_args = PythonServerLauncherArgs(
96
+ host=args.host,
97
+ port=args.port,
98
+ log_level=getattr(logging, args.log_level),
99
+ access_log=args.access_log,
100
+ healthcheck_url="/health",
101
+ )
102
+ launcher = PythonServerLauncher(app, launcher_args)
103
+
104
+ try:
105
+ asyncio.run(launcher.run_forever())
106
+ except KeyboardInterrupt:
107
+ logger.info("Received shutdown signal. Stopping Prometheus server.")
108
+ except RuntimeError as exc:
109
+ logger.error("Prometheus server failed to start: %s", exc, exc_info=True)
110
+ return 1
111
+ return 0
112
+
113
+
114
+ if __name__ == "__main__":
115
+ raise SystemExit(main())
mantisdk/cli/store.py ADDED
@@ -0,0 +1,131 @@
1
+ # Copyright (c) Microsoft. All rights reserved.
2
+
3
+ """Run a LightningStore server for persistent access from multiple processes."""
4
+
5
+ from __future__ import annotations
6
+
7
+ import argparse
8
+ import asyncio
9
+ import logging
10
+ from typing import Iterable, List
11
+
12
+ from mantisdk import setup_logging
13
+ from mantisdk.store.client_server import LightningStoreServer
14
+ from mantisdk.store.memory import InMemoryLightningStore
15
+ from mantisdk.utils.metrics import (
16
+ ConsoleMetricsBackend,
17
+ MetricsBackend,
18
+ MultiMetricsBackend,
19
+ PrometheusMetricsBackend,
20
+ setup_multiprocess_prometheus,
21
+ )
22
+
23
+ logger = logging.getLogger(__name__)
24
+
25
+
26
+ def main(argv: Iterable[str] | None = None) -> int:
27
+ parser = argparse.ArgumentParser(description="Run a LightningStore server")
28
+ parser.add_argument("--host", default="0.0.0.0", help="Host to bind the server to")
29
+ parser.add_argument("--port", type=int, default=4747, help="Port to run the server on")
30
+ parser.add_argument(
31
+ "--cors-origin",
32
+ dest="cors_origins",
33
+ action="append",
34
+ help="Allowed CORS origin. Repeat for multiple origins. Use '*' to allow all origins.",
35
+ )
36
+ parser.add_argument(
37
+ "--log-level",
38
+ default="INFO",
39
+ choices=["DEBUG", "INFO", "WARNING", "ERROR"],
40
+ help="Configure the logging level for the store.",
41
+ )
42
+ parser.add_argument(
43
+ "--tracker",
44
+ nargs="+",
45
+ choices=["prometheus", "console"],
46
+ help="Enable metrics tracking. Repeat for multiple trackers.",
47
+ )
48
+ parser.add_argument(
49
+ "--n-workers",
50
+ default=1,
51
+ type=int,
52
+ help=(
53
+ "Number of workers to run in the server. When it's greater than 1, the server will be run using `mp` launch mode. "
54
+ "Only applicable for zero-copy stores such as MongoDB backend."
55
+ ),
56
+ )
57
+
58
+ parser.add_argument(
59
+ "--backend",
60
+ choices=["memory", "mongo"],
61
+ default="memory",
62
+ help="Backend to use for the store.",
63
+ )
64
+ parser.add_argument(
65
+ "--mongo-uri",
66
+ default="mongodb://localhost:27017/?replicaSet=rs0",
67
+ help="MongoDB URI to use for the store. Applicable only if --backend is 'mongo'.",
68
+ )
69
+
70
+ args = parser.parse_args(list(argv) if argv is not None else None)
71
+
72
+ setup_logging(args.log_level)
73
+
74
+ trackers: List[MetricsBackend] = []
75
+ if args.tracker:
76
+ if "prometheus" in args.tracker:
77
+ logger.info("Enabling Prometheus metrics tracking.")
78
+ if args.n_workers > 1:
79
+ # This has to be done before prometheus_client is imported
80
+ setup_multiprocess_prometheus()
81
+ logger.info("Setting up Prometheus multiprocess directory for metrics tracking.")
82
+ trackers.append(PrometheusMetricsBackend())
83
+
84
+ if "console" in args.tracker:
85
+ logger.info("Enabling console metrics tracking.")
86
+ trackers.append(ConsoleMetricsBackend())
87
+
88
+ if len(trackers) == 0:
89
+ tracker: MetricsBackend | None = None
90
+ elif len(trackers) == 1:
91
+ tracker = trackers[0]
92
+ else:
93
+ tracker = MultiMetricsBackend(trackers)
94
+
95
+ if args.backend == "memory":
96
+ store = InMemoryLightningStore(
97
+ thread_safe=True, # Using thread_safe store for server
98
+ tracker=tracker,
99
+ )
100
+ elif args.backend == "mongo":
101
+ from mantisdk.store.mongo import MongoLightningStore
102
+
103
+ store = MongoLightningStore(mongo_uri=args.mongo_uri, tracker=tracker)
104
+ else:
105
+ raise ValueError(f"Invalid backend: {args.backend}")
106
+
107
+ if args.n_workers > 1:
108
+ logger.info(f"Running the server using `mp` launch mode with {args.n_workers} workers.")
109
+ launch_mode = "mp"
110
+ else:
111
+ logger.info("Running the server using `asyncio` launch mode.")
112
+ launch_mode = "asyncio"
113
+ server = LightningStoreServer(
114
+ store,
115
+ host=args.host,
116
+ port=args.port,
117
+ cors_allow_origins=args.cors_origins,
118
+ launch_mode=launch_mode,
119
+ tracker=tracker,
120
+ n_workers=args.n_workers,
121
+ )
122
+ try:
123
+ asyncio.run(server.run_forever())
124
+ except RuntimeError as exc:
125
+ logger.error("LightningStore server failed to start: %s", exc, exc_info=True)
126
+ return 1
127
+ return 0
128
+
129
+
130
+ if __name__ == "__main__":
131
+ raise SystemExit(main())
mantisdk/cli/vllm.py ADDED
@@ -0,0 +1,29 @@
1
+ # Copyright (c) Microsoft. All rights reserved.
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Iterable
6
+
7
+
8
+ def main(argv: Iterable[str] | None = None) -> int:
9
+ import sys
10
+
11
+ from vllm.entrypoints.cli.main import main as vllm_main
12
+
13
+ from mantisdk.instrumentation.vllm import instrument_vllm
14
+
15
+ instrument_vllm()
16
+ if argv is not None:
17
+ original_argv = sys.argv
18
+ sys.argv = [original_argv[0], *list(argv)]
19
+ try:
20
+ vllm_main()
21
+ finally:
22
+ sys.argv = original_argv
23
+ else:
24
+ vllm_main()
25
+ return 0
26
+
27
+
28
+ if __name__ == "__main__":
29
+ raise SystemExit(main())