world-model-optimizer 0.2.0__tar.gz

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 (513) hide show
  1. world_model_optimizer-0.2.0/.gitignore +47 -0
  2. world_model_optimizer-0.2.0/PKG-INFO +203 -0
  3. world_model_optimizer-0.2.0/README.md +146 -0
  4. world_model_optimizer-0.2.0/conftest.py +11 -0
  5. world_model_optimizer-0.2.0/packages/llm-waterfall/LICENSE +21 -0
  6. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/__init__.py +53 -0
  7. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/__init__.py +36 -0
  8. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/anthropic.py +105 -0
  9. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/anthropic_test.py +70 -0
  10. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/aws_mantle.py +47 -0
  11. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/azure_openai.py +71 -0
  12. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/azure_openai_test.py +133 -0
  13. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/base.py +51 -0
  14. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/bedrock.py +309 -0
  15. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/bedrock_test.py +165 -0
  16. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/openai.py +130 -0
  17. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/openai_test.py +96 -0
  18. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/classify.py +184 -0
  19. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/classify_test.py +266 -0
  20. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/import_hygiene_test.py +50 -0
  21. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/pricing.py +110 -0
  22. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/pricing_test.py +60 -0
  23. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/py.typed +0 -0
  24. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/types.py +295 -0
  25. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/types_test.py +123 -0
  26. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/waterfall.py +255 -0
  27. world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/waterfall_test.py +315 -0
  28. world_model_optimizer-0.2.0/pyproject.toml +166 -0
  29. world_model_optimizer-0.2.0/wmo/__init__.py +38 -0
  30. world_model_optimizer-0.2.0/wmo/agents/__init__.py +7 -0
  31. world_model_optimizer-0.2.0/wmo/agents/default.py +29 -0
  32. world_model_optimizer-0.2.0/wmo/agents/definitions_test.py +37 -0
  33. world_model_optimizer-0.2.0/wmo/agents/meta.py +55 -0
  34. world_model_optimizer-0.2.0/wmo/agents/optimizer.py +55 -0
  35. world_model_optimizer-0.2.0/wmo/agents/optimizer_test.py +14 -0
  36. world_model_optimizer-0.2.0/wmo/agents/project.py +928 -0
  37. world_model_optimizer-0.2.0/wmo/agents/project_test.py +1468 -0
  38. world_model_optimizer-0.2.0/wmo/api_test.py +12 -0
  39. world_model_optimizer-0.2.0/wmo/cli/__init__.py +5 -0
  40. world_model_optimizer-0.2.0/wmo/cli/agent_session.py +1123 -0
  41. world_model_optimizer-0.2.0/wmo/cli/agent_session_test.py +1312 -0
  42. world_model_optimizer-0.2.0/wmo/cli/app.py +2489 -0
  43. world_model_optimizer-0.2.0/wmo/cli/app_test.py +1070 -0
  44. world_model_optimizer-0.2.0/wmo/cli/e2b_cmds.py +212 -0
  45. world_model_optimizer-0.2.0/wmo/cli/e2b_cmds_test.py +245 -0
  46. world_model_optimizer-0.2.0/wmo/cli/eval_closed_loop.py +207 -0
  47. world_model_optimizer-0.2.0/wmo/cli/eval_closed_loop_test.py +320 -0
  48. world_model_optimizer-0.2.0/wmo/cli/harness_app.py +1147 -0
  49. world_model_optimizer-0.2.0/wmo/cli/harness_app_test.py +1057 -0
  50. world_model_optimizer-0.2.0/wmo/cli/harness_distill.py +659 -0
  51. world_model_optimizer-0.2.0/wmo/cli/harness_distill_test.py +888 -0
  52. world_model_optimizer-0.2.0/wmo/cli/hosted_session.py +880 -0
  53. world_model_optimizer-0.2.0/wmo/cli/hosted_session_test.py +1382 -0
  54. world_model_optimizer-0.2.0/wmo/cli/ingest_cmd.py +165 -0
  55. world_model_optimizer-0.2.0/wmo/cli/ingest_cmd_test.py +98 -0
  56. world_model_optimizer-0.2.0/wmo/cli/model_roles.py +82 -0
  57. world_model_optimizer-0.2.0/wmo/cli/model_roles_test.py +189 -0
  58. world_model_optimizer-0.2.0/wmo/cli/platform_cmds.py +372 -0
  59. world_model_optimizer-0.2.0/wmo/cli/platform_cmds_test.py +265 -0
  60. world_model_optimizer-0.2.0/wmo/cli/route_app.py +274 -0
  61. world_model_optimizer-0.2.0/wmo/cli/route_app_test.py +319 -0
  62. world_model_optimizer-0.2.0/wmo/cli/session_state.py +243 -0
  63. world_model_optimizer-0.2.0/wmo/cli/session_state_test.py +217 -0
  64. world_model_optimizer-0.2.0/wmo/cli/ui.py +1107 -0
  65. world_model_optimizer-0.2.0/wmo/cli/ui_test.py +734 -0
  66. world_model_optimizer-0.2.0/wmo/cli/workspace_sync.py +504 -0
  67. world_model_optimizer-0.2.0/wmo/cli/workspace_sync_test.py +276 -0
  68. world_model_optimizer-0.2.0/wmo/config/__init__.py +60 -0
  69. world_model_optimizer-0.2.0/wmo/config/card.py +129 -0
  70. world_model_optimizer-0.2.0/wmo/config/card_test.py +58 -0
  71. world_model_optimizer-0.2.0/wmo/config/config.py +367 -0
  72. world_model_optimizer-0.2.0/wmo/config/config_test.py +242 -0
  73. world_model_optimizer-0.2.0/wmo/config/dotenv.py +67 -0
  74. world_model_optimizer-0.2.0/wmo/config/dotenv_test.py +60 -0
  75. world_model_optimizer-0.2.0/wmo/config/settings.py +128 -0
  76. world_model_optimizer-0.2.0/wmo/config/settings_test.py +142 -0
  77. world_model_optimizer-0.2.0/wmo/config/store.py +177 -0
  78. world_model_optimizer-0.2.0/wmo/config/store_test.py +84 -0
  79. world_model_optimizer-0.2.0/wmo/conftest.py +19 -0
  80. world_model_optimizer-0.2.0/wmo/connect/__init__.py +88 -0
  81. world_model_optimizer-0.2.0/wmo/connect/api_test.py +53 -0
  82. world_model_optimizer-0.2.0/wmo/connect/apps.py +78 -0
  83. world_model_optimizer-0.2.0/wmo/connect/apps_test.py +67 -0
  84. world_model_optimizer-0.2.0/wmo/connect/brave.py +284 -0
  85. world_model_optimizer-0.2.0/wmo/connect/brave_test.py +375 -0
  86. world_model_optimizer-0.2.0/wmo/connect/connector.py +79 -0
  87. world_model_optimizer-0.2.0/wmo/connect/connector_test.py +78 -0
  88. world_model_optimizer-0.2.0/wmo/connect/credentials.py +164 -0
  89. world_model_optimizer-0.2.0/wmo/connect/credentials_test.py +165 -0
  90. world_model_optimizer-0.2.0/wmo/connect/github.py +321 -0
  91. world_model_optimizer-0.2.0/wmo/connect/github_test.py +325 -0
  92. world_model_optimizer-0.2.0/wmo/connect/google.py +627 -0
  93. world_model_optimizer-0.2.0/wmo/connect/google_test.py +668 -0
  94. world_model_optimizer-0.2.0/wmo/connect/notion.py +790 -0
  95. world_model_optimizer-0.2.0/wmo/connect/notion_test.py +693 -0
  96. world_model_optimizer-0.2.0/wmo/connect/oauth.py +461 -0
  97. world_model_optimizer-0.2.0/wmo/connect/oauth_test.py +376 -0
  98. world_model_optimizer-0.2.0/wmo/connect/slack.py +555 -0
  99. world_model_optimizer-0.2.0/wmo/connect/slack_test.py +592 -0
  100. world_model_optimizer-0.2.0/wmo/connect/store.py +199 -0
  101. world_model_optimizer-0.2.0/wmo/connect/store_test.py +127 -0
  102. world_model_optimizer-0.2.0/wmo/connect/types.py +156 -0
  103. world_model_optimizer-0.2.0/wmo/connect/types_test.py +73 -0
  104. world_model_optimizer-0.2.0/wmo/core/__init__.py +21 -0
  105. world_model_optimizer-0.2.0/wmo/core/parsing.py +281 -0
  106. world_model_optimizer-0.2.0/wmo/core/parsing_test.py +207 -0
  107. world_model_optimizer-0.2.0/wmo/core/render.py +271 -0
  108. world_model_optimizer-0.2.0/wmo/core/render_test.py +212 -0
  109. world_model_optimizer-0.2.0/wmo/core/text.py +40 -0
  110. world_model_optimizer-0.2.0/wmo/core/types.py +116 -0
  111. world_model_optimizer-0.2.0/wmo/core/types_test.py +15 -0
  112. world_model_optimizer-0.2.0/wmo/distill/__init__.py +14 -0
  113. world_model_optimizer-0.2.0/wmo/distill/agents.py +140 -0
  114. world_model_optimizer-0.2.0/wmo/distill/agents_test.py +199 -0
  115. world_model_optimizer-0.2.0/wmo/distill/config.py +1006 -0
  116. world_model_optimizer-0.2.0/wmo/distill/config_test.py +976 -0
  117. world_model_optimizer-0.2.0/wmo/distill/cost.py +437 -0
  118. world_model_optimizer-0.2.0/wmo/distill/cost_test.py +421 -0
  119. world_model_optimizer-0.2.0/wmo/distill/data.py +921 -0
  120. world_model_optimizer-0.2.0/wmo/distill/data_test.py +1779 -0
  121. world_model_optimizer-0.2.0/wmo/distill/deadlines.py +254 -0
  122. world_model_optimizer-0.2.0/wmo/distill/deadlines_test.py +168 -0
  123. world_model_optimizer-0.2.0/wmo/distill/fake_tinker.py +734 -0
  124. world_model_optimizer-0.2.0/wmo/distill/fake_tinker_test.py +547 -0
  125. world_model_optimizer-0.2.0/wmo/distill/gate.py +122 -0
  126. world_model_optimizer-0.2.0/wmo/distill/gate_test.py +111 -0
  127. world_model_optimizer-0.2.0/wmo/distill/loop.py +3499 -0
  128. world_model_optimizer-0.2.0/wmo/distill/loop_test.py +3588 -0
  129. world_model_optimizer-0.2.0/wmo/distill/renderers.py +399 -0
  130. world_model_optimizer-0.2.0/wmo/distill/renderers_test.py +638 -0
  131. world_model_optimizer-0.2.0/wmo/distill/rendering.py +620 -0
  132. world_model_optimizer-0.2.0/wmo/distill/rendering_test.py +475 -0
  133. world_model_optimizer-0.2.0/wmo/distill/rollouts.py +726 -0
  134. world_model_optimizer-0.2.0/wmo/distill/rollouts_test.py +1021 -0
  135. world_model_optimizer-0.2.0/wmo/distill/samples.py +195 -0
  136. world_model_optimizer-0.2.0/wmo/distill/samples_test.py +178 -0
  137. world_model_optimizer-0.2.0/wmo/distill/store.py +829 -0
  138. world_model_optimizer-0.2.0/wmo/distill/store_test.py +506 -0
  139. world_model_optimizer-0.2.0/wmo/distill/teacher.py +714 -0
  140. world_model_optimizer-0.2.0/wmo/distill/teacher_test.py +701 -0
  141. world_model_optimizer-0.2.0/wmo/distill/tokens.py +535 -0
  142. world_model_optimizer-0.2.0/wmo/distill/tokens_test.py +449 -0
  143. world_model_optimizer-0.2.0/wmo/distill/tracking.py +552 -0
  144. world_model_optimizer-0.2.0/wmo/distill/tracking_test.py +730 -0
  145. world_model_optimizer-0.2.0/wmo/distill/tripwire.py +411 -0
  146. world_model_optimizer-0.2.0/wmo/distill/tripwire_test.py +510 -0
  147. world_model_optimizer-0.2.0/wmo/distill/xtoken/byte_offsets.py +152 -0
  148. world_model_optimizer-0.2.0/wmo/distill/xtoken/byte_offsets_test.py +145 -0
  149. world_model_optimizer-0.2.0/wmo/distill/xtoken/chunks.py +457 -0
  150. world_model_optimizer-0.2.0/wmo/distill/xtoken/chunks_test.py +325 -0
  151. world_model_optimizer-0.2.0/wmo/distill/xtoken/prompt_logprobs.py +475 -0
  152. world_model_optimizer-0.2.0/wmo/distill/xtoken/teacher_render.py +346 -0
  153. world_model_optimizer-0.2.0/wmo/distill/xtoken/teacher_render_test.py +289 -0
  154. world_model_optimizer-0.2.0/wmo/engine/__init__.py +28 -0
  155. world_model_optimizer-0.2.0/wmo/engine/autoconfig.py +367 -0
  156. world_model_optimizer-0.2.0/wmo/engine/autoconfig_test.py +214 -0
  157. world_model_optimizer-0.2.0/wmo/engine/build.py +346 -0
  158. world_model_optimizer-0.2.0/wmo/engine/build_test.py +559 -0
  159. world_model_optimizer-0.2.0/wmo/engine/demo.py +77 -0
  160. world_model_optimizer-0.2.0/wmo/engine/demo_test.py +120 -0
  161. world_model_optimizer-0.2.0/wmo/engine/eval_suites.py +245 -0
  162. world_model_optimizer-0.2.0/wmo/engine/eval_suites_test.py +110 -0
  163. world_model_optimizer-0.2.0/wmo/engine/grounding.py +491 -0
  164. world_model_optimizer-0.2.0/wmo/engine/grounding_test.py +299 -0
  165. world_model_optimizer-0.2.0/wmo/engine/integration_test.py +91 -0
  166. world_model_optimizer-0.2.0/wmo/engine/knowledge.py +291 -0
  167. world_model_optimizer-0.2.0/wmo/engine/knowledge_test.py +159 -0
  168. world_model_optimizer-0.2.0/wmo/engine/loader.py +36 -0
  169. world_model_optimizer-0.2.0/wmo/engine/play.py +92 -0
  170. world_model_optimizer-0.2.0/wmo/engine/play_test.py +104 -0
  171. world_model_optimizer-0.2.0/wmo/engine/prompts.py +99 -0
  172. world_model_optimizer-0.2.0/wmo/engine/replay.py +443 -0
  173. world_model_optimizer-0.2.0/wmo/engine/replay_test.py +662 -0
  174. world_model_optimizer-0.2.0/wmo/engine/reporting.py +58 -0
  175. world_model_optimizer-0.2.0/wmo/engine/workspace.py +468 -0
  176. world_model_optimizer-0.2.0/wmo/engine/workspace_test.py +233 -0
  177. world_model_optimizer-0.2.0/wmo/engine/world_model.py +568 -0
  178. world_model_optimizer-0.2.0/wmo/engine/world_model_test.py +714 -0
  179. world_model_optimizer-0.2.0/wmo/env/__init__.py +22 -0
  180. world_model_optimizer-0.2.0/wmo/env/base.py +121 -0
  181. world_model_optimizer-0.2.0/wmo/env/base_test.py +188 -0
  182. world_model_optimizer-0.2.0/wmo/env/closed_loop.py +229 -0
  183. world_model_optimizer-0.2.0/wmo/env/closed_loop_test.py +265 -0
  184. world_model_optimizer-0.2.0/wmo/env/episode.py +107 -0
  185. world_model_optimizer-0.2.0/wmo/env/episode_test.py +163 -0
  186. world_model_optimizer-0.2.0/wmo/env/llm_agent.py +93 -0
  187. world_model_optimizer-0.2.0/wmo/env/llm_agent_test.py +100 -0
  188. world_model_optimizer-0.2.0/wmo/env/scenarios.py +73 -0
  189. world_model_optimizer-0.2.0/wmo/env/scenarios_test.py +82 -0
  190. world_model_optimizer-0.2.0/wmo/evals/__init__.py +52 -0
  191. world_model_optimizer-0.2.0/wmo/evals/agreement.py +110 -0
  192. world_model_optimizer-0.2.0/wmo/evals/agreement_test.py +61 -0
  193. world_model_optimizer-0.2.0/wmo/evals/base.py +45 -0
  194. world_model_optimizer-0.2.0/wmo/evals/base_test.py +40 -0
  195. world_model_optimizer-0.2.0/wmo/evals/closed_loop.py +480 -0
  196. world_model_optimizer-0.2.0/wmo/evals/closed_loop_test.py +701 -0
  197. world_model_optimizer-0.2.0/wmo/evals/failover.py +96 -0
  198. world_model_optimizer-0.2.0/wmo/evals/failover_test.py +102 -0
  199. world_model_optimizer-0.2.0/wmo/evals/gold.py +127 -0
  200. world_model_optimizer-0.2.0/wmo/evals/gold_test.py +130 -0
  201. world_model_optimizer-0.2.0/wmo/evals/grid.py +394 -0
  202. world_model_optimizer-0.2.0/wmo/evals/grid_plot.py +205 -0
  203. world_model_optimizer-0.2.0/wmo/evals/grid_plot_test.py +101 -0
  204. world_model_optimizer-0.2.0/wmo/evals/grid_test.py +388 -0
  205. world_model_optimizer-0.2.0/wmo/evals/harbor/__init__.py +27 -0
  206. world_model_optimizer-0.2.0/wmo/evals/harbor/agent.py +573 -0
  207. world_model_optimizer-0.2.0/wmo/evals/harbor/agent_test.py +490 -0
  208. world_model_optimizer-0.2.0/wmo/evals/harbor/ctrf.py +171 -0
  209. world_model_optimizer-0.2.0/wmo/evals/harbor/ctrf_test.py +389 -0
  210. world_model_optimizer-0.2.0/wmo/evals/harbor/e2b_environment.py +587 -0
  211. world_model_optimizer-0.2.0/wmo/evals/harbor/e2b_environment_test.py +732 -0
  212. world_model_optimizer-0.2.0/wmo/evals/harbor/e2b_template_policy.py +144 -0
  213. world_model_optimizer-0.2.0/wmo/evals/harbor/scorer.py +875 -0
  214. world_model_optimizer-0.2.0/wmo/evals/harbor/scorer_test.py +973 -0
  215. world_model_optimizer-0.2.0/wmo/evals/harbor/tasks.py +140 -0
  216. world_model_optimizer-0.2.0/wmo/evals/harbor/tasks_test.py +139 -0
  217. world_model_optimizer-0.2.0/wmo/evals/open_loop.py +194 -0
  218. world_model_optimizer-0.2.0/wmo/evals/open_loop_test.py +213 -0
  219. world_model_optimizer-0.2.0/wmo/evals/tasks.py +53 -0
  220. world_model_optimizer-0.2.0/wmo/evals/tasks_test.py +53 -0
  221. world_model_optimizer-0.2.0/wmo/harness/__init__.py +51 -0
  222. world_model_optimizer-0.2.0/wmo/harness/code_runtime.py +288 -0
  223. world_model_optimizer-0.2.0/wmo/harness/code_runtime_test.py +209 -0
  224. world_model_optimizer-0.2.0/wmo/harness/create.py +1191 -0
  225. world_model_optimizer-0.2.0/wmo/harness/create_test.py +2186 -0
  226. world_model_optimizer-0.2.0/wmo/harness/delta.py +220 -0
  227. world_model_optimizer-0.2.0/wmo/harness/delta_test.py +288 -0
  228. world_model_optimizer-0.2.0/wmo/harness/doc.py +556 -0
  229. world_model_optimizer-0.2.0/wmo/harness/doc_test.py +490 -0
  230. world_model_optimizer-0.2.0/wmo/harness/e2b_ledger.py +342 -0
  231. world_model_optimizer-0.2.0/wmo/harness/e2b_ledger_test.py +157 -0
  232. world_model_optimizer-0.2.0/wmo/harness/e2b_reap.py +476 -0
  233. world_model_optimizer-0.2.0/wmo/harness/e2b_reap_test.py +393 -0
  234. world_model_optimizer-0.2.0/wmo/harness/e2b_sandbox.py +350 -0
  235. world_model_optimizer-0.2.0/wmo/harness/e2b_sandbox_test.py +420 -0
  236. world_model_optimizer-0.2.0/wmo/harness/environment.py +35 -0
  237. world_model_optimizer-0.2.0/wmo/harness/live_session.py +543 -0
  238. world_model_optimizer-0.2.0/wmo/harness/live_session_test.py +482 -0
  239. world_model_optimizer-0.2.0/wmo/harness/mutate.py +343 -0
  240. world_model_optimizer-0.2.0/wmo/harness/mutate_test.py +310 -0
  241. world_model_optimizer-0.2.0/wmo/harness/pi_e2b.py +1710 -0
  242. world_model_optimizer-0.2.0/wmo/harness/pi_e2b_test.py +2519 -0
  243. world_model_optimizer-0.2.0/wmo/harness/pi_entry/entry.ts +268 -0
  244. world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_frames.ts +92 -0
  245. world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_live.ts +587 -0
  246. world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_service.ts +270 -0
  247. world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_stdio.ts +374 -0
  248. world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_termination.ts +142 -0
  249. world_model_optimizer-0.2.0/wmo/harness/pi_local.py +262 -0
  250. world_model_optimizer-0.2.0/wmo/harness/pi_local_test.py +313 -0
  251. world_model_optimizer-0.2.0/wmo/harness/pi_runtime.py +495 -0
  252. world_model_optimizer-0.2.0/wmo/harness/pi_runtime_test.py +365 -0
  253. world_model_optimizer-0.2.0/wmo/harness/pi_vendor.py +65 -0
  254. world_model_optimizer-0.2.0/wmo/harness/pi_vendor_test.py +56 -0
  255. world_model_optimizer-0.2.0/wmo/harness/population.py +509 -0
  256. world_model_optimizer-0.2.0/wmo/harness/population_test.py +279 -0
  257. world_model_optimizer-0.2.0/wmo/harness/project_proposer.py +569 -0
  258. world_model_optimizer-0.2.0/wmo/harness/project_proposer_test.py +380 -0
  259. world_model_optimizer-0.2.0/wmo/harness/proposer.py +977 -0
  260. world_model_optimizer-0.2.0/wmo/harness/proposer_test.py +917 -0
  261. world_model_optimizer-0.2.0/wmo/harness/runner_link.py +619 -0
  262. world_model_optimizer-0.2.0/wmo/harness/runner_link_test.py +752 -0
  263. world_model_optimizer-0.2.0/wmo/harness/runtime.py +389 -0
  264. world_model_optimizer-0.2.0/wmo/harness/runtime_test.py +193 -0
  265. world_model_optimizer-0.2.0/wmo/harness/scoring.py +247 -0
  266. world_model_optimizer-0.2.0/wmo/harness/scoring_test.py +125 -0
  267. world_model_optimizer-0.2.0/wmo/harness/skills.py +116 -0
  268. world_model_optimizer-0.2.0/wmo/harness/skills_test.py +44 -0
  269. world_model_optimizer-0.2.0/wmo/harness/source_tree.py +319 -0
  270. world_model_optimizer-0.2.0/wmo/harness/source_tree_test.py +220 -0
  271. world_model_optimizer-0.2.0/wmo/harness/store.py +176 -0
  272. world_model_optimizer-0.2.0/wmo/harness/store_test.py +225 -0
  273. world_model_optimizer-0.2.0/wmo/harness/tools.py +105 -0
  274. world_model_optimizer-0.2.0/wmo/harness/tools_test.py +42 -0
  275. world_model_optimizer-0.2.0/wmo/harness/vendor/manifest.sha256 +58 -0
  276. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/CHANGELOG.md +556 -0
  277. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/LICENSE +21 -0
  278. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/README.md +488 -0
  279. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/VENDOR.md +39 -0
  280. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/agent-harness.md +486 -0
  281. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/durable-harness.md +212 -0
  282. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/hooks.md +445 -0
  283. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/models.md +966 -0
  284. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/observability.md +376 -0
  285. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/package.json +60 -0
  286. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/agent-loop.ts +748 -0
  287. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/agent.ts +575 -0
  288. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/agent-harness.ts +1029 -0
  289. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/compaction/branch-summarization.ts +261 -0
  290. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/compaction/compaction.ts +747 -0
  291. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/compaction/utils.ts +144 -0
  292. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/env/nodejs.ts +550 -0
  293. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/messages.ts +164 -0
  294. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/prompt-templates.ts +267 -0
  295. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/jsonl-repo.ts +177 -0
  296. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/jsonl-storage.ts +293 -0
  297. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/memory-repo.ts +50 -0
  298. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/memory-storage.ts +131 -0
  299. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/repo-utils.ts +51 -0
  300. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/session.ts +267 -0
  301. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/uuid.ts +54 -0
  302. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/skills.ts +375 -0
  303. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/system-prompt.ts +34 -0
  304. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/types.ts +836 -0
  305. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/utils/shell-output.ts +135 -0
  306. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/utils/truncate.ts +344 -0
  307. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/index.ts +44 -0
  308. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/node.ts +2 -0
  309. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/proxy.ts +367 -0
  310. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/types.ts +428 -0
  311. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/agent-loop.test.ts +1351 -0
  312. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/agent.test.ts +699 -0
  313. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/e2e.test.ts +404 -0
  314. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/agent-harness-stream.test.ts +213 -0
  315. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/agent-harness.test.ts +608 -0
  316. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/compaction.test.ts +655 -0
  317. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/nodejs-env.test.ts +321 -0
  318. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/prompt-templates.test.ts +90 -0
  319. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/repo.test.ts +68 -0
  320. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/resource-formatting.test.ts +24 -0
  321. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/session-test-utils.ts +55 -0
  322. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/session-uuid.test.ts +50 -0
  323. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/session.test.ts +156 -0
  324. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/skills.test.ts +116 -0
  325. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/storage.test.ts +299 -0
  326. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/system-prompt.test.ts +66 -0
  327. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/truncate.test.ts +169 -0
  328. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/scratch/simple.ts +72 -0
  329. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/utils/calculate.ts +32 -0
  330. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/utils/get-current-time.ts +46 -0
  331. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/tsconfig.build.json +13 -0
  332. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/vitest.config.ts +19 -0
  333. world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/vitest.harness.config.ts +28 -0
  334. world_model_optimizer-0.2.0/wmo/harness/vendor/vendor_pi.sh +59 -0
  335. world_model_optimizer-0.2.0/wmo/harness/workspace_patch.py +270 -0
  336. world_model_optimizer-0.2.0/wmo/harness/workspace_patch_test.py +88 -0
  337. world_model_optimizer-0.2.0/wmo/ingest/__init__.py +47 -0
  338. world_model_optimizer-0.2.0/wmo/ingest/adapter.py +72 -0
  339. world_model_optimizer-0.2.0/wmo/ingest/base.py +114 -0
  340. world_model_optimizer-0.2.0/wmo/ingest/base_test.py +181 -0
  341. world_model_optimizer-0.2.0/wmo/ingest/braintrust.py +339 -0
  342. world_model_optimizer-0.2.0/wmo/ingest/braintrust_test.py +210 -0
  343. world_model_optimizer-0.2.0/wmo/ingest/detect.py +126 -0
  344. world_model_optimizer-0.2.0/wmo/ingest/detect_test.py +71 -0
  345. world_model_optimizer-0.2.0/wmo/ingest/langfuse.py +291 -0
  346. world_model_optimizer-0.2.0/wmo/ingest/langfuse_test.py +254 -0
  347. world_model_optimizer-0.2.0/wmo/ingest/langsmith.py +444 -0
  348. world_model_optimizer-0.2.0/wmo/ingest/langsmith_test.py +293 -0
  349. world_model_optimizer-0.2.0/wmo/ingest/mastra.py +330 -0
  350. world_model_optimizer-0.2.0/wmo/ingest/mastra_test.py +217 -0
  351. world_model_optimizer-0.2.0/wmo/ingest/messages.py +170 -0
  352. world_model_optimizer-0.2.0/wmo/ingest/messages_test.py +139 -0
  353. world_model_optimizer-0.2.0/wmo/ingest/normalize.py +679 -0
  354. world_model_optimizer-0.2.0/wmo/ingest/normalize_test.py +191 -0
  355. world_model_optimizer-0.2.0/wmo/ingest/otel_genai.py +69 -0
  356. world_model_optimizer-0.2.0/wmo/ingest/otel_genai_envcap_roundtrip_test.py +59 -0
  357. world_model_optimizer-0.2.0/wmo/ingest/otel_genai_test.py +228 -0
  358. world_model_optimizer-0.2.0/wmo/ingest/otel_writer.py +100 -0
  359. world_model_optimizer-0.2.0/wmo/ingest/otel_writer_test.py +110 -0
  360. world_model_optimizer-0.2.0/wmo/ingest/phoenix.py +150 -0
  361. world_model_optimizer-0.2.0/wmo/ingest/phoenix_test.py +213 -0
  362. world_model_optimizer-0.2.0/wmo/ingest/postgres.py +246 -0
  363. world_model_optimizer-0.2.0/wmo/ingest/postgres_test.py +151 -0
  364. world_model_optimizer-0.2.0/wmo/ingest/posthog.py +320 -0
  365. world_model_optimizer-0.2.0/wmo/ingest/posthog_test.py +189 -0
  366. world_model_optimizer-0.2.0/wmo/ingest/quality.py +28 -0
  367. world_model_optimizer-0.2.0/wmo/ingest/quality_test.py +39 -0
  368. world_model_optimizer-0.2.0/wmo/ingest/stream.py +209 -0
  369. world_model_optimizer-0.2.0/wmo/ingest/stream_test.py +170 -0
  370. world_model_optimizer-0.2.0/wmo/ingest/testdata/sample_otlp.json +60 -0
  371. world_model_optimizer-0.2.0/wmo/ingest/testdata/sample_spans.jsonl +3 -0
  372. world_model_optimizer-0.2.0/wmo/optimize/__init__.py +25 -0
  373. world_model_optimizer-0.2.0/wmo/optimize/base.py +143 -0
  374. world_model_optimizer-0.2.0/wmo/optimize/base_test.py +111 -0
  375. world_model_optimizer-0.2.0/wmo/optimize/gepa.py +806 -0
  376. world_model_optimizer-0.2.0/wmo/optimize/gepa_test.py +661 -0
  377. world_model_optimizer-0.2.0/wmo/optimize/judge.py +262 -0
  378. world_model_optimizer-0.2.0/wmo/optimize/judge_quality.py +359 -0
  379. world_model_optimizer-0.2.0/wmo/optimize/judge_quality_test.py +119 -0
  380. world_model_optimizer-0.2.0/wmo/optimize/judge_test.py +274 -0
  381. world_model_optimizer-0.2.0/wmo/optimize/knn.py +468 -0
  382. world_model_optimizer-0.2.0/wmo/optimize/knn_test.py +547 -0
  383. world_model_optimizer-0.2.0/wmo/optimize/numeric.py +152 -0
  384. world_model_optimizer-0.2.0/wmo/optimize/numeric_test.py +138 -0
  385. world_model_optimizer-0.2.0/wmo/optimize/outcomes.py +103 -0
  386. world_model_optimizer-0.2.0/wmo/optimize/outcomes_test.py +77 -0
  387. world_model_optimizer-0.2.0/wmo/optimize/policy.py +669 -0
  388. world_model_optimizer-0.2.0/wmo/optimize/policy_test.py +612 -0
  389. world_model_optimizer-0.2.0/wmo/optimize/report.py +231 -0
  390. world_model_optimizer-0.2.0/wmo/optimize/report_test.py +213 -0
  391. world_model_optimizer-0.2.0/wmo/optimize/reward.py +129 -0
  392. world_model_optimizer-0.2.0/wmo/optimize/reward_test.py +96 -0
  393. world_model_optimizer-0.2.0/wmo/optimize/routing.py +373 -0
  394. world_model_optimizer-0.2.0/wmo/optimize/routing_test.py +296 -0
  395. world_model_optimizer-0.2.0/wmo/platform/__init__.py +6 -0
  396. world_model_optimizer-0.2.0/wmo/platform/auth.py +115 -0
  397. world_model_optimizer-0.2.0/wmo/platform/auth_test.py +78 -0
  398. world_model_optimizer-0.2.0/wmo/platform/client.py +551 -0
  399. world_model_optimizer-0.2.0/wmo/platform/client_test.py +496 -0
  400. world_model_optimizer-0.2.0/wmo/platform/credentials.py +126 -0
  401. world_model_optimizer-0.2.0/wmo/platform/credentials_test.py +111 -0
  402. world_model_optimizer-0.2.0/wmo/platform/transfer.py +158 -0
  403. world_model_optimizer-0.2.0/wmo/platform/transfer_test.py +102 -0
  404. world_model_optimizer-0.2.0/wmo/providers/__init__.py +40 -0
  405. world_model_optimizer-0.2.0/wmo/providers/_bedrock_chat.py +155 -0
  406. world_model_optimizer-0.2.0/wmo/providers/_bedrock_chat_test.py +95 -0
  407. world_model_optimizer-0.2.0/wmo/providers/_openai_common.py +182 -0
  408. world_model_optimizer-0.2.0/wmo/providers/_responses_common.py +472 -0
  409. world_model_optimizer-0.2.0/wmo/providers/_responses_common_test.py +435 -0
  410. world_model_optimizer-0.2.0/wmo/providers/anthropic.py +134 -0
  411. world_model_optimizer-0.2.0/wmo/providers/azure_openai.py +296 -0
  412. world_model_optimizer-0.2.0/wmo/providers/base.py +300 -0
  413. world_model_optimizer-0.2.0/wmo/providers/base_test.py +88 -0
  414. world_model_optimizer-0.2.0/wmo/providers/bedrock.py +312 -0
  415. world_model_optimizer-0.2.0/wmo/providers/bedrock_test.py +144 -0
  416. world_model_optimizer-0.2.0/wmo/providers/models.py +205 -0
  417. world_model_optimizer-0.2.0/wmo/providers/models_test.py +130 -0
  418. world_model_optimizer-0.2.0/wmo/providers/openai.py +143 -0
  419. world_model_optimizer-0.2.0/wmo/providers/openai_responses.py +240 -0
  420. world_model_optimizer-0.2.0/wmo/providers/openai_responses_test.py +295 -0
  421. world_model_optimizer-0.2.0/wmo/providers/pool.py +170 -0
  422. world_model_optimizer-0.2.0/wmo/providers/pool_test.py +219 -0
  423. world_model_optimizer-0.2.0/wmo/providers/registry.py +73 -0
  424. world_model_optimizer-0.2.0/wmo/providers/retry.py +151 -0
  425. world_model_optimizer-0.2.0/wmo/providers/retry_test.py +145 -0
  426. world_model_optimizer-0.2.0/wmo/providers/tests/_openai_common_test.py +112 -0
  427. world_model_optimizer-0.2.0/wmo/providers/tests/anthropic_test.py +108 -0
  428. world_model_optimizer-0.2.0/wmo/providers/tests/azure_openai_test.py +604 -0
  429. world_model_optimizer-0.2.0/wmo/providers/tests/bedrock_test.py +182 -0
  430. world_model_optimizer-0.2.0/wmo/providers/tests/openai_test.py +276 -0
  431. world_model_optimizer-0.2.0/wmo/providers/tests/registry_test.py +86 -0
  432. world_model_optimizer-0.2.0/wmo/providers/tests/streaming_test.py +320 -0
  433. world_model_optimizer-0.2.0/wmo/providers/tinker.py +936 -0
  434. world_model_optimizer-0.2.0/wmo/providers/tinker_test.py +1236 -0
  435. world_model_optimizer-0.2.0/wmo/providers/waterfall.py +336 -0
  436. world_model_optimizer-0.2.0/wmo/providers/waterfall_test.py +338 -0
  437. world_model_optimizer-0.2.0/wmo/repo_layout_test.py +230 -0
  438. world_model_optimizer-0.2.0/wmo/research/__init__.py +81 -0
  439. world_model_optimizer-0.2.0/wmo/research/ablation.py +133 -0
  440. world_model_optimizer-0.2.0/wmo/research/ablation_test.py +89 -0
  441. world_model_optimizer-0.2.0/wmo/research/concurrency_plot.py +523 -0
  442. world_model_optimizer-0.2.0/wmo/research/concurrency_plot_test.py +117 -0
  443. world_model_optimizer-0.2.0/wmo/research/concurrency_run.py +240 -0
  444. world_model_optimizer-0.2.0/wmo/research/concurrency_run_test.py +137 -0
  445. world_model_optimizer-0.2.0/wmo/research/concurrency_scaling.py +270 -0
  446. world_model_optimizer-0.2.0/wmo/research/concurrency_scaling_test.py +161 -0
  447. world_model_optimizer-0.2.0/wmo/research/gepa_scaling.py +274 -0
  448. world_model_optimizer-0.2.0/wmo/research/gepa_scaling_test.py +336 -0
  449. world_model_optimizer-0.2.0/wmo/research/pipeline.py +198 -0
  450. world_model_optimizer-0.2.0/wmo/research/pipeline_test.py +335 -0
  451. world_model_optimizer-0.2.0/wmo/research/scaling_split.py +82 -0
  452. world_model_optimizer-0.2.0/wmo/research/scaling_split_test.py +78 -0
  453. world_model_optimizer-0.2.0/wmo/research/scenario_fidelity.py +198 -0
  454. world_model_optimizer-0.2.0/wmo/research/scenario_fidelity_test.py +124 -0
  455. world_model_optimizer-0.2.0/wmo/research/scenario_recovery.py +92 -0
  456. world_model_optimizer-0.2.0/wmo/research/scenario_recovery_test.py +52 -0
  457. world_model_optimizer-0.2.0/wmo/research/seed_stability.py +90 -0
  458. world_model_optimizer-0.2.0/wmo/research/seed_stability_test.py +89 -0
  459. world_model_optimizer-0.2.0/wmo/research/trace_scaling.py +348 -0
  460. world_model_optimizer-0.2.0/wmo/research/trace_scaling_test.py +417 -0
  461. world_model_optimizer-0.2.0/wmo/retrieval/__init__.py +6 -0
  462. world_model_optimizer-0.2.0/wmo/retrieval/embedders.py +105 -0
  463. world_model_optimizer-0.2.0/wmo/retrieval/embedders_test.py +114 -0
  464. world_model_optimizer-0.2.0/wmo/retrieval/leakfree.py +52 -0
  465. world_model_optimizer-0.2.0/wmo/retrieval/leakfree_test.py +55 -0
  466. world_model_optimizer-0.2.0/wmo/retrieval/retriever.py +173 -0
  467. world_model_optimizer-0.2.0/wmo/retrieval/retriever_test.py +179 -0
  468. world_model_optimizer-0.2.0/wmo/scenarios/__init__.py +58 -0
  469. world_model_optimizer-0.2.0/wmo/scenarios/builder.py +152 -0
  470. world_model_optimizer-0.2.0/wmo/scenarios/builder_test.py +154 -0
  471. world_model_optimizer-0.2.0/wmo/scenarios/mining/__init__.py +27 -0
  472. world_model_optimizer-0.2.0/wmo/scenarios/mining/clustering.py +171 -0
  473. world_model_optimizer-0.2.0/wmo/scenarios/mining/clustering_test.py +77 -0
  474. world_model_optimizer-0.2.0/wmo/scenarios/mining/facets.py +226 -0
  475. world_model_optimizer-0.2.0/wmo/scenarios/mining/facets_test.py +136 -0
  476. world_model_optimizer-0.2.0/wmo/scenarios/mining/selection.py +220 -0
  477. world_model_optimizer-0.2.0/wmo/scenarios/mining/selection_test.py +95 -0
  478. world_model_optimizer-0.2.0/wmo/scenarios/synthesis/__init__.py +6 -0
  479. world_model_optimizer-0.2.0/wmo/scenarios/synthesis/scenario_set.py +63 -0
  480. world_model_optimizer-0.2.0/wmo/scenarios/synthesis/scenario_set_test.py +55 -0
  481. world_model_optimizer-0.2.0/wmo/scenarios/synthesis/synthesizer.py +85 -0
  482. world_model_optimizer-0.2.0/wmo/scenarios/synthesis/synthesizer_test.py +48 -0
  483. world_model_optimizer-0.2.0/wmo/scenarios/verification/__init__.py +17 -0
  484. world_model_optimizer-0.2.0/wmo/scenarios/verification/judge.py +97 -0
  485. world_model_optimizer-0.2.0/wmo/scenarios/verification/judge_test.py +66 -0
  486. world_model_optimizer-0.2.0/wmo/scenarios/verification/verify.py +135 -0
  487. world_model_optimizer-0.2.0/wmo/scenarios/verification/verify_test.py +201 -0
  488. world_model_optimizer-0.2.0/wmo/serving/__init__.py +5 -0
  489. world_model_optimizer-0.2.0/wmo/serving/builds.py +451 -0
  490. world_model_optimizer-0.2.0/wmo/serving/builds_test.py +339 -0
  491. world_model_optimizer-0.2.0/wmo/serving/chat.py +878 -0
  492. world_model_optimizer-0.2.0/wmo/serving/chat_openai_client_test.py +212 -0
  493. world_model_optimizer-0.2.0/wmo/serving/chat_test.py +936 -0
  494. world_model_optimizer-0.2.0/wmo/serving/endpoint_config.py +64 -0
  495. world_model_optimizer-0.2.0/wmo/serving/endpoint_config_test.py +65 -0
  496. world_model_optimizer-0.2.0/wmo/serving/savings.py +250 -0
  497. world_model_optimizer-0.2.0/wmo/serving/savings_test.py +270 -0
  498. world_model_optimizer-0.2.0/wmo/serving/server.py +553 -0
  499. world_model_optimizer-0.2.0/wmo/serving/server_test.py +466 -0
  500. world_model_optimizer-0.2.0/wmo/serving/traces_source.py +206 -0
  501. world_model_optimizer-0.2.0/wmo/serving/traces_source_test.py +133 -0
  502. world_model_optimizer-0.2.0/wmo/telemetry.py +213 -0
  503. world_model_optimizer-0.2.0/wmo/telemetry_test.py +121 -0
  504. world_model_optimizer-0.2.0/wmo/tracking/__init__.py +36 -0
  505. world_model_optimizer-0.2.0/wmo/tracking/clock.py +24 -0
  506. world_model_optimizer-0.2.0/wmo/tracking/metered.py +125 -0
  507. world_model_optimizer-0.2.0/wmo/tracking/metered_test.py +130 -0
  508. world_model_optimizer-0.2.0/wmo/tracking/pricing.py +99 -0
  509. world_model_optimizer-0.2.0/wmo/tracking/pricing_test.py +60 -0
  510. world_model_optimizer-0.2.0/wmo/tracking/store.py +31 -0
  511. world_model_optimizer-0.2.0/wmo/tracking/store_test.py +41 -0
  512. world_model_optimizer-0.2.0/wmo/tracking/tracker.py +149 -0
  513. world_model_optimizer-0.2.0/wmo/tracking/tracker_test.py +83 -0
