gatewaysdk 0.3.2__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. gatewaysdk/__init__.py +540 -0
  2. gatewaysdk/adapter/__init__.py +15 -0
  3. gatewaysdk/adapter/base.py +94 -0
  4. gatewaysdk/adapter/messages.py +270 -0
  5. gatewaysdk/adapter/triplet.py +1026 -0
  6. gatewaysdk/algorithm/__init__.py +39 -0
  7. gatewaysdk/algorithm/apo/__init__.py +5 -0
  8. gatewaysdk/algorithm/apo/apo.py +898 -0
  9. gatewaysdk/algorithm/apo/prompts/apply_edit_variant01.poml +22 -0
  10. gatewaysdk/algorithm/apo/prompts/apply_edit_variant02.poml +18 -0
  11. gatewaysdk/algorithm/apo/prompts/text_gradient_variant01.poml +18 -0
  12. gatewaysdk/algorithm/apo/prompts/text_gradient_variant02.poml +16 -0
  13. gatewaysdk/algorithm/apo/prompts/text_gradient_variant03.poml +107 -0
  14. gatewaysdk/algorithm/base.py +262 -0
  15. gatewaysdk/algorithm/decorator.py +264 -0
  16. gatewaysdk/algorithm/evals/__init__.py +7 -0
  17. gatewaysdk/algorithm/evals/evals.py +217 -0
  18. gatewaysdk/algorithm/fast.py +250 -0
  19. gatewaysdk/algorithm/gepa/__init__.py +61 -0
  20. gatewaysdk/algorithm/gepa/adapter.py +495 -0
  21. gatewaysdk/algorithm/gepa/gepa.py +570 -0
  22. gatewaysdk/algorithm/gepa/lib/__init__.py +18 -0
  23. gatewaysdk/algorithm/gepa/lib/adapters/README.md +12 -0
  24. gatewaysdk/algorithm/gepa/lib/adapters/__init__.py +0 -0
  25. gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/README.md +341 -0
  26. gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/__init__.py +1 -0
  27. gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/anymaths_adapter.py +174 -0
  28. gatewaysdk/algorithm/gepa/lib/adapters/anymaths_adapter/requirements.txt +1 -0
  29. gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/README.md +0 -0
  30. gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/__init__.py +0 -0
  31. gatewaysdk/algorithm/gepa/lib/adapters/default_adapter/default_adapter.py +209 -0
  32. gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/README.md +7 -0
  33. gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/__init__.py +0 -0
  34. gatewaysdk/algorithm/gepa/lib/adapters/dspy_adapter/dspy_adapter.py +307 -0
  35. gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/README.md +99 -0
  36. gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/dspy_program_proposal_signature.py +137 -0
  37. gatewaysdk/algorithm/gepa/lib/adapters/dspy_full_program_adapter/full_program_adapter.py +268 -0
  38. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/GEPA_RAG.md +621 -0
  39. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/__init__.py +56 -0
  40. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/evaluation_metrics.py +226 -0
  41. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/generic_rag_adapter.py +496 -0
  42. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/rag_pipeline.py +238 -0
  43. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_store_interface.py +212 -0
  44. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/__init__.py +2 -0
  45. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/chroma_store.py +196 -0
  46. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/lancedb_store.py +422 -0
  47. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/milvus_store.py +409 -0
  48. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/qdrant_store.py +368 -0
  49. gatewaysdk/algorithm/gepa/lib/adapters/generic_rag_adapter/vector_stores/weaviate_store.py +418 -0
  50. gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/README.md +552 -0
  51. gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/__init__.py +37 -0
  52. gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_adapter.py +699 -0
  53. gatewaysdk/algorithm/gepa/lib/adapters/mcp_adapter/mcp_client.py +364 -0
  54. gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/README.md +9 -0
  55. gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/__init__.py +0 -0
  56. gatewaysdk/algorithm/gepa/lib/adapters/terminal_bench_adapter/terminal_bench_adapter.py +217 -0
  57. gatewaysdk/algorithm/gepa/lib/api.py +382 -0
  58. gatewaysdk/algorithm/gepa/lib/core/__init__.py +0 -0
  59. gatewaysdk/algorithm/gepa/lib/core/adapter.py +180 -0
  60. gatewaysdk/algorithm/gepa/lib/core/data_loader.py +74 -0
  61. gatewaysdk/algorithm/gepa/lib/core/engine.py +379 -0
  62. gatewaysdk/algorithm/gepa/lib/core/result.py +233 -0
  63. gatewaysdk/algorithm/gepa/lib/core/state.py +636 -0
  64. gatewaysdk/algorithm/gepa/lib/examples/__init__.py +0 -0
  65. gatewaysdk/algorithm/gepa/lib/examples/aime.py +24 -0
  66. gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/eval_default.py +111 -0
  67. gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/instruction_prompt.txt +9 -0
  68. gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/prompt-templates/optimal_prompt.txt +24 -0
  69. gatewaysdk/algorithm/gepa/lib/examples/anymaths-bench/train_anymaths.py +177 -0
  70. gatewaysdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/arc_agi.ipynb +25705 -0
  71. gatewaysdk/algorithm/gepa/lib/examples/dspy_full_program_evolution/example.ipynb +348 -0
  72. gatewaysdk/algorithm/gepa/lib/examples/mcp_adapter/__init__.py +4 -0
  73. gatewaysdk/algorithm/gepa/lib/examples/mcp_adapter/mcp_optimization_example.py +456 -0
  74. gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/RAG_GUIDE.md +613 -0
  75. gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/__init__.py +9 -0
  76. gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/rag_optimization.py +820 -0
  77. gatewaysdk/algorithm/gepa/lib/examples/rag_adapter/requirements-rag.txt +29 -0
  78. gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/instruction_prompt.txt +16 -0
  79. gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/prompt-templates/terminus.txt +9 -0
  80. gatewaysdk/algorithm/gepa/lib/examples/terminal-bench/train_terminus.py +161 -0
  81. gatewaysdk/algorithm/gepa/lib/gepa_utils.py +117 -0
  82. gatewaysdk/algorithm/gepa/lib/logging/__init__.py +0 -0
  83. gatewaysdk/algorithm/gepa/lib/logging/experiment_tracker.py +187 -0
  84. gatewaysdk/algorithm/gepa/lib/logging/logger.py +75 -0
  85. gatewaysdk/algorithm/gepa/lib/logging/utils.py +103 -0
  86. gatewaysdk/algorithm/gepa/lib/proposer/__init__.py +0 -0
  87. gatewaysdk/algorithm/gepa/lib/proposer/base.py +31 -0
  88. gatewaysdk/algorithm/gepa/lib/proposer/merge.py +357 -0
  89. gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/__init__.py +0 -0
  90. gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/base.py +49 -0
  91. gatewaysdk/algorithm/gepa/lib/proposer/reflective_mutation/reflective_mutation.py +176 -0
  92. gatewaysdk/algorithm/gepa/lib/py.typed +0 -0
  93. gatewaysdk/algorithm/gepa/lib/strategies/__init__.py +0 -0
  94. gatewaysdk/algorithm/gepa/lib/strategies/batch_sampler.py +77 -0
  95. gatewaysdk/algorithm/gepa/lib/strategies/candidate_selector.py +50 -0
  96. gatewaysdk/algorithm/gepa/lib/strategies/component_selector.py +36 -0
  97. gatewaysdk/algorithm/gepa/lib/strategies/eval_policy.py +64 -0
  98. gatewaysdk/algorithm/gepa/lib/strategies/instruction_proposal.py +126 -0
  99. gatewaysdk/algorithm/gepa/lib/utils/__init__.py +10 -0
  100. gatewaysdk/algorithm/gepa/lib/utils/stop_condition.py +196 -0
  101. gatewaysdk/algorithm/gepa/tracing.py +105 -0
  102. gatewaysdk/algorithm/utils.py +177 -0
  103. gatewaysdk/algorithm/verl/__init__.py +5 -0
  104. gatewaysdk/algorithm/verl/interface.py +202 -0
  105. gatewaysdk/automations.py +111 -0
  106. gatewaysdk/benchmark_hub/README.md +88 -0
  107. gatewaysdk/benchmark_hub/__init__.py +119 -0
  108. gatewaysdk/benchmark_hub/_archive.py +189 -0
  109. gatewaysdk/benchmark_hub/_tar.py +6 -0
  110. gatewaysdk/benchmark_hub/client.py +992 -0
  111. gatewaysdk/benchmark_hub/dispatch_shard.py +34 -0
  112. gatewaysdk/benchmark_hub/eval_config.py +20 -0
  113. gatewaysdk/benchmark_hub/evals.py +351 -0
  114. gatewaysdk/benchmark_hub/harbor_adapter.py +673 -0
  115. gatewaysdk/benchmark_hub/path_utils.py +81 -0
  116. gatewaysdk/benchmark_hub/save_utils.py +101 -0
  117. gatewaysdk/benchmark_hub/verifiers_adapter.py +327 -0
  118. gatewaysdk/benchmark_hub/versioning.py +72 -0
  119. gatewaysdk/build.py +515 -0
  120. gatewaysdk/cli/__init__.py +58 -0
  121. gatewaysdk/cli/agent_runner.py +132 -0
  122. gatewaysdk/cli/http_client.py +115 -0
  123. gatewaysdk/cli/platform.py +4086 -0
  124. gatewaysdk/cli/prometheus.py +115 -0
  125. gatewaysdk/cli/release_gate.py +215 -0
  126. gatewaysdk/cli/store.py +131 -0
  127. gatewaysdk/cli/vllm.py +29 -0
  128. gatewaysdk/client.py +406 -0
  129. gatewaysdk/config.py +348 -0
  130. gatewaysdk/connectors/__init__.py +25 -0
  131. gatewaysdk/connectors/client.py +203 -0
  132. gatewaysdk/connectors/skill.py +25 -0
  133. gatewaysdk/connectors/template.py +106 -0
  134. gatewaysdk/context.py +606 -0
  135. gatewaysdk/emitter/__init__.py +43 -0
  136. gatewaysdk/emitter/annotation.py +370 -0
  137. gatewaysdk/emitter/exception.py +54 -0
  138. gatewaysdk/emitter/message.py +61 -0
  139. gatewaysdk/emitter/object.py +117 -0
  140. gatewaysdk/emitter/reward.py +320 -0
  141. gatewaysdk/env_var.py +156 -0
  142. gatewaysdk/environment/__init__.py +108 -0
  143. gatewaysdk/environment/_bundle.py +281 -0
  144. gatewaysdk/environment/_harbor.py +276 -0
  145. gatewaysdk/environment/_materialize.py +97 -0
  146. gatewaysdk/environment/_tar.py +33 -0
  147. gatewaysdk/environment/_world.py +346 -0
  148. gatewaysdk/environment/core.py +527 -0
  149. gatewaysdk/environment/errors.py +58 -0
  150. gatewaysdk/environment/runtime.py +150 -0
  151. gatewaysdk/environment/schema/__init__.py +35 -0
  152. gatewaysdk/environment/schema/__main__.py +225 -0
  153. gatewaysdk/environment/schema/_slack_fidelity.py +116 -0
  154. gatewaysdk/environment/schema/_slack_scenario.py +183 -0
  155. gatewaysdk/environment/schema/api.py +1628 -0
  156. gatewaysdk/environment/schema/batch.py +755 -0
  157. gatewaysdk/environment/schema/compiler.py +615 -0
  158. gatewaysdk/environment/schema/conform.py +428 -0
  159. gatewaysdk/environment/schema/connector.py +777 -0
  160. gatewaysdk/environment/schema/connectors/apple-business-manager/handlers.py +17 -0
  161. gatewaysdk/environment/schema/connectors/apple-business-manager/parity.json +28 -0
  162. gatewaysdk/environment/schema/connectors/apple-business-manager/provenance.json +233 -0
  163. gatewaysdk/environment/schema/connectors/apple-business-manager/scope.toml +112 -0
  164. gatewaysdk/environment/schema/connectors/apple-business-manager/world.json +1380 -0
  165. gatewaysdk/environment/schema/connectors/base.json +28 -0
  166. gatewaysdk/environment/schema/connectors/custom/handlers.py +18 -0
  167. gatewaysdk/environment/schema/connectors/custom/world.json +123 -0
  168. gatewaysdk/environment/schema/connectors/github/handlers.py +81 -0
  169. gatewaysdk/environment/schema/connectors/github/parity.json +37 -0
  170. gatewaysdk/environment/schema/connectors/github/provenance.json +134 -0
  171. gatewaysdk/environment/schema/connectors/github/scope.toml +158 -0
  172. gatewaysdk/environment/schema/connectors/github/world.json +5869 -0
  173. gatewaysdk/environment/schema/connectors/google-calendar/handlers.py +23 -0
  174. gatewaysdk/environment/schema/connectors/google-calendar/world.json +209 -0
  175. gatewaysdk/environment/schema/connectors/google-drive/handlers.py +18 -0
  176. gatewaysdk/environment/schema/connectors/google-drive/world.json +286 -0
  177. gatewaysdk/environment/schema/connectors/jamf/handlers.py +34 -0
  178. gatewaysdk/environment/schema/connectors/jamf/parity.json +49 -0
  179. gatewaysdk/environment/schema/connectors/jamf/provenance.json +181 -0
  180. gatewaysdk/environment/schema/connectors/jamf/scope.toml +128 -0
  181. gatewaysdk/environment/schema/connectors/jamf/world.json +2218 -0
  182. gatewaysdk/environment/schema/connectors/jira/handlers.py +28 -0
  183. gatewaysdk/environment/schema/connectors/jira/world.json +389 -0
  184. gatewaysdk/environment/schema/connectors/kandji/handlers.py +38 -0
  185. gatewaysdk/environment/schema/connectors/kandji/parity.json +29 -0
  186. gatewaysdk/environment/schema/connectors/kandji/provenance.json +152 -0
  187. gatewaysdk/environment/schema/connectors/kandji/scope.toml +120 -0
  188. gatewaysdk/environment/schema/connectors/kandji/world.json +765 -0
  189. gatewaysdk/environment/schema/connectors/linear/handlers.py +20 -0
  190. gatewaysdk/environment/schema/connectors/linear/world.json +363 -0
  191. gatewaysdk/environment/schema/connectors/microsoft-teams/fidelity.json +45 -0
  192. gatewaysdk/environment/schema/connectors/microsoft-teams/handlers.py +1 -0
  193. gatewaysdk/environment/schema/connectors/microsoft-teams/provenance.json +851 -0
  194. gatewaysdk/environment/schema/connectors/microsoft-teams/scope.md +231 -0
  195. gatewaysdk/environment/schema/connectors/microsoft-teams/teams-types.json +1710 -0
  196. gatewaysdk/environment/schema/connectors/microsoft-teams/world.json +858 -0
  197. gatewaysdk/environment/schema/connectors/netsuite/handlers.py +32 -0
  198. gatewaysdk/environment/schema/connectors/netsuite/parity.json +50 -0
  199. gatewaysdk/environment/schema/connectors/netsuite/provenance.json +137 -0
  200. gatewaysdk/environment/schema/connectors/netsuite/scope.toml +78 -0
  201. gatewaysdk/environment/schema/connectors/netsuite/world.json +16243 -0
  202. gatewaysdk/environment/schema/connectors/salesforce/handlers.py +806 -0
  203. gatewaysdk/environment/schema/connectors/salesforce/parity.json +46 -0
  204. gatewaysdk/environment/schema/connectors/salesforce/provenance.json +143 -0
  205. gatewaysdk/environment/schema/connectors/salesforce/scope.toml +174 -0
  206. gatewaysdk/environment/schema/connectors/salesforce/world.json +4695 -0
  207. gatewaysdk/environment/schema/connectors/slack/MODEL.md +236 -0
  208. gatewaysdk/environment/schema/connectors/slack/capabilities.json +1039 -0
  209. gatewaysdk/environment/schema/connectors/slack/handlers.py +762 -0
  210. gatewaysdk/environment/schema/connectors/slack/parity.json +65 -0
  211. gatewaysdk/environment/schema/connectors/slack/provenance.json +294 -0
  212. gatewaysdk/environment/schema/connectors/slack/scope.toml +44 -0
  213. gatewaysdk/environment/schema/connectors/slack/world.json +4993 -0
  214. gatewaysdk/environment/schema/connectors/workday/handlers.py +75 -0
  215. gatewaysdk/environment/schema/connectors/workday/parity.json +36 -0
  216. gatewaysdk/environment/schema/connectors/workday/provenance.json +179 -0
  217. gatewaysdk/environment/schema/connectors/workday/scope.toml +180 -0
  218. gatewaysdk/environment/schema/connectors/workday/world.json +806 -0
  219. gatewaysdk/environment/schema/data.py +593 -0
  220. gatewaysdk/environment/schema/extract.py +263 -0
  221. gatewaysdk/environment/schema/host.py +2437 -0
  222. gatewaysdk/environment/schema/host_surfaces.py +275 -0
  223. gatewaysdk/environment/schema/platform.py +1272 -0
  224. gatewaysdk/environment/schema/scaffold.py +250 -0
  225. gatewaysdk/environment/schema/skill.py +118 -0
  226. gatewaysdk/environment/schema/skills/agents/connector-template-author.md +202 -0
  227. gatewaysdk/environment/schema/skills/connector-schema-authoring/CONNECTORS.md +331 -0
  228. gatewaysdk/environment/schema/skills/connector-schema-authoring/CONVENTIONS.md +100 -0
  229. gatewaysdk/environment/schema/skills/connector-schema-authoring/SKILL.md +313 -0
  230. gatewaysdk/environment/schema/skills/world-data-ingestion/ROWS.md +223 -0
  231. gatewaysdk/environment/schema/skills/world-data-ingestion/SKILL.md +293 -0
  232. gatewaysdk/environment/schema/skills/worlds-getting-started/SKILL.md +390 -0
  233. gatewaysdk/environment/schema/slack.py +757 -0
  234. gatewaysdk/environment/schema/snapshot.py +479 -0
  235. gatewaysdk/environment/schema/store.py +904 -0
  236. gatewaysdk/environment/schema/tasks.py +525 -0
  237. gatewaysdk/environment/schema/tools_world.py +322 -0
  238. gatewaysdk/environment/schema/validation.py +577 -0
  239. gatewaysdk/environment/schema/worker.py +78 -0
  240. gatewaysdk/environment/schema/workers.py +500 -0
  241. gatewaysdk/environment/schema/world_tests.py +336 -0
  242. gatewaysdk/environments/__init__.py +24 -0
  243. gatewaysdk/environments/client.py +486 -0
  244. gatewaysdk/environments/types.py +318 -0
  245. gatewaysdk/execution/__init__.py +15 -0
  246. gatewaysdk/execution/base.py +64 -0
  247. gatewaysdk/execution/client_server.py +443 -0
  248. gatewaysdk/execution/events.py +69 -0
  249. gatewaysdk/execution/inter_process.py +16 -0
  250. gatewaysdk/execution/shared_memory.py +282 -0
  251. gatewaysdk/experiments/__init__.py +90 -0
  252. gatewaysdk/experiments/assignment.py +177 -0
  253. gatewaysdk/experiments/client.py +877 -0
  254. gatewaysdk/experiments/exposure.py +222 -0
  255. gatewaysdk/experiments/types.py +81 -0
  256. gatewaysdk/importers/__init__.py +49 -0
  257. gatewaysdk/importers/_normalize.py +91 -0
  258. gatewaysdk/importers/builder.py +173 -0
  259. gatewaysdk/importers/client.py +95 -0
  260. gatewaysdk/importers/langsmith.py +196 -0
  261. gatewaysdk/importers/recipes.py +249 -0
  262. gatewaysdk/instrumentation/__init__.py +300 -0
  263. gatewaysdk/instrumentation/agentops.py +314 -0
  264. gatewaysdk/instrumentation/agentops_langchain.py +45 -0
  265. gatewaysdk/instrumentation/base.py +119 -0
  266. gatewaysdk/instrumentation/litellm.py +83 -0
  267. gatewaysdk/instrumentation/registry.py +273 -0
  268. gatewaysdk/instrumentation/vllm.py +81 -0
  269. gatewaysdk/instrumentation/weave.py +500 -0
  270. gatewaysdk/integrations/__init__.py +15 -0
  271. gatewaysdk/integrations/gateway/__init__.py +11 -0
  272. gatewaysdk/integrations/gateway/client.py +171 -0
  273. gatewaysdk/integrations/tool_access.py +549 -0
  274. gatewaysdk/litagent/__init__.py +11 -0
  275. gatewaysdk/litagent/decorator.py +536 -0
  276. gatewaysdk/litagent/litagent.py +252 -0
  277. gatewaysdk/llm_proxy.py +1742 -0
  278. gatewaysdk/logging.py +370 -0
  279. gatewaysdk/memory.py +278 -0
  280. gatewaysdk/personas.py +186 -0
  281. gatewaysdk/platform/__init__.py +17 -0
  282. gatewaysdk/platform/builder.py +221 -0
  283. gatewaysdk/platform/compatibility.py +67 -0
  284. gatewaysdk/platform/manifest.py +185 -0
  285. gatewaysdk/platform/orchestrator.py +901 -0
  286. gatewaysdk/platform/registry.py +122 -0
  287. gatewaysdk/platform/worker.py +864 -0
  288. gatewaysdk/replay/__init__.py +1032 -0
  289. gatewaysdk/replay/pytest.py +56 -0
  290. gatewaysdk/reward.py +7 -0
  291. gatewaysdk/run.py +1781 -0
  292. gatewaysdk/runner/__init__.py +11 -0
  293. gatewaysdk/runner/agent.py +878 -0
  294. gatewaysdk/runner/base.py +182 -0
  295. gatewaysdk/runner/legacy.py +309 -0
  296. gatewaysdk/security.py +700 -0
  297. gatewaysdk/semconv.py +170 -0
  298. gatewaysdk/server.py +399 -0
  299. gatewaysdk/sessions.py +282 -0
  300. gatewaysdk/store/__init__.py +45 -0
  301. gatewaysdk/store/base.py +908 -0
  302. gatewaysdk/store/client_server.py +2093 -0
  303. gatewaysdk/store/collection/__init__.py +30 -0
  304. gatewaysdk/store/collection/base.py +587 -0
  305. gatewaysdk/store/collection/memory.py +970 -0
  306. gatewaysdk/store/collection/mongo.py +1412 -0
  307. gatewaysdk/store/collection_based.py +1823 -0
  308. gatewaysdk/store/gateway.py +983 -0
  309. gatewaysdk/store/gateway_listener.py +465 -0
  310. gatewaysdk/store/listener.py +58 -0
  311. gatewaysdk/store/memory.py +396 -0
  312. gatewaysdk/store/mongo.py +165 -0
  313. gatewaysdk/store/redis_stream.py +517 -0
  314. gatewaysdk/store/sqlite.py +3 -0
  315. gatewaysdk/store/threading.py +370 -0
  316. gatewaysdk/store/utils.py +142 -0
  317. gatewaysdk/tracer/__init__.py +14 -0
  318. gatewaysdk/tracer/base.py +286 -0
  319. gatewaysdk/tracer/dummy.py +106 -0
  320. gatewaysdk/tracer/otel.py +559 -0
  321. gatewaysdk/tracing/__init__.py +110 -0
  322. gatewaysdk/tracing/api.py +808 -0
  323. gatewaysdk/tracing/attributes.py +9 -0
  324. gatewaysdk/tracing/context.py +272 -0
  325. gatewaysdk/tracing/exporters/__init__.py +10 -0
  326. gatewaysdk/tracing/exporters/gateway.py +228 -0
  327. gatewaysdk/tracing/identity.py +288 -0
  328. gatewaysdk/tracing/init.py +620 -0
  329. gatewaysdk/tracing/instrumentors/__init__.py +15 -0
  330. gatewaysdk/tracing/instrumentors/claude_agent_sdk.py +766 -0
  331. gatewaysdk/tracing/instrumentors/instrumentation_principles.md +294 -0
  332. gatewaysdk/tracing/instrumentors/registry.py +352 -0
  333. gatewaysdk/tracing/mapping.py +729 -0
  334. gatewaysdk/tracing/processors.py +393 -0
  335. gatewaysdk/tracing/push.py +617 -0
  336. gatewaysdk/tracing/push_models.py +247 -0
  337. gatewaysdk/tracing/semconv.py +294 -0
  338. gatewaysdk/tracing/span_builder.py +356 -0
  339. gatewaysdk/trainer/__init__.py +6 -0
  340. gatewaysdk/trainer/init_utils.py +263 -0
  341. gatewaysdk/trainer/legacy.py +359 -0
  342. gatewaysdk/trainer/registry.py +12 -0
  343. gatewaysdk/trainer/trainer.py +638 -0
  344. gatewaysdk/types/__init__.py +63 -0
  345. gatewaysdk/types/core.py +556 -0
  346. gatewaysdk/types/resources.py +204 -0
  347. gatewaysdk/types/tracer.py +515 -0
  348. gatewaysdk/types/tracing.py +162 -0
  349. gatewaysdk/users.py +251 -0
  350. gatewaysdk/utils/__init__.py +1 -0
  351. gatewaysdk/utils/id.py +18 -0
  352. gatewaysdk/utils/metrics.py +1025 -0
  353. gatewaysdk/utils/otel.py +550 -0
  354. gatewaysdk/utils/otlp.py +556 -0
  355. gatewaysdk/utils/redact.py +22 -0
  356. gatewaysdk/utils/server_launcher.py +1045 -0
  357. gatewaysdk/utils/system_snapshot.py +90 -0
  358. gatewaysdk/verl/__init__.py +8 -0
  359. gatewaysdk/verl/__main__.py +6 -0
  360. gatewaysdk/verl/async_server.py +46 -0
  361. gatewaysdk/verl/config.yaml +27 -0
  362. gatewaysdk/verl/daemon.py +1154 -0
  363. gatewaysdk/verl/dataset.py +44 -0
  364. gatewaysdk/verl/entrypoint.py +248 -0
  365. gatewaysdk/verl/trainer.py +549 -0
  366. gatewaysdk/world_browser.py +748 -0
  367. gatewaysdk/world_data.py +453 -0
  368. gatewaysdk/world_sessions.py +978 -0
  369. gatewaysdk/world_tasks.py +285 -0
  370. gatewaysdk/world_tools.py +115 -0
  371. gatewaysdk/worlds.py +639 -0
  372. gatewaysdk-0.3.2.dist-info/METADATA +236 -0
  373. gatewaysdk-0.3.2.dist-info/RECORD +376 -0
  374. gatewaysdk-0.3.2.dist-info/WHEEL +4 -0
  375. gatewaysdk-0.3.2.dist-info/entry_points.txt +5 -0
  376. gatewaysdk-0.3.2.dist-info/licenses/LICENSE +19 -0
