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,495 @@
1
+ # Copyright (c) Microsoft. All rights reserved.
2
+
3
+ from __future__ import annotations
4
+
5
+ import asyncio
6
+ import hashlib
7
+ import json
8
+ import logging
9
+ import uuid
10
+ from typing import Any, Dict, List, Mapping, Optional, Sequence, TypedDict
11
+
12
+ from gatewaysdk.adapter import TraceAdapter
13
+ from gatewaysdk.algorithm.gepa.lib.core.adapter import EvaluationBatch, GEPAAdapter
14
+ from gatewaysdk.emitter import find_final_reward, find_reward_spans, get_rewards_from_span
15
+ from gatewaysdk.store.base import LightningStore
16
+ from gatewaysdk.types import NamedResources, PromptTemplate, Rollout, Span, TracingConfig
17
+
18
+ from .tracing import GEPATracingContext
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+
23
+ class GatewayDataInst(TypedDict):
24
+ """Data instance for GatewaySDK."""
25
+
26
+ input: Dict[str, Any]
27
+ id: Optional[str]
28
+
29
+
30
+ class GatewayTrajectory(TypedDict):
31
+ """Trajectory for GatewaySDK.
32
+
33
+ Captures the data needed for reflection:
34
+ - original_input: The task input data
35
+ - assistant_response: The final LLM response
36
+ - feedback: Evaluation feedback including score and status
37
+ - spans: Raw spans for detailed analysis
38
+ """
39
+
40
+ rollout_id: str
41
+ original_input: Dict[str, Any] # The task input
42
+ assistant_response: str # The final LLM response
43
+ feedback: str # Feedback including score and error info
44
+ spans: List[Span]
45
+
46
+
47
+ class GatewayRolloutOutput(TypedDict):
48
+ """Rollout output for GatewaySDK."""
49
+
50
+ final_reward: Optional[float]
51
+ status: str
52
+
53
+
54
+ # TypedDict for GEPA's expected reflective record format
55
+ GatewayReflectiveRecord = TypedDict(
56
+ "GatewayReflectiveRecord",
57
+ {
58
+ "Inputs": str,
59
+ "Generated Outputs": str,
60
+ "Feedback": str,
61
+ },
62
+ )
63
+
64
+
65
+ class GatewayGEPAAdapter(GEPAAdapter[GatewayDataInst, GatewayTrajectory, GatewayRolloutOutput]):
66
+ """Adapter to bridge GEPA with GatewaySDK.
67
+
68
+ This adapter:
69
+ 1. Evaluates candidates by creating rollouts in the LightningStore
70
+ 2. Waits for runners to execute the agent
71
+ 3. Collects spans and rewards
72
+ 4. Builds reflective datasets for GEPA's reflection mechanism
73
+ """
74
+
75
+ def __init__(
76
+ self,
77
+ store: LightningStore,
78
+ loop: asyncio.AbstractEventLoop,
79
+ resource_name: str,
80
+ adapter: TraceAdapter,
81
+ llm_proxy_resource: Any = None,
82
+ rollout_batch_timeout: float = 600.0,
83
+ tracing_config: Optional[TracingConfig] = None,
84
+ tracing_context: Optional[GEPATracingContext] = None,
85
+ ) -> None:
86
+ """Initialize the adapter.
87
+
88
+ Args:
89
+ store: The LightningStore instance.
90
+ loop: The asyncio loop where the store and other async components are running.
91
+ resource_name: The name of the resource to update (e.g., "prompt_template").
92
+ adapter: The TraceAdapter to convert spans to messages (optional, for debugging).
93
+ llm_proxy_resource: LLM resource from the proxy to include in resources.
94
+ rollout_batch_timeout: Timeout for waiting for rollouts in seconds.
95
+ tracing_config: Optional tracing configuration from the algorithm.
96
+ tracing_context: Optional GEPA tracing context for detailed execution tracking.
97
+ """
98
+ self.store = store
99
+ self.loop = loop
100
+ self.resource_name = resource_name
101
+ self.adapter = adapter
102
+ self.llm_proxy_resource = llm_proxy_resource
103
+ self.rollout_batch_timeout = rollout_batch_timeout
104
+ self.tracing_config = tracing_config
105
+ self.tracing_context = tracing_context
106
+
107
+ # Sequential step counter for metrics (avoids gaps in visualization)
108
+ self._metric_step = 0
109
+
110
+ def evaluate(
111
+ self,
112
+ batch: List[GatewayDataInst],
113
+ candidate: Dict[str, str],
114
+ capture_traces: bool = False,
115
+ ) -> EvaluationBatch[GatewayTrajectory, GatewayRolloutOutput]:
116
+ """Evaluate a candidate on a batch of data instances.
117
+
118
+ This method bridges the synchronous GEPA call to the asynchronous GatewaySDK execution.
119
+ """
120
+ # Run the async evaluation in the main loop and wait for result
121
+ future = asyncio.run_coroutine_threadsafe(self._evaluate_async(batch, candidate, capture_traces), self.loop)
122
+ return future.result(timeout=self.rollout_batch_timeout + 60) # Add buffer to timeout
123
+
124
+ async def _evaluate_async(
125
+ self,
126
+ batch: List[GatewayDataInst],
127
+ candidate: Dict[str, str],
128
+ capture_traces: bool = False,
129
+ ) -> EvaluationBatch[GatewayTrajectory, GatewayRolloutOutput]:
130
+ """Asynchronous evaluation logic."""
131
+ # 1. Build resources from candidate
132
+ resources: NamedResources = {}
133
+ for key, value in candidate.items():
134
+ resources[key] = PromptTemplate(template=value, engine="f-string")
135
+
136
+ # Add the LLM resource if available
137
+ if self.llm_proxy_resource is not None:
138
+ resources["llm"] = self.llm_proxy_resource
139
+
140
+ # Create a unique resource version for this evaluation
141
+ candidate_version = f"gepa-{uuid.uuid4().hex[:8]}"
142
+ await self.store.update_resources(candidate_version, resources)
143
+
144
+ # 2. Enqueue rollouts for each item in the batch
145
+ rollout_ids = []
146
+ batch_inputs: Dict[str, Dict[str, Any]] = {} # Map rollout_id -> original input
147
+
148
+ # Prepare metadata from tracing config with detailed context
149
+ metadata = None
150
+ if self.tracing_config and self.tracing_context:
151
+ # Generate candidate hash for tracking
152
+ candidate_hash = hashlib.md5(str(candidate).encode()).hexdigest()[:8]
153
+ self.tracing_context.set_candidate(candidate_hash)
154
+
155
+ # Get batch item IDs for validation detection
156
+ item_ids = [item.get("id", str(i)) for i, item in enumerate(batch)]
157
+
158
+ # Detect if this is a validation batch
159
+ if self.tracing_context.is_validation_batch(item_ids):
160
+ self.tracing_context.set_phase("validation-eval")
161
+ else:
162
+ # Register training items on first batch of generation
163
+ if self.tracing_context.batch_count == 0:
164
+ self.tracing_context.register_training_items(item_ids)
165
+ self.tracing_context.set_phase("train-eval")
166
+
167
+ # Get batch ID and build GEPA-specific tags
168
+ batch_id = self.tracing_context.next_batch()
169
+ gepa_tags = [
170
+ f"gen-{self.tracing_context.generation}",
171
+ f"candidate-{candidate_hash}",
172
+ batch_id,
173
+ ]
174
+ metadata = self.tracing_config.to_detailed_metadata(
175
+ phase=self.tracing_context.phase,
176
+ extra_tags=gepa_tags,
177
+ )
178
+ logger.debug(
179
+ f"Batch evaluation: session={self.tracing_context.session_id}, "
180
+ f"phase={self.tracing_context.phase}, "
181
+ f"gen={self.tracing_context.generation}, candidate={candidate_hash}, {batch_id}"
182
+ )
183
+ elif self.tracing_config:
184
+ # Fallback to simple metadata if no context
185
+ metadata = self.tracing_config.to_metadata("train")
186
+
187
+ for item in batch:
188
+ task_input = item["input"]
189
+ res = await self.store.enqueue_rollout(
190
+ input=task_input,
191
+ mode="train",
192
+ resources_id=candidate_version,
193
+ metadata=metadata,
194
+ )
195
+ rollout_ids.append(res.rollout_id)
196
+ batch_inputs[res.rollout_id] = task_input
197
+
198
+ # 3. Wait for completion
199
+ try:
200
+ completed_rollouts = await self.store.wait_for_rollouts(
201
+ rollout_ids=rollout_ids, timeout=self.rollout_batch_timeout
202
+ )
203
+ except Exception as e:
204
+ logger.error(f"Error waiting for rollouts: {e}")
205
+ # Return failure results for all items
206
+ outputs: List[GatewayRolloutOutput] = []
207
+ trajectories: List[GatewayTrajectory] = [] if capture_traces else None
208
+ scores: List[float] = []
209
+
210
+ for rollout_id in rollout_ids:
211
+ outputs.append({"final_reward": 0.0, "status": "failed"})
212
+ scores.append(0.0)
213
+ if capture_traces:
214
+ trajectories.append(
215
+ {
216
+ "rollout_id": rollout_id,
217
+ "original_input": batch_inputs.get(rollout_id, {}),
218
+ "assistant_response": "",
219
+ "feedback": f"Rollout failed with error: {e}",
220
+ "spans": [],
221
+ }
222
+ )
223
+
224
+ return EvaluationBatch(
225
+ outputs=outputs,
226
+ trajectories=trajectories,
227
+ scores=scores,
228
+ )
229
+
230
+ # 4. Collect results
231
+ outputs: List[GatewayRolloutOutput] = []
232
+ trajectories: List[GatewayTrajectory] = [] if capture_traces else None
233
+ scores: List[float] = []
234
+
235
+ for rollout in completed_rollouts:
236
+ # Query spans for this rollout
237
+ spans = await self.store.query_spans(rollout.rollout_id)
238
+
239
+ # Find final reward
240
+ final_reward_val = find_final_reward(spans)
241
+ if final_reward_val is None:
242
+ final_reward_val = 0.0
243
+
244
+ outputs.append(
245
+ {
246
+ "final_reward": final_reward_val,
247
+ "status": rollout.status,
248
+ }
249
+ )
250
+ scores.append(final_reward_val)
251
+
252
+ if capture_traces:
253
+ # Extract assistant response from spans
254
+ assistant_response = self._extract_assistant_response(spans)
255
+
256
+ # Build feedback string
257
+ feedback = self._build_feedback(
258
+ final_reward_val, rollout.status, spans, batch_inputs.get(rollout.rollout_id, {})
259
+ )
260
+
261
+ trajectories.append(
262
+ {
263
+ "rollout_id": rollout.rollout_id,
264
+ "original_input": batch_inputs.get(rollout.rollout_id, {}),
265
+ "assistant_response": assistant_response,
266
+ "feedback": feedback,
267
+ "spans": spans,
268
+ }
269
+ )
270
+
271
+ # Log batch metrics to the Run for real-time monitoring
272
+ if hasattr(self.store, "_run") and self.store._run and scores:
273
+ try:
274
+ avg_score = sum(scores) / len(scores) if scores else 0.0
275
+ completed_count = sum(1 for o in outputs if o["status"] == "succeeded")
276
+
277
+ # Use sequential step counter for continuous visualization
278
+ self._metric_step += 1
279
+
280
+ # Include generation info in labels for filtering
281
+ labels = {}
282
+ if self.tracing_context:
283
+ labels["generation"] = str(self.tracing_context.generation)
284
+
285
+ self.store._run.log(
286
+ {
287
+ "batch_avg_score": avg_score,
288
+ "batch_completed_rollouts": completed_count,
289
+ "batch_total_rollouts": len(scores),
290
+ },
291
+ step=self._metric_step,
292
+ labels=labels,
293
+ )
294
+
295
+ logger.debug(
296
+ f"Logged batch metrics: avg_score={avg_score:.3f}, "
297
+ f"completed={completed_count}/{len(scores)}, step={self._metric_step}"
298
+ )
299
+ except Exception as e:
300
+ logger.debug(f"Failed to log batch metrics: {e}")
301
+
302
+ return EvaluationBatch(
303
+ outputs=outputs,
304
+ trajectories=trajectories,
305
+ scores=scores,
306
+ )
307
+
308
+ def _extract_assistant_response(self, spans: List[Span]) -> str:
309
+ """Extract the final assistant response from spans."""
310
+ responses = []
311
+
312
+ for span in spans:
313
+ attrs = span.attributes if hasattr(span, "attributes") else {}
314
+ name = span.name if hasattr(span, "name") else ""
315
+
316
+ # Look for LLM completion spans
317
+ if "chat" in name.lower() or "completion" in name.lower() or "llm" in name.lower():
318
+ # Try different attribute keys for response content
319
+ response_keys = [
320
+ "gen_ai.completion.0.content",
321
+ "gen_ai.response.content",
322
+ "response.content",
323
+ "completion",
324
+ ]
325
+ for key in response_keys:
326
+ if key in attrs and attrs[key]:
327
+ responses.append(str(attrs[key]))
328
+ break
329
+
330
+ if responses:
331
+ return responses[-1] # Return the last (final) response
332
+ return "No assistant response found in spans"
333
+
334
+ def _build_feedback(self, reward: float, status: str, spans: List[Span], task_input: Dict[str, Any]) -> str:
335
+ """Build detailed feedback for reflection.
336
+
337
+ For evaluation tasks, extracts human_score and llm_score from reward dimensions
338
+ to provide specific feedback about prediction errors.
339
+ """
340
+ parts = []
341
+
342
+ # Try to extract multi-dimensional reward data (human_score, llm_score)
343
+ human_score = None
344
+ llm_score = None
345
+
346
+ reward_spans = find_reward_spans(spans)
347
+ for span in reward_spans:
348
+ rewards = get_rewards_from_span(span)
349
+ for r in rewards:
350
+ if r.name == "human_score":
351
+ human_score = r.value
352
+ elif r.name == "llm_score":
353
+ llm_score = r.value
354
+
355
+ # If we have both scores, provide detailed evaluation feedback
356
+ if human_score is not None and llm_score is not None:
357
+ diff = llm_score - human_score
358
+ if abs(diff) < 0.1:
359
+ parts.append(
360
+ f"Good prediction: LLM scored {llm_score:.2f}, human scored {human_score:.2f} (close match)."
361
+ )
362
+ elif diff > 0:
363
+ parts.append(
364
+ f"OVERESTIMATED: LLM scored {llm_score:.2f} but human scored {human_score:.2f}. "
365
+ f"The prompt caused the LLM to rate this {diff:.2f} points too high. "
366
+ "Consider adding stricter criteria or examples."
367
+ )
368
+ else:
369
+ parts.append(
370
+ f"UNDERESTIMATED: LLM scored {llm_score:.2f} but human scored {human_score:.2f}. "
371
+ f"The prompt caused the LLM to rate this {abs(diff):.2f} points too low. "
372
+ "Consider broadening the criteria or recognizing subtle details."
373
+ )
374
+ else:
375
+ # Fallback to generic feedback
376
+ if reward >= 0.9:
377
+ parts.append(f"The task was completed successfully with a high score of {reward:.2f}.")
378
+ elif reward >= 0.5:
379
+ parts.append(
380
+ f"The task was partially successful with a score of {reward:.2f}. There is room for improvement."
381
+ )
382
+ else:
383
+ parts.append(
384
+ f"The task failed or performed poorly with a score of {reward:.2f}. The prompt needs significant improvement."
385
+ )
386
+
387
+ # Add status info
388
+ if status != "succeeded":
389
+ parts.append(f"Rollout status: {status}.")
390
+
391
+ # Look for error information in spans
392
+ for span in spans:
393
+ attrs = span.attributes if hasattr(span, "attributes") else {}
394
+ if "error" in str(attrs).lower():
395
+ parts.append(f"Error detected in execution.")
396
+ break
397
+
398
+ # Add task context
399
+ if task_input:
400
+ if "expected_choice" in task_input:
401
+ parts.append(f"Expected answer: {task_input['expected_choice']}")
402
+ # Include humanScore from task if available (for debugging)
403
+ if "humanScore" in task_input:
404
+ parts.append(f"Expected human score: {task_input['humanScore']:.2f}")
405
+
406
+ return " ".join(parts)
407
+
408
+ def make_reflective_dataset(
409
+ self,
410
+ candidate: Dict[str, str],
411
+ eval_batch: EvaluationBatch[GatewayTrajectory, GatewayRolloutOutput],
412
+ components_to_update: List[str],
413
+ ) -> Mapping[str, Sequence[Mapping[str, Any]]]:
414
+ """Create a reflective dataset for GEPA's reflection mechanism.
415
+
416
+ Returns data in GEPA's expected format:
417
+ {
418
+ "component_name": [
419
+ {
420
+ "Inputs": str, # Task input description
421
+ "Generated Outputs": str, # Model outputs
422
+ "Feedback": str # Performance feedback
423
+ },
424
+ ...
425
+ ]
426
+ }
427
+ """
428
+ reflective_data: Dict[str, List[GatewayReflectiveRecord]] = {
429
+ component: [] for component in components_to_update
430
+ }
431
+
432
+ trajectories = eval_batch.trajectories
433
+ if trajectories is None:
434
+ logger.warning("No trajectories available for building reflective dataset")
435
+ return reflective_data
436
+
437
+ for i, traj in enumerate(trajectories):
438
+ output = eval_batch.outputs[i]
439
+
440
+ # Format the input as a readable string
441
+ input_str = self._format_input(traj["original_input"])
442
+
443
+ # Get the assistant response
444
+ generated_output = traj["assistant_response"]
445
+
446
+ # Get the feedback
447
+ feedback = traj["feedback"]
448
+
449
+ record: GatewayReflectiveRecord = {
450
+ "Inputs": input_str,
451
+ "Generated Outputs": generated_output,
452
+ "Feedback": feedback,
453
+ }
454
+
455
+ # Add to each component being updated
456
+ for component in components_to_update:
457
+ reflective_data[component].append(record)
458
+
459
+ # Validate we have data
460
+ for component in components_to_update:
461
+ if len(reflective_data[component]) == 0:
462
+ logger.warning(f"No reflective records for component {component}")
463
+
464
+ return reflective_data
465
+
466
+ def _format_input(self, task_input: Dict[str, Any]) -> str:
467
+ """Format task input as a readable string for reflection."""
468
+ if not task_input:
469
+ return "No input available"
470
+
471
+ # If it's a RoomSelectionTask-like structure
472
+ if "task_input" in task_input:
473
+ inner = task_input["task_input"]
474
+ parts = []
475
+ if "date" in inner:
476
+ parts.append(f"Date: {inner['date']}")
477
+ if "time" in inner:
478
+ parts.append(f"Time: {inner['time']}")
479
+ if "duration_min" in inner:
480
+ parts.append(f"Duration: {inner['duration_min']} minutes")
481
+ if "attendees" in inner:
482
+ parts.append(f"Attendees: {inner['attendees']}")
483
+ if "needs" in inner:
484
+ parts.append(f"Needs: {', '.join(inner['needs']) if inner['needs'] else 'none'}")
485
+ if "accessible_required" in inner:
486
+ parts.append(f"Accessible required: {inner['accessible_required']}")
487
+ return "; ".join(parts) if parts else json.dumps(task_input)
488
+
489
+ # For other dict structures, try to format nicely
490
+ try:
491
+ if len(task_input) <= 5:
492
+ return "; ".join(f"{k}: {v}" for k, v in task_input.items())
493
+ return json.dumps(task_input, indent=2)
494
+ except Exception:
495
+ return str(task_input)