synth-ai 0.2.8.dev2__py3-none-any.whl → 0.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- synth_ai/__init__.py +44 -24
- synth_ai/__main__.py +30 -3
- synth_ai/cli/__init__.py +103 -48
- synth_ai/cli/__main__.py +42 -0
- synth_ai/cli/_internal/__init__.py +5 -0
- synth_ai/cli/_internal/modal_wrapper.py +31 -0
- synth_ai/cli/_internal/storage.py +20 -0
- synth_ai/cli/_internal/typer_patch.py +47 -0
- synth_ai/cli/_internal/validate_task_app.py +29 -0
- synth_ai/cli/agents/__init__.py +17 -0
- synth_ai/cli/agents/claude.py +77 -0
- synth_ai/cli/agents/codex.py +265 -0
- synth_ai/cli/agents/opencode.py +253 -0
- synth_ai/cli/commands/__init__.py +18 -0
- synth_ai/cli/commands/artifacts/__init__.py +13 -0
- synth_ai/cli/commands/artifacts/client.py +119 -0
- synth_ai/cli/commands/artifacts/config.py +57 -0
- synth_ai/cli/commands/artifacts/core.py +24 -0
- synth_ai/cli/commands/artifacts/download.py +188 -0
- synth_ai/cli/commands/artifacts/export.py +186 -0
- synth_ai/cli/commands/artifacts/list.py +156 -0
- synth_ai/cli/commands/artifacts/parsing.py +250 -0
- synth_ai/cli/commands/artifacts/show.py +336 -0
- synth_ai/cli/commands/demo/__init__.py +3 -0
- synth_ai/cli/commands/demo/core.py +153 -0
- synth_ai/cli/commands/eval/__init__.py +10 -0
- synth_ai/cli/commands/eval/config.py +338 -0
- synth_ai/cli/commands/eval/core.py +256 -0
- synth_ai/cli/commands/eval/runner.py +704 -0
- synth_ai/cli/commands/eval/validation.py +60 -0
- synth_ai/cli/commands/filter/__init__.py +12 -0
- synth_ai/cli/commands/filter/core.py +424 -0
- synth_ai/cli/commands/filter/errors.py +55 -0
- synth_ai/cli/commands/filter/validation.py +77 -0
- synth_ai/cli/commands/help/__init__.py +185 -0
- synth_ai/cli/commands/help/core.py +72 -0
- synth_ai/cli/commands/scan/__init__.py +19 -0
- synth_ai/cli/commands/scan/cloudflare_scanner.py +403 -0
- synth_ai/cli/commands/scan/core.py +344 -0
- synth_ai/cli/commands/scan/health_checker.py +242 -0
- synth_ai/cli/commands/scan/local_scanner.py +278 -0
- synth_ai/cli/commands/scan/models.py +83 -0
- synth_ai/cli/commands/smoke/__init__.py +7 -0
- synth_ai/cli/commands/smoke/core.py +1428 -0
- synth_ai/cli/commands/status/__init__.py +3 -0
- synth_ai/cli/commands/status/client.py +91 -0
- synth_ai/cli/commands/status/config.py +12 -0
- synth_ai/cli/commands/status/errors.py +11 -0
- synth_ai/cli/commands/status/subcommands/__init__.py +3 -0
- synth_ai/cli/commands/status/subcommands/config.py +13 -0
- synth_ai/cli/commands/status/subcommands/files.py +34 -0
- synth_ai/cli/commands/status/subcommands/jobs.py +51 -0
- synth_ai/cli/commands/status/subcommands/models.py +35 -0
- synth_ai/cli/commands/status/subcommands/runs.py +34 -0
- synth_ai/cli/commands/status/subcommands/session.py +77 -0
- synth_ai/cli/commands/status/subcommands/summary.py +39 -0
- synth_ai/cli/commands/status/subcommands/utils.py +41 -0
- synth_ai/cli/commands/status/utils.py +23 -0
- synth_ai/cli/commands/train/__init__.py +53 -0
- synth_ai/cli/commands/train/core.py +22 -0
- synth_ai/cli/commands/train/errors.py +117 -0
- synth_ai/cli/commands/train/judge_schemas.py +201 -0
- synth_ai/cli/commands/train/judge_validation.py +305 -0
- synth_ai/cli/commands/train/prompt_learning_validation.py +633 -0
- synth_ai/cli/commands/train/validation.py +392 -0
- synth_ai/cli/demo_apps/__init__.py +10 -0
- synth_ai/cli/demo_apps/core/__init__.py +28 -0
- synth_ai/{demos → cli/demo_apps}/core/cli.py +783 -441
- synth_ai/cli/demo_apps/crafter/__init__.py +1 -0
- synth_ai/cli/demo_apps/crafter/crafter_fft_4b.toml +55 -0
- synth_ai/cli/demo_apps/crafter/grpo_crafter_task_app.py +186 -0
- synth_ai/cli/demo_apps/crafter/rl_from_base_qwen4b.toml +74 -0
- synth_ai/cli/demo_apps/demo_registry.py +176 -0
- synth_ai/cli/demo_apps/demo_task_apps/__init__.py +7 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/core.py +75 -37
- synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/crafter_fft_4b.toml +53 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +73 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/grpo_crafter_task_app.py +185 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/_common.py +1 -2
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +2 -1
- synth_ai/cli/demo_apps/demo_task_apps/math/config.toml +73 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +3 -6
- synth_ai/cli/demo_apps/demo_task_apps/math/modal_task_app.py +738 -0
- synth_ai/cli/demo_apps/demo_task_apps/math/task_app_entry.py +39 -0
- synth_ai/cli/demo_apps/math/__init__.py +1 -0
- synth_ai/cli/demo_apps/math/_common.py +16 -0
- synth_ai/cli/demo_apps/math/app.py +38 -0
- synth_ai/cli/demo_apps/math/config.toml +75 -0
- synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
- synth_ai/cli/demo_apps/math/modal_task_app.py +698 -0
- synth_ai/cli/demo_apps/math/task_app_entry.py +53 -0
- synth_ai/cli/demo_apps/mipro/main.py +271 -0
- synth_ai/cli/demo_apps/mipro/task_app.py +922 -0
- synth_ai/cli/demo_apps/mipro/train_cfg.toml +92 -0
- synth_ai/cli/demos/__init__.py +12 -0
- synth_ai/cli/demos/demo.py +32 -0
- synth_ai/cli/demos/rl_demo.py +254 -0
- synth_ai/cli/deploy.py +216 -0
- synth_ai/cli/infra/__init__.py +14 -0
- synth_ai/cli/{balance.py → infra/balance.py} +16 -4
- synth_ai/cli/infra/mcp.py +35 -0
- synth_ai/cli/infra/modal_app.py +36 -0
- synth_ai/cli/infra/setup.py +69 -0
- synth_ai/cli/infra/status.py +16 -0
- synth_ai/cli/infra/turso.py +77 -0
- synth_ai/cli/lib/__init__.py +10 -0
- synth_ai/cli/lib/agents.py +76 -0
- synth_ai/cli/lib/apps/modal_app.py +101 -0
- synth_ai/cli/lib/apps/task_app.py +642 -0
- synth_ai/cli/lib/bin.py +39 -0
- synth_ai/cli/lib/env.py +375 -0
- synth_ai/cli/lib/errors.py +85 -0
- synth_ai/cli/lib/modal.py +315 -0
- synth_ai/cli/lib/plotting.py +126 -0
- synth_ai/cli/lib/prompt_args.py +39 -0
- synth_ai/cli/lib/prompts.py +284 -0
- synth_ai/cli/lib/sqld.py +122 -0
- synth_ai/cli/lib/task_app_discovery.py +884 -0
- synth_ai/cli/lib/task_app_env.py +295 -0
- synth_ai/cli/lib/train_cfgs.py +300 -0
- synth_ai/cli/lib/tunnel_records.py +207 -0
- synth_ai/cli/local/__init__.py +14 -0
- synth_ai/cli/local/experiment_queue/__init__.py +72 -0
- synth_ai/cli/local/experiment_queue/api_schemas.py +221 -0
- synth_ai/cli/local/experiment_queue/celery_app.py +208 -0
- synth_ai/cli/local/experiment_queue/config.py +128 -0
- synth_ai/cli/local/experiment_queue/config_utils.py +272 -0
- synth_ai/cli/local/experiment_queue/database.py +175 -0
- synth_ai/cli/local/experiment_queue/dispatcher.py +119 -0
- synth_ai/cli/local/experiment_queue/models.py +231 -0
- synth_ai/cli/local/experiment_queue/progress_info.py +160 -0
- synth_ai/cli/local/experiment_queue/results.py +373 -0
- synth_ai/cli/local/experiment_queue/schemas.py +131 -0
- synth_ai/cli/local/experiment_queue/service.py +344 -0
- synth_ai/cli/local/experiment_queue/status.py +372 -0
- synth_ai/cli/local/experiment_queue/status_tracker.py +360 -0
- synth_ai/cli/local/experiment_queue/tasks.py +1984 -0
- synth_ai/cli/local/experiment_queue/trace_storage.py +65 -0
- synth_ai/cli/local/experiment_queue/validation.py +157 -0
- synth_ai/cli/local/session/__init__.py +92 -0
- synth_ai/cli/local/session/client.py +383 -0
- synth_ai/cli/local/session/constants.py +63 -0
- synth_ai/cli/local/session/exceptions.py +105 -0
- synth_ai/cli/local/session/manager.py +139 -0
- synth_ai/cli/local/session/models.py +89 -0
- synth_ai/cli/local/session/query.py +110 -0
- synth_ai/cli/root.py +150 -108
- synth_ai/cli/task_apps/__init__.py +37 -0
- synth_ai/cli/task_apps/commands.py +3145 -0
- synth_ai/cli/task_apps/deploy.py +7 -0
- synth_ai/cli/task_apps/list.py +26 -0
- synth_ai/cli/task_apps/main.py +36 -0
- synth_ai/cli/task_apps/modal_serve.py +11 -0
- synth_ai/cli/task_apps/serve.py +11 -0
- synth_ai/cli/training/__init__.py +8 -0
- synth_ai/cli/training/train.py +5 -0
- synth_ai/cli/training/train_cfg.py +34 -0
- synth_ai/cli/{watch.py → training/watch.py} +13 -18
- synth_ai/cli/turso.py +52 -0
- synth_ai/cli/utils/__init__.py +8 -0
- synth_ai/cli/utils/experiments.py +235 -0
- synth_ai/cli/utils/queue.py +504 -0
- synth_ai/cli/{recent.py → utils/recent.py} +13 -7
- synth_ai/cli/{traces.py → utils/traces.py} +9 -5
- synth_ai/contracts/__init__.py +67 -0
- synth_ai/core/__init__.py +100 -0
- synth_ai/core/_utils/__init__.py +54 -0
- synth_ai/core/_utils/base_url.py +10 -0
- synth_ai/core/_utils/http.py +10 -0
- synth_ai/core/_utils/prompts.py +14 -0
- synth_ai/core/_utils/task_app_state.py +12 -0
- synth_ai/core/_utils/user_config.py +10 -0
- synth_ai/core/apps/common.py +116 -0
- synth_ai/core/auth.py +95 -0
- synth_ai/core/cfgs.py +240 -0
- synth_ai/core/config/__init__.py +16 -0
- synth_ai/core/config/base.py +168 -0
- synth_ai/core/config/resolver.py +89 -0
- synth_ai/core/env.py +231 -0
- synth_ai/core/errors.py +126 -0
- synth_ai/core/http.py +230 -0
- synth_ai/core/integrations/__init__.py +11 -0
- synth_ai/core/integrations/cloudflare.py +1710 -0
- synth_ai/core/integrations/mcp/__init__.py +6 -0
- synth_ai/core/integrations/mcp/__main__.py +8 -0
- synth_ai/core/integrations/mcp/claude.py +36 -0
- synth_ai/core/integrations/mcp/main.py +254 -0
- synth_ai/core/integrations/mcp/setup.py +100 -0
- synth_ai/core/integrations/modal.py +277 -0
- synth_ai/core/json.py +72 -0
- synth_ai/core/log_filter.py +99 -0
- synth_ai/core/logging.py +82 -0
- synth_ai/core/paths.py +107 -0
- synth_ai/core/pricing.py +109 -0
- synth_ai/core/process.py +233 -0
- synth_ai/core/ssl.py +25 -0
- synth_ai/core/storage/__init__.py +71 -0
- synth_ai/core/task_app_state.py +318 -0
- synth_ai/core/telemetry.py +282 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/__init__.py +5 -1
- synth_ai/{tracing_v3 → core/tracing_v3}/abstractions.py +21 -4
- synth_ai/core/tracing_v3/config.py +229 -0
- synth_ai/core/tracing_v3/constants.py +21 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/db_config.py +42 -29
- synth_ai/{tracing_v3 → core/tracing_v3}/decorators.py +80 -45
- synth_ai/{tracing_v3 → core/tracing_v3}/examples/basic_usage.py +15 -9
- synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +6 -4
- synth_ai/{tracing_v3 → core/tracing_v3}/llm_call_record_helpers.py +161 -61
- synth_ai/{tracing_v3 → core/tracing_v3}/migration_helper.py +1 -2
- synth_ai/{tracing_v3 → core/tracing_v3}/replica_sync.py +12 -7
- synth_ai/core/tracing_v3/serialization.py +130 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/session_tracer.py +88 -21
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/base.py +99 -12
- synth_ai/core/tracing_v3/storage/config.py +109 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/factory.py +11 -9
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/utils.py +15 -11
- synth_ai/core/tracing_v3/trace_utils.py +326 -0
- synth_ai/core/tracing_v3/turso/__init__.py +12 -0
- synth_ai/core/tracing_v3/turso/daemon.py +278 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/turso/models.py +7 -3
- synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/utils.py +5 -4
- synth_ai/core/urls.py +18 -0
- synth_ai/core/user_config.py +137 -0
- synth_ai/core/uvicorn.py +222 -0
- synth_ai/data/__init__.py +83 -0
- synth_ai/data/enums.py +123 -0
- synth_ai/data/rewards.py +152 -0
- synth_ai/data/traces.py +35 -0
- synth_ai/products/__init__.py +6 -0
- synth_ai/products/graph_evolve/__init__.py +46 -0
- synth_ai/products/graph_evolve/client.py +226 -0
- synth_ai/products/graph_evolve/config.py +591 -0
- synth_ai/products/graph_evolve/converters/__init__.py +42 -0
- synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
- synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
- synth_ai/products/graph_evolve/run.py +222 -0
- synth_ai/products/graph_gepa/__init__.py +23 -0
- synth_ai/products/graph_gepa/converters/__init__.py +19 -0
- synth_ai/products/graph_gepa/converters/openai_sft.py +29 -0
- synth_ai/sdk/__init__.py +123 -0
- synth_ai/sdk/api/__init__.py +1 -0
- synth_ai/sdk/api/models/supported.py +514 -0
- synth_ai/sdk/api/research_agent/__init__.py +296 -0
- synth_ai/sdk/api/train/__init__.py +85 -0
- synth_ai/sdk/api/train/builders.py +895 -0
- synth_ai/sdk/api/train/cli.py +2199 -0
- synth_ai/sdk/api/train/config_finder.py +267 -0
- synth_ai/sdk/api/train/configs/__init__.py +65 -0
- synth_ai/sdk/api/train/configs/prompt_learning.py +1706 -0
- synth_ai/sdk/api/train/configs/rl.py +187 -0
- synth_ai/sdk/api/train/configs/sft.py +99 -0
- synth_ai/sdk/api/train/configs/shared.py +81 -0
- synth_ai/sdk/api/train/context_learning.py +312 -0
- synth_ai/sdk/api/train/env_resolver.py +418 -0
- synth_ai/sdk/api/train/graph_validators.py +216 -0
- synth_ai/sdk/api/train/graphgen.py +984 -0
- synth_ai/sdk/api/train/graphgen_models.py +823 -0
- synth_ai/sdk/api/train/graphgen_validators.py +109 -0
- synth_ai/sdk/api/train/local_api.py +10 -0
- synth_ai/sdk/api/train/pollers.py +124 -0
- synth_ai/sdk/api/train/progress/__init__.py +97 -0
- synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
- synth_ai/sdk/api/train/progress/events.py +326 -0
- synth_ai/sdk/api/train/progress/results.py +428 -0
- synth_ai/sdk/api/train/progress/tracker.py +641 -0
- synth_ai/sdk/api/train/prompt_learning.py +469 -0
- synth_ai/sdk/api/train/rl.py +441 -0
- synth_ai/sdk/api/train/sft.py +396 -0
- synth_ai/sdk/api/train/summary.py +522 -0
- synth_ai/sdk/api/train/supported_algos.py +147 -0
- synth_ai/sdk/api/train/task_app.py +351 -0
- synth_ai/sdk/api/train/utils.py +279 -0
- synth_ai/sdk/api/train/validators.py +2424 -0
- synth_ai/sdk/graphs/__init__.py +15 -0
- synth_ai/sdk/graphs/completions.py +570 -0
- synth_ai/{inference → sdk/inference}/__init__.py +0 -1
- synth_ai/sdk/inference/client.py +128 -0
- synth_ai/sdk/jobs/__init__.py +16 -0
- synth_ai/sdk/jobs/client.py +371 -0
- synth_ai/sdk/judging/__init__.py +14 -0
- synth_ai/sdk/judging/base.py +24 -0
- synth_ai/sdk/judging/client.py +40 -0
- synth_ai/sdk/judging/schemas.py +222 -0
- synth_ai/sdk/judging/types.py +42 -0
- synth_ai/sdk/learning/__init__.py +99 -0
- synth_ai/sdk/learning/algorithms.py +14 -0
- synth_ai/{learning → sdk/learning}/client.py +121 -30
- synth_ai/sdk/learning/config.py +5 -0
- synth_ai/{learning → sdk/learning}/constants.py +0 -2
- synth_ai/sdk/learning/context_learning_client.py +531 -0
- synth_ai/sdk/learning/context_learning_types.py +292 -0
- synth_ai/sdk/learning/ft_client.py +7 -0
- synth_ai/{learning → sdk/learning}/health.py +15 -9
- synth_ai/{learning → sdk/learning}/jobs.py +44 -47
- synth_ai/sdk/learning/prompt_extraction.py +334 -0
- synth_ai/sdk/learning/prompt_learning_client.py +455 -0
- synth_ai/sdk/learning/prompt_learning_types.py +186 -0
- synth_ai/{rl → sdk/learning/rl}/__init__.py +13 -8
- synth_ai/{learning/rl_client.py → sdk/learning/rl/client.py} +89 -77
- synth_ai/sdk/learning/rl/config.py +31 -0
- synth_ai/{rl → sdk/learning/rl}/contracts.py +5 -14
- synth_ai/{rl → sdk/learning/rl}/env_keys.py +45 -16
- synth_ai/sdk/learning/rl/secrets.py +13 -0
- synth_ai/sdk/learning/rl_client.py +5 -0
- synth_ai/sdk/learning/sft/__init__.py +29 -0
- synth_ai/sdk/learning/sft/client.py +95 -0
- synth_ai/sdk/learning/sft/config.py +270 -0
- synth_ai/sdk/learning/sft/data.py +698 -0
- synth_ai/sdk/learning/sse.py +57 -0
- synth_ai/sdk/learning/validators.py +52 -0
- synth_ai/sdk/localapi/__init__.py +40 -0
- synth_ai/sdk/localapi/apps/__init__.py +28 -0
- synth_ai/sdk/localapi/client.py +10 -0
- synth_ai/sdk/localapi/contracts.py +10 -0
- synth_ai/sdk/localapi/helpers.py +519 -0
- synth_ai/sdk/localapi/rollouts.py +87 -0
- synth_ai/sdk/localapi/server.py +29 -0
- synth_ai/sdk/localapi/template.py +70 -0
- synth_ai/sdk/streaming/__init__.py +35 -0
- synth_ai/sdk/streaming/config.py +94 -0
- synth_ai/sdk/streaming/handlers.py +1997 -0
- synth_ai/sdk/streaming/streamer.py +713 -0
- synth_ai/sdk/streaming/types.py +112 -0
- synth_ai/sdk/task/__init__.py +164 -0
- synth_ai/sdk/task/apps/__init__.py +169 -0
- synth_ai/sdk/task/auth.py +165 -0
- synth_ai/sdk/task/client.py +175 -0
- synth_ai/sdk/task/config.py +257 -0
- synth_ai/sdk/task/contracts.py +219 -0
- synth_ai/sdk/task/datasets.py +108 -0
- synth_ai/sdk/task/errors.py +50 -0
- synth_ai/sdk/task/health.py +34 -0
- synth_ai/sdk/task/in_process.py +1190 -0
- synth_ai/sdk/task/in_process_runner.py +314 -0
- synth_ai/sdk/task/inference_api.py +299 -0
- synth_ai/sdk/task/json.py +111 -0
- synth_ai/sdk/task/proxy.py +287 -0
- synth_ai/sdk/task/rubrics/__init__.py +55 -0
- synth_ai/sdk/task/rubrics/loaders.py +156 -0
- synth_ai/sdk/task/rubrics/models.py +57 -0
- synth_ai/sdk/task/rubrics/scoring.py +116 -0
- synth_ai/sdk/task/rubrics/strict.py +149 -0
- synth_ai/sdk/task/rubrics.py +219 -0
- synth_ai/sdk/task/server.py +631 -0
- synth_ai/sdk/task/trace_correlation_helpers.py +539 -0
- synth_ai/sdk/task/tracing_utils.py +95 -0
- synth_ai/sdk/task/validators.py +441 -0
- synth_ai/sdk/task/vendors.py +59 -0
- synth_ai/sdk/training/__init__.py +102 -0
- synth_ai/sdk/tunnels/__init__.py +83 -0
- synth_ai/sdk/tunnels/cleanup.py +83 -0
- synth_ai/sdk/tunnels/ports.py +120 -0
- synth_ai/utils/__init__.py +213 -0
- synth_ai-0.4.3.dist-info/METADATA +262 -0
- synth_ai-0.4.3.dist-info/RECORD +370 -0
- {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/entry_points.txt +0 -1
- synth_ai/cli/calc.py +0 -69
- synth_ai/cli/demo.py +0 -144
- synth_ai/cli/legacy_root_backup.py +0 -470
- synth_ai/cli/man.py +0 -106
- synth_ai/cli/rl_demo.py +0 -202
- synth_ai/cli/status.py +0 -133
- synth_ai/config/base_url.py +0 -107
- synth_ai/core/experiment.py +0 -15
- synth_ai/core/system.py +0 -15
- synth_ai/demos/core/__init__.py +0 -1
- synth_ai/demos/demo_task_apps/__init__.py +0 -1
- synth_ai/demos/demo_task_apps/math/config.toml +0 -129
- synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
- synth_ai/demos/demo_task_apps/math/modal_task_app.py +0 -415
- synth_ai/environments/__init__.py +0 -31
- synth_ai/environments/environment/__init__.py +0 -1
- synth_ai/environments/environment/artifacts/__init__.py +0 -1
- synth_ai/environments/environment/artifacts/base.py +0 -52
- synth_ai/environments/environment/core.py +0 -67
- synth_ai/environments/environment/db/__init__.py +0 -1
- synth_ai/environments/environment/db/sqlite.py +0 -45
- synth_ai/environments/environment/registry.py +0 -233
- synth_ai/environments/environment/resources/sqlite.py +0 -45
- synth_ai/environments/environment/results.py +0 -1
- synth_ai/environments/environment/rewards/__init__.py +0 -1
- synth_ai/environments/environment/rewards/core.py +0 -29
- synth_ai/environments/environment/shared_engine.py +0 -26
- synth_ai/environments/environment/tools/__init__.py +0 -200
- synth_ai/environments/examples/__init__.py +0 -1
- synth_ai/environments/examples/bandit/__init__.py +0 -33
- synth_ai/environments/examples/bandit/engine.py +0 -294
- synth_ai/environments/examples/bandit/environment.py +0 -194
- synth_ai/environments/examples/bandit/taskset.py +0 -200
- synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
- synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -738
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
- synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
- synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
- synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
- synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
- synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
- synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
- synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
- synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
- synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
- synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
- synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
- synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
- synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
- synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
- synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
- synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
- synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
- synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
- synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
- synth_ai/environments/examples/crafter_classic/engine.py +0 -579
- synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
- synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
- synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
- synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
- synth_ai/environments/examples/crafter_classic/environment.py +0 -404
- synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
- synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
- synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
- synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
- synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
- synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
- synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
- synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
- synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
- synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
- synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
- synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
- synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
- synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
- synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
- synth_ai/environments/examples/crafter_custom/environment.py +0 -312
- synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
- synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
- synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
- synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
- synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
- synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
- synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
- synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
- synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
- synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
- synth_ai/environments/examples/enron/engine.py +0 -295
- synth_ai/environments/examples/enron/environment.py +0 -166
- synth_ai/environments/examples/enron/taskset.py +0 -112
- synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
- synth_ai/environments/examples/minigrid/__init__.py +0 -48
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
- synth_ai/environments/examples/minigrid/engine.py +0 -589
- synth_ai/environments/examples/minigrid/environment.py +0 -274
- synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
- synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
- synth_ai/environments/examples/minigrid/taskset.py +0 -583
- synth_ai/environments/examples/nethack/__init__.py +0 -7
- synth_ai/environments/examples/nethack/achievements.py +0 -337
- synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
- synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
- synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
- synth_ai/environments/examples/nethack/engine.py +0 -739
- synth_ai/environments/examples/nethack/environment.py +0 -256
- synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
- synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
- synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
- synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
- synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
- synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
- synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
- synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
- synth_ai/environments/examples/nethack/taskset.py +0 -323
- synth_ai/environments/examples/red/__init__.py +0 -7
- synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
- synth_ai/environments/examples/red/config_logging.py +0 -110
- synth_ai/environments/examples/red/engine.py +0 -694
- synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
- synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -28
- synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
- synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
- synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
- synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
- synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
- synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
- synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
- synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
- synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
- synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
- synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
- synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
- synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
- synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
- synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -140
- synth_ai/environments/examples/red/environment.py +0 -238
- synth_ai/environments/examples/red/taskset.py +0 -79
- synth_ai/environments/examples/red/units/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
- synth_ai/environments/examples/sokoban/engine.py +0 -678
- synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
- synth_ai/environments/examples/sokoban/environment.py +0 -229
- synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
- synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
- synth_ai/environments/examples/sokoban/taskset.py +0 -428
- synth_ai/environments/examples/sokoban/units/astar_common.py +0 -95
- synth_ai/environments/examples/tictactoe/__init__.py +0 -1
- synth_ai/environments/examples/tictactoe/engine.py +0 -368
- synth_ai/environments/examples/tictactoe/environment.py +0 -240
- synth_ai/environments/examples/tictactoe/taskset.py +0 -215
- synth_ai/environments/examples/verilog/__init__.py +0 -10
- synth_ai/environments/examples/verilog/engine.py +0 -329
- synth_ai/environments/examples/verilog/environment.py +0 -350
- synth_ai/environments/examples/verilog/taskset.py +0 -420
- synth_ai/environments/examples/wordle/__init__.py +0 -29
- synth_ai/environments/examples/wordle/engine.py +0 -398
- synth_ai/environments/examples/wordle/environment.py +0 -159
- synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
- synth_ai/environments/examples/wordle/taskset.py +0 -230
- synth_ai/environments/reproducibility/core.py +0 -42
- synth_ai/environments/reproducibility/helpers.py +0 -0
- synth_ai/environments/reproducibility/tree.py +0 -364
- synth_ai/environments/service/app.py +0 -98
- synth_ai/environments/service/core_routes.py +0 -1020
- synth_ai/environments/service/external_registry.py +0 -56
- synth_ai/environments/service/registry.py +0 -9
- synth_ai/environments/stateful/__init__.py +0 -1
- synth_ai/environments/stateful/core.py +0 -163
- synth_ai/environments/stateful/engine.py +0 -21
- synth_ai/environments/stateful/state.py +0 -7
- synth_ai/environments/tasks/api.py +0 -19
- synth_ai/environments/tasks/core.py +0 -80
- synth_ai/environments/tasks/filters.py +0 -41
- synth_ai/environments/tasks/utils.py +0 -91
- synth_ai/environments/v0_observability/history.py +0 -3
- synth_ai/environments/v0_observability/log.py +0 -2
- synth_ai/evals/base.py +0 -15
- synth_ai/experimental/synth_oss.py +0 -446
- synth_ai/handshake.py +0 -63
- synth_ai/http.py +0 -26
- synth_ai/http_client.py +0 -104
- synth_ai/inference/client.py +0 -20
- synth_ai/install_sqld.sh +0 -40
- synth_ai/jobs/client.py +0 -246
- synth_ai/learning/__init__.py +0 -24
- synth_ai/learning/config.py +0 -43
- synth_ai/learning/filtering.py +0 -0
- synth_ai/learning/ft_client.py +0 -59
- synth_ai/learning/offline/dpo.py +0 -0
- synth_ai/learning/offline/providers.py +0 -7
- synth_ai/learning/offline/sft.py +0 -0
- synth_ai/learning/offline/shared.py +0 -0
- synth_ai/learning/online/grpo.py +0 -0
- synth_ai/learning/online/irft.py +0 -0
- synth_ai/learning/prompts/banking77_injection_eval.py +0 -168
- synth_ai/learning/prompts/gepa.py +0 -0
- synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -213
- synth_ai/learning/prompts/mipro.py +0 -289
- synth_ai/learning/prompts/random_search.py +0 -246
- synth_ai/learning/prompts/run_mipro_banking77.py +0 -172
- synth_ai/learning/prompts/run_random_search_banking77.py +0 -324
- synth_ai/learning/sse.py +0 -58
- synth_ai/learning/validators.py +0 -48
- synth_ai/lm/__init__.py +0 -51
- synth_ai/lm/caching/constants.py +0 -6
- synth_ai/lm/caching/dbs.py +0 -0
- synth_ai/lm/caching/ephemeral.py +0 -102
- synth_ai/lm/caching/handler.py +0 -137
- synth_ai/lm/caching/initialize.py +0 -11
- synth_ai/lm/caching/persistent.py +0 -114
- synth_ai/lm/config.py +0 -110
- synth_ai/lm/constants.py +0 -32
- synth_ai/lm/core/__init__.py +0 -8
- synth_ai/lm/core/all.py +0 -73
- synth_ai/lm/core/exceptions.py +0 -7
- synth_ai/lm/core/main.py +0 -319
- synth_ai/lm/core/main_v3.py +0 -594
- synth_ai/lm/core/synth_models.py +0 -48
- synth_ai/lm/core/vendor_clients.py +0 -188
- synth_ai/lm/cost/__init__.py +0 -0
- synth_ai/lm/cost/monitor.py +0 -1
- synth_ai/lm/cost/statefulness.py +0 -1
- synth_ai/lm/injection.py +0 -80
- synth_ai/lm/overrides.py +0 -206
- synth_ai/lm/provider_support/__init__.py +0 -8
- synth_ai/lm/provider_support/anthropic.py +0 -972
- synth_ai/lm/provider_support/openai.py +0 -1139
- synth_ai/lm/provider_support/suppress_logging.py +0 -31
- synth_ai/lm/structured_outputs/__init__.py +0 -0
- synth_ai/lm/structured_outputs/handler.py +0 -440
- synth_ai/lm/structured_outputs/inject.py +0 -297
- synth_ai/lm/structured_outputs/rehabilitate.py +0 -185
- synth_ai/lm/tools/__init__.py +0 -3
- synth_ai/lm/tools/base.py +0 -172
- synth_ai/lm/unified_interface.py +0 -202
- synth_ai/lm/vendors/__init__.py +0 -0
- synth_ai/lm/vendors/base.py +0 -81
- synth_ai/lm/vendors/core/__init__.py +0 -0
- synth_ai/lm/vendors/core/anthropic_api.py +0 -387
- synth_ai/lm/vendors/core/gemini_api.py +0 -292
- synth_ai/lm/vendors/core/mistral_api.py +0 -322
- synth_ai/lm/vendors/core/openai_api.py +0 -225
- synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
- synth_ai/lm/vendors/local/__init__.py +0 -0
- synth_ai/lm/vendors/local/ollama.py +0 -0
- synth_ai/lm/vendors/openai_standard.py +0 -780
- synth_ai/lm/vendors/openai_standard_responses.py +0 -256
- synth_ai/lm/vendors/retries.py +0 -22
- synth_ai/lm/vendors/supported/__init__.py +0 -0
- synth_ai/lm/vendors/supported/custom_endpoint.py +0 -417
- synth_ai/lm/vendors/supported/deepseek.py +0 -69
- synth_ai/lm/vendors/supported/grok.py +0 -75
- synth_ai/lm/vendors/supported/groq.py +0 -16
- synth_ai/lm/vendors/supported/ollama.py +0 -15
- synth_ai/lm/vendors/supported/openrouter.py +0 -74
- synth_ai/lm/vendors/supported/together.py +0 -11
- synth_ai/lm/vendors/synth_client.py +0 -808
- synth_ai/lm/warmup.py +0 -186
- synth_ai/rl/secrets.py +0 -19
- synth_ai/scripts/verify_rewards.py +0 -100
- synth_ai/task/__init__.py +0 -10
- synth_ai/task/contracts.py +0 -120
- synth_ai/task/health.py +0 -28
- synth_ai/task/validators.py +0 -12
- synth_ai/tracing/__init__.py +0 -30
- synth_ai/tracing_v1/__init__.py +0 -33
- synth_ai/tracing_v3/config.py +0 -84
- synth_ai/tracing_v3/storage/config.py +0 -62
- synth_ai/tracing_v3/turso/__init__.py +0 -25
- synth_ai/tracing_v3/turso/daemon.py +0 -144
- synth_ai/tracing_v3/turso/manager.py +0 -760
- synth_ai/v0/tracing/__init__.py +0 -0
- synth_ai/v0/tracing/abstractions.py +0 -224
- synth_ai/v0/tracing/base_client.py +0 -91
- synth_ai/v0/tracing/client_manager.py +0 -131
- synth_ai/v0/tracing/config.py +0 -142
- synth_ai/v0/tracing/context.py +0 -146
- synth_ai/v0/tracing/decorators.py +0 -682
- synth_ai/v0/tracing/events/__init__.py +0 -0
- synth_ai/v0/tracing/events/manage.py +0 -147
- synth_ai/v0/tracing/events/scope.py +0 -86
- synth_ai/v0/tracing/events/store.py +0 -228
- synth_ai/v0/tracing/immediate_client.py +0 -151
- synth_ai/v0/tracing/local.py +0 -18
- synth_ai/v0/tracing/log_client_base.py +0 -73
- synth_ai/v0/tracing/retry_queue.py +0 -186
- synth_ai/v0/tracing/trackers.py +0 -515
- synth_ai/v0/tracing/upload.py +0 -512
- synth_ai/v0/tracing/utils.py +0 -9
- synth_ai/v0/tracing_v1/__init__.py +0 -16
- synth_ai/v0/tracing_v1/abstractions.py +0 -224
- synth_ai/v0/tracing_v1/base_client.py +0 -91
- synth_ai/v0/tracing_v1/client_manager.py +0 -131
- synth_ai/v0/tracing_v1/config.py +0 -142
- synth_ai/v0/tracing_v1/context.py +0 -146
- synth_ai/v0/tracing_v1/decorators.py +0 -703
- synth_ai/v0/tracing_v1/events/__init__.py +0 -0
- synth_ai/v0/tracing_v1/events/manage.py +0 -147
- synth_ai/v0/tracing_v1/events/scope.py +0 -86
- synth_ai/v0/tracing_v1/events/store.py +0 -228
- synth_ai/v0/tracing_v1/immediate_client.py +0 -151
- synth_ai/v0/tracing_v1/local.py +0 -18
- synth_ai/v0/tracing_v1/log_client_base.py +0 -73
- synth_ai/v0/tracing_v1/retry_queue.py +0 -186
- synth_ai/v0/tracing_v1/trackers.py +0 -515
- synth_ai/v0/tracing_v1/upload.py +0 -527
- synth_ai/v0/tracing_v1/utils.py +0 -9
- synth_ai/zyk/__init__.py +0 -30
- synth_ai-0.2.8.dev2.dist-info/METADATA +0 -129
- synth_ai-0.2.8.dev2.dist-info/RECORD +0 -420
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
- /synth_ai/{lm/caching → core/apps}/__init__.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
- /synth_ai/{compound/cais.py → py.typed} +0 -0
- /synth_ai/{learning → sdk/learning}/core.py +0 -0
- /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
- {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/licenses/LICENSE +0 -0
- {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/top_level.txt +0 -0
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
from dataclasses import dataclass
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
from uuid import UUID
|
|
7
|
-
|
|
8
|
-
from synth_ai.environments.tasks.core import (
|
|
9
|
-
Impetus,
|
|
10
|
-
Intent,
|
|
11
|
-
SplitInfo,
|
|
12
|
-
TaskInstance,
|
|
13
|
-
TaskInstanceMetadata,
|
|
14
|
-
TaskInstanceSet,
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
from .engine import DEFAULT_SOLUTIONS
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@dataclass
|
|
21
|
-
class WordleTaskInstanceMetadata(TaskInstanceMetadata):
|
|
22
|
-
word_length: int
|
|
23
|
-
max_guesses: int
|
|
24
|
-
target_word: str
|
|
25
|
-
enforce_wordlist: bool
|
|
26
|
-
seed: int | None = None
|
|
27
|
-
consume_invalid_attempts: bool = True
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
@dataclass
|
|
31
|
-
class WordleTaskInstance(TaskInstance):
|
|
32
|
-
async def serialize(self) -> dict:
|
|
33
|
-
return {
|
|
34
|
-
"id": str(self.id),
|
|
35
|
-
"impetus": {"instructions": self.impetus.instructions},
|
|
36
|
-
"intent": {
|
|
37
|
-
"rubric": self.intent.rubric,
|
|
38
|
-
"gold_trajectories": self.intent.gold_trajectories,
|
|
39
|
-
"gold_state_diff": self.intent.gold_state_diff,
|
|
40
|
-
},
|
|
41
|
-
"metadata": {
|
|
42
|
-
"word_length": self.metadata.word_length,
|
|
43
|
-
"max_guesses": self.metadata.max_guesses,
|
|
44
|
-
"target_word": self.metadata.target_word,
|
|
45
|
-
"enforce_wordlist": self.metadata.enforce_wordlist,
|
|
46
|
-
"seed": self.metadata.seed,
|
|
47
|
-
"consume_invalid_attempts": self.metadata.consume_invalid_attempts,
|
|
48
|
-
},
|
|
49
|
-
"is_reproducible": self.is_reproducible,
|
|
50
|
-
"initial_engine_snapshot": self.initial_engine_snapshot,
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
@classmethod
|
|
54
|
-
async def deserialize(cls, data: dict) -> WordleTaskInstance:
|
|
55
|
-
from uuid import UUID
|
|
56
|
-
|
|
57
|
-
metadata = WordleTaskInstanceMetadata(
|
|
58
|
-
word_length=data["metadata"]["word_length"],
|
|
59
|
-
max_guesses=data["metadata"]["max_guesses"],
|
|
60
|
-
target_word=data["metadata"]["target_word"],
|
|
61
|
-
enforce_wordlist=data["metadata"]["enforce_wordlist"],
|
|
62
|
-
seed=data["metadata"].get("seed"),
|
|
63
|
-
consume_invalid_attempts=data["metadata"].get("consume_invalid_attempts", True),
|
|
64
|
-
)
|
|
65
|
-
|
|
66
|
-
return cls(
|
|
67
|
-
id=UUID(data["id"]),
|
|
68
|
-
impetus=Impetus(instructions=data["impetus"]["instructions"]),
|
|
69
|
-
intent=Intent(
|
|
70
|
-
rubric=data["intent"]["rubric"],
|
|
71
|
-
gold_trajectories=data["intent"]["gold_trajectories"],
|
|
72
|
-
gold_state_diff=data["intent"]["gold_state_diff"],
|
|
73
|
-
),
|
|
74
|
-
metadata=metadata,
|
|
75
|
-
is_reproducible=data["is_reproducible"],
|
|
76
|
-
initial_engine_snapshot=data["initial_engine_snapshot"],
|
|
77
|
-
)
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
def _stable_uuid_for_instance(idx: int, target: str) -> UUID:
|
|
81
|
-
import uuid
|
|
82
|
-
|
|
83
|
-
return uuid.uuid5(uuid.NAMESPACE_URL, f"wordle-fixed-v1:{idx}:{target}")
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def _load_fixed_instances_json() -> tuple[list[dict], dict]:
|
|
87
|
-
"""Load fixed instances definition from instances.json (if present).
|
|
88
|
-
|
|
89
|
-
Returns a tuple (instances, defaults) where instances is a list of dicts with at least
|
|
90
|
-
target_word fields, and defaults contains default params.
|
|
91
|
-
"""
|
|
92
|
-
import os
|
|
93
|
-
|
|
94
|
-
# Allow override via env var
|
|
95
|
-
override = os.getenv("WORDLE_INSTANCES_JSON")
|
|
96
|
-
p = Path(override) if override else Path(__file__).with_name("instances.json")
|
|
97
|
-
if not p.exists():
|
|
98
|
-
return [], {}
|
|
99
|
-
try:
|
|
100
|
-
data = json.loads(p.read_text())
|
|
101
|
-
defaults = data.get("defaults", {}) or {}
|
|
102
|
-
insts = data.get("instances", []) or []
|
|
103
|
-
return insts, defaults
|
|
104
|
-
except Exception:
|
|
105
|
-
return [], {}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
# Note: generation helpers removed from runtime. Use the provided script in tools/
|
|
109
|
-
_ = None
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
async def create_wordle_taskset(
|
|
113
|
-
*,
|
|
114
|
-
word_length: int = 5,
|
|
115
|
-
max_guesses: int = 6,
|
|
116
|
-
enforce_wordlist: bool = False,
|
|
117
|
-
sample_size: int = 30,
|
|
118
|
-
consume_invalid_attempts: bool = True,
|
|
119
|
-
) -> TaskInstanceSet:
|
|
120
|
-
"""Create a Wordle taskset.
|
|
121
|
-
|
|
122
|
-
Priority:
|
|
123
|
-
1) If instances.json exists, use it to produce a fixed, stable taskset with deterministic IDs.
|
|
124
|
-
2) Otherwise, fall back to a procedural slice of DEFAULT_SOLUTIONS (stable ordering).
|
|
125
|
-
"""
|
|
126
|
-
|
|
127
|
-
json_insts, json_defaults = _load_fixed_instances_json()
|
|
128
|
-
|
|
129
|
-
instances: list[WordleTaskInstance] = []
|
|
130
|
-
# Assemble fixed targets from JSON only (no runtime generation)
|
|
131
|
-
fixed_targets: list[str] = []
|
|
132
|
-
if json_insts:
|
|
133
|
-
fixed_targets.extend(
|
|
134
|
-
[
|
|
135
|
-
str(r.get("target_word", "")).strip().lower()
|
|
136
|
-
for r in json_insts
|
|
137
|
-
if r.get("target_word")
|
|
138
|
-
]
|
|
139
|
-
)
|
|
140
|
-
|
|
141
|
-
if fixed_targets:
|
|
142
|
-
# Use fixed_targets, honoring defaults and slicing by sample_size
|
|
143
|
-
chosen = fixed_targets[:sample_size]
|
|
144
|
-
for i, tgt in enumerate(chosen):
|
|
145
|
-
md = WordleTaskInstanceMetadata(
|
|
146
|
-
word_length=int(word_length),
|
|
147
|
-
max_guesses=int(max_guesses),
|
|
148
|
-
target_word=tgt,
|
|
149
|
-
enforce_wordlist=bool(enforce_wordlist),
|
|
150
|
-
seed=i,
|
|
151
|
-
consume_invalid_attempts=bool(consume_invalid_attempts),
|
|
152
|
-
)
|
|
153
|
-
impetus = Impetus(
|
|
154
|
-
instructions=(
|
|
155
|
-
"Play Wordle. Submit one word per turn consisting only of letters. "
|
|
156
|
-
f"You have up to {md.max_guesses} guesses to find the {md.word_length}-letter target word. "
|
|
157
|
-
"Feedback per letter: G=correct position, Y=present elsewhere, B=absent."
|
|
158
|
-
)
|
|
159
|
-
)
|
|
160
|
-
intent = Intent(
|
|
161
|
-
rubric={"goal": "Guess the target word in as few moves as possible"},
|
|
162
|
-
gold_trajectories=None,
|
|
163
|
-
gold_state_diff={"target_known": False},
|
|
164
|
-
)
|
|
165
|
-
inst = WordleTaskInstance(
|
|
166
|
-
id=_stable_uuid_for_instance(i, md.target_word),
|
|
167
|
-
impetus=impetus,
|
|
168
|
-
intent=intent,
|
|
169
|
-
metadata=md,
|
|
170
|
-
is_reproducible=True,
|
|
171
|
-
initial_engine_snapshot=None,
|
|
172
|
-
)
|
|
173
|
-
instances.append(inst)
|
|
174
|
-
else:
|
|
175
|
-
# Procedural fallback: stable ordering from DEFAULT_SOLUTIONS
|
|
176
|
-
pool = [w for w in DEFAULT_SOLUTIONS if len(w) == word_length] or [
|
|
177
|
-
w for w in DEFAULT_SOLUTIONS if len(w) == 5
|
|
178
|
-
]
|
|
179
|
-
sample = pool[:sample_size]
|
|
180
|
-
for i, target in enumerate(sample):
|
|
181
|
-
seed = i
|
|
182
|
-
md = WordleTaskInstanceMetadata(
|
|
183
|
-
word_length=word_length,
|
|
184
|
-
max_guesses=max_guesses,
|
|
185
|
-
target_word=target,
|
|
186
|
-
enforce_wordlist=enforce_wordlist,
|
|
187
|
-
seed=seed,
|
|
188
|
-
consume_invalid_attempts=consume_invalid_attempts,
|
|
189
|
-
)
|
|
190
|
-
impetus = Impetus(
|
|
191
|
-
instructions=(
|
|
192
|
-
"Play Wordle. Submit one word per turn consisting only of letters. "
|
|
193
|
-
f"You have up to {max_guesses} guesses to find the {word_length}-letter target word. "
|
|
194
|
-
"Feedback per letter: G=correct position, Y=present elsewhere, B=absent."
|
|
195
|
-
)
|
|
196
|
-
)
|
|
197
|
-
intent = Intent(
|
|
198
|
-
rubric={"goal": "Guess the target word in as few moves as possible"},
|
|
199
|
-
gold_trajectories=None,
|
|
200
|
-
gold_state_diff={"target_known": False},
|
|
201
|
-
)
|
|
202
|
-
inst = WordleTaskInstance(
|
|
203
|
-
id=_stable_uuid_for_instance(i, target),
|
|
204
|
-
impetus=impetus,
|
|
205
|
-
intent=intent,
|
|
206
|
-
metadata=md,
|
|
207
|
-
is_reproducible=True,
|
|
208
|
-
initial_engine_snapshot=None,
|
|
209
|
-
)
|
|
210
|
-
instances.append(inst)
|
|
211
|
-
|
|
212
|
-
# Deterministic split based on index positions
|
|
213
|
-
val_ids = {instances[i].id for i in range(0, len(instances), 5)}
|
|
214
|
-
test_ids = {instances[i].id for i in range(0, len(instances), 7)}
|
|
215
|
-
split = SplitInfo(val_instance_ids=val_ids, test_instance_ids=test_ids, _is_split_defined=True)
|
|
216
|
-
|
|
217
|
-
return TaskInstanceSet(
|
|
218
|
-
name="Wordle Fixed TaskSet" if json_insts else "Wordle Example TaskSet",
|
|
219
|
-
description=(
|
|
220
|
-
"Fixed set from instances.json (stable ordering)."
|
|
221
|
-
if json_insts
|
|
222
|
-
else "Lightweight Wordle tasks with fixed targets and seeds."
|
|
223
|
-
),
|
|
224
|
-
instances=instances,
|
|
225
|
-
split_info=split,
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
# Alias
|
|
230
|
-
taskset = create_wordle_taskset
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
from abc import ABC, abstractmethod
|
|
2
|
-
from typing import Any, Generic, TypeVar
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
class IReproducibleEngine(ABC):
|
|
6
|
-
"""
|
|
7
|
-
An abstract base class for engines that support serialization and deserialization,
|
|
8
|
-
making them reproducible.
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
@abstractmethod
|
|
12
|
-
async def _serialize_engine(
|
|
13
|
-
self,
|
|
14
|
-
) -> Any: # Replace Any with a more specific Snapshot type if common one emerges
|
|
15
|
-
"""Serializes the current state of the engine."""
|
|
16
|
-
pass
|
|
17
|
-
|
|
18
|
-
@classmethod
|
|
19
|
-
@abstractmethod
|
|
20
|
-
async def _deserialize_engine(cls, snapshot: Any) -> "IReproducibleEngine": # Replace Any
|
|
21
|
-
"""Creates an engine instance from a serialized snapshot."""
|
|
22
|
-
pass
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# Type variable for the engine, ensuring it adheres to the IReproducibleEngine interface.
|
|
26
|
-
EngineType_co = TypeVar("EngineType_co", bound=IReproducibleEngine, covariant=True)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
class ReproducibleEnvironment(Generic[EngineType_co]):
|
|
30
|
-
"""
|
|
31
|
-
A mixin class for environments that support reproducibility through
|
|
32
|
-
engine serialization and deserialization.
|
|
33
|
-
|
|
34
|
-
It expects the environment to have an 'engine' attribute that conforms to
|
|
35
|
-
the IReproducibleEngine interface. This contract is enforced via type hinting
|
|
36
|
-
and the IReproducibleEngine ABC.
|
|
37
|
-
"""
|
|
38
|
-
|
|
39
|
-
engine: EngineType_co
|
|
40
|
-
# No explicit runtime checks like hasattr are performed here.
|
|
41
|
-
# The presence and correctness of _serialize_engine and _deserialize_engine
|
|
42
|
-
# methods on the engine are ensured by the IReproducibleEngine contract.
|
|
File without changes
|
|
@@ -1,364 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
NOTE - first pass was o3-generated. Mostly bc idrk what I 'want' from this yet ...
|
|
3
|
-
trajectory_tree_store.py
|
|
4
|
-
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
5
|
-
A minimal search-tree wrapper that pairs
|
|
6
|
-
|
|
7
|
-
• an *in-memory* NetworkX DiGraph (parent ⇢ children edges)
|
|
8
|
-
• a *content-addressable* FilesystemSnapshotStore (heavy blobs)
|
|
9
|
-
|
|
10
|
-
so you can implement things like LATS / MCTS without bringing in the
|
|
11
|
-
big “backend.production” code-base.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import annotations
|
|
15
|
-
|
|
16
|
-
import gzip
|
|
17
|
-
import json
|
|
18
|
-
import logging
|
|
19
|
-
import pickle
|
|
20
|
-
import sqlite3
|
|
21
|
-
from collections.abc import Iterable
|
|
22
|
-
from pathlib import Path
|
|
23
|
-
from typing import Any
|
|
24
|
-
|
|
25
|
-
import networkx as nx
|
|
26
|
-
|
|
27
|
-
# from filesystem_snapshot_store import FilesystemSnapshotStore # ← your re-impl
|
|
28
|
-
|
|
29
|
-
log = logging.getLogger(__name__)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
# --------------------------------------------------------------------------- #
|
|
33
|
-
# lightweight metadata record #
|
|
34
|
-
# --------------------------------------------------------------------------- #
|
|
35
|
-
import hashlib
|
|
36
|
-
import logging
|
|
37
|
-
import os
|
|
38
|
-
|
|
39
|
-
log = logging.getLogger(__name__)
|
|
40
|
-
|
|
41
|
-
# Default directory for storing snapshots relative to some base path
|
|
42
|
-
# This could be configured via environment variables or settings later.
|
|
43
|
-
DEFAULT_SNAPSHOT_DIR = Path(os.getenv("SNAPSHOT_STORE_PATH", "/tmp/agent_snapshots"))
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
class FilesystemSnapshotStore:
|
|
47
|
-
"""
|
|
48
|
-
Stores and retrieves environment state snapshots on the filesystem.
|
|
49
|
-
|
|
50
|
-
Uses content-addressable storage: the key (ID) for a snapshot
|
|
51
|
-
is the SHA-256 hash of its compressed content.
|
|
52
|
-
"""
|
|
53
|
-
|
|
54
|
-
def __init__(self, base_dir: str | Path = DEFAULT_SNAPSHOT_DIR):
|
|
55
|
-
self.base_dir = Path(base_dir)
|
|
56
|
-
try:
|
|
57
|
-
self.base_dir.mkdir(parents=True, exist_ok=True)
|
|
58
|
-
log.info(f"Initialized snapshot store at: {self.base_dir}")
|
|
59
|
-
except OSError as e:
|
|
60
|
-
log.error(
|
|
61
|
-
f"Failed to create snapshot directory {self.base_dir}: {e}",
|
|
62
|
-
exc_info=True,
|
|
63
|
-
)
|
|
64
|
-
raise
|
|
65
|
-
|
|
66
|
-
def _get_path(self, key: str) -> Path:
|
|
67
|
-
"""Constructs the full path for a given snapshot key."""
|
|
68
|
-
# Maybe add subdirectories later for large numbers of files, e.g., key[:2]/key[2:]
|
|
69
|
-
filename = f"{key}.snapshot.gz"
|
|
70
|
-
return self.base_dir / filename
|
|
71
|
-
|
|
72
|
-
def write(self, blob: bytes | dict[str, Any]) -> str:
|
|
73
|
-
"""
|
|
74
|
-
Stores a snapshot blob (bytes or dict) and returns its SHA-256 key.
|
|
75
|
-
|
|
76
|
-
• Dicts → pickle → gzip
|
|
77
|
-
• Bytes already gzip-compressed (magic 0x1f 0x8b) are stored as-is
|
|
78
|
-
to avoid double compression.
|
|
79
|
-
"""
|
|
80
|
-
try:
|
|
81
|
-
if isinstance(blob, dict):
|
|
82
|
-
compressed_blob = gzip.compress(pickle.dumps(blob))
|
|
83
|
-
elif isinstance(blob, bytes):
|
|
84
|
-
# Skip re-compression if data is already gzipped
|
|
85
|
-
compressed_blob = blob if blob[:2] == b"\x1f\x8b" else gzip.compress(blob)
|
|
86
|
-
else:
|
|
87
|
-
raise TypeError(f"Unsupported blob type for snapshot store: {type(blob)}")
|
|
88
|
-
|
|
89
|
-
key = hashlib.sha256(compressed_blob).hexdigest()
|
|
90
|
-
path = self._get_path(key)
|
|
91
|
-
if not path.exists():
|
|
92
|
-
path.write_bytes(compressed_blob)
|
|
93
|
-
return key
|
|
94
|
-
except Exception as e:
|
|
95
|
-
log.error(f"Failed to write snapshot: {e}", exc_info=True)
|
|
96
|
-
raise
|
|
97
|
-
|
|
98
|
-
def read(self, key: str) -> bytes | None:
|
|
99
|
-
"""
|
|
100
|
-
Retrieves the raw *compressed* snapshot bytes for a given key.
|
|
101
|
-
|
|
102
|
-
Returns None if the key is not found.
|
|
103
|
-
Deserialization (decompression, unpickling) is the responsibility
|
|
104
|
-
of the caller (e.g., ReproducibleResource.from_snapshot).
|
|
105
|
-
"""
|
|
106
|
-
filepath = self._get_path(key)
|
|
107
|
-
if not filepath.exists():
|
|
108
|
-
log.warning(f"Snapshot key not found: {key}")
|
|
109
|
-
return None
|
|
110
|
-
try:
|
|
111
|
-
with open(filepath, "rb") as f:
|
|
112
|
-
compressed_blob = f.read()
|
|
113
|
-
return compressed_blob
|
|
114
|
-
except OSError as e:
|
|
115
|
-
log.error(f"Failed to read snapshot {key} from {filepath}: {e}", exc_info=True)
|
|
116
|
-
return None # Or re-raise? Returning None might be safer.
|
|
117
|
-
|
|
118
|
-
def exists(self, key: str) -> bool:
|
|
119
|
-
"""Checks if a snapshot with the given key exists."""
|
|
120
|
-
return self._get_path(key).exists()
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
# Global instance (optional, could use dependency injection)
|
|
124
|
-
# snapshot_store = FilesystemSnapshotStore()
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
class TrajectorySnapshot:
|
|
128
|
-
"""
|
|
129
|
-
A *metadata* header for one node in the search tree.
|
|
130
|
-
The heavy serialized-state bytes live only in the snapshot store.
|
|
131
|
-
"""
|
|
132
|
-
|
|
133
|
-
__slots__ = (
|
|
134
|
-
"snap_id",
|
|
135
|
-
"parent_id",
|
|
136
|
-
"depth",
|
|
137
|
-
"action",
|
|
138
|
-
"reward",
|
|
139
|
-
"terminated",
|
|
140
|
-
"info",
|
|
141
|
-
)
|
|
142
|
-
|
|
143
|
-
def __init__(
|
|
144
|
-
self,
|
|
145
|
-
snap_id: str,
|
|
146
|
-
parent_id: str | None,
|
|
147
|
-
depth: int,
|
|
148
|
-
action: Any | None,
|
|
149
|
-
reward: float = 0.0,
|
|
150
|
-
terminated: bool = False,
|
|
151
|
-
info: dict[str, Any] | None = None,
|
|
152
|
-
):
|
|
153
|
-
self.snap_id = snap_id
|
|
154
|
-
self.parent_id = parent_id
|
|
155
|
-
self.depth = depth
|
|
156
|
-
self.action = action
|
|
157
|
-
self.reward = reward
|
|
158
|
-
self.terminated = bool(terminated)
|
|
159
|
-
self.info = info or {}
|
|
160
|
-
|
|
161
|
-
# helpful for printing / debugging
|
|
162
|
-
def __repr__(self) -> str: # pragma: no cover
|
|
163
|
-
a = json.dumps(self.action) if self.action is not None else "∅"
|
|
164
|
-
return (
|
|
165
|
-
f"TrajSnap(id={self.snap_id[:7]}…, depth={self.depth}, "
|
|
166
|
-
f"action={a}, reward={self.reward}, term={self.terminated})"
|
|
167
|
-
)
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
# --------------------------------------------------------------------------- #
|
|
171
|
-
# tree manager #
|
|
172
|
-
# --------------------------------------------------------------------------- #
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
class TrajectoryTreeStore:
|
|
176
|
-
"""
|
|
177
|
-
❑ Adds snapshots (root / children) and keeps the DAG in-memory
|
|
178
|
-
❑ Optionally mirrors headers to a tiny SQLite DB (so you can kill +
|
|
179
|
-
resume a long search)
|
|
180
|
-
❑ Hands out raw snapshot **bytes**; decoding is up to the caller.
|
|
181
|
-
"""
|
|
182
|
-
|
|
183
|
-
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
|
|
184
|
-
# construction #
|
|
185
|
-
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
|
|
186
|
-
|
|
187
|
-
def __init__(
|
|
188
|
-
self,
|
|
189
|
-
snapshot_store: FilesystemSnapshotStore | None = None,
|
|
190
|
-
*,
|
|
191
|
-
db_path: Path | str | None = None,
|
|
192
|
-
):
|
|
193
|
-
self.snap_store = snapshot_store or FilesystemSnapshotStore()
|
|
194
|
-
self.graph: nx.DiGraph = nx.DiGraph()
|
|
195
|
-
self.db_path = Path(db_path).expanduser() if db_path else None
|
|
196
|
-
if self.db_path:
|
|
197
|
-
self._init_sqlite()
|
|
198
|
-
|
|
199
|
-
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
|
|
200
|
-
# public API #
|
|
201
|
-
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
|
|
202
|
-
|
|
203
|
-
# insertion -------------------------------------------------------------
|
|
204
|
-
|
|
205
|
-
def add_root(self, snapshot_blob: bytes, *, info: dict[str, Any] | None = None) -> str:
|
|
206
|
-
"""Insert the very first node and return its content-hash key."""
|
|
207
|
-
snap_id = self.snap_store.write(snapshot_blob)
|
|
208
|
-
self._add_node(TrajectorySnapshot(snap_id, None, 0, None, 0.0, False, info))
|
|
209
|
-
return snap_id
|
|
210
|
-
|
|
211
|
-
def add_child(
|
|
212
|
-
self,
|
|
213
|
-
parent_id: str,
|
|
214
|
-
snapshot_blob: bytes,
|
|
215
|
-
*,
|
|
216
|
-
action: Any,
|
|
217
|
-
reward: float,
|
|
218
|
-
terminated: bool = False,
|
|
219
|
-
info: dict[str, Any] | None = None,
|
|
220
|
-
) -> str:
|
|
221
|
-
"""Attach `snapshot_blob` as a child reached by `action` from *parent_id*."""
|
|
222
|
-
if parent_id not in self.graph:
|
|
223
|
-
raise KeyError(f"Parent snapshot {parent_id[:8]}… not in tree")
|
|
224
|
-
depth = self.graph.nodes[parent_id]["meta"].depth + 1 # type: ignore[index]
|
|
225
|
-
snap_id = self.snap_store.write(snapshot_blob)
|
|
226
|
-
meta = TrajectorySnapshot(snap_id, parent_id, depth, action, reward, terminated, info)
|
|
227
|
-
self._add_node(meta) # records node + (maybe) SQLite
|
|
228
|
-
self.graph.add_edge(parent_id, snap_id, action=action, reward=reward) # NX edge attrs
|
|
229
|
-
return snap_id
|
|
230
|
-
|
|
231
|
-
# read-side helpers -----------------------------------------------------
|
|
232
|
-
|
|
233
|
-
def get_children(self, snap_id: str) -> tuple[str, ...]:
|
|
234
|
-
return tuple(self.graph.successors(snap_id))
|
|
235
|
-
|
|
236
|
-
def get_parent(self, snap_id: str) -> str | None:
|
|
237
|
-
preds = tuple(self.graph.predecessors(snap_id))
|
|
238
|
-
return preds[0] if preds else None
|
|
239
|
-
|
|
240
|
-
def is_leaf(self, snap_id: str) -> bool:
|
|
241
|
-
return self.graph.out_degree(snap_id) == 0
|
|
242
|
-
|
|
243
|
-
# simple enumerations useful for MCTS / LATS ---------------------------
|
|
244
|
-
|
|
245
|
-
def iter_leaves(self) -> Iterable[str]:
|
|
246
|
-
"""Yield snapshot-ids that currently have no children."""
|
|
247
|
-
return (n for n in self.graph.nodes if self.is_leaf(n))
|
|
248
|
-
|
|
249
|
-
def path_to_root(self, snap_id: str) -> tuple[str, ...]:
|
|
250
|
-
"""Return (snap_id, …, root_id)"""
|
|
251
|
-
path = [snap_id]
|
|
252
|
-
while (p := self.get_parent(path[-1])) is not None:
|
|
253
|
-
path.append(p)
|
|
254
|
-
return tuple(path)
|
|
255
|
-
|
|
256
|
-
def reconstruct_actions(self, snap_id: str) -> tuple[Any, ...]:
|
|
257
|
-
"""Return the sequence of *actions* from the root → `snap_id`."""
|
|
258
|
-
actions = []
|
|
259
|
-
for child, parent in zip(self.path_to_root(snap_id)[:-1], self.path_to_root(snap_id)[1:], strict=False):
|
|
260
|
-
actions.append(self.graph.edges[parent, child]["action"])
|
|
261
|
-
return tuple(reversed(actions))
|
|
262
|
-
|
|
263
|
-
# snapshot access -------------------------------------------------------
|
|
264
|
-
|
|
265
|
-
def load_snapshot_blob(self, snap_id: str) -> bytes:
|
|
266
|
-
blob = self.snap_store.read(snap_id)
|
|
267
|
-
if blob is None:
|
|
268
|
-
raise FileNotFoundError(f"Snapshot {snap_id[:8]}… missing on disk")
|
|
269
|
-
return blob
|
|
270
|
-
|
|
271
|
-
def load_pickled_payload(self, snap_id: str) -> Any:
|
|
272
|
-
"""Decompress + unpickle whatever you stored under this id."""
|
|
273
|
-
return pickle.loads(gzip.decompress(self.load_snapshot_blob(snap_id)))
|
|
274
|
-
|
|
275
|
-
# mutation --------------------------------------------------------------
|
|
276
|
-
|
|
277
|
-
def prune_subtree(self, root_id: str) -> None:
|
|
278
|
-
"""Remove *root_id* and all its descendants from the in-mem graph and DB."""
|
|
279
|
-
doomed = list(nx.dfs_preorder_nodes(self.graph, root_id))
|
|
280
|
-
self.graph.remove_nodes_from(doomed)
|
|
281
|
-
if self.db_path:
|
|
282
|
-
with sqlite3.connect(self.db_path) as conn:
|
|
283
|
-
conn.executemany("DELETE FROM nodes WHERE snap_id = ?;", ((n,) for n in doomed))
|
|
284
|
-
conn.executemany(
|
|
285
|
-
"DELETE FROM edges WHERE parent_id = ? OR child_id = ?;",
|
|
286
|
-
((n, n) for n in doomed),
|
|
287
|
-
)
|
|
288
|
-
conn.commit()
|
|
289
|
-
|
|
290
|
-
def wipe(self) -> None:
|
|
291
|
-
"""Clear the *entire* tree (does **not** delete snapshot files)."""
|
|
292
|
-
self.graph.clear()
|
|
293
|
-
if self.db_path:
|
|
294
|
-
with sqlite3.connect(self.db_path) as conn:
|
|
295
|
-
conn.executescript("DELETE FROM nodes; DELETE FROM edges;")
|
|
296
|
-
conn.commit()
|
|
297
|
-
|
|
298
|
-
# ------------------------------------------------------------------- #
|
|
299
|
-
# internal helpers #
|
|
300
|
-
# ------------------------------------------------------------------- #
|
|
301
|
-
|
|
302
|
-
def _add_node(self, meta: TrajectorySnapshot) -> None:
|
|
303
|
-
self.graph.add_node(meta.snap_id, meta=meta)
|
|
304
|
-
if self.db_path:
|
|
305
|
-
self._sqlite_insert(meta)
|
|
306
|
-
|
|
307
|
-
# ------------------------------------------------------------------- #
|
|
308
|
-
# tiny SQLite backing store (optional) #
|
|
309
|
-
# ------------------------------------------------------------------- #
|
|
310
|
-
|
|
311
|
-
def _init_sqlite(self) -> None:
|
|
312
|
-
self.db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
313
|
-
with sqlite3.connect(self.db_path) as conn:
|
|
314
|
-
conn.executescript(
|
|
315
|
-
"""
|
|
316
|
-
CREATE TABLE IF NOT EXISTS nodes(
|
|
317
|
-
snap_id TEXT PRIMARY KEY,
|
|
318
|
-
parent_id TEXT,
|
|
319
|
-
depth INTEGER,
|
|
320
|
-
action TEXT,
|
|
321
|
-
reward REAL,
|
|
322
|
-
terminated INTEGER,
|
|
323
|
-
info TEXT
|
|
324
|
-
);
|
|
325
|
-
CREATE TABLE IF NOT EXISTS edges(
|
|
326
|
-
parent_id TEXT,
|
|
327
|
-
child_id TEXT,
|
|
328
|
-
action TEXT,
|
|
329
|
-
reward REAL,
|
|
330
|
-
PRIMARY KEY(parent_id, child_id)
|
|
331
|
-
);
|
|
332
|
-
"""
|
|
333
|
-
)
|
|
334
|
-
conn.commit()
|
|
335
|
-
|
|
336
|
-
def _sqlite_insert(self, meta: TrajectorySnapshot) -> None:
|
|
337
|
-
with sqlite3.connect(self.db_path) as conn:
|
|
338
|
-
conn.execute(
|
|
339
|
-
"""INSERT OR IGNORE INTO nodes
|
|
340
|
-
(snap_id, parent_id, depth, action, reward, terminated, info)
|
|
341
|
-
VALUES (?,?,?,?,?,?,?)""",
|
|
342
|
-
(
|
|
343
|
-
meta.snap_id,
|
|
344
|
-
meta.parent_id,
|
|
345
|
-
meta.depth,
|
|
346
|
-
json.dumps(meta.action),
|
|
347
|
-
meta.reward,
|
|
348
|
-
int(meta.terminated),
|
|
349
|
-
json.dumps(meta.info),
|
|
350
|
-
),
|
|
351
|
-
)
|
|
352
|
-
if meta.parent_id:
|
|
353
|
-
conn.execute(
|
|
354
|
-
"""INSERT OR IGNORE INTO edges
|
|
355
|
-
(parent_id, child_id, action, reward)
|
|
356
|
-
VALUES (?,?,?,?)""",
|
|
357
|
-
(
|
|
358
|
-
meta.parent_id,
|
|
359
|
-
meta.snap_id,
|
|
360
|
-
json.dumps(meta.action),
|
|
361
|
-
meta.reward,
|
|
362
|
-
),
|
|
363
|
-
)
|
|
364
|
-
conn.commit()
|