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.
- world_model_optimizer-0.2.0/.gitignore +47 -0
- world_model_optimizer-0.2.0/PKG-INFO +203 -0
- world_model_optimizer-0.2.0/README.md +146 -0
- world_model_optimizer-0.2.0/conftest.py +11 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/LICENSE +21 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/__init__.py +53 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/__init__.py +36 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/anthropic.py +105 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/anthropic_test.py +70 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/aws_mantle.py +47 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/azure_openai.py +71 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/azure_openai_test.py +133 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/base.py +51 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/bedrock.py +309 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/bedrock_test.py +165 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/openai.py +130 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/adapters/openai_test.py +96 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/classify.py +184 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/classify_test.py +266 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/import_hygiene_test.py +50 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/pricing.py +110 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/pricing_test.py +60 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/py.typed +0 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/types.py +295 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/types_test.py +123 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/waterfall.py +255 -0
- world_model_optimizer-0.2.0/packages/llm-waterfall/llm_waterfall/waterfall_test.py +315 -0
- world_model_optimizer-0.2.0/pyproject.toml +166 -0
- world_model_optimizer-0.2.0/wmo/__init__.py +38 -0
- world_model_optimizer-0.2.0/wmo/agents/__init__.py +7 -0
- world_model_optimizer-0.2.0/wmo/agents/default.py +29 -0
- world_model_optimizer-0.2.0/wmo/agents/definitions_test.py +37 -0
- world_model_optimizer-0.2.0/wmo/agents/meta.py +55 -0
- world_model_optimizer-0.2.0/wmo/agents/optimizer.py +55 -0
- world_model_optimizer-0.2.0/wmo/agents/optimizer_test.py +14 -0
- world_model_optimizer-0.2.0/wmo/agents/project.py +928 -0
- world_model_optimizer-0.2.0/wmo/agents/project_test.py +1468 -0
- world_model_optimizer-0.2.0/wmo/api_test.py +12 -0
- world_model_optimizer-0.2.0/wmo/cli/__init__.py +5 -0
- world_model_optimizer-0.2.0/wmo/cli/agent_session.py +1123 -0
- world_model_optimizer-0.2.0/wmo/cli/agent_session_test.py +1312 -0
- world_model_optimizer-0.2.0/wmo/cli/app.py +2489 -0
- world_model_optimizer-0.2.0/wmo/cli/app_test.py +1070 -0
- world_model_optimizer-0.2.0/wmo/cli/e2b_cmds.py +212 -0
- world_model_optimizer-0.2.0/wmo/cli/e2b_cmds_test.py +245 -0
- world_model_optimizer-0.2.0/wmo/cli/eval_closed_loop.py +207 -0
- world_model_optimizer-0.2.0/wmo/cli/eval_closed_loop_test.py +320 -0
- world_model_optimizer-0.2.0/wmo/cli/harness_app.py +1147 -0
- world_model_optimizer-0.2.0/wmo/cli/harness_app_test.py +1057 -0
- world_model_optimizer-0.2.0/wmo/cli/harness_distill.py +659 -0
- world_model_optimizer-0.2.0/wmo/cli/harness_distill_test.py +888 -0
- world_model_optimizer-0.2.0/wmo/cli/hosted_session.py +880 -0
- world_model_optimizer-0.2.0/wmo/cli/hosted_session_test.py +1382 -0
- world_model_optimizer-0.2.0/wmo/cli/ingest_cmd.py +165 -0
- world_model_optimizer-0.2.0/wmo/cli/ingest_cmd_test.py +98 -0
- world_model_optimizer-0.2.0/wmo/cli/model_roles.py +82 -0
- world_model_optimizer-0.2.0/wmo/cli/model_roles_test.py +189 -0
- world_model_optimizer-0.2.0/wmo/cli/platform_cmds.py +372 -0
- world_model_optimizer-0.2.0/wmo/cli/platform_cmds_test.py +265 -0
- world_model_optimizer-0.2.0/wmo/cli/route_app.py +274 -0
- world_model_optimizer-0.2.0/wmo/cli/route_app_test.py +319 -0
- world_model_optimizer-0.2.0/wmo/cli/session_state.py +243 -0
- world_model_optimizer-0.2.0/wmo/cli/session_state_test.py +217 -0
- world_model_optimizer-0.2.0/wmo/cli/ui.py +1107 -0
- world_model_optimizer-0.2.0/wmo/cli/ui_test.py +734 -0
- world_model_optimizer-0.2.0/wmo/cli/workspace_sync.py +504 -0
- world_model_optimizer-0.2.0/wmo/cli/workspace_sync_test.py +276 -0
- world_model_optimizer-0.2.0/wmo/config/__init__.py +60 -0
- world_model_optimizer-0.2.0/wmo/config/card.py +129 -0
- world_model_optimizer-0.2.0/wmo/config/card_test.py +58 -0
- world_model_optimizer-0.2.0/wmo/config/config.py +367 -0
- world_model_optimizer-0.2.0/wmo/config/config_test.py +242 -0
- world_model_optimizer-0.2.0/wmo/config/dotenv.py +67 -0
- world_model_optimizer-0.2.0/wmo/config/dotenv_test.py +60 -0
- world_model_optimizer-0.2.0/wmo/config/settings.py +128 -0
- world_model_optimizer-0.2.0/wmo/config/settings_test.py +142 -0
- world_model_optimizer-0.2.0/wmo/config/store.py +177 -0
- world_model_optimizer-0.2.0/wmo/config/store_test.py +84 -0
- world_model_optimizer-0.2.0/wmo/conftest.py +19 -0
- world_model_optimizer-0.2.0/wmo/connect/__init__.py +88 -0
- world_model_optimizer-0.2.0/wmo/connect/api_test.py +53 -0
- world_model_optimizer-0.2.0/wmo/connect/apps.py +78 -0
- world_model_optimizer-0.2.0/wmo/connect/apps_test.py +67 -0
- world_model_optimizer-0.2.0/wmo/connect/brave.py +284 -0
- world_model_optimizer-0.2.0/wmo/connect/brave_test.py +375 -0
- world_model_optimizer-0.2.0/wmo/connect/connector.py +79 -0
- world_model_optimizer-0.2.0/wmo/connect/connector_test.py +78 -0
- world_model_optimizer-0.2.0/wmo/connect/credentials.py +164 -0
- world_model_optimizer-0.2.0/wmo/connect/credentials_test.py +165 -0
- world_model_optimizer-0.2.0/wmo/connect/github.py +321 -0
- world_model_optimizer-0.2.0/wmo/connect/github_test.py +325 -0
- world_model_optimizer-0.2.0/wmo/connect/google.py +627 -0
- world_model_optimizer-0.2.0/wmo/connect/google_test.py +668 -0
- world_model_optimizer-0.2.0/wmo/connect/notion.py +790 -0
- world_model_optimizer-0.2.0/wmo/connect/notion_test.py +693 -0
- world_model_optimizer-0.2.0/wmo/connect/oauth.py +461 -0
- world_model_optimizer-0.2.0/wmo/connect/oauth_test.py +376 -0
- world_model_optimizer-0.2.0/wmo/connect/slack.py +555 -0
- world_model_optimizer-0.2.0/wmo/connect/slack_test.py +592 -0
- world_model_optimizer-0.2.0/wmo/connect/store.py +199 -0
- world_model_optimizer-0.2.0/wmo/connect/store_test.py +127 -0
- world_model_optimizer-0.2.0/wmo/connect/types.py +156 -0
- world_model_optimizer-0.2.0/wmo/connect/types_test.py +73 -0
- world_model_optimizer-0.2.0/wmo/core/__init__.py +21 -0
- world_model_optimizer-0.2.0/wmo/core/parsing.py +281 -0
- world_model_optimizer-0.2.0/wmo/core/parsing_test.py +207 -0
- world_model_optimizer-0.2.0/wmo/core/render.py +271 -0
- world_model_optimizer-0.2.0/wmo/core/render_test.py +212 -0
- world_model_optimizer-0.2.0/wmo/core/text.py +40 -0
- world_model_optimizer-0.2.0/wmo/core/types.py +116 -0
- world_model_optimizer-0.2.0/wmo/core/types_test.py +15 -0
- world_model_optimizer-0.2.0/wmo/distill/__init__.py +14 -0
- world_model_optimizer-0.2.0/wmo/distill/agents.py +140 -0
- world_model_optimizer-0.2.0/wmo/distill/agents_test.py +199 -0
- world_model_optimizer-0.2.0/wmo/distill/config.py +1006 -0
- world_model_optimizer-0.2.0/wmo/distill/config_test.py +976 -0
- world_model_optimizer-0.2.0/wmo/distill/cost.py +437 -0
- world_model_optimizer-0.2.0/wmo/distill/cost_test.py +421 -0
- world_model_optimizer-0.2.0/wmo/distill/data.py +921 -0
- world_model_optimizer-0.2.0/wmo/distill/data_test.py +1779 -0
- world_model_optimizer-0.2.0/wmo/distill/deadlines.py +254 -0
- world_model_optimizer-0.2.0/wmo/distill/deadlines_test.py +168 -0
- world_model_optimizer-0.2.0/wmo/distill/fake_tinker.py +734 -0
- world_model_optimizer-0.2.0/wmo/distill/fake_tinker_test.py +547 -0
- world_model_optimizer-0.2.0/wmo/distill/gate.py +122 -0
- world_model_optimizer-0.2.0/wmo/distill/gate_test.py +111 -0
- world_model_optimizer-0.2.0/wmo/distill/loop.py +3499 -0
- world_model_optimizer-0.2.0/wmo/distill/loop_test.py +3588 -0
- world_model_optimizer-0.2.0/wmo/distill/renderers.py +399 -0
- world_model_optimizer-0.2.0/wmo/distill/renderers_test.py +638 -0
- world_model_optimizer-0.2.0/wmo/distill/rendering.py +620 -0
- world_model_optimizer-0.2.0/wmo/distill/rendering_test.py +475 -0
- world_model_optimizer-0.2.0/wmo/distill/rollouts.py +726 -0
- world_model_optimizer-0.2.0/wmo/distill/rollouts_test.py +1021 -0
- world_model_optimizer-0.2.0/wmo/distill/samples.py +195 -0
- world_model_optimizer-0.2.0/wmo/distill/samples_test.py +178 -0
- world_model_optimizer-0.2.0/wmo/distill/store.py +829 -0
- world_model_optimizer-0.2.0/wmo/distill/store_test.py +506 -0
- world_model_optimizer-0.2.0/wmo/distill/teacher.py +714 -0
- world_model_optimizer-0.2.0/wmo/distill/teacher_test.py +701 -0
- world_model_optimizer-0.2.0/wmo/distill/tokens.py +535 -0
- world_model_optimizer-0.2.0/wmo/distill/tokens_test.py +449 -0
- world_model_optimizer-0.2.0/wmo/distill/tracking.py +552 -0
- world_model_optimizer-0.2.0/wmo/distill/tracking_test.py +730 -0
- world_model_optimizer-0.2.0/wmo/distill/tripwire.py +411 -0
- world_model_optimizer-0.2.0/wmo/distill/tripwire_test.py +510 -0
- world_model_optimizer-0.2.0/wmo/distill/xtoken/byte_offsets.py +152 -0
- world_model_optimizer-0.2.0/wmo/distill/xtoken/byte_offsets_test.py +145 -0
- world_model_optimizer-0.2.0/wmo/distill/xtoken/chunks.py +457 -0
- world_model_optimizer-0.2.0/wmo/distill/xtoken/chunks_test.py +325 -0
- world_model_optimizer-0.2.0/wmo/distill/xtoken/prompt_logprobs.py +475 -0
- world_model_optimizer-0.2.0/wmo/distill/xtoken/teacher_render.py +346 -0
- world_model_optimizer-0.2.0/wmo/distill/xtoken/teacher_render_test.py +289 -0
- world_model_optimizer-0.2.0/wmo/engine/__init__.py +28 -0
- world_model_optimizer-0.2.0/wmo/engine/autoconfig.py +367 -0
- world_model_optimizer-0.2.0/wmo/engine/autoconfig_test.py +214 -0
- world_model_optimizer-0.2.0/wmo/engine/build.py +346 -0
- world_model_optimizer-0.2.0/wmo/engine/build_test.py +559 -0
- world_model_optimizer-0.2.0/wmo/engine/demo.py +77 -0
- world_model_optimizer-0.2.0/wmo/engine/demo_test.py +120 -0
- world_model_optimizer-0.2.0/wmo/engine/eval_suites.py +245 -0
- world_model_optimizer-0.2.0/wmo/engine/eval_suites_test.py +110 -0
- world_model_optimizer-0.2.0/wmo/engine/grounding.py +491 -0
- world_model_optimizer-0.2.0/wmo/engine/grounding_test.py +299 -0
- world_model_optimizer-0.2.0/wmo/engine/integration_test.py +91 -0
- world_model_optimizer-0.2.0/wmo/engine/knowledge.py +291 -0
- world_model_optimizer-0.2.0/wmo/engine/knowledge_test.py +159 -0
- world_model_optimizer-0.2.0/wmo/engine/loader.py +36 -0
- world_model_optimizer-0.2.0/wmo/engine/play.py +92 -0
- world_model_optimizer-0.2.0/wmo/engine/play_test.py +104 -0
- world_model_optimizer-0.2.0/wmo/engine/prompts.py +99 -0
- world_model_optimizer-0.2.0/wmo/engine/replay.py +443 -0
- world_model_optimizer-0.2.0/wmo/engine/replay_test.py +662 -0
- world_model_optimizer-0.2.0/wmo/engine/reporting.py +58 -0
- world_model_optimizer-0.2.0/wmo/engine/workspace.py +468 -0
- world_model_optimizer-0.2.0/wmo/engine/workspace_test.py +233 -0
- world_model_optimizer-0.2.0/wmo/engine/world_model.py +568 -0
- world_model_optimizer-0.2.0/wmo/engine/world_model_test.py +714 -0
- world_model_optimizer-0.2.0/wmo/env/__init__.py +22 -0
- world_model_optimizer-0.2.0/wmo/env/base.py +121 -0
- world_model_optimizer-0.2.0/wmo/env/base_test.py +188 -0
- world_model_optimizer-0.2.0/wmo/env/closed_loop.py +229 -0
- world_model_optimizer-0.2.0/wmo/env/closed_loop_test.py +265 -0
- world_model_optimizer-0.2.0/wmo/env/episode.py +107 -0
- world_model_optimizer-0.2.0/wmo/env/episode_test.py +163 -0
- world_model_optimizer-0.2.0/wmo/env/llm_agent.py +93 -0
- world_model_optimizer-0.2.0/wmo/env/llm_agent_test.py +100 -0
- world_model_optimizer-0.2.0/wmo/env/scenarios.py +73 -0
- world_model_optimizer-0.2.0/wmo/env/scenarios_test.py +82 -0
- world_model_optimizer-0.2.0/wmo/evals/__init__.py +52 -0
- world_model_optimizer-0.2.0/wmo/evals/agreement.py +110 -0
- world_model_optimizer-0.2.0/wmo/evals/agreement_test.py +61 -0
- world_model_optimizer-0.2.0/wmo/evals/base.py +45 -0
- world_model_optimizer-0.2.0/wmo/evals/base_test.py +40 -0
- world_model_optimizer-0.2.0/wmo/evals/closed_loop.py +480 -0
- world_model_optimizer-0.2.0/wmo/evals/closed_loop_test.py +701 -0
- world_model_optimizer-0.2.0/wmo/evals/failover.py +96 -0
- world_model_optimizer-0.2.0/wmo/evals/failover_test.py +102 -0
- world_model_optimizer-0.2.0/wmo/evals/gold.py +127 -0
- world_model_optimizer-0.2.0/wmo/evals/gold_test.py +130 -0
- world_model_optimizer-0.2.0/wmo/evals/grid.py +394 -0
- world_model_optimizer-0.2.0/wmo/evals/grid_plot.py +205 -0
- world_model_optimizer-0.2.0/wmo/evals/grid_plot_test.py +101 -0
- world_model_optimizer-0.2.0/wmo/evals/grid_test.py +388 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/__init__.py +27 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/agent.py +573 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/agent_test.py +490 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/ctrf.py +171 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/ctrf_test.py +389 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/e2b_environment.py +587 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/e2b_environment_test.py +732 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/e2b_template_policy.py +144 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/scorer.py +875 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/scorer_test.py +973 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/tasks.py +140 -0
- world_model_optimizer-0.2.0/wmo/evals/harbor/tasks_test.py +139 -0
- world_model_optimizer-0.2.0/wmo/evals/open_loop.py +194 -0
- world_model_optimizer-0.2.0/wmo/evals/open_loop_test.py +213 -0
- world_model_optimizer-0.2.0/wmo/evals/tasks.py +53 -0
- world_model_optimizer-0.2.0/wmo/evals/tasks_test.py +53 -0
- world_model_optimizer-0.2.0/wmo/harness/__init__.py +51 -0
- world_model_optimizer-0.2.0/wmo/harness/code_runtime.py +288 -0
- world_model_optimizer-0.2.0/wmo/harness/code_runtime_test.py +209 -0
- world_model_optimizer-0.2.0/wmo/harness/create.py +1191 -0
- world_model_optimizer-0.2.0/wmo/harness/create_test.py +2186 -0
- world_model_optimizer-0.2.0/wmo/harness/delta.py +220 -0
- world_model_optimizer-0.2.0/wmo/harness/delta_test.py +288 -0
- world_model_optimizer-0.2.0/wmo/harness/doc.py +556 -0
- world_model_optimizer-0.2.0/wmo/harness/doc_test.py +490 -0
- world_model_optimizer-0.2.0/wmo/harness/e2b_ledger.py +342 -0
- world_model_optimizer-0.2.0/wmo/harness/e2b_ledger_test.py +157 -0
- world_model_optimizer-0.2.0/wmo/harness/e2b_reap.py +476 -0
- world_model_optimizer-0.2.0/wmo/harness/e2b_reap_test.py +393 -0
- world_model_optimizer-0.2.0/wmo/harness/e2b_sandbox.py +350 -0
- world_model_optimizer-0.2.0/wmo/harness/e2b_sandbox_test.py +420 -0
- world_model_optimizer-0.2.0/wmo/harness/environment.py +35 -0
- world_model_optimizer-0.2.0/wmo/harness/live_session.py +543 -0
- world_model_optimizer-0.2.0/wmo/harness/live_session_test.py +482 -0
- world_model_optimizer-0.2.0/wmo/harness/mutate.py +343 -0
- world_model_optimizer-0.2.0/wmo/harness/mutate_test.py +310 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_e2b.py +1710 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_e2b_test.py +2519 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_entry/entry.ts +268 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_frames.ts +92 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_live.ts +587 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_service.ts +270 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_stdio.ts +374 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_entry/runner_termination.ts +142 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_local.py +262 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_local_test.py +313 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_runtime.py +495 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_runtime_test.py +365 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_vendor.py +65 -0
- world_model_optimizer-0.2.0/wmo/harness/pi_vendor_test.py +56 -0
- world_model_optimizer-0.2.0/wmo/harness/population.py +509 -0
- world_model_optimizer-0.2.0/wmo/harness/population_test.py +279 -0
- world_model_optimizer-0.2.0/wmo/harness/project_proposer.py +569 -0
- world_model_optimizer-0.2.0/wmo/harness/project_proposer_test.py +380 -0
- world_model_optimizer-0.2.0/wmo/harness/proposer.py +977 -0
- world_model_optimizer-0.2.0/wmo/harness/proposer_test.py +917 -0
- world_model_optimizer-0.2.0/wmo/harness/runner_link.py +619 -0
- world_model_optimizer-0.2.0/wmo/harness/runner_link_test.py +752 -0
- world_model_optimizer-0.2.0/wmo/harness/runtime.py +389 -0
- world_model_optimizer-0.2.0/wmo/harness/runtime_test.py +193 -0
- world_model_optimizer-0.2.0/wmo/harness/scoring.py +247 -0
- world_model_optimizer-0.2.0/wmo/harness/scoring_test.py +125 -0
- world_model_optimizer-0.2.0/wmo/harness/skills.py +116 -0
- world_model_optimizer-0.2.0/wmo/harness/skills_test.py +44 -0
- world_model_optimizer-0.2.0/wmo/harness/source_tree.py +319 -0
- world_model_optimizer-0.2.0/wmo/harness/source_tree_test.py +220 -0
- world_model_optimizer-0.2.0/wmo/harness/store.py +176 -0
- world_model_optimizer-0.2.0/wmo/harness/store_test.py +225 -0
- world_model_optimizer-0.2.0/wmo/harness/tools.py +105 -0
- world_model_optimizer-0.2.0/wmo/harness/tools_test.py +42 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/manifest.sha256 +58 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/CHANGELOG.md +556 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/LICENSE +21 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/README.md +488 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/VENDOR.md +39 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/agent-harness.md +486 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/durable-harness.md +212 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/hooks.md +445 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/models.md +966 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/docs/observability.md +376 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/package.json +60 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/agent-loop.ts +748 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/agent.ts +575 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/agent-harness.ts +1029 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/compaction/branch-summarization.ts +261 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/compaction/compaction.ts +747 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/compaction/utils.ts +144 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/env/nodejs.ts +550 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/messages.ts +164 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/prompt-templates.ts +267 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/jsonl-repo.ts +177 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/jsonl-storage.ts +293 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/memory-repo.ts +50 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/memory-storage.ts +131 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/repo-utils.ts +51 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/session.ts +267 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/session/uuid.ts +54 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/skills.ts +375 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/system-prompt.ts +34 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/types.ts +836 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/utils/shell-output.ts +135 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/harness/utils/truncate.ts +344 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/index.ts +44 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/node.ts +2 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/proxy.ts +367 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/src/types.ts +428 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/agent-loop.test.ts +1351 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/agent.test.ts +699 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/e2e.test.ts +404 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/agent-harness-stream.test.ts +213 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/agent-harness.test.ts +608 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/compaction.test.ts +655 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/nodejs-env.test.ts +321 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/prompt-templates.test.ts +90 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/repo.test.ts +68 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/resource-formatting.test.ts +24 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/session-test-utils.ts +55 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/session-uuid.test.ts +50 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/session.test.ts +156 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/skills.test.ts +116 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/storage.test.ts +299 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/system-prompt.test.ts +66 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/harness/truncate.test.ts +169 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/scratch/simple.ts +72 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/utils/calculate.ts +32 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/test/utils/get-current-time.ts +46 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/tsconfig.build.json +13 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/vitest.config.ts +19 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/pi-agent/vitest.harness.config.ts +28 -0
- world_model_optimizer-0.2.0/wmo/harness/vendor/vendor_pi.sh +59 -0
- world_model_optimizer-0.2.0/wmo/harness/workspace_patch.py +270 -0
- world_model_optimizer-0.2.0/wmo/harness/workspace_patch_test.py +88 -0
- world_model_optimizer-0.2.0/wmo/ingest/__init__.py +47 -0
- world_model_optimizer-0.2.0/wmo/ingest/adapter.py +72 -0
- world_model_optimizer-0.2.0/wmo/ingest/base.py +114 -0
- world_model_optimizer-0.2.0/wmo/ingest/base_test.py +181 -0
- world_model_optimizer-0.2.0/wmo/ingest/braintrust.py +339 -0
- world_model_optimizer-0.2.0/wmo/ingest/braintrust_test.py +210 -0
- world_model_optimizer-0.2.0/wmo/ingest/detect.py +126 -0
- world_model_optimizer-0.2.0/wmo/ingest/detect_test.py +71 -0
- world_model_optimizer-0.2.0/wmo/ingest/langfuse.py +291 -0
- world_model_optimizer-0.2.0/wmo/ingest/langfuse_test.py +254 -0
- world_model_optimizer-0.2.0/wmo/ingest/langsmith.py +444 -0
- world_model_optimizer-0.2.0/wmo/ingest/langsmith_test.py +293 -0
- world_model_optimizer-0.2.0/wmo/ingest/mastra.py +330 -0
- world_model_optimizer-0.2.0/wmo/ingest/mastra_test.py +217 -0
- world_model_optimizer-0.2.0/wmo/ingest/messages.py +170 -0
- world_model_optimizer-0.2.0/wmo/ingest/messages_test.py +139 -0
- world_model_optimizer-0.2.0/wmo/ingest/normalize.py +679 -0
- world_model_optimizer-0.2.0/wmo/ingest/normalize_test.py +191 -0
- world_model_optimizer-0.2.0/wmo/ingest/otel_genai.py +69 -0
- world_model_optimizer-0.2.0/wmo/ingest/otel_genai_envcap_roundtrip_test.py +59 -0
- world_model_optimizer-0.2.0/wmo/ingest/otel_genai_test.py +228 -0
- world_model_optimizer-0.2.0/wmo/ingest/otel_writer.py +100 -0
- world_model_optimizer-0.2.0/wmo/ingest/otel_writer_test.py +110 -0
- world_model_optimizer-0.2.0/wmo/ingest/phoenix.py +150 -0
- world_model_optimizer-0.2.0/wmo/ingest/phoenix_test.py +213 -0
- world_model_optimizer-0.2.0/wmo/ingest/postgres.py +246 -0
- world_model_optimizer-0.2.0/wmo/ingest/postgres_test.py +151 -0
- world_model_optimizer-0.2.0/wmo/ingest/posthog.py +320 -0
- world_model_optimizer-0.2.0/wmo/ingest/posthog_test.py +189 -0
- world_model_optimizer-0.2.0/wmo/ingest/quality.py +28 -0
- world_model_optimizer-0.2.0/wmo/ingest/quality_test.py +39 -0
- world_model_optimizer-0.2.0/wmo/ingest/stream.py +209 -0
- world_model_optimizer-0.2.0/wmo/ingest/stream_test.py +170 -0
- world_model_optimizer-0.2.0/wmo/ingest/testdata/sample_otlp.json +60 -0
- world_model_optimizer-0.2.0/wmo/ingest/testdata/sample_spans.jsonl +3 -0
- world_model_optimizer-0.2.0/wmo/optimize/__init__.py +25 -0
- world_model_optimizer-0.2.0/wmo/optimize/base.py +143 -0
- world_model_optimizer-0.2.0/wmo/optimize/base_test.py +111 -0
- world_model_optimizer-0.2.0/wmo/optimize/gepa.py +806 -0
- world_model_optimizer-0.2.0/wmo/optimize/gepa_test.py +661 -0
- world_model_optimizer-0.2.0/wmo/optimize/judge.py +262 -0
- world_model_optimizer-0.2.0/wmo/optimize/judge_quality.py +359 -0
- world_model_optimizer-0.2.0/wmo/optimize/judge_quality_test.py +119 -0
- world_model_optimizer-0.2.0/wmo/optimize/judge_test.py +274 -0
- world_model_optimizer-0.2.0/wmo/optimize/knn.py +468 -0
- world_model_optimizer-0.2.0/wmo/optimize/knn_test.py +547 -0
- world_model_optimizer-0.2.0/wmo/optimize/numeric.py +152 -0
- world_model_optimizer-0.2.0/wmo/optimize/numeric_test.py +138 -0
- world_model_optimizer-0.2.0/wmo/optimize/outcomes.py +103 -0
- world_model_optimizer-0.2.0/wmo/optimize/outcomes_test.py +77 -0
- world_model_optimizer-0.2.0/wmo/optimize/policy.py +669 -0
- world_model_optimizer-0.2.0/wmo/optimize/policy_test.py +612 -0
- world_model_optimizer-0.2.0/wmo/optimize/report.py +231 -0
- world_model_optimizer-0.2.0/wmo/optimize/report_test.py +213 -0
- world_model_optimizer-0.2.0/wmo/optimize/reward.py +129 -0
- world_model_optimizer-0.2.0/wmo/optimize/reward_test.py +96 -0
- world_model_optimizer-0.2.0/wmo/optimize/routing.py +373 -0
- world_model_optimizer-0.2.0/wmo/optimize/routing_test.py +296 -0
- world_model_optimizer-0.2.0/wmo/platform/__init__.py +6 -0
- world_model_optimizer-0.2.0/wmo/platform/auth.py +115 -0
- world_model_optimizer-0.2.0/wmo/platform/auth_test.py +78 -0
- world_model_optimizer-0.2.0/wmo/platform/client.py +551 -0
- world_model_optimizer-0.2.0/wmo/platform/client_test.py +496 -0
- world_model_optimizer-0.2.0/wmo/platform/credentials.py +126 -0
- world_model_optimizer-0.2.0/wmo/platform/credentials_test.py +111 -0
- world_model_optimizer-0.2.0/wmo/platform/transfer.py +158 -0
- world_model_optimizer-0.2.0/wmo/platform/transfer_test.py +102 -0
- world_model_optimizer-0.2.0/wmo/providers/__init__.py +40 -0
- world_model_optimizer-0.2.0/wmo/providers/_bedrock_chat.py +155 -0
- world_model_optimizer-0.2.0/wmo/providers/_bedrock_chat_test.py +95 -0
- world_model_optimizer-0.2.0/wmo/providers/_openai_common.py +182 -0
- world_model_optimizer-0.2.0/wmo/providers/_responses_common.py +472 -0
- world_model_optimizer-0.2.0/wmo/providers/_responses_common_test.py +435 -0
- world_model_optimizer-0.2.0/wmo/providers/anthropic.py +134 -0
- world_model_optimizer-0.2.0/wmo/providers/azure_openai.py +296 -0
- world_model_optimizer-0.2.0/wmo/providers/base.py +300 -0
- world_model_optimizer-0.2.0/wmo/providers/base_test.py +88 -0
- world_model_optimizer-0.2.0/wmo/providers/bedrock.py +312 -0
- world_model_optimizer-0.2.0/wmo/providers/bedrock_test.py +144 -0
- world_model_optimizer-0.2.0/wmo/providers/models.py +205 -0
- world_model_optimizer-0.2.0/wmo/providers/models_test.py +130 -0
- world_model_optimizer-0.2.0/wmo/providers/openai.py +143 -0
- world_model_optimizer-0.2.0/wmo/providers/openai_responses.py +240 -0
- world_model_optimizer-0.2.0/wmo/providers/openai_responses_test.py +295 -0
- world_model_optimizer-0.2.0/wmo/providers/pool.py +170 -0
- world_model_optimizer-0.2.0/wmo/providers/pool_test.py +219 -0
- world_model_optimizer-0.2.0/wmo/providers/registry.py +73 -0
- world_model_optimizer-0.2.0/wmo/providers/retry.py +151 -0
- world_model_optimizer-0.2.0/wmo/providers/retry_test.py +145 -0
- world_model_optimizer-0.2.0/wmo/providers/tests/_openai_common_test.py +112 -0
- world_model_optimizer-0.2.0/wmo/providers/tests/anthropic_test.py +108 -0
- world_model_optimizer-0.2.0/wmo/providers/tests/azure_openai_test.py +604 -0
- world_model_optimizer-0.2.0/wmo/providers/tests/bedrock_test.py +182 -0
- world_model_optimizer-0.2.0/wmo/providers/tests/openai_test.py +276 -0
- world_model_optimizer-0.2.0/wmo/providers/tests/registry_test.py +86 -0
- world_model_optimizer-0.2.0/wmo/providers/tests/streaming_test.py +320 -0
- world_model_optimizer-0.2.0/wmo/providers/tinker.py +936 -0
- world_model_optimizer-0.2.0/wmo/providers/tinker_test.py +1236 -0
- world_model_optimizer-0.2.0/wmo/providers/waterfall.py +336 -0
- world_model_optimizer-0.2.0/wmo/providers/waterfall_test.py +338 -0
- world_model_optimizer-0.2.0/wmo/repo_layout_test.py +230 -0
- world_model_optimizer-0.2.0/wmo/research/__init__.py +81 -0
- world_model_optimizer-0.2.0/wmo/research/ablation.py +133 -0
- world_model_optimizer-0.2.0/wmo/research/ablation_test.py +89 -0
- world_model_optimizer-0.2.0/wmo/research/concurrency_plot.py +523 -0
- world_model_optimizer-0.2.0/wmo/research/concurrency_plot_test.py +117 -0
- world_model_optimizer-0.2.0/wmo/research/concurrency_run.py +240 -0
- world_model_optimizer-0.2.0/wmo/research/concurrency_run_test.py +137 -0
- world_model_optimizer-0.2.0/wmo/research/concurrency_scaling.py +270 -0
- world_model_optimizer-0.2.0/wmo/research/concurrency_scaling_test.py +161 -0
- world_model_optimizer-0.2.0/wmo/research/gepa_scaling.py +274 -0
- world_model_optimizer-0.2.0/wmo/research/gepa_scaling_test.py +336 -0
- world_model_optimizer-0.2.0/wmo/research/pipeline.py +198 -0
- world_model_optimizer-0.2.0/wmo/research/pipeline_test.py +335 -0
- world_model_optimizer-0.2.0/wmo/research/scaling_split.py +82 -0
- world_model_optimizer-0.2.0/wmo/research/scaling_split_test.py +78 -0
- world_model_optimizer-0.2.0/wmo/research/scenario_fidelity.py +198 -0
- world_model_optimizer-0.2.0/wmo/research/scenario_fidelity_test.py +124 -0
- world_model_optimizer-0.2.0/wmo/research/scenario_recovery.py +92 -0
- world_model_optimizer-0.2.0/wmo/research/scenario_recovery_test.py +52 -0
- world_model_optimizer-0.2.0/wmo/research/seed_stability.py +90 -0
- world_model_optimizer-0.2.0/wmo/research/seed_stability_test.py +89 -0
- world_model_optimizer-0.2.0/wmo/research/trace_scaling.py +348 -0
- world_model_optimizer-0.2.0/wmo/research/trace_scaling_test.py +417 -0
- world_model_optimizer-0.2.0/wmo/retrieval/__init__.py +6 -0
- world_model_optimizer-0.2.0/wmo/retrieval/embedders.py +105 -0
- world_model_optimizer-0.2.0/wmo/retrieval/embedders_test.py +114 -0
- world_model_optimizer-0.2.0/wmo/retrieval/leakfree.py +52 -0
- world_model_optimizer-0.2.0/wmo/retrieval/leakfree_test.py +55 -0
- world_model_optimizer-0.2.0/wmo/retrieval/retriever.py +173 -0
- world_model_optimizer-0.2.0/wmo/retrieval/retriever_test.py +179 -0
- world_model_optimizer-0.2.0/wmo/scenarios/__init__.py +58 -0
- world_model_optimizer-0.2.0/wmo/scenarios/builder.py +152 -0
- world_model_optimizer-0.2.0/wmo/scenarios/builder_test.py +154 -0
- world_model_optimizer-0.2.0/wmo/scenarios/mining/__init__.py +27 -0
- world_model_optimizer-0.2.0/wmo/scenarios/mining/clustering.py +171 -0
- world_model_optimizer-0.2.0/wmo/scenarios/mining/clustering_test.py +77 -0
- world_model_optimizer-0.2.0/wmo/scenarios/mining/facets.py +226 -0
- world_model_optimizer-0.2.0/wmo/scenarios/mining/facets_test.py +136 -0
- world_model_optimizer-0.2.0/wmo/scenarios/mining/selection.py +220 -0
- world_model_optimizer-0.2.0/wmo/scenarios/mining/selection_test.py +95 -0
- world_model_optimizer-0.2.0/wmo/scenarios/synthesis/__init__.py +6 -0
- world_model_optimizer-0.2.0/wmo/scenarios/synthesis/scenario_set.py +63 -0
- world_model_optimizer-0.2.0/wmo/scenarios/synthesis/scenario_set_test.py +55 -0
- world_model_optimizer-0.2.0/wmo/scenarios/synthesis/synthesizer.py +85 -0
- world_model_optimizer-0.2.0/wmo/scenarios/synthesis/synthesizer_test.py +48 -0
- world_model_optimizer-0.2.0/wmo/scenarios/verification/__init__.py +17 -0
- world_model_optimizer-0.2.0/wmo/scenarios/verification/judge.py +97 -0
- world_model_optimizer-0.2.0/wmo/scenarios/verification/judge_test.py +66 -0
- world_model_optimizer-0.2.0/wmo/scenarios/verification/verify.py +135 -0
- world_model_optimizer-0.2.0/wmo/scenarios/verification/verify_test.py +201 -0
- world_model_optimizer-0.2.0/wmo/serving/__init__.py +5 -0
- world_model_optimizer-0.2.0/wmo/serving/builds.py +451 -0
- world_model_optimizer-0.2.0/wmo/serving/builds_test.py +339 -0
- world_model_optimizer-0.2.0/wmo/serving/chat.py +878 -0
- world_model_optimizer-0.2.0/wmo/serving/chat_openai_client_test.py +212 -0
- world_model_optimizer-0.2.0/wmo/serving/chat_test.py +936 -0
- world_model_optimizer-0.2.0/wmo/serving/endpoint_config.py +64 -0
- world_model_optimizer-0.2.0/wmo/serving/endpoint_config_test.py +65 -0
- world_model_optimizer-0.2.0/wmo/serving/savings.py +250 -0
- world_model_optimizer-0.2.0/wmo/serving/savings_test.py +270 -0
- world_model_optimizer-0.2.0/wmo/serving/server.py +553 -0
- world_model_optimizer-0.2.0/wmo/serving/server_test.py +466 -0
- world_model_optimizer-0.2.0/wmo/serving/traces_source.py +206 -0
- world_model_optimizer-0.2.0/wmo/serving/traces_source_test.py +133 -0
- world_model_optimizer-0.2.0/wmo/telemetry.py +213 -0
- world_model_optimizer-0.2.0/wmo/telemetry_test.py +121 -0
- world_model_optimizer-0.2.0/wmo/tracking/__init__.py +36 -0
- world_model_optimizer-0.2.0/wmo/tracking/clock.py +24 -0
- world_model_optimizer-0.2.0/wmo/tracking/metered.py +125 -0
- world_model_optimizer-0.2.0/wmo/tracking/metered_test.py +130 -0
- world_model_optimizer-0.2.0/wmo/tracking/pricing.py +99 -0
- world_model_optimizer-0.2.0/wmo/tracking/pricing_test.py +60 -0
- world_model_optimizer-0.2.0/wmo/tracking/store.py +31 -0
- world_model_optimizer-0.2.0/wmo/tracking/store_test.py +41 -0
- world_model_optimizer-0.2.0/wmo/tracking/tracker.py +149 -0
- 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
|
+

|
|
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
|
+

|
|
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
|
+
)
|