@@ -0,0 +1,115 @@
1
+ # Copyright (c) Microsoft. All rights reserved.
2
+
3
+ """Serve Prometheus metrics from the GatewaySDK 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 gatewaysdk.logging import setup as setup_logging
18
+ from gatewaysdk.utils.metrics import get_prometheus_registry
19
+ from gatewaysdk.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="GatewaySDK 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())
@@ -0,0 +1,215 @@
1
+ # Copyright (c) Gateway. All rights reserved.
2
+
3
+ """`gateway release gate` — ask the release gate about a build, from CI.
4
+
5
+ The platform applies one rule before a build is promoted (pass rate over
6
+ graded rollouts, plus a floor on how many were graded). That rule lives on
7
+ the server; this command only asks for the verdict and turns it into an exit
8
+ code a pipeline can branch on:
9
+
10
+ 0 pass the gate is open on the build's latest run
11
+ 1 blocked the latest run failed the rule; the reasons say how
12
+ 2 untested nothing to judge yet: no run recorded this build, or its
13
+ latest run is still going
14
+
15
+ `--wait` polls until every run attributed to the build is terminal (or the
16
+ timeout lapses), so a CI step can start a run and then block on the verdict.
17
+ The verdict itself is never computed here: a second copy of the rule in the
18
+ CLI is exactly the drift the server endpoint exists to prevent.
19
+
20
+ Kept apart from ``platform.py`` so tests can drive it with a fake HTTP
21
+ client and no typer app.
22
+ """
23
+
24
+ from __future__ import annotations
25
+
26
+ import json
27
+ import time
28
+ from typing import Any, Callable, Dict, List, Optional, Tuple
29
+
30
+ EXIT_PASS = 0
31
+ EXIT_BLOCKED = 1
32
+ EXIT_UNTESTED = 2
33
+
34
+ EXIT_CODES: Dict[str, int] = {
35
+ "pass": EXIT_PASS,
36
+ "blocked": EXIT_BLOCKED,
37
+ "untested": EXIT_UNTESTED,
38
+ }
39
+
40
+ # Statuses after which a run grades nothing further. Mirrors the server's
41
+ # `isTerminalRunStatus`; `--wait` stops when every listed run is one of these.
42
+ TERMINAL_STATES = frozenset({"COMPLETED", "FAILED", "ERROR", "TIMEOUT", "CANCELLED"})
43
+
44
+ GATE_PATH = "/api/public/agent-builds/gate"
45
+
46
+
47
+ class GateLookupError(ValueError):
48
+ """The caller named the build zero ways or more than one way."""
49
+
50
+
51
+ def build_query(
52
+ *,
53
+ build: Optional[str],
54
+ agent: Optional[str],
55
+ version: Optional[str],
56
+ commit: Optional[str],
57
+ ) -> Dict[str, str]:
58
+ """Exactly one way of naming the build, as the endpoint's query string."""
59
+ ways = [build is not None, agent is not None or version is not None, commit is not None]
60
+ if sum(ways) != 1:
61
+ raise GateLookupError("name the build one way: --build, --agent + --version, or --commit")
62
+ if build is not None:
63
+ return {"buildId": build}
64
+ if commit is not None:
65
+ return {"commitSha": commit}
66
+ if not agent or not version:
67
+ raise GateLookupError("--agent and --version go together; supply both")
68
+ return {"agentId": agent, "version": version}
69
+
70
+
71
+ def fetch_gate(client: Any, query: Dict[str, str]) -> Dict[str, Any]:
72
+ """One GET against the gate endpoint. Raises on any non-2xx status."""
73
+ response = client.get(GATE_PATH, params=query)
74
+ if response.status_code == 404:
75
+ detail = _error_detail(response)
76
+ raise LookupError(detail or "no build matches that lookup")
77
+ response.raise_for_status()
78
+ return response.json()
79
+
80
+
81
+ def _error_detail(response: Any) -> Optional[str]:
82
+ try:
83
+ body = response.json()
84
+ except Exception: # noqa: BLE001 - a non-JSON error body is still an error
85
+ return None
86
+ if isinstance(body, dict):
87
+ for key in ("message", "error"):
88
+ if isinstance(body.get(key), str):
89
+ return body[key]
90
+ return None
91
+
92
+
93
+ def runs_settled(result: Dict[str, Any]) -> bool:
94
+ """True once the build has runs and none of them can still change."""
95
+ runs = result.get("evaluatedRuns") or []
96
+ if not runs:
97
+ return False
98
+ return all(str(run.get("state", "")).upper() in TERMINAL_STATES for run in runs)
99
+
100
+
101
+ def wait_for_gate(
102
+ client: Any,
103
+ query: Dict[str, str],
104
+ *,
105
+ timeout_s: float,
106
+ interval_s: float,
107
+ clock: Callable[[], float] = time.monotonic,
108
+ sleep: Callable[[float], None] = time.sleep,
109
+ on_poll: Optional[Callable[[Dict[str, Any]], None]] = None,
110
+ ) -> Tuple[Dict[str, Any], bool]:
111
+ """Poll until the attributed runs are terminal or the timeout lapses.
112
+
113
+ Returns the last result and whether the runs settled. A timeout is not an
114
+ error: the caller gets the latest verdict (usually ``untested``) and the
115
+ honest exit code for it.
116
+ """
117
+ deadline = clock() + timeout_s
118
+ while True:
119
+ result = fetch_gate(client, query)
120
+ if on_poll is not None:
121
+ on_poll(result)
122
+ if runs_settled(result):
123
+ return result, True
124
+ if clock() >= deadline:
125
+ return result, False
126
+ sleep(interval_s)
127
+
128
+
129
+ def exit_code_for(result: Dict[str, Any]) -> int:
130
+ verdict = str(result.get("gate", {}).get("verdict", "")).lower()
131
+ if verdict not in EXIT_CODES:
132
+ raise ValueError(f"unknown gate verdict {verdict!r}")
133
+ return EXIT_CODES[verdict]
134
+
135
+
136
+ def _fmt_rate(rate: Optional[float]) -> str:
137
+ return "n/a" if rate is None else f"{rate:.2f}"
138
+
139
+
140
+ def render_table(result: Dict[str, Any]) -> str:
141
+ """The verdict as a short table, then the reasons and the judged runs."""
142
+ build = result.get("build", {})
143
+ gate = result.get("gate", {})
144
+ compared = result.get("comparedTo")
145
+
146
+ rows: List[Tuple[str, str]] = [
147
+ ("verdict", str(gate.get("verdict", "?")).upper()),
148
+ ("agent", str(build.get("agentId", "?"))),
149
+ ("version", str(build.get("version") or "-")),
150
+ ("build", str(build.get("id", "?"))),
151
+ ("commit", str(build.get("commitSha") or "-")),
152
+ ("pass rate", _fmt_rate(gate.get("passRate"))),
153
+ ("graded", str(gate.get("gradedRollouts", 0))),
154
+ (
155
+ "rule",
156
+ f"needs {_fmt_rate(gate.get('threshold'))} pass rate "
157
+ f"and at least {gate.get('minGradedRollouts', '?')} graded",
158
+ ),
159
+ ]
160
+ if compared:
161
+ stable = compared.get("stableVersion") or compared.get("stableBuildId")
162
+ rows.append(("production", str(stable)))
163
+
164
+ width = max(len(k) for k, _ in rows)
165
+ lines = [f"{k.ljust(width)} {v}" for k, v in rows]
166
+
167
+ reasons = gate.get("reasons") or []
168
+ if reasons:
169
+ lines.append("")
170
+ lines.extend(f"- {reason}" for reason in reasons)
171
+
172
+ runs = result.get("evaluatedRuns") or []
173
+ if runs:
174
+ lines.append("")
175
+ lines.append("runs (newest first):")
176
+ for run in runs:
177
+ lines.append(
178
+ f" {run.get('runId')} {run.get('state')} "
179
+ f"world={run.get('world') or '-'} model={run.get('model') or '-'} "
180
+ f"pass={_fmt_rate(run.get('passRate'))} graded={run.get('graded', 0)}"
181
+ )
182
+ return "\n".join(lines)
183
+
184
+
185
+ def render_json(result: Dict[str, Any]) -> str:
186
+ return json.dumps(result, indent=2, sort_keys=True)
187
+
188
+
189
+ def write_step_summary(result: Dict[str, Any], path: Optional[str]) -> None:
190
+ """Append the verdict to a GitHub Actions step summary, when one exists.
191
+
192
+ A nicety, never the contract: the exit code is what a pipeline acts on,
193
+ so a summary that cannot be written is ignored rather than fatal.
194
+ """
195
+ if not path:
196
+ return
197
+ build = result.get("build", {})
198
+ gate = result.get("gate", {})
199
+ lines = [
200
+ f"### Release gate: {build.get('agentId', '?')} {build.get('version') or ''}".rstrip(),
201
+ "",
202
+ "| | |",
203
+ "|---|---|",
204
+ f"| verdict | {str(gate.get('verdict', '?')).upper()} |",
205
+ f"| pass rate | {_fmt_rate(gate.get('passRate'))} |",
206
+ f"| graded | {gate.get('gradedRollouts', 0)} |",
207
+ f"| rule | {_fmt_rate(gate.get('threshold'))} / {gate.get('minGradedRollouts', '?')} graded |",
208
+ ]
209
+ for reason in gate.get("reasons") or []:
210
+ lines.append(f"| reason | {reason} |")
211
+ try:
212
+ with open(path, "a", encoding="utf-8") as fh:
213
+ fh.write("\n".join(lines) + "\n\n")
214
+ except OSError:
215
+ pass
@@ -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 gatewaysdk import setup_logging
13
+ from gatewaysdk.store.client_server import LightningStoreServer
14
+ from gatewaysdk.store.memory import InMemoryLightningStore
15
+ from gatewaysdk.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 gatewaysdk.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())
gatewaysdk/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 gatewaysdk.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())