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,9 @@
1
+ # Copyright (c) Gateway. All rights reserved.
2
+
3
+ """Semantic attributes for GatewayDK tracing.
4
+
5
+ DEPRECATED: This module re-exports all constants from semconv.py for backward
6
+ compatibility. New code should import directly from gatewaysdk.tracing.semconv.
7
+ """
8
+
9
+ from .semconv import * # noqa: F401, F403
@@ -0,0 +1,272 @@
1
+ # Copyright (c) Gateway. All rights reserved.
2
+
3
+ """Unified tracing context for GatewayDK.
4
+
5
+ This module provides context variables and context managers for ALL tracing
6
+ metadata: call_type, tags, environment. The TracingContextSpanProcessor
7
+ reads from these and injects into spans.
8
+
9
+ Run/rollout context (run_id, session_id) is read directly from the run module.
10
+
11
+ Usage::
12
+
13
+ import gatewaysdk.tracing as tracing
14
+
15
+ # Context manager for ad-hoc tagging
16
+ with tracing.tracing_context(call_type="agent-call", tags=["gepa", "train"]):
17
+ response = client.chat.completions.create(...) # Tagged automatically
18
+
19
+ # Decorator for consistent function tagging
20
+ @tracing.call_type_decorator("judge-call")
21
+ def my_judge_function():
22
+ response = client.chat.completions.create(...) # Tagged as judge-call
23
+ """
24
+
25
+ from __future__ import annotations
26
+
27
+ import asyncio
28
+ from contextlib import contextmanager
29
+ from contextvars import ContextVar
30
+ from functools import wraps
31
+ from typing import Iterator, Any, Callable, Generator, List, Optional, TypeVar
32
+
33
+ # Type variable for decorators
34
+ F = TypeVar("F", bound=Callable[..., Any])
35
+
36
+ # =============================================================================
37
+ # Context Variables for Tracing Metadata
38
+ # =============================================================================
39
+
40
+ _call_type_context: ContextVar[Optional[str]] = ContextVar("gateway_call_type", default=None)
41
+ _tags_context: ContextVar[Optional[List[str]]] = ContextVar("gateway_tags", default=None)
42
+ _environment_context: ContextVar[Optional[str]] = ContextVar("gateway_environment", default=None)
43
+ # Proxy-specific session context. Used by RolloutAttemptMiddleware in llm_proxy
44
+ # to set the session_id for proxy spans (where there's no Run/Rollout object).
45
+ _proxy_session_context: ContextVar[Optional[str]] = ContextVar("gateway_proxy_session", default=None)
46
+ # Context Hub items (prompts/agents/skills/memory) used in this execution
47
+ # context. Stored as an immutable tuple of dicts with keys: kind,
48
+ # repo_handle, commit_hash, label. Appended automatically by
49
+ # GatewayContext.pull(); injected into every span by
50
+ # TracingContextSpanProcessor so traces/sessions link to the content
51
+ # they used.
52
+ _context_items_context: ContextVar[Optional[tuple]] = ContextVar(
53
+ "gateway_context_items", default=None
54
+ )
55
+
56
+
57
+ # =============================================================================
58
+ # Getters
59
+ # =============================================================================
60
+
61
+
62
+ def get_current_call_type() -> Optional[str]:
63
+ """Get the current LLM call type (e.g., 'agent-call', 'judge-call').
64
+
65
+ Returns:
66
+ The current call type string, or None if not set.
67
+ """
68
+ return _call_type_context.get()
69
+
70
+
71
+ def get_current_tags() -> Optional[List[str]]:
72
+ """Get the current tracing tags.
73
+
74
+ Returns:
75
+ The current list of tags, or None if not set.
76
+ """
77
+ return _tags_context.get()
78
+
79
+
80
+ def get_current_environment() -> Optional[str]:
81
+ """Get the current tracing environment.
82
+
83
+ Returns:
84
+ The current environment string, or None if not set.
85
+ """
86
+ return _environment_context.get()
87
+
88
+
89
+ def get_current_context_items() -> tuple:
90
+ """Get the Context Hub items recorded in this execution context.
91
+
92
+ Returns:
93
+ Tuple of dicts with keys: kind, repo_handle, commit_hash, label.
94
+ """
95
+ return _context_items_context.get() or ()
96
+
97
+
98
+ def record_context_item(
99
+ kind: str,
100
+ repo_handle: Optional[str],
101
+ commit_hash: Optional[str] = None,
102
+ label: Optional[str] = None,
103
+ ) -> None:
104
+ """Record that a Context Hub item is being used.
105
+
106
+ Called automatically by ``GatewayContext.pull()`` so that all spans
107
+ created afterwards carry ``gateway.context.*`` attributes linking the
108
+ trace (and its session) to the prompt/agent/skill/memory content used.
109
+ Deduplicates on (kind, repo_handle, commit_hash).
110
+ """
111
+ if not kind or not repo_handle:
112
+ return
113
+ item = {
114
+ "kind": str(kind),
115
+ "repo_handle": str(repo_handle),
116
+ "commit_hash": str(commit_hash) if commit_hash else None,
117
+ "label": str(label) if label else None,
118
+ }
119
+ existing = _context_items_context.get() or ()
120
+ for candidate in existing:
121
+ if (
122
+ candidate.get("kind") == item["kind"]
123
+ and candidate.get("repo_handle") == item["repo_handle"]
124
+ and candidate.get("commit_hash") == item["commit_hash"]
125
+ ):
126
+ return
127
+ _context_items_context.set(existing + (item,))
128
+
129
+
130
+ def get_proxy_session_id() -> Optional[str]:
131
+ """Get the proxy-specific session ID.
132
+
133
+ This is set by RolloutAttemptMiddleware in the LLM proxy when there's
134
+ no Run/Rollout object in scope. Falls back to None, in which case
135
+ TracingContextSpanProcessor won't set session_id on proxy spans.
136
+
137
+ Returns:
138
+ The proxy session ID string (typically the rollout_id), or None.
139
+ """
140
+ return _proxy_session_context.get()
141
+
142
+
143
+ # =============================================================================
144
+ # Context Managers
145
+ # =============================================================================
146
+
147
+
148
+ @contextmanager
149
+ def tracing_context(
150
+ *,
151
+ call_type: Optional[str] = None,
152
+ tags: Optional[List[str]] = None,
153
+ environment: Optional[str] = None,
154
+ session_id: Optional[str] = None,
155
+ ) -> Generator[None, None, None]:
156
+ """Set tracing context for the duration of the block.
157
+
158
+ All spans created within this block will be tagged with the provided
159
+ metadata via the TracingContextSpanProcessor.
160
+
161
+ Args:
162
+ call_type: LLM call type (e.g., "agent-call", "judge-call", "reflection-call")
163
+ tags: List of tags for the traces
164
+ environment: Environment name (e.g., "gatewaysdk-gepa")
165
+ session_id: Session ID for proxy spans (set by RolloutAttemptMiddleware)
166
+
167
+ Example::
168
+
169
+ with tracing_context(call_type="agent-call", tags=["gepa", "train"]):
170
+ response = client.chat.completions.create(...) # Tagged automatically
171
+ """
172
+ tokens: List[tuple[str, Any]] = []
173
+
174
+ if call_type is not None:
175
+ tokens.append(("call_type", _call_type_context.set(call_type)))
176
+ if tags is not None:
177
+ tokens.append(("tags", _tags_context.set(tags)))
178
+ if environment is not None:
179
+ tokens.append(("environment", _environment_context.set(environment)))
180
+ if session_id is not None:
181
+ tokens.append(("session_id", _proxy_session_context.set(session_id)))
182
+
183
+ try:
184
+ yield
185
+ finally:
186
+ for name, token in tokens:
187
+ if name == "call_type":
188
+ _call_type_context.reset(token)
189
+ elif name == "tags":
190
+ _tags_context.reset(token)
191
+ elif name == "environment":
192
+ _environment_context.reset(token)
193
+ elif name == "session_id":
194
+ _proxy_session_context.reset(token)
195
+
196
+
197
+ @contextmanager
198
+ def session(session_id: str) -> Iterator[None]:
199
+ """Group every trace recorded inside this block under one session id.
200
+
201
+ THE way to record a named session — e.g. a session you intend to
202
+ replay later with gatewaysdk.replay, or a logical conversation spanning
203
+ several traces:
204
+
205
+ import gatewaysdk.tracing as tracing
206
+
207
+ with tracing.session("checkout-regression-001"):
208
+ with tracing.trace("turn-1", input=prompt):
209
+ ... # every span in here carries the session id
210
+
211
+ Works process-wide via context propagation, so auto-instrumented LLM
212
+ calls and tool spans inside the block are grouped too. Nesting: the
213
+ innermost session wins.
214
+ """
215
+ with tracing_context(session_id=session_id):
216
+ yield
217
+
218
+
219
+ # =============================================================================
220
+ # Decorators
221
+ # =============================================================================
222
+
223
+
224
+ def call_type_decorator(call_type: str) -> Callable[[F], F]:
225
+ """Factory to create call-type tagging decorators.
226
+
227
+ Creates a decorator that sets the call_type context for the duration
228
+ of the decorated function. All spans created within the function
229
+ will have the `gateway.call_type` attribute set.
230
+
231
+ Args:
232
+ call_type: The call type to set (e.g., "agent-call", "judge-call")
233
+
234
+ Returns:
235
+ A decorator that wraps functions with tracing context.
236
+
237
+ Example::
238
+
239
+ # Create reusable decorators
240
+ agent = call_type_decorator("agent-call")
241
+ judge = call_type_decorator("judge-call")
242
+
243
+ @agent
244
+ def my_agent_function():
245
+ # LLM calls here are tagged as "agent-call"
246
+ response = client.chat.completions.create(...)
247
+
248
+ @judge
249
+ def my_judge_function():
250
+ # LLM calls here are tagged as "judge-call"
251
+ response = client.chat.completions.create(...)
252
+ """
253
+
254
+ def decorator(fn: F) -> F:
255
+ if asyncio.iscoroutinefunction(fn):
256
+
257
+ @wraps(fn)
258
+ async def async_wrapper(*args: Any, **kwargs: Any) -> Any:
259
+ with tracing_context(call_type=call_type):
260
+ return await fn(*args, **kwargs)
261
+
262
+ return async_wrapper # type: ignore[return-value]
263
+ else:
264
+
265
+ @wraps(fn)
266
+ def sync_wrapper(*args: Any, **kwargs: Any) -> Any:
267
+ with tracing_context(call_type=call_type):
268
+ return fn(*args, **kwargs)
269
+
270
+ return sync_wrapper # type: ignore[return-value]
271
+
272
+ return decorator
@@ -0,0 +1,10 @@
1
+ # Copyright (c) Gateway. All rights reserved.
2
+
3
+ """Exporters for GatewayDK tracing."""
4
+
5
+ from .gateway import GatewayOTLPExporter, gateway
6
+
7
+ __all__ = [
8
+ "gateway",
9
+ "GatewayOTLPExporter",
10
+ ]
@@ -0,0 +1,228 @@
1
+ # Copyright (c) Gateway. All rights reserved.
2
+
3
+ """Gateway OTLP exporter for GatewayDK tracing.
4
+
5
+ This module provides an OTLP/HTTP exporter configured for Gateway,
6
+ with support for environment variable auto-detection and Basic Auth headers.
7
+ """
8
+
9
+ from __future__ import annotations
10
+
11
+ import base64
12
+ import logging
13
+ import os
14
+ import time
15
+ from typing import Optional
16
+
17
+ from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter
18
+ from opentelemetry.sdk.trace.export import SpanExportResult
19
+
20
+ logger = logging.getLogger(__name__)
21
+
22
+ # Environment variable names (GATEWAY_* prefix)
23
+ ENV_GATEWAY_HOST = "GATEWAY_HOST"
24
+ ENV_GATEWAY_PUBLIC_KEY = "GATEWAY_PUBLIC_KEY"
25
+ ENV_GATEWAY_SECRET_KEY = "GATEWAY_SECRET_KEY"
26
+ ENV_GATEWAY_OTLP_ENDPOINT = "GATEWAY_OTLP_ENDPOINT"
27
+
28
+ # Default OTLP endpoint path
29
+ DEFAULT_OTLP_PATH = "/api/public/otel/v1/traces"
30
+
31
+
32
+ class GatewayOTLPExporter(OTLPSpanExporter):
33
+ """OTLP exporter configured for Gateway.
34
+
35
+ This exporter automatically handles Basic Auth header construction
36
+ from public/secret key pairs.
37
+
38
+ Example::
39
+
40
+ from gatewaysdk.tracing_claude.exporters import GatewayOTLPExporter
41
+
42
+ exporter = GatewayOTLPExporter(
43
+ host="https://app.gateway.dev",
44
+ public_key="pk-lf-...",
45
+ secret_key="sk-lf-...",
46
+ )
47
+ """
48
+
49
+ def __init__(
50
+ self,
51
+ host: str,
52
+ public_key: str,
53
+ secret_key: str,
54
+ *,
55
+ endpoint: Optional[str] = None,
56
+ **kwargs,
57
+ ):
58
+ """Initialize the Gateway OTLP exporter.
59
+
60
+ Args:
61
+ host: The Gateway server URL (e.g., "https://app.gateway.dev").
62
+ public_key: The public key for authentication (pk-lf-...).
63
+ secret_key: The secret key for authentication (sk-lf-...).
64
+ endpoint: Optional full OTLP endpoint URL. If not provided,
65
+ derived from host + DEFAULT_OTLP_PATH.
66
+ **kwargs: Additional arguments passed to OTLPSpanExporter.
67
+ """
68
+ # Derive endpoint from host if not explicitly provided
69
+ if endpoint is None:
70
+ # Remove trailing slash if present
71
+ host = host.rstrip("/")
72
+ endpoint = f"{host}{DEFAULT_OTLP_PATH}"
73
+
74
+ # Construct Basic Auth header
75
+ credentials = f"{public_key}:{secret_key}"
76
+ encoded = base64.b64encode(credentials.encode("utf-8")).decode("utf-8")
77
+ auth_header = f"Basic {encoded}"
78
+
79
+ # Merge auth header with any user-provided headers
80
+ headers = kwargs.pop("headers", {}) or {}
81
+ headers["Authorization"] = auth_header
82
+
83
+ super().__init__(endpoint=endpoint, headers=headers, **kwargs)
84
+
85
+ self._gateway_host = host
86
+ self._gateway_public_key = public_key
87
+ # Don't store secret key in instance for security
88
+
89
+ logger.debug(
90
+ "GatewayOTLPExporter initialized: endpoint=%s, public_key=%s",
91
+ endpoint,
92
+ public_key[:20] + "..." if len(public_key) > 20 else public_key,
93
+ )
94
+
95
+ def export(self, spans):
96
+ count = len(spans) if spans else 0
97
+ t0 = time.monotonic()
98
+ try:
99
+ result = super().export(spans)
100
+ except Exception as exc:
101
+ elapsed_ms = (time.monotonic() - t0) * 1000
102
+ logger.warning("Export: %d span(s) -> FAILED (%s, %.0fms) %s", count, self._gateway_host, elapsed_ms, exc)
103
+ return SpanExportResult.FAILURE
104
+ elapsed_ms = (time.monotonic() - t0) * 1000
105
+ if result == SpanExportResult.SUCCESS:
106
+ logger.info("Export: %d span(s) -> SUCCESS (%s, %.0fms)", count, self._gateway_host, elapsed_ms)
107
+ self._record_exported(count)
108
+ else:
109
+ logger.warning("Export: %d span(s) -> FAILED (%s, %.0fms)", count, self._gateway_host, elapsed_ms)
110
+ return result
111
+
112
+ def _record_exported(self, count: int) -> None:
113
+ """Notify the init module about successful exports for the shutdown summary."""
114
+ try:
115
+ from gatewaysdk.tracing.init import _record_exported
116
+
117
+ _record_exported(count)
118
+ except ImportError:
119
+ pass
120
+
121
+ def __repr__(self) -> str:
122
+ return (
123
+ f"GatewayOTLPExporter(" f"host={self._gateway_host!r}, " f"public_key={self._gateway_public_key[:10]}...)"
124
+ )
125
+
126
+
127
+ def gateway(
128
+ *,
129
+ host: Optional[str] = None,
130
+ public_key: Optional[str] = None,
131
+ secret_key: Optional[str] = None,
132
+ endpoint: Optional[str] = None,
133
+ **kwargs,
134
+ ) -> GatewayOTLPExporter:
135
+ """Factory function to create an Gateway OTLP exporter.
136
+
137
+ This function supports both explicit configuration and environment variable
138
+ auto-detection. If any required parameter is not provided, it will be read
139
+ from the corresponding environment variable.
140
+
141
+ Environment variables:
142
+ - GATEWAY_HOST: The Gateway server URL
143
+ - GATEWAY_PUBLIC_KEY: The public key for authentication
144
+ - GATEWAY_SECRET_KEY: The secret key for authentication
145
+ - GATEWAY_OTLP_ENDPOINT: Optional override for the OTLP endpoint
146
+
147
+ Args:
148
+ host: The Gateway server URL. Falls back to GATEWAY_HOST env var.
149
+ public_key: The public key. Falls back to GATEWAY_PUBLIC_KEY env var.
150
+ secret_key: The secret key. Falls back to GATEWAY_SECRET_KEY env var.
151
+ endpoint: Optional full OTLP endpoint URL. Falls back to GATEWAY_OTLP_ENDPOINT.
152
+ **kwargs: Additional arguments passed to GatewayOTLPExporter.
153
+
154
+ Returns:
155
+ Configured GatewayOTLPExporter instance.
156
+
157
+ Raises:
158
+ ValueError: If required credentials are not provided and not found in env vars.
159
+
160
+ Example::
161
+
162
+ import gatewaysdk.tracing_claude as tracing
163
+
164
+ # Using environment variables
165
+ tracing.init(exporters=[tracing.gateway_exporter()])
166
+
167
+ # Explicit configuration
168
+ tracing.init(exporters=[
169
+ tracing.gateway_exporter(
170
+ host="https://app.gateway.dev",
171
+ public_key="pk-lf-...",
172
+ secret_key="sk-lf-...",
173
+ )
174
+ ])
175
+ """
176
+ # Read from env vars if not provided
177
+ host = host or os.environ.get(ENV_GATEWAY_HOST)
178
+ public_key = public_key or os.environ.get(ENV_GATEWAY_PUBLIC_KEY)
179
+ secret_key = secret_key or os.environ.get(ENV_GATEWAY_SECRET_KEY)
180
+ endpoint = endpoint or os.environ.get(ENV_GATEWAY_OTLP_ENDPOINT)
181
+
182
+ # Validate required parameters
183
+ missing = []
184
+ if not host:
185
+ missing.append(f"{ENV_GATEWAY_HOST} (or host parameter)")
186
+ if not public_key:
187
+ missing.append(f"{ENV_GATEWAY_PUBLIC_KEY} (or public_key parameter)")
188
+ if not secret_key:
189
+ missing.append(f"{ENV_GATEWAY_SECRET_KEY} (or secret_key parameter)")
190
+
191
+ if missing:
192
+ raise ValueError(
193
+ f"Missing required Gateway configuration: {', '.join(missing)}. "
194
+ "Provide these values via function arguments or environment variables."
195
+ )
196
+
197
+ return GatewayOTLPExporter(
198
+ host=host,
199
+ public_key=public_key,
200
+ secret_key=secret_key,
201
+ endpoint=endpoint,
202
+ **kwargs,
203
+ )
204
+
205
+
206
+ def detect_gateway_config() -> tuple[Optional[str], Optional[str], Optional[str], Optional[str]]:
207
+ """Detect Gateway configuration from environment variables.
208
+
209
+ Returns:
210
+ Tuple of (host, public_key, secret_key, endpoint) where any value may be None
211
+ if the corresponding environment variable is not set.
212
+ """
213
+ return (
214
+ os.environ.get(ENV_GATEWAY_HOST),
215
+ os.environ.get(ENV_GATEWAY_PUBLIC_KEY),
216
+ os.environ.get(ENV_GATEWAY_SECRET_KEY),
217
+ os.environ.get(ENV_GATEWAY_OTLP_ENDPOINT),
218
+ )
219
+
220
+
221
+ def is_gateway_configured() -> bool:
222
+ """Check if Gateway is configured via environment variables.
223
+
224
+ Returns:
225
+ True if all required environment variables are set.
226
+ """
227
+ host, public_key, secret_key, _ = detect_gateway_config()
228
+ return all([host, public_key, secret_key])