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,346 @@
1
+ """Worlds — deterministic instances of a mock-tools environment's seeded state.
2
+
3
+ A world is one sqlite file, branched (file-copied) from the environment's
4
+ prepared template db, plus the seams that let an agent's tool calls execute
5
+ against it: ``execute``, ``as_registry`` (the exact replay ``ToolStubRegistry``
6
+ mapping contract), ``wrap_tools``, and grading (``verify`` / ``state``).
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import shutil
12
+ import sqlite3
13
+ import time
14
+ import uuid
15
+ from contextlib import nullcontext
16
+ from dataclasses import dataclass, field
17
+ from pathlib import Path
18
+ from typing import TYPE_CHECKING, Any, Callable, Dict, List, Mapping, Optional, Union
19
+
20
+ try:
21
+ from ..replay import StubRegistryMapping
22
+ except ImportError:
23
+ # ``replay`` pulls in ``requests`` + the sessions stack. A lean consumer
24
+ # that only needs worlds + verifiers (e.g. the benchmark runner's
25
+ # mock_tools engine, which vendors just this ``environment`` subpackage —
26
+ # no ``replay``) still imports ``World``/``verify``; only ``as_registry``
27
+ # (the replay registry contract) is unavailable there, and it is never
28
+ # called on that path. The full SDK always has ``replay``, so real
29
+ # behaviour is unchanged.
30
+ StubRegistryMapping = dict # type: ignore[assignment,misc]
31
+ from . import runtime
32
+ from .errors import ToolRouteError, VerifierError
33
+
34
+ if TYPE_CHECKING: # pragma: no cover
35
+ from .core import Environment
36
+
37
+
38
+ @dataclass
39
+ class VerifierResult:
40
+ """One verifier outcome. ``score=None`` stays ``None`` (house rule: null
41
+ scores are their own category, never coerced to 0) and yields
42
+ ``passed=None``; otherwise ``passed = score >= 1.0``."""
43
+
44
+ name: str
45
+ passed: Optional[bool]
46
+ score: Optional[float]
47
+ detail: str = ""
48
+ rewards: Dict[str, float] = field(default_factory=dict)
49
+
50
+
51
+ def split_sql_statements(script: str) -> List[str]:
52
+ """Split a SQL script into complete statements (via
53
+ ``sqlite3.complete_statement`` accumulation, so semicolons inside string
54
+ literals don't split)."""
55
+ statements: List[str] = []
56
+ buffer = ""
57
+ for line in script.splitlines(keepends=True):
58
+ buffer += line
59
+ if sqlite3.complete_statement(buffer):
60
+ stripped = buffer.strip()
61
+ if stripped:
62
+ statements.append(stripped)
63
+ buffer = ""
64
+ if buffer.strip():
65
+ statements.append(buffer.strip())
66
+ return statements
67
+
68
+
69
+ _NO_INPUT = object()
70
+
71
+
72
+ def _stub_input(tool_input: Any, kwargs: Dict[str, Any]) -> Any:
73
+ """One rule for callable seams: an explicit positional input (even None)
74
+ is the input; keyword arguments are the input; nothing means omitted."""
75
+ if tool_input is not _NO_INPUT:
76
+ return tool_input
77
+ return kwargs if kwargs else _NO_INPUT
78
+
79
+
80
+ class WorldRegistry(StubRegistryMapping):
81
+ """``world.as_registry()`` — the replay registry contract (mapping with
82
+ ``__missing__``, ``lookup``, ``call_log``/``called_names``) backed by the
83
+ live env world instead of recordings."""
84
+
85
+ def __init__(self, world: "World") -> None:
86
+ self._world = world
87
+
88
+ def make(name: str) -> Callable[..., Any]:
89
+ def stub(tool_input: Any = _NO_INPUT, **kwargs: Any) -> Any:
90
+ return world._registry_call(name, _stub_input(tool_input, kwargs))
91
+
92
+ stub.__name__ = name if name.isidentifier() else "stub"
93
+ stub.__qualname__ = f"gateway_env.{name}"
94
+ return stub
95
+
96
+ super().__init__(
97
+ {name: make(name) for name in world.env._handlers}, make
98
+ )
99
+
100
+ @property
101
+ def call_log(self) -> List[Dict[str, Any]]:
102
+ return self._world.call_log
103
+
104
+ def lookup(self, tool_name: str, tool_input: Any = _NO_INPUT) -> Any:
105
+ return self._world._registry_call(tool_name, tool_input)
106
+
107
+ def called_names(self) -> List[str]:
108
+ return [entry["tool"] for entry in self._world.call_log]
109
+
110
+
111
+ class World:
112
+ """One live, isolated instance of the environment's seeded state."""
113
+
114
+ def __init__(self, env: "Environment", *, world_id: Optional[str] = None, snapshot: Optional[Path] = None) -> None:
115
+ self.env = env
116
+ self.id = world_id or uuid.uuid4().hex[:8]
117
+ self.db_path: Path = env._worlds_dir / f"world-{self.id}.db"
118
+ self.call_log: List[Dict[str, Any]] = []
119
+ from .schema import bundle_mode, check_bundle
120
+
121
+ self.contract = check_bundle(env.bundle_path) if bundle_mode(env.bundle_path) is not None else None
122
+ self.store = None
123
+ shutil.copyfile(snapshot if snapshot is not None else env._template_db, self.db_path)
124
+ try:
125
+ self._conn = self._connect()
126
+ except BaseException:
127
+ self.db_path.unlink(missing_ok=True)
128
+ raise
129
+
130
+ def _connect(self) -> sqlite3.Connection:
131
+ # autocommit + cross-thread: agents call tools from worker threads, and
132
+ # file copies (branch/snapshot/reset) must always see committed state.
133
+ if self.contract is not None:
134
+ from .schema import SQLiteStore
135
+
136
+ self.store = SQLiteStore.open(self.db_path, self.contract)
137
+ return self.store._conn # Trusted host only; handlers receive ReadConnection.
138
+ conn = sqlite3.connect(self.db_path, isolation_level=None, check_same_thread=False)
139
+ conn.row_factory = sqlite3.Row
140
+ return conn
141
+
142
+ # -- execution seams -------------------------------------------------
143
+
144
+ def execute(self, tool_name: str, tool_input: Any = _NO_INPUT) -> Any:
145
+ """Execute atomically in schema mode, validating both input and output."""
146
+ from .schema.store import ReadConnection
147
+ from .schema.validation import validate
148
+
149
+ handler = self.env._handlers.get(tool_name)
150
+ if handler is None or (self.contract is not None and tool_name not in self.contract.tools):
151
+ raise ToolRouteError(f"tool '{tool_name}' has no declared env handler")
152
+ supplied = ({} if self.contract else None) if tool_input is _NO_INPUT else tool_input
153
+ started = time.perf_counter()
154
+ with self.store.transaction() if self.store is not None else nullcontext():
155
+ if self.contract is not None:
156
+ validate(
157
+ self.contract.tools[tool_name]["input_schema"],
158
+ supplied,
159
+ location=f"world.json#/x-gateway/tools/{tool_name}/input",
160
+ )
161
+ token = runtime._active_connection.set(ReadConnection(self.store) if self.store is not None else self._conn)
162
+ store_token = runtime._active_store.set(self.store)
163
+ try:
164
+ if isinstance(supplied, Mapping):
165
+ result = handler(**supplied)
166
+ elif supplied is None:
167
+ result = handler()
168
+ else:
169
+ result = handler(supplied)
170
+ if self.contract is not None:
171
+ validate(
172
+ self.contract.tools[tool_name]["output_schema"],
173
+ result,
174
+ location=f"world.json#/x-gateway/tools/{tool_name}/output",
175
+ )
176
+ finally:
177
+ runtime._active_connection.reset(token)
178
+ runtime._active_store.reset(store_token)
179
+ duration_ms = (time.perf_counter() - started) * 1000.0
180
+ self.call_log.append({"tool": tool_name, "match": "env", "input": supplied})
181
+ self.env._record_route(tool_name, "env", duration_ms, self.id)
182
+ return result
183
+
184
+ def _registry_call(
185
+ self, tool_name: str, tool_input: Any = _NO_INPUT
186
+ ) -> Any:
187
+ if tool_name in self.env._handlers and self.env.resolve_route(tool_name) == "env":
188
+ return self.execute(tool_name, tool_input)
189
+ route = self.env.resolve_route(tool_name)
190
+ logged = None if tool_input is _NO_INPUT else tool_input
191
+ self.call_log.append({"tool": tool_name, "match": "miss", "input": logged})
192
+ if route == "prod":
193
+ raise ToolRouteError(
194
+ f"tool '{tool_name}' routes to prod, but the registry seam has no "
195
+ "live implementation to call — pass the real callable via "
196
+ "world.wrap_tools()/your own registry, or rely on the ambient "
197
+ "define_tool wrapper (with env:), which passes prod-routed calls "
198
+ "through to the original function."
199
+ )
200
+ raise ToolRouteError(
201
+ f"tool '{tool_name}' has no env handler "
202
+ f"(served: {sorted(self.env._handlers)}) and no prod route."
203
+ )
204
+
205
+ def as_registry(self) -> WorldRegistry:
206
+ """Tool-name → callable mapping, drop-in for agent tool layers —
207
+ identical contract to ``ToolStubRegistry.as_registry()`` in replay."""
208
+ return WorldRegistry(self)
209
+
210
+ def wrap_tools(
211
+ self, tools: Union[Mapping[str, Any], List[Any]]
212
+ ) -> Union[Dict[str, Any], List[Any]]:
213
+ """Substitute env-served callables by name in a list/dict of tools;
214
+ everything not served (or not env-routed) passes through unchanged."""
215
+
216
+ def routed_to_env(name: Optional[str]) -> bool:
217
+ return bool(name) and name in self.env._handlers and self.env.resolve_route(name) == "env"
218
+
219
+ def stub_for(name: str) -> Callable[..., Any]:
220
+ def stub(tool_input: Any = _NO_INPUT, **kwargs: Any) -> Any:
221
+ return self.execute(name, _stub_input(tool_input, kwargs))
222
+
223
+ stub.__name__ = name if name.isidentifier() else "stub"
224
+ return stub
225
+
226
+ if isinstance(tools, Mapping):
227
+ return {
228
+ name: (stub_for(name) if routed_to_env(name) else value)
229
+ for name, value in tools.items()
230
+ }
231
+ wrapped: List[Any] = []
232
+ for item in tools:
233
+ name = getattr(item, "name", None)
234
+ if not isinstance(name, str):
235
+ name = getattr(item, "__name__", None)
236
+ wrapped.append(stub_for(name) if routed_to_env(name) else item)
237
+ return wrapped
238
+
239
+ # -- state lifecycle -------------------------------------------------
240
+
241
+ def reset(self) -> None:
242
+ """Back to the seed, in place (same world instance)."""
243
+ if self.contract is not None:
244
+ from .schema import check_bundle
245
+
246
+ if check_bundle(self.env.bundle_path).lock != self.contract.lock:
247
+ from .schema import ContractError
248
+
249
+ raise ContractError("state_contract", "Bundle contract changed; create a new world explicitly")
250
+ if self.store is not None:
251
+ self.store.close()
252
+ else:
253
+ self._conn.close()
254
+ shutil.copyfile(self.env._template_db, self.db_path)
255
+ self._conn = self._connect()
256
+
257
+ def restore(self, source: Union[str, Path]) -> None:
258
+ """Replace this world's state with a file :meth:`snapshot` wrote, in place.
259
+ The file is opened the way a fresh copy of the seed is, so a schema-backed
260
+ world audits it against its contract."""
261
+ if self.store is not None:
262
+ self.store.close()
263
+ else:
264
+ self._conn.close()
265
+ shutil.copyfile(source, self.db_path)
266
+ self._conn = self._connect()
267
+
268
+ def snapshot(self, destination: Union[str, Path]) -> Path:
269
+ """Pin this world's current state to a file (for debugging fixtures)."""
270
+ if self.store is not None:
271
+ return self.store.snapshot(destination)
272
+ dest = Path(destination)
273
+ dest.parent.mkdir(parents=True, exist_ok=True)
274
+ shutil.copyfile(self.db_path, dest)
275
+ return dest
276
+
277
+ def close(self) -> None:
278
+ try:
279
+ if self.store is not None:
280
+ self.store.close()
281
+ else:
282
+ self._conn.close()
283
+ except sqlite3.Error: # pragma: no cover — close is best-effort
284
+ pass
285
+
286
+ # -- grading ---------------------------------------------------------
287
+
288
+ def state(self, sql: str, *params: Any) -> List[Dict[str, Any]]:
289
+ """Read-only SQL against the world's db (SELECT/WITH only)."""
290
+ if self.store is not None:
291
+ return [dict(row) for row in self.store.query(sql, params)]
292
+ head = sql.lstrip().split(None, 1)[0].upper() if sql.strip() else ""
293
+ if head not in ("SELECT", "WITH"):
294
+ raise ValueError(
295
+ "world.state() is read-only — only SELECT/WITH queries are "
296
+ "allowed (use tool handlers or verifiers for writes)."
297
+ )
298
+ rows = self._conn.execute(sql, params).fetchall()
299
+ return [dict(row) for row in rows]
300
+
301
+ def verify(self, name: str) -> VerifierResult:
302
+ """Run ``verifiers/<name>.sql`` against this world.
303
+
304
+ Statements run in order; the score is the first column of the first
305
+ row of the LAST row-returning statement. NULL / no rows → score None
306
+ (passed None) — never coerced to 0.
307
+ """
308
+ verifier_name = name[:-4] if name.endswith(".sql") else name
309
+ path = self.env.bundle_path / "verifiers" / f"{verifier_name}.sql"
310
+ if not path.is_file():
311
+ available = sorted(p.stem for p in (self.env.bundle_path / "verifiers").glob("*.sql"))
312
+ raise VerifierError(f"unknown verifier '{name}' (available: {available})")
313
+
314
+ script = path.read_text(encoding="utf-8")
315
+ score: Optional[float] = None
316
+ saw_rows = False
317
+ last_sql = ""
318
+ for statement in split_sql_statements(script):
319
+ try:
320
+ if self.store is not None:
321
+ rows = self.store.query(statement, private=True)
322
+ saw_rows = True
323
+ last_sql = statement
324
+ value = rows[0][0] if rows else None
325
+ score = float(value) if value is not None else None
326
+ continue
327
+ cursor = self._conn.execute(statement)
328
+ except sqlite3.Error as error:
329
+ raise VerifierError(
330
+ f"verifier '{verifier_name}' failed: {error}\n SQL: {statement}"
331
+ ) from error
332
+ if cursor.description is not None: # row-returning statement
333
+ saw_rows = True
334
+ last_sql = statement
335
+ row = cursor.fetchone()
336
+ value = row[0] if row is not None else None
337
+ score = float(value) if value is not None else None
338
+
339
+ if not saw_rows:
340
+ detail = "no row-returning statement — score is null"
341
+ elif score is None:
342
+ detail = f"null score from: {last_sql}"
343
+ else:
344
+ detail = f"score {score} from: {last_sql}"
345
+ passed = None if score is None else score >= 1.0
346
+ return VerifierResult(name=verifier_name, passed=passed, score=score, detail=detail)