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,820 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ GEPA RAG Optimization Example with Multiple Vector Stores
4
+
5
+ This example demonstrates how to use GEPA to optimize a RAG system using various
6
+ vector stores, showcasing their unique capabilities and search methods.
7
+
8
+ Supported Vector Stores:
9
+ - ChromaDB: Local/persistent vector store with simple setup
10
+ - LanceDB: Developer-friendly serverless vector database
11
+ - Milvus: Cloud-native vector database with Lite mode
12
+ - Qdrant: High-performance vector database with advanced filtering
13
+ - Weaviate: Vector database with hybrid search capabilities
14
+
15
+ Usage:
16
+ # ChromaDB (default, no external dependencies)
17
+ python rag_optimization.py --vector-store chromadb
18
+
19
+ # LanceDB (local, no Docker required)
20
+ python rag_optimization.py --vector-store lancedb
21
+
22
+ # Milvus Lite (local SQLite-based)
23
+ python rag_optimization.py --vector-store milvus
24
+
25
+ # Qdrant (in-memory or with Docker)
26
+ python rag_optimization.py --vector-store qdrant
27
+
28
+ # Weaviate (requires Docker)
29
+ python rag_optimization.py --vector-store weaviate
30
+
31
+ # With specific models
32
+ python rag_optimization.py --vector-store chromadb --model ollama/llama3.1:8b
33
+
34
+ # Full optimization run
35
+ python rag_optimization.py --vector-store qdrant --max-iterations 20
36
+
37
+ Requirements:
38
+ Base: pip install gepa[rag]
39
+ ChromaDB: pip install chromadb
40
+ LanceDB: pip install lancedb pyarrow sentence-transformers
41
+ Milvus: pip install pymilvus sentence-transformers
42
+ Qdrant: pip install qdrant-client
43
+ Weaviate: pip install weaviate-client
44
+
45
+ Prerequisites:
46
+ - For Ollama: ollama pull qwen3:8b && ollama pull nomic-embed-text:latest
47
+ - For Weaviate: docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:1.26.1
48
+ - For Qdrant (optional): docker run -p 6333:6333 qdrant/qdrant
49
+ """
50
+
51
+ import argparse
52
+ import os
53
+ import sys
54
+ import tempfile
55
+ import warnings
56
+ from pathlib import Path
57
+ from typing import Any
58
+
59
+ # Suppress all warnings for clean output
60
+ warnings.filterwarnings("ignore")
61
+ os.environ["PYTHONWARNINGS"] = "ignore"
62
+
63
+ # Add parent directory to path for imports
64
+ sys.path.insert(0, str(Path(__file__).parent.parent.parent.parent))
65
+
66
+ import gatewaysdk.algorithm.gepa.lib as gepa # noqa: E402
67
+ from gatewaysdk.algorithm.gepa.lib.adapters.generic_rag_adapter import GenericRAGAdapter, RAGDataInst # noqa: E402
68
+
69
+ # Vector store imports (lazy loaded)
70
+ _vector_stores = {}
71
+
72
+
73
+ def lazy_import_vector_store(store_name: str):
74
+ """Lazy import vector store classes to avoid dependency issues."""
75
+ if store_name in _vector_stores:
76
+ return _vector_stores[store_name]
77
+
78
+ try:
79
+ if store_name == "chromadb":
80
+ from gatewaysdk.algorithm.gepa.lib.adapters.generic_rag_adapter import ChromaVectorStore
81
+
82
+ _vector_stores[store_name] = ChromaVectorStore
83
+ return ChromaVectorStore
84
+ elif store_name == "lancedb":
85
+ from gatewaysdk.algorithm.gepa.lib.adapters.generic_rag_adapter import LanceDBVectorStore
86
+
87
+ _vector_stores[store_name] = LanceDBVectorStore
88
+ return LanceDBVectorStore
89
+ elif store_name == "milvus":
90
+ from gatewaysdk.algorithm.gepa.lib.adapters.generic_rag_adapter import MilvusVectorStore
91
+
92
+ _vector_stores[store_name] = MilvusVectorStore
93
+ return MilvusVectorStore
94
+ elif store_name == "qdrant":
95
+ from gatewaysdk.algorithm.gepa.lib.adapters.generic_rag_adapter import QdrantVectorStore
96
+
97
+ _vector_stores[store_name] = QdrantVectorStore
98
+ return QdrantVectorStore
99
+ elif store_name == "weaviate":
100
+ from gatewaysdk.algorithm.gepa.lib.adapters.generic_rag_adapter import WeaviateVectorStore
101
+
102
+ _vector_stores[store_name] = WeaviateVectorStore
103
+ return WeaviateVectorStore
104
+ else:
105
+ raise ValueError(f"Unknown vector store: {store_name}")
106
+ except ImportError as e:
107
+ raise ImportError(
108
+ f"Failed to import {store_name} dependencies: {e}\n"
109
+ f"Install with: pip install {get_install_command(store_name)}"
110
+ )
111
+
112
+
113
+ def get_install_command(store_name: str) -> str:
114
+ """Get pip install command for vector store dependencies."""
115
+ commands = {
116
+ "chromadb": "chromadb",
117
+ "lancedb": "lancedb pyarrow sentence-transformers",
118
+ "milvus": "pymilvus sentence-transformers",
119
+ "qdrant": "qdrant-client",
120
+ "weaviate": "weaviate-client",
121
+ }
122
+ return commands.get(store_name, "unknown")
123
+
124
+
125
+ def create_llm_client(model_name: str):
126
+ """Create LLM client supporting both Ollama and cloud models."""
127
+ try:
128
+ import litellm
129
+
130
+ litellm.drop_params = True
131
+ litellm.set_verbose = False
132
+ except ImportError:
133
+ raise ImportError("LiteLLM is required. Install with: pip install litellm")
134
+
135
+ def llm_client(messages_or_prompt, **kwargs):
136
+ try:
137
+ # Handle both string prompts and message lists
138
+ if isinstance(messages_or_prompt, str):
139
+ messages = [{"role": "user", "content": messages_or_prompt}]
140
+ else:
141
+ messages = messages_or_prompt
142
+
143
+ params = {
144
+ "model": model_name,
145
+ "messages": messages,
146
+ "max_tokens": kwargs.get("max_tokens", 400),
147
+ "temperature": kwargs.get("temperature", 0.1),
148
+ }
149
+
150
+ if "ollama/" in model_name:
151
+ params["request_timeout"] = 120
152
+
153
+ response = litellm.completion(**params)
154
+ return response.choices[0].message.content.strip()
155
+
156
+ except Exception as e:
157
+ return f"Error: Unable to generate response ({e})"
158
+
159
+ return llm_client
160
+
161
+
162
+ def create_embedding_function():
163
+ """Create embedding function using sentence-transformers as fallback."""
164
+ try:
165
+ from sentence_transformers import SentenceTransformer
166
+
167
+ model = SentenceTransformer("all-MiniLM-L6-v2")
168
+ return lambda text: model.encode(text)
169
+ except ImportError:
170
+ # Fallback to litellm for embedding
171
+ try:
172
+ import litellm
173
+
174
+ def embed_text(text: str):
175
+ try:
176
+ response = litellm.embedding(model="ollama/nomic-embed-text:latest", input=text)
177
+ if hasattr(response, "data") and response.data:
178
+ if hasattr(response.data[0], "embedding"):
179
+ return response.data[0].embedding
180
+ elif isinstance(response.data[0], dict) and "embedding" in response.data[0]:
181
+ return response.data[0]["embedding"]
182
+ elif isinstance(response, dict):
183
+ if response.get("data"):
184
+ return response["data"][0]["embedding"]
185
+ elif "embedding" in response:
186
+ return response["embedding"]
187
+ raise ValueError(f"Unknown response format: {type(response)}")
188
+ except Exception as e:
189
+ raise RuntimeError(
190
+ f"Embedding failed: {e}. Please check your embedding model setup (sentence-transformers or litellm) and ensure all dependencies are installed."
191
+ )
192
+
193
+ return embed_text
194
+ except ImportError:
195
+ raise ImportError("Either sentence-transformers or litellm is required for embeddings")
196
+
197
+
198
+ def setup_chromadb_store():
199
+ """Set up ChromaDB vector store with sample data."""
200
+ print("šŸ—„ļø Setting up ChromaDB vector store...")
201
+
202
+ try:
203
+ from chromadb.utils import embedding_functions
204
+ except ImportError:
205
+ raise ImportError("ChromaDB is required. Install with: pip install chromadb")
206
+
207
+ # Create temporary directory
208
+ temp_dir = tempfile.mkdtemp()
209
+ print(f" šŸ“ ChromaDB directory: {temp_dir}")
210
+
211
+ # Initialize ChromaDB
212
+ embedding_function = embedding_functions.DefaultEmbeddingFunction()
213
+ chroma_vector_store = lazy_import_vector_store("chromadb")
214
+ vector_store = chroma_vector_store.create_local(
215
+ persist_directory=temp_dir, collection_name="ai_ml_knowledge", embedding_function=embedding_function
216
+ )
217
+
218
+ documents = get_sample_documents()
219
+ vector_store.collection.add(
220
+ documents=[doc["content"] for doc in documents],
221
+ metadatas=[doc["metadata"] for doc in documents],
222
+ ids=[doc["metadata"]["doc_id"] for doc in documents],
223
+ )
224
+
225
+ print(f" āœ… Created ChromaDB knowledge base with {len(documents)} articles")
226
+ return vector_store
227
+
228
+
229
+ def setup_lancedb_store():
230
+ """Set up LanceDB vector store with sample data."""
231
+ print("šŸ—„ļø Setting up LanceDB vector store...")
232
+
233
+ try:
234
+ embedding_function = create_embedding_function()
235
+ lancedb_vector_store = lazy_import_vector_store("lancedb")
236
+
237
+ vector_store = lancedb_vector_store.create_local(
238
+ table_name="rag_demo",
239
+ embedding_function=embedding_function,
240
+ db_path="./lancedb_demo",
241
+ vector_size=384,
242
+ )
243
+
244
+ documents = get_sample_documents_simple()
245
+ embeddings = [embedding_function(doc["content"]) for doc in documents]
246
+ ids = vector_store.add_documents(documents, embeddings)
247
+
248
+ print(f" āœ… Added {len(ids)} documents to LanceDB table")
249
+ return vector_store
250
+
251
+ except ImportError as e:
252
+ raise ImportError(
253
+ f"LanceDB dependencies missing: {e}\nInstall with: pip install lancedb pyarrow sentence-transformers"
254
+ )
255
+
256
+
257
+ def setup_milvus_store():
258
+ """Set up Milvus vector store with sample data."""
259
+ print("šŸ—„ļø Setting up Milvus vector store...")
260
+
261
+ try:
262
+ embedding_function = create_embedding_function()
263
+ milvus_vector_store = lazy_import_vector_store("milvus")
264
+
265
+ vector_store = milvus_vector_store.create_local(
266
+ collection_name="rag_demo",
267
+ embedding_function=embedding_function,
268
+ vector_size=384,
269
+ uri="./milvus_demo.db",
270
+ )
271
+
272
+ documents = get_sample_documents_simple()
273
+ embeddings = [embedding_function(doc["content"]) for doc in documents]
274
+ ids = vector_store.add_documents(documents, embeddings)
275
+
276
+ print(f" āœ… Added {len(ids)} documents to Milvus collection")
277
+ return vector_store
278
+
279
+ except ImportError as e:
280
+ raise ImportError(f"Milvus dependencies missing: {e}\nInstall with: pip install pymilvus sentence-transformers")
281
+
282
+
283
+ def setup_qdrant_store():
284
+ """Set up Qdrant vector store with sample data."""
285
+ print("šŸ—„ļø Setting up Qdrant vector store...")
286
+
287
+ try:
288
+ from qdrant_client import QdrantClient
289
+ from qdrant_client.http import models
290
+ except ImportError:
291
+ raise ImportError("Qdrant client required. Install with: pip install qdrant-client")
292
+
293
+ # Connect to in-memory Qdrant
294
+ client = QdrantClient(path=":memory:")
295
+ print(" āœ… Connected to in-memory Qdrant")
296
+
297
+ collection_name = "AIKnowledge"
298
+
299
+ # Delete existing collection if it exists
300
+ try:
301
+ client.delete_collection(collection_name)
302
+ except Exception:
303
+ pass
304
+
305
+ # Create embedding function and determine vector size
306
+ embedding_fn = create_embedding_function()
307
+ sample_vector = embedding_fn("test")
308
+ vector_size = len(sample_vector)
309
+
310
+ client.create_collection(
311
+ collection_name=collection_name,
312
+ vectors_config=models.VectorParams(
313
+ size=vector_size,
314
+ distance=models.Distance.COSINE,
315
+ ),
316
+ )
317
+
318
+ # Add documents
319
+ documents = get_sample_documents_for_qdrant()
320
+
321
+ points = []
322
+ for i, doc in enumerate(documents):
323
+ doc_vector = embedding_fn(doc["content"])
324
+ payload = dict(doc)
325
+ payload["original_id"] = f"doc_{i + 1}"
326
+
327
+ point = models.PointStruct(
328
+ id=i + 1,
329
+ vector=doc_vector,
330
+ payload=payload,
331
+ )
332
+ points.append(point)
333
+
334
+ client.upsert(collection_name=collection_name, points=points, wait=True)
335
+ print(f" āœ… Created Qdrant knowledge base with {len(documents)} articles")
336
+
337
+ qdrant_vector_store = lazy_import_vector_store("qdrant")
338
+ vector_store = qdrant_vector_store(client, collection_name, embedding_fn)
339
+ return vector_store
340
+
341
+
342
+ def setup_weaviate_store():
343
+ """Set up Weaviate vector store with sample data."""
344
+ print("šŸ—„ļø Setting up Weaviate vector store...")
345
+
346
+ try:
347
+ import weaviate
348
+ import weaviate.classes as wvc
349
+ except ImportError:
350
+ raise ImportError("Weaviate client required. Install with: pip install weaviate-client")
351
+
352
+ # Connect to local Weaviate
353
+ try:
354
+ client = weaviate.connect_to_local()
355
+ print(" āœ… Connected to local Weaviate")
356
+ except Exception as e:
357
+ print(f" āŒ Failed to connect to Weaviate: {e}")
358
+ print(" šŸ’” Make sure Weaviate is running:")
359
+ print(" docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:1.26.1")
360
+ raise
361
+
362
+ collection_name = "AIKnowledge"
363
+
364
+ # Delete existing collection if it exists
365
+ try:
366
+ client.collections.delete(collection_name)
367
+ print(f" šŸ—‘ļø Removed existing collection: {collection_name}")
368
+ except Exception:
369
+ pass
370
+
371
+ # Create collection
372
+ collection = client.collections.create(
373
+ name=collection_name,
374
+ properties=[
375
+ wvc.config.Property(name="content", data_type=wvc.config.DataType.TEXT, description="Document content"),
376
+ wvc.config.Property(name="topic", data_type=wvc.config.DataType.TEXT, description="Topic category"),
377
+ wvc.config.Property(name="difficulty", data_type=wvc.config.DataType.TEXT, description="Difficulty level"),
378
+ ],
379
+ vectorizer_config=wvc.config.Configure.Vectorizer.none(),
380
+ inverted_index_config=wvc.config.Configure.inverted_index(
381
+ bm25_b=0.75,
382
+ bm25_k1=1.2,
383
+ ),
384
+ )
385
+
386
+ # Create embedding function and add documents
387
+ embedding_fn = create_embedding_function()
388
+ documents = get_sample_documents_for_weaviate()
389
+
390
+ with collection.batch.dynamic() as batch:
391
+ for doc in documents:
392
+ doc_vector = embedding_fn(doc["content"])
393
+ batch.add_object(properties=doc, vector=doc_vector)
394
+
395
+ client.close()
396
+ print(f" āœ… Created Weaviate knowledge base with {len(documents)} articles")
397
+
398
+ # Reconnect and create vector store wrapper
399
+ client_for_store = weaviate.connect_to_local()
400
+ weaviate_vector_store = lazy_import_vector_store("weaviate")
401
+ vector_store = weaviate_vector_store(client_for_store, collection_name, embedding_fn)
402
+ return vector_store
403
+
404
+
405
+ def get_sample_documents() -> list[dict[str, Any]]:
406
+ """Get sample documents for ChromaDB (with nested metadata structure)."""
407
+ return [
408
+ {
409
+ "content": "Machine Learning is a subset of artificial intelligence that enables computers to learn and improve from experience without being explicitly programmed. It focuses on the development of computer programs that can access data and use it to learn for themselves.",
410
+ "metadata": {"doc_id": "ml_basics", "topic": "machine_learning", "difficulty": "beginner"},
411
+ },
412
+ {
413
+ "content": "Deep Learning is a subset of machine learning based on artificial neural networks with representation learning. It can learn from data that is unstructured or unlabeled. Deep learning models are inspired by information processing patterns found in biological neural networks.",
414
+ "metadata": {"doc_id": "dl_basics", "topic": "deep_learning", "difficulty": "intermediate"},
415
+ },
416
+ {
417
+ "content": "Natural Language Processing (NLP) is a branch of artificial intelligence that helps computers understand, interpret and manipulate human language. NLP draws from many disciplines, including computer science and computational linguistics.",
418
+ "metadata": {"doc_id": "nlp_basics", "topic": "nlp", "difficulty": "intermediate"},
419
+ },
420
+ {
421
+ "content": "Computer Vision is a field of artificial intelligence that trains computers to interpret and understand the visual world. Using digital images from cameras and videos and deep learning models, machines can accurately identify and classify objects.",
422
+ "metadata": {"doc_id": "cv_basics", "topic": "computer_vision", "difficulty": "intermediate"},
423
+ },
424
+ {
425
+ "content": "Reinforcement Learning is an area of machine learning where an agent learns to behave in an environment by performing actions and seeing the results. The agent receives rewards by performing correctly and penalties for performing incorrectly.",
426
+ "metadata": {"doc_id": "rl_basics", "topic": "reinforcement_learning", "difficulty": "advanced"},
427
+ },
428
+ {
429
+ "content": "Large Language Models (LLMs) are a type of artificial intelligence model designed to understand and generate human-like text. They are trained on vast amounts of text data and can perform various natural language tasks such as translation, summarization, and question answering.",
430
+ "metadata": {"doc_id": "llm_basics", "topic": "large_language_models", "difficulty": "advanced"},
431
+ },
432
+ ]
433
+
434
+
435
+ def get_sample_documents_simple() -> list[dict[str, str]]:
436
+ """Get sample documents for LanceDB/Milvus (flat structure)."""
437
+ return [
438
+ {"content": "Machine learning is a method of data analysis that automates analytical model building."},
439
+ {"content": "It is a branch of artificial intelligence based on the idea that systems can learn from data."},
440
+ {"content": "Machine learning algorithms build a model based on training data to make predictions."},
441
+ {
442
+ "content": "Deep learning is part of a broader family of machine learning methods based on artificial neural networks."
443
+ },
444
+ {"content": "It uses multiple layers to progressively extract higher-level features from raw input."},
445
+ {
446
+ "content": "Deep learning models can automatically learn representations of data with multiple levels of abstraction."
447
+ },
448
+ {
449
+ "content": "Natural language processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence."
450
+ },
451
+ {"content": "It deals with the interaction between computers and human language."},
452
+ {"content": "NLP techniques enable computers to process and analyze large amounts of natural language data."},
453
+ ]
454
+
455
+
456
+ def get_sample_documents_for_qdrant() -> list[dict[str, Any]]:
457
+ """Get sample documents for Qdrant (with flat metadata)."""
458
+ return [
459
+ {
460
+ "content": "Artificial Intelligence (AI) is the simulation of human intelligence in machines that are programmed to think and learn like humans. The term may also be applied to any machine that exhibits traits associated with a human mind such as learning and problem-solving.",
461
+ "topic": "artificial_intelligence",
462
+ "difficulty": "beginner",
463
+ "category": "definition",
464
+ },
465
+ {
466
+ "content": "Machine Learning is a method of data analysis that automates analytical model building. It is a branch of artificial intelligence based on the idea that systems can learn from data, identify patterns and make decisions with minimal human intervention.",
467
+ "topic": "machine_learning",
468
+ "difficulty": "beginner",
469
+ "category": "definition",
470
+ },
471
+ {
472
+ "content": "Deep Learning is part of a broader family of machine learning methods based on artificial neural networks with representation learning. Learning can be supervised, semi-supervised or unsupervised. Deep learning architectures such as deep neural networks have been applied to computer vision, speech recognition, and natural language processing.",
473
+ "topic": "deep_learning",
474
+ "difficulty": "intermediate",
475
+ "category": "technical",
476
+ },
477
+ {
478
+ "content": "Natural Language Processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human language. The goal is to program computers to process and analyze large amounts of natural language data.",
479
+ "topic": "nlp",
480
+ "difficulty": "intermediate",
481
+ "category": "technical",
482
+ },
483
+ {
484
+ "content": "Computer Vision is a field of artificial intelligence (AI) that enables computers and systems to derive meaningful information from digital images, videos and other visual inputs. It uses machine learning models to analyze and interpret visual data.",
485
+ "topic": "computer_vision",
486
+ "difficulty": "intermediate",
487
+ "category": "application",
488
+ },
489
+ {
490
+ "content": "Transformers are a deep learning architecture that has revolutionized natural language processing. They rely entirely on self-attention mechanisms to draw global dependencies between input and output, dispensing with recurrence and convolutions entirely.",
491
+ "topic": "transformers",
492
+ "difficulty": "advanced",
493
+ "category": "architecture",
494
+ },
495
+ ]
496
+
497
+
498
+ def get_sample_documents_for_weaviate() -> list[dict[str, str]]:
499
+ """Get sample documents for Weaviate (flat string properties)."""
500
+ return [
501
+ {
502
+ "content": "Artificial Intelligence (AI) is the simulation of human intelligence in machines that are programmed to think and learn like humans. The term may also be applied to any machine that exhibits traits associated with a human mind such as learning and problem-solving.",
503
+ "topic": "artificial_intelligence",
504
+ "difficulty": "beginner",
505
+ },
506
+ {
507
+ "content": "Machine Learning is a method of data analysis that automates analytical model building. It is a branch of artificial intelligence based on the idea that systems can learn from data, identify patterns and make decisions with minimal human intervention.",
508
+ "topic": "machine_learning",
509
+ "difficulty": "beginner",
510
+ },
511
+ {
512
+ "content": "Deep Learning is part of a broader family of machine learning methods based on artificial neural networks with representation learning. Learning can be supervised, semi-supervised or unsupervised. Deep learning architectures such as deep neural networks have been applied to computer vision, speech recognition, and natural language processing.",
513
+ "topic": "deep_learning",
514
+ "difficulty": "intermediate",
515
+ },
516
+ {
517
+ "content": "Natural Language Processing (NLP) is a subfield of linguistics, computer science, and artificial intelligence concerned with the interactions between computers and human language. The goal is to program computers to process and analyze large amounts of natural language data.",
518
+ "topic": "nlp",
519
+ "difficulty": "intermediate",
520
+ },
521
+ {
522
+ "content": "Computer Vision is an interdisciplinary scientific field that deals with how computers can gain high-level understanding from digital images or videos. From an engineering perspective, it seeks to understand and automate tasks that the human visual system can do.",
523
+ "topic": "computer_vision",
524
+ "difficulty": "intermediate",
525
+ },
526
+ {
527
+ "content": "Transformers are a deep learning architecture that has revolutionized natural language processing. They rely entirely on self-attention mechanisms to draw global dependencies between input and output, dispensing with recurrence and convolutions entirely.",
528
+ "topic": "transformers",
529
+ "difficulty": "advanced",
530
+ },
531
+ ]
532
+
533
+
534
+ def create_training_data() -> tuple[list[RAGDataInst], list[RAGDataInst]]:
535
+ """Create training and validation datasets for RAG optimization."""
536
+ # Training examples
537
+ train_data = [
538
+ RAGDataInst(
539
+ query="What is machine learning?",
540
+ ground_truth_answer="Machine Learning is a method of data analysis that automates analytical model building. It is a branch of artificial intelligence based on the idea that systems can learn from data, identify patterns and make decisions with minimal human intervention.",
541
+ relevant_doc_ids=["ml_basics"],
542
+ metadata={"category": "definition", "difficulty": "beginner"},
543
+ ),
544
+ RAGDataInst(
545
+ query="How does deep learning work?",
546
+ ground_truth_answer="Deep Learning is a subset of machine learning based on artificial neural networks with representation learning. It can learn from data that is unstructured or unlabeled. Deep learning models are inspired by information processing patterns found in biological neural networks.",
547
+ relevant_doc_ids=["dl_basics"],
548
+ metadata={"category": "explanation", "difficulty": "intermediate"},
549
+ ),
550
+ RAGDataInst(
551
+ query="What is natural language processing?",
552
+ ground_truth_answer="Natural Language Processing (NLP) is a branch of artificial intelligence that helps computers understand, interpret and manipulate human language. NLP draws from many disciplines, including computer science and computational linguistics.",
553
+ relevant_doc_ids=["nlp_basics"],
554
+ metadata={"category": "definition", "difficulty": "intermediate"},
555
+ ),
556
+ ]
557
+
558
+ # Validation examples
559
+ val_data = [
560
+ RAGDataInst(
561
+ query="Explain computer vision in AI",
562
+ ground_truth_answer="Computer Vision is a field of artificial intelligence that trains computers to interpret and understand the visual world. Using digital images from cameras and videos and deep learning models, machines can accurately identify and classify objects.",
563
+ relevant_doc_ids=["cv_basics"],
564
+ metadata={"category": "explanation", "difficulty": "intermediate"},
565
+ ),
566
+ RAGDataInst(
567
+ query="What are large language models?",
568
+ ground_truth_answer="Large Language Models (LLMs) are a type of artificial intelligence model designed to understand and generate human-like text. They are trained on vast amounts of text data and can perform various natural language tasks such as translation, summarization, and question answering.",
569
+ relevant_doc_ids=["llm_basics"],
570
+ metadata={"category": "definition", "difficulty": "advanced"},
571
+ ),
572
+ ]
573
+
574
+ return train_data, val_data
575
+
576
+
577
+ def clean_answer(answer: str) -> str:
578
+ """Clean up LLM answer by removing thinking tokens and truncating appropriately."""
579
+ import re
580
+
581
+ cleaned = re.sub(r"<think>.*?</think>", "", answer, flags=re.DOTALL)
582
+ cleaned = cleaned.strip()
583
+
584
+ # If still empty or starts with <think> without closing tag, try to find content after
585
+ if not cleaned or cleaned.startswith("<think>"):
586
+ lines = answer.split("\n")
587
+ content_lines = []
588
+ skip_thinking = False
589
+
590
+ for line in lines:
591
+ if "<think>" in line:
592
+ skip_thinking = True
593
+ continue
594
+ if "</think>" in line:
595
+ skip_thinking = False
596
+ continue
597
+ if not skip_thinking and line.strip():
598
+ content_lines.append(line.strip())
599
+
600
+ cleaned = " ".join(content_lines)
601
+
602
+ # Show more of the answer - increase limit significantly
603
+ if len(cleaned) > 500:
604
+ return cleaned[:500] + "..."
605
+ return cleaned or answer[:500] + ("..." if len(answer) > 500 else "")
606
+
607
+
608
+ def create_initial_prompts() -> dict[str, str]:
609
+ """Create initial prompt templates for optimization."""
610
+ return {"answer_generation": """You are an AI expert providing accurate technical explanations.
611
+
612
+ Based on the retrieved context, provide a clear and informative answer to the user's question.
613
+
614
+ Guidelines:
615
+ - Use information from the provided context
616
+ - Be accurate and concise
617
+ - Include key technical details
618
+ - Structure your response clearly
619
+
620
+ Context: {context}
621
+
622
+ Question: {query}
623
+
624
+ Answer:"""}
625
+
626
+
627
+ def setup_vector_store(store_name: str):
628
+ """Factory function to set up the specified vector store."""
629
+ setup_functions = {
630
+ "chromadb": setup_chromadb_store,
631
+ "lancedb": setup_lancedb_store,
632
+ "milvus": setup_milvus_store,
633
+ "qdrant": setup_qdrant_store,
634
+ "weaviate": setup_weaviate_store,
635
+ }
636
+
637
+ if store_name not in setup_functions:
638
+ raise ValueError(f"Unknown vector store: {store_name}. Supported: {list(setup_functions.keys())}")
639
+
640
+ return setup_functions[store_name]()
641
+
642
+
643
+ def parse_arguments():
644
+ """Parse command line arguments."""
645
+ parser = argparse.ArgumentParser(
646
+ description="GEPA RAG Optimization Example with Multiple Vector Stores",
647
+ formatter_class=argparse.RawDescriptionHelpFormatter,
648
+ epilog="""
649
+ Examples:
650
+ python rag_optimization.py --vector-store chromadb
651
+ python rag_optimization.py --vector-store lancedb --model ollama/llama3.1:8b
652
+ python rag_optimization.py --vector-store qdrant --max-iterations 10
653
+ python rag_optimization.py --vector-store weaviate --model gpt-4o-mini
654
+
655
+ Supported Vector Stores:
656
+ chromadb - Local/persistent, simple setup (default)
657
+ lancedb - Serverless, no Docker required
658
+ milvus - Cloud-native, uses Lite mode locally
659
+ qdrant - High-performance, advanced filtering
660
+ weaviate - Hybrid search capabilities (requires Docker)
661
+ """,
662
+ )
663
+
664
+ parser.add_argument(
665
+ "--vector-store",
666
+ type=str,
667
+ default="chromadb",
668
+ choices=["chromadb", "lancedb", "milvus", "qdrant", "weaviate"],
669
+ help="Vector store to use (default: chromadb)",
670
+ )
671
+ parser.add_argument("--model", type=str, default="ollama/qwen3:8b", help="LLM model (default: ollama/qwen3:8b)")
672
+ parser.add_argument(
673
+ "--embedding-model",
674
+ type=str,
675
+ default="ollama/nomic-embed-text:latest",
676
+ help="Embedding model (default: ollama/nomic-embed-text:latest)",
677
+ )
678
+ parser.add_argument(
679
+ "--max-iterations",
680
+ type=int,
681
+ default=5,
682
+ help="GEPA optimization iterations (default: 5, use 0 to skip optimization)",
683
+ )
684
+ parser.add_argument("--verbose", action="store_true", help="Enable verbose output")
685
+
686
+ return parser.parse_args()
687
+
688
+
689
+ def main():
690
+ """Main function demonstrating RAG optimization with multiple vector stores."""
691
+ args = parse_arguments()
692
+
693
+ print("šŸš€ GEPA RAG Optimization with Multiple Vector Stores")
694
+ print("=" * 60)
695
+ print(f"šŸ—„ļø Vector Store: {args.vector_store}")
696
+ print(f"šŸ“Š Model: {args.model}")
697
+ print(f"šŸ”— Embeddings: {args.embedding_model}")
698
+ print(f"šŸ”„ Max Iterations: {args.max_iterations}")
699
+
700
+ try:
701
+ # Step 1: Setup vector store
702
+ print(f"\n1ļøāƒ£ Setting up {args.vector_store} vector store...")
703
+ vector_store = setup_vector_store(args.vector_store)
704
+
705
+ # Step 2: Create datasets
706
+ print("\n2ļøāƒ£ Creating training and validation datasets...")
707
+ train_data, val_data = create_training_data()
708
+ print(f" šŸ“š Training examples: {len(train_data)}")
709
+ print(f" šŸ“ Validation examples: {len(val_data)}")
710
+
711
+ # Step 3: Initialize LLM client
712
+ print(f"\n3ļøāƒ£ Initializing LLM client ({args.model})...")
713
+ llm_client = create_llm_client(args.model)
714
+
715
+ # Test LLM
716
+ test_response = llm_client([{"role": "user", "content": "Say 'OK' only."}])
717
+ if "Error:" not in test_response:
718
+ print(f" āœ… LLM connected: {test_response[:30]}...")
719
+ else:
720
+ print(f" āš ļø LLM issue: {test_response}")
721
+
722
+ # Step 4: Initialize RAG adapter
723
+ print("\n4ļøāƒ£ Initializing GenericRAGAdapter...")
724
+ rag_config = {
725
+ "retrieval_strategy": "similarity",
726
+ "top_k": 3,
727
+ "retrieval_weight": 0.3,
728
+ "generation_weight": 0.7,
729
+ }
730
+
731
+ # Add hybrid search for Weaviate
732
+ if args.vector_store == "weaviate":
733
+ rag_config["retrieval_strategy"] = "hybrid"
734
+ rag_config["hybrid_alpha"] = 0.7
735
+
736
+ rag_adapter = GenericRAGAdapter(
737
+ vector_store=vector_store,
738
+ llm_model=llm_client,
739
+ embedding_model=args.embedding_model,
740
+ rag_config=rag_config,
741
+ )
742
+
743
+ # Step 5: Create initial prompts
744
+ print("\n5ļøāƒ£ Creating initial prompts...")
745
+ initial_prompts = create_initial_prompts()
746
+
747
+ # Step 6: Test initial performance
748
+ print("\n6ļøāƒ£ Testing initial performance...")
749
+ eval_result = rag_adapter.evaluate(batch=val_data[:1], candidate=initial_prompts, capture_traces=True)
750
+
751
+ initial_score = eval_result.scores[0]
752
+ print(f" šŸ“Š Initial score: {initial_score:.3f}")
753
+ print(f" šŸ’¬ Sample answer: {clean_answer(eval_result.outputs[0]['final_answer'])}")
754
+
755
+ # Step 7: Run GEPA optimization
756
+ if args.max_iterations > 0:
757
+ print(f"\n7ļøāƒ£ Running GEPA optimization ({args.max_iterations} iterations)...")
758
+
759
+ result = gepa.optimize(
760
+ seed_candidate=initial_prompts,
761
+ trainset=train_data,
762
+ valset=val_data,
763
+ adapter=rag_adapter,
764
+ reflection_lm=llm_client,
765
+ max_metric_calls=args.max_iterations,
766
+ )
767
+
768
+ best_score = result.val_aggregate_scores[result.best_idx]
769
+ print(" šŸŽ‰ Optimization complete!")
770
+ print(f" šŸ† Best score: {best_score:.3f}")
771
+ print(f" šŸ“ˆ Improvement: {best_score - initial_score:+.3f}")
772
+ print(f" šŸ”„ Total iterations: {result.total_metric_calls or 0}")
773
+
774
+ # Test optimized prompts
775
+ print("\n Testing optimized prompts...")
776
+ optimized_result = rag_adapter.evaluate(
777
+ batch=val_data[:1], candidate=result.best_candidate, capture_traces=False
778
+ )
779
+ print(f" šŸ’¬ Optimized answer: {clean_answer(optimized_result.outputs[0]['final_answer'])}")
780
+
781
+ else:
782
+ print("\n7ļøāƒ£ Skipping optimization (use --max-iterations > 0 to enable)")
783
+
784
+ print(f"\nāœ… {args.vector_store.title()} RAG optimization completed successfully!")
785
+
786
+ # Clean up connections
787
+ try:
788
+ if hasattr(vector_store, "client") and hasattr(vector_store.client, "close"):
789
+ vector_store.client.close()
790
+ except Exception:
791
+ pass
792
+
793
+ except Exception as e:
794
+ print(f"\nāŒ Error: {e}")
795
+ if args.verbose:
796
+ import traceback
797
+
798
+ traceback.print_exc()
799
+
800
+ print("\nšŸ”§ Troubleshooting tips:")
801
+ if args.vector_store == "weaviate":
802
+ print(" • Ensure Weaviate is running: curl http://localhost:8080/v1/meta")
803
+ print(
804
+ " • Start Weaviate: docker run -p 8080:8080 -p 50051:50051 cr.weaviate.io/semitechnologies/weaviate:1.26.1"
805
+ )
806
+ elif args.vector_store == "qdrant":
807
+ print(" • For external Qdrant: docker run -p 6333:6333 qdrant/qdrant")
808
+
809
+ print(" • Ensure Ollama is running: ollama list")
810
+ print(" • Check models are available: ollama pull qwen3:8b")
811
+ print(" • For cloud models: set API keys (OPENAI_API_KEY, etc.)")
812
+ print(f" • Install dependencies: pip install {get_install_command(args.vector_store)}")
813
+
814
+ return 1
815
+
816
+ return 0
817
+
818
+
819
+ if __name__ == "__main__":
820
+ sys.exit(main())