@@ -0,0 +1,47 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ .venv/
4
+ .env
5
+ .env.*
6
+ !.env.example
7
+ .wmo/
8
+ dist/
9
+ *.egg-info/
10
+ .pytest_cache/
11
+ .ruff_cache/
12
+ .mypy_cache/
13
+ .ty_cache/
14
+ .DS_Store
15
+
16
+ # Local-only design notes; not committed.
17
+ DESIGN.md
18
+
19
+ demos/
20
+
21
+ # baseline-grid run scratch (not artifacts)
22
+ .wmo-rebuild/
23
+ logs/
24
+
25
+ .wmo-fixed/
26
+
27
+ # dev-run artifacts of the RL arms (official rows are committed deliberately under results/)
28
+ examples/tau-bench/rl/*.results.jsonl
29
+ examples/tau-bench/rl/icl_memory.jsonl
30
+
31
+ # Local per-project settings (telemetry ids etc.) — never committed, wherever the root is.
32
+ settings.toml
33
+
34
+ # Claude Code local state (skills ARE committed; local settings/locks are not).
35
+ .claude/settings.local.json
36
+ .claude/scheduled_tasks.lock
37
+ .claude/projects/
38
+
39
+ # Raw experiment data artifacts of the distill/ablation program are NOT committed — they live
40
+ # in the Notion experiments area (Research page) with a SHA-256 manifest. Analysis prose (.md)
41
+ # stays in git, as do small result JSONs elsewhere under research/ (e.g. trace_scaling_results).
42
+ .agents/docs/research/distill/*.json
43
+ .agents/docs/research/distill/*.jsonl
44
+ .agents/docs/research/distill/*.html
45
+
46
+ # wandb run directories (local mirrors of what is already on the server)
47
+ wandb/
@@ -0,0 +1,203 @@
1
+ Metadata-Version: 2.4
2
+ Name: world-model-optimizer
3
+ Version: 0.2.0
4
+ Summary: Run agents, build world models from traces, and optimize agent harnesses.
5
+ Requires-Python: >=3.12
6
+ Requires-Dist: anthropic>=0.39
7
+ Requires-Dist: boto3>=1.34
8
+ Requires-Dist: click>=8.2
9
+ Requires-Dist: environment-capture
10
+ Requires-Dist: fastapi>=0.128
11
+ Requires-Dist: gepa>=0.1.1
12
+ Requires-Dist: httpx>=0.27
13
+ Requires-Dist: numpy>=1.26
14
+ Requires-Dist: openai>=1.40
15
+ Requires-Dist: posthog>=7.0
16
+ Requires-Dist: pydantic>=2.6
17
+ Requires-Dist: python-multipart>=0.0.9
18
+ Requires-Dist: rich>=14.1
19
+ Requires-Dist: scikit-learn>=1.4
20
+ Requires-Dist: tomli-w>=1.0
21
+ Requires-Dist: typer>=0.16
22
+ Requires-Dist: uvicorn>=0.38
23
+ Provides-Extra: connectors
24
+ Requires-Dist: mcp>=1.27; extra == 'connectors'
25
+ Provides-Extra: dev
26
+ Requires-Dist: e2b==2.31.0; extra == 'dev'
27
+ Requires-Dist: harbor==0.20.0; extra == 'dev'
28
+ Requires-Dist: matplotlib>=3.8; extra == 'dev'
29
+ Requires-Dist: mcp>=1.27; extra == 'dev'
30
+ Requires-Dist: opentelemetry-proto>=1.24; extra == 'dev'
31
+ Requires-Dist: pandas>=2.0; extra == 'dev'
32
+ Requires-Dist: psycopg[binary]>=3.1; extra == 'dev'
33
+ Requires-Dist: pytest>=8.0; extra == 'dev'
34
+ Requires-Dist: ruff>=0.5; extra == 'dev'
35
+ Requires-Dist: seaborn>=0.13; extra == 'dev'
36
+ Requires-Dist: tinker-cookbook<0.5,>=0.4.3; extra == 'dev'
37
+ Requires-Dist: tinker<0.24,>=0.23; extra == 'dev'
38
+ Requires-Dist: ty>=0.0.1a1; extra == 'dev'
39
+ Requires-Dist: wandb>=0.17; extra == 'dev'
40
+ Provides-Extra: distill
41
+ Requires-Dist: tinker-cookbook<0.5,>=0.4.3; extra == 'distill'
42
+ Requires-Dist: tinker<0.24,>=0.23; extra == 'distill'
43
+ Requires-Dist: wandb>=0.17; extra == 'distill'
44
+ Provides-Extra: e2b
45
+ Requires-Dist: e2b==2.31.0; extra == 'e2b'
46
+ Provides-Extra: harbor
47
+ Requires-Dist: harbor==0.20.0; extra == 'harbor'
48
+ Provides-Extra: otel
49
+ Requires-Dist: opentelemetry-proto>=1.24; extra == 'otel'
50
+ Provides-Extra: postgres
51
+ Requires-Dist: psycopg[binary]>=3.1; extra == 'postgres'
52
+ Provides-Extra: viz
53
+ Requires-Dist: matplotlib>=3.8; extra == 'viz'
54
+ Requires-Dist: pandas>=2.0; extra == 'viz'
55
+ Requires-Dist: seaborn>=0.13; extra == 'viz'
56
+ Description-Content-Type: text/markdown
57
+
58
+ # World Model Optimizer
59
+
60
+ `wmo` is an open-source project for running and building continuously improving agents. It
61
+ includes a flexible agent runtime, a world model that simulates tool calls, and an optimizer that
62
+ builds task-specific harnesses for stronger performance at lower cost.
63
+
64
+ ![World model, runtime agent, and optimizer connected in a continuous improvement loop](assets/world-model-agent-loop.svg)
65
+
66
+ <p align="center">
67
+ 🌐 <a href="https://platform.experientiallabs.ai">Platform</a> |
68
+ 📚 <a href="https://github.com/experientiallabs/world-model-optimizer/tree/main/docs">Docs</a> |
69
+ <a href="https://discord.gg/QwjJpEyHd"><img src="https://cdn.simpleicons.org/discord/5865F2" alt="" width="16" height="16"> Discord</a>
70
+ </p>
71
+
72
+ ## Getting started
73
+
74
+ ### Local setup
75
+
76
+ Install WMO, choose the model provider for the built-in runtime agent, and start a local run:
77
+
78
+ ```bash
79
+ pip install world-model-optimizer
80
+ wmo providers set
81
+ wmo run --task "Inspect this repository and explain it"
82
+ ```
83
+
84
+ Build a named world model from collected traces:
85
+
86
+ ```bash
87
+ wmo build --file traces.jsonl --name my-environment
88
+ ```
89
+
90
+ Then optimize an agent harness against that model and a set of tasks:
91
+
92
+ ```bash
93
+ wmo optimize harness my-agent my-environment --tasks tasks.jsonl
94
+ ```
95
+
96
+ ### Hosted platform
97
+
98
+ Create an account at [platform.experientiallabs.ai](https://platform.experientiallabs.ai), then
99
+ authenticate the CLI:
100
+
101
+ ```bash
102
+ wmo login
103
+ ```
104
+
105
+ Copy an agent ID from the platform and run its current champion harness:
106
+
107
+ ```bash
108
+ wmo run <agent-id>
109
+ ```
110
+
111
+ ### E2B backend
112
+
113
+ Hosted agents already run in platform-managed E2B sandboxes. To evaluate a local optimization in
114
+ E2B, install the extra and provide an E2B key:
115
+
116
+ ```bash
117
+ pip install "world-model-optimizer[e2b]"
118
+ export E2B_API_KEY=...
119
+ wmo optimize harness my-agent my-environment --tasks tasks.jsonl --backend e2b
120
+ ```
121
+
122
+ ## Use a world model as an API
123
+
124
+ ```python
125
+ from wmo import Action, ActionKind
126
+ from wmo.config.store import WorldModelStore
127
+ from wmo.engine.loader import load_world_model
128
+
129
+ model_dir = WorldModelStore(".wmo").resolve("airline")
130
+ wm, _provider = load_world_model(model_dir)
131
+
132
+ session = wm.new_session(task="check out the cart")
133
+ obs = wm.step(session.id, Action(kind=ActionKind.TOOL_CALL, name="add_to_cart",
134
+ arguments={"sku": "A1"}))
135
+ print(obs.content)
136
+ ```
137
+
138
+ Or over HTTP (same code path), namespaced by model name: `GET /world_models`, then `POST /world_models/{name}/sessions` and `POST /world_models/{name}/sessions/{id}/step`.
139
+
140
+ ## Run after platform login
141
+
142
+ After `wmo login`, the same `wmo run` command can open a hosted world model or run an agent's
143
+ current champion harness in E2B. The platform manages model and sandbox credentials, so hosted
144
+ runs do not need local API keys.
145
+
146
+ ```bash
147
+ wmo login
148
+ wmo run <world-model-or-agent-id>
149
+ wmo run <agent-id> -u . --task "fix the failing tests"
150
+ ```
151
+
152
+ Workspace upload is opt-in with `-u`: WMO live-syncs changes and preserves concurrent local edits.
153
+ Long-running agents can detach, continue in the platform, and be messaged or reattached later.
154
+
155
+ ```bash
156
+ wmo run <agent-id> -u . --detach
157
+ wmo run --send "Now run the full test suite"
158
+ wmo run --attach
159
+ wmo run --end
160
+ ```
161
+
162
+ ## Runtime agents and optimizers in E2B sandboxes
163
+
164
+ WMO can run the real [pi](https://github.com/earendil-works/pi) worker inside isolated
165
+ [E2B](https://e2b.dev) sandboxes while the world model supplies the environment. Optimization and
166
+ evaluation rollouts run in parallel, and model credentials stay outside the sandbox.
167
+
168
+ ```bash
169
+ wmo optimize harness my-agent my-environment --tasks tasks.jsonl --backend e2b
170
+ wmo eval tasks.jsonl --mode closed-loop --harness my-agent --harness-backend e2b
171
+ ```
172
+
173
+ The optimizer can change prompts, tools, policies, skills, and runtime code. Every candidate is
174
+ measured against the same simulated tasks, and only changes that pass the evaluation gates become
175
+ the new versioned champion harness.
176
+
177
+ ## Development
178
+
179
+ Managed with [uv](https://docs.astral.sh/uv/); linting/formatting with [ruff](https://docs.astral.sh/ruff/); type checking with [ty](https://github.com/astral-sh/ty). Conventions live in [AGENTS.md](./AGENTS.md).
180
+
181
+ ```bash
182
+ uv sync --extra dev # env + dev tools
183
+ uv run ruff check . # lint
184
+ uv run ruff format . # format
185
+ uv run ty check # type check
186
+ uv run pytest -q # tests
187
+ ```
188
+
189
+ ## Usage telemetry
190
+
191
+ `wmo` uses anonymous usage telemetry to track the volume of usage.
192
+ Telemetry is strictly metadata. It never includes prompts, traces, actions, observations, file paths,
193
+ model names, provider credentials, or raw user content.
194
+
195
+ Telemetry is enabled by default. To opt out for a project:
196
+
197
+ ```bash
198
+ uv run wmo config telemetry disable
199
+ ```
200
+
201
+ This writes `.wmo/settings.toml`. You can re-enable it with `uv run wmo config telemetry enable`,
202
+ check the current setting with `uv run wmo config telemetry status`, or disable it for a process
203
+ with `DO_NOT_TRACK=1` or `WMO_TELEMETRY=0`.
@@ -0,0 +1,146 @@
1
+ # World Model Optimizer
2
+
3
+ `wmo` is an open-source project for running and building continuously improving agents. It
4
+ includes a flexible agent runtime, a world model that simulates tool calls, and an optimizer that
5
+ builds task-specific harnesses for stronger performance at lower cost.
6
+
7
+ ![World model, runtime agent, and optimizer connected in a continuous improvement loop](assets/world-model-agent-loop.svg)
8
+
9
+ <p align="center">
10
+ 🌐 <a href="https://platform.experientiallabs.ai">Platform</a> |
11
+ 📚 <a href="https://github.com/experientiallabs/world-model-optimizer/tree/main/docs">Docs</a> |
12
+ <a href="https://discord.gg/QwjJpEyHd"><img src="https://cdn.simpleicons.org/discord/5865F2" alt="" width="16" height="16"> Discord</a>
13
+ </p>
14
+
15
+ ## Getting started
16
+
17
+ ### Local setup
18
+
19
+ Install WMO, choose the model provider for the built-in runtime agent, and start a local run:
20
+
21
+ ```bash
22
+ pip install world-model-optimizer
23
+ wmo providers set
24
+ wmo run --task "Inspect this repository and explain it"
25
+ ```
26
+
27
+ Build a named world model from collected traces:
28
+
29
+ ```bash
30
+ wmo build --file traces.jsonl --name my-environment
31
+ ```
32
+
33
+ Then optimize an agent harness against that model and a set of tasks:
34
+
35
+ ```bash
36
+ wmo optimize harness my-agent my-environment --tasks tasks.jsonl
37
+ ```
38
+
39
+ ### Hosted platform
40
+
41
+ Create an account at [platform.experientiallabs.ai](https://platform.experientiallabs.ai), then
42
+ authenticate the CLI:
43
+
44
+ ```bash
45
+ wmo login
46
+ ```
47
+
48
+ Copy an agent ID from the platform and run its current champion harness:
49
+
50
+ ```bash
51
+ wmo run <agent-id>
52
+ ```
53
+
54
+ ### E2B backend
55
+
56
+ Hosted agents already run in platform-managed E2B sandboxes. To evaluate a local optimization in
57
+ E2B, install the extra and provide an E2B key:
58
+
59
+ ```bash
60
+ pip install "world-model-optimizer[e2b]"
61
+ export E2B_API_KEY=...
62
+ wmo optimize harness my-agent my-environment --tasks tasks.jsonl --backend e2b
63
+ ```
64
+
65
+ ## Use a world model as an API
66
+
67
+ ```python
68
+ from wmo import Action, ActionKind
69
+ from wmo.config.store import WorldModelStore
70
+ from wmo.engine.loader import load_world_model
71
+
72
+ model_dir = WorldModelStore(".wmo").resolve("airline")
73
+ wm, _provider = load_world_model(model_dir)
74
+
75
+ session = wm.new_session(task="check out the cart")
76
+ obs = wm.step(session.id, Action(kind=ActionKind.TOOL_CALL, name="add_to_cart",
77
+ arguments={"sku": "A1"}))
78
+ print(obs.content)
79
+ ```
80
+
81
+ Or over HTTP (same code path), namespaced by model name: `GET /world_models`, then `POST /world_models/{name}/sessions` and `POST /world_models/{name}/sessions/{id}/step`.
82
+
83
+ ## Run after platform login
84
+
85
+ After `wmo login`, the same `wmo run` command can open a hosted world model or run an agent's
86
+ current champion harness in E2B. The platform manages model and sandbox credentials, so hosted
87
+ runs do not need local API keys.
88
+
89
+ ```bash
90
+ wmo login
91
+ wmo run <world-model-or-agent-id>
92
+ wmo run <agent-id> -u . --task "fix the failing tests"
93
+ ```
94
+
95
+ Workspace upload is opt-in with `-u`: WMO live-syncs changes and preserves concurrent local edits.
96
+ Long-running agents can detach, continue in the platform, and be messaged or reattached later.
97
+
98
+ ```bash
99
+ wmo run <agent-id> -u . --detach
100
+ wmo run --send "Now run the full test suite"
101
+ wmo run --attach
102
+ wmo run --end
103
+ ```
104
+
105
+ ## Runtime agents and optimizers in E2B sandboxes
106
+
107
+ WMO can run the real [pi](https://github.com/earendil-works/pi) worker inside isolated
108
+ [E2B](https://e2b.dev) sandboxes while the world model supplies the environment. Optimization and
109
+ evaluation rollouts run in parallel, and model credentials stay outside the sandbox.
110
+
111
+ ```bash
112
+ wmo optimize harness my-agent my-environment --tasks tasks.jsonl --backend e2b
113
+ wmo eval tasks.jsonl --mode closed-loop --harness my-agent --harness-backend e2b
114
+ ```
115
+
116
+ The optimizer can change prompts, tools, policies, skills, and runtime code. Every candidate is
117
+ measured against the same simulated tasks, and only changes that pass the evaluation gates become
118
+ the new versioned champion harness.
119
+
120
+ ## Development
121
+
122
+ Managed with [uv](https://docs.astral.sh/uv/); linting/formatting with [ruff](https://docs.astral.sh/ruff/); type checking with [ty](https://github.com/astral-sh/ty). Conventions live in [AGENTS.md](./AGENTS.md).
123
+
124
+ ```bash
125
+ uv sync --extra dev # env + dev tools
126
+ uv run ruff check . # lint
127
+ uv run ruff format . # format
128
+ uv run ty check # type check
129
+ uv run pytest -q # tests
130
+ ```
131
+
132
+ ## Usage telemetry
133
+
134
+ `wmo` uses anonymous usage telemetry to track the volume of usage.
135
+ Telemetry is strictly metadata. It never includes prompts, traces, actions, observations, file paths,
136
+ model names, provider credentials, or raw user content.
137
+
138
+ Telemetry is enabled by default. To opt out for a project:
139
+
140
+ ```bash
141
+ uv run wmo config telemetry disable
142
+ ```
143
+
144
+ This writes `.wmo/settings.toml`. You can re-enable it with `uv run wmo config telemetry enable`,
145
+ check the current setting with `uv run wmo config telemetry status`, or disable it for a process
146
+ with `DO_NOT_TRACK=1` or `WMO_TELEMETRY=0`.
@@ -0,0 +1,11 @@
1
+ """Repo-wide pytest configuration."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+
7
+ # Rich consoles snapshot color support when constructed, and `wmo.cli.app` builds its console at
8
+ # import time — so color-forcing vars must go before any test module imports it, or a dev shell
9
+ # exporting FORCE_COLOR would inject ANSI codes into CliRunner captures and fail assertions.
10
+ os.environ.pop("FORCE_COLOR", None)
11
+ os.environ.pop("CLICOLOR_FORCE", None)
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Experiential Labs
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,53 @@
1
+ """llm-waterfall: stateless LLM failover across an ordered chain of backends.
2
+
3
+ Capacity errors (throttling, transient 5xx, timeouts) spill to the next backend; real client
4
+ errors raise immediately. Every call returns which backend served it, token usage, USD cost, and
5
+ the full attempt trail.
6
+ """
7
+
8
+ from llm_waterfall.classify import is_capacity_error, outcome_for
9
+ from llm_waterfall.pricing import ModelPrice, cost_usd, price_for
10
+ from llm_waterfall.types import (
11
+ Attempt,
12
+ Backend,
13
+ ChatMaxTokensField,
14
+ ChatRequest,
15
+ ChatResponse,
16
+ ChatResult,
17
+ CompletionResult,
18
+ EmbeddingResult,
19
+ EmbeddingsUnsupported,
20
+ Message,
21
+ RetryPolicy,
22
+ TokenUsage,
23
+ ToolCallingUnsupported,
24
+ VerifyResult,
25
+ WaterfallExhausted,
26
+ )
27
+ from llm_waterfall.waterfall import Waterfall
28
+
29
+ __version__ = "0.1.4"
30
+
31
+ __all__ = [
32
+ "Attempt",
33
+ "Backend",
34
+ "ChatMaxTokensField",
35
+ "ChatRequest",
36
+ "ChatResponse",
37
+ "ChatResult",
38
+ "CompletionResult",
39
+ "EmbeddingResult",
40
+ "EmbeddingsUnsupported",
41
+ "Message",
42
+ "ModelPrice",
43
+ "RetryPolicy",
44
+ "TokenUsage",
45
+ "ToolCallingUnsupported",
46
+ "VerifyResult",
47
+ "Waterfall",
48
+ "WaterfallExhausted",
49
+ "cost_usd",
50
+ "is_capacity_error",
51
+ "outcome_for",
52
+ "price_for",
53
+ ]
@@ -0,0 +1,36 @@
1
+ """Adapter registry: map a Backend's provider name to its adapter class.
2
+
3
+ Adapter modules import at module scope (they gate their SDK imports internally, so this package
4
+ imports with zero SDKs installed); only the SDKs themselves are lazy.
5
+ """
6
+
7
+ from __future__ import annotations
8
+
9
+ from collections.abc import Callable
10
+
11
+ from llm_waterfall.adapters.anthropic import AnthropicAdapter
12
+ from llm_waterfall.adapters.aws_mantle import AwsMantleAdapter
13
+ from llm_waterfall.adapters.azure_openai import AzureOpenAIAdapter
14
+ from llm_waterfall.adapters.base import Adapter
15
+ from llm_waterfall.adapters.bedrock import BedrockAdapter
16
+ from llm_waterfall.adapters.openai import OpenAIAdapter
17
+ from llm_waterfall.types import PROVIDERS, Backend
18
+
19
+ _ADAPTERS: dict[str, Callable[[Backend], Adapter]] = {
20
+ "bedrock": BedrockAdapter,
21
+ "openai": OpenAIAdapter,
22
+ "anthropic": AnthropicAdapter,
23
+ "azure_openai": AzureOpenAIAdapter, # real; construction validates endpoint/api_version
24
+ "aws_mantle": AwsMantleAdapter, # stub: raises NotImplementedError at construction
25
+ }
26
+
27
+
28
+ def build_adapter(backend: Backend) -> Adapter:
29
+ """Construct the adapter for `backend`. Unimplemented providers fail here, fast."""
30
+ try:
31
+ factory = _ADAPTERS[backend.provider]
32
+ except KeyError:
33
+ raise ValueError(
34
+ f"unknown provider {backend.provider!r}; expected one of {', '.join(PROVIDERS)}"
35
+ ) from None
36
+ return factory(backend)
@@ -0,0 +1,105 @@
1
+ """Anthropic direct-API adapter. Reads ANTHROPIC_API_KEY from the environment."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import threading
6
+ from typing import TYPE_CHECKING, cast
7
+
8
+ from llm_waterfall.adapters.base import missing_sdk_error
9
+ from llm_waterfall.types import (
10
+ Backend,
11
+ ChatRequest,
12
+ ChatResponse,
13
+ EmbeddingsUnsupported,
14
+ Message,
15
+ TokenUsage,
16
+ ToolCallingUnsupported,
17
+ )
18
+
19
+ if TYPE_CHECKING:
20
+ from anthropic import Anthropic
21
+ from anthropic.types import MessageParam
22
+
23
+
24
+ class AnthropicAdapter:
25
+ """Claude via the direct Anthropic Messages API."""
26
+
27
+ def __init__(self, backend: Backend) -> None:
28
+ self.backend = backend
29
+ self._client: Anthropic | None = None
30
+ self._lock = threading.Lock()
31
+
32
+ def _get_client(self) -> Anthropic:
33
+ if self._client is None:
34
+ with self._lock:
35
+ if self._client is None:
36
+ try:
37
+ import httpx
38
+ from anthropic import Anthropic
39
+ except ModuleNotFoundError as exc:
40
+ raise missing_sdk_error("anthropic", "anthropic") from exc
41
+
42
+ # max_retries=0: the waterfall owns retry policy. Granular httpx.Timeout so
43
+ # a dead endpoint fails over after connect_timeout_s, not read_timeout_s.
44
+ self._client = Anthropic(
45
+ max_retries=0,
46
+ timeout=httpx.Timeout(
47
+ self.backend.read_timeout_s,
48
+ connect=self.backend.connect_timeout_s,
49
+ ),
50
+ )
51
+ return self._client
52
+
53
+ def complete(
54
+ self,
55
+ system: str,
56
+ messages: list[Message],
57
+ *,
58
+ temperature: float | None,
59
+ max_tokens: int,
60
+ ) -> tuple[str, TokenUsage]:
61
+ """One Messages API call; system is a top-level arg (Anthropic-native)."""
62
+ api_messages = [
63
+ cast("MessageParam", {"role": m.role, "content": m.content}) for m in messages
64
+ ]
65
+ client_messages = self._get_client().messages
66
+ # Claude 4.7+ rejects sampling params; only forward temperature when explicitly set.
67
+ if temperature is None:
68
+ response = client_messages.create(
69
+ model=self.backend.model,
70
+ system=system,
71
+ messages=api_messages,
72
+ max_tokens=max_tokens,
73
+ )
74
+ else:
75
+ response = client_messages.create(
76
+ model=self.backend.model,
77
+ system=system,
78
+ messages=api_messages,
79
+ max_tokens=max_tokens,
80
+ temperature=temperature,
81
+ )
82
+ text = "".join(block.text for block in response.content if block.type == "text")
83
+ usage = TokenUsage(
84
+ input_tokens=response.usage.input_tokens,
85
+ output_tokens=response.usage.output_tokens,
86
+ )
87
+ return text, usage
88
+
89
+ def complete_chat(self, request: ChatRequest) -> ChatResponse:
90
+ """Direct Anthropic structured mapping is not implemented yet."""
91
+ del request
92
+ raise ToolCallingUnsupported(
93
+ "the anthropic adapter does not yet map OpenAI-compatible tool calls; "
94
+ "put an openai, azure_openai, or bedrock backend in the chain"
95
+ )
96
+
97
+ def embed_model_id(self) -> str | None:
98
+ """Anthropic has no embeddings API."""
99
+ return None
100
+
101
+ def embed(self, texts: list[str]) -> tuple[list[list[float]], TokenUsage]:
102
+ raise EmbeddingsUnsupported(
103
+ "Anthropic has no embeddings API; put a bedrock or openai backend in the chain "
104
+ "for embeddings (the waterfall skips this backend for embed calls)."
105
+ )