synth-ai 0.2.6.dev1__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/cli/demo_apps/core/cli.py +1735 -0
- 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 +117 -51
- 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/cli/demo_apps/demo_task_apps/math/_common.py +16 -0
- 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} +21 -3
- 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 -102
- 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.6.dev1.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 -131
- synth_ai/cli/legacy_root_backup.py +0 -470
- synth_ai/cli/man.py +0 -106
- synth_ai/cli/rl_demo.py +0 -137
- synth_ai/cli/status.py +0 -133
- synth_ai/config/base_url.py +0 -98
- 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/core/cli.py +0 -685
- synth_ai/demos/demo_task_apps/__init__.py +0 -1
- synth_ai/demos/demo_task_apps/math/config.toml +0 -44
- synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
- 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 -724
- 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 -91
- 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/http.py +0 -102
- 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 -220
- 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 -140
- synth_ai/v0/tracing/context.py +0 -146
- synth_ai/v0/tracing/decorators.py +0 -680
- 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 -510
- 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 -140
- synth_ai/v0/tracing_v1/context.py +0 -146
- synth_ai/v0/tracing_v1/decorators.py +0 -701
- 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 -525
- synth_ai/v0/tracing_v1/utils.py +0 -9
- synth_ai/zyk/__init__.py +0 -30
- synth_ai-0.2.6.dev1.dist-info/METADATA +0 -106
- synth_ai-0.2.6.dev1.dist-info/RECORD +0 -416
- /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.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/licenses/LICENSE +0 -0
- {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/top_level.txt +0 -0
|
@@ -3,12 +3,13 @@ from __future__ import annotations
|
|
|
3
3
|
import json
|
|
4
4
|
import os
|
|
5
5
|
import subprocess
|
|
6
|
-
import
|
|
7
|
-
import time
|
|
6
|
+
import urllib.request
|
|
8
7
|
from dataclasses import dataclass
|
|
9
|
-
from typing import Any
|
|
8
|
+
from typing import Any
|
|
10
9
|
|
|
11
|
-
import
|
|
10
|
+
from synth_ai.core.env import PROD_BASE_URL_DEFAULT
|
|
11
|
+
|
|
12
|
+
DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-secret"
|
|
12
13
|
|
|
13
14
|
|
|
14
15
|
@dataclass
|
|
@@ -18,7 +19,7 @@ class DemoEnv:
|
|
|
18
19
|
env_api_key: str = ""
|
|
19
20
|
task_app_base_url: str = ""
|
|
20
21
|
task_app_name: str = ""
|
|
21
|
-
task_app_secret_name: str =
|
|
22
|
+
task_app_secret_name: str = DEFAULT_TASK_APP_SECRET_NAME
|
|
22
23
|
|
|
23
24
|
|
|
24
25
|
def _mask(value: str, keep: int = 4) -> str:
|
|
@@ -31,7 +32,7 @@ def _state_path() -> str:
|
|
|
31
32
|
return os.path.expanduser("~/.synth-ai/demo.json")
|
|
32
33
|
|
|
33
34
|
|
|
34
|
-
def _read_state() ->
|
|
35
|
+
def _read_state() -> dict[str, Any]:
|
|
35
36
|
try:
|
|
36
37
|
path = _state_path()
|
|
37
38
|
if os.path.isfile(path):
|
|
@@ -43,7 +44,7 @@ def _read_state() -> Dict[str, Any]:
|
|
|
43
44
|
return {}
|
|
44
45
|
|
|
45
46
|
|
|
46
|
-
def _write_state(data:
|
|
47
|
+
def _write_state(data: dict[str, Any]) -> None:
|
|
47
48
|
try:
|
|
48
49
|
path = _state_path()
|
|
49
50
|
os.makedirs(os.path.dirname(path), exist_ok=True)
|
|
@@ -53,8 +54,8 @@ def _write_state(data: Dict[str, Any]) -> None:
|
|
|
53
54
|
pass
|
|
54
55
|
|
|
55
56
|
|
|
56
|
-
def load_dotenv_file(path: str) ->
|
|
57
|
-
out:
|
|
57
|
+
def load_dotenv_file(path: str) -> dict[str, str]:
|
|
58
|
+
out: dict[str, str] = {}
|
|
58
59
|
try:
|
|
59
60
|
with open(path) as fh:
|
|
60
61
|
for raw in fh:
|
|
@@ -68,7 +69,7 @@ def load_dotenv_file(path: str) -> Dict[str, str]:
|
|
|
68
69
|
return out
|
|
69
70
|
|
|
70
71
|
|
|
71
|
-
def _persist_dotenv_values(path: str, values:
|
|
72
|
+
def _persist_dotenv_values(path: str, values: dict[str, str]) -> None:
|
|
72
73
|
"""Ensure ``values`` are present in ``path`` (.env style)."""
|
|
73
74
|
|
|
74
75
|
try:
|
|
@@ -78,7 +79,7 @@ def _persist_dotenv_values(path: str, values: Dict[str, str]) -> None:
|
|
|
78
79
|
existing_lines = fh.read().splitlines()
|
|
79
80
|
else:
|
|
80
81
|
os.makedirs(os.path.dirname(path) or ".", exist_ok=True)
|
|
81
|
-
mapping:
|
|
82
|
+
mapping: dict[str, str] = {}
|
|
82
83
|
order: list[str] = []
|
|
83
84
|
for line in existing_lines:
|
|
84
85
|
if not line or line.startswith("#") or "=" not in line:
|
|
@@ -106,7 +107,7 @@ def _persist_dotenv_values(path: str, values: Dict[str, str]) -> None:
|
|
|
106
107
|
pass
|
|
107
108
|
|
|
108
109
|
|
|
109
|
-
def persist_dotenv_values(values:
|
|
110
|
+
def persist_dotenv_values(values: dict[str, str], *, cwd: str | None = None) -> str:
|
|
110
111
|
path = os.path.join(cwd or os.getcwd(), ".env")
|
|
111
112
|
_persist_dotenv_values(path, values)
|
|
112
113
|
return path
|
|
@@ -118,14 +119,41 @@ def persist_env_api_key(key: str) -> None:
|
|
|
118
119
|
_write_state(data)
|
|
119
120
|
|
|
120
121
|
|
|
121
|
-
def
|
|
122
|
+
def persist_demo_dir(demo_dir: str) -> None:
|
|
123
|
+
"""Store the demo directory path for subsequent commands."""
|
|
124
|
+
data = _read_state()
|
|
125
|
+
data["DEMO_DIR"] = demo_dir
|
|
126
|
+
_write_state(data)
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def load_demo_dir() -> str | None:
|
|
130
|
+
"""Load the stored demo directory path, if any."""
|
|
131
|
+
data = _read_state()
|
|
132
|
+
return data.get("DEMO_DIR")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def persist_env_file_path(env_path: str) -> None:
|
|
136
|
+
"""Store the .env file path for subsequent commands."""
|
|
137
|
+
data = _read_state()
|
|
138
|
+
data["ENV_FILE_PATH"] = env_path
|
|
139
|
+
_write_state(data)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def load_env_file_path() -> str | None:
|
|
143
|
+
"""Load the stored .env file path, if any."""
|
|
144
|
+
data = _read_state()
|
|
145
|
+
return data.get("ENV_FILE_PATH")
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def modal_auth_status() -> tuple[bool, str]:
|
|
122
149
|
"""Return (ok, message) describing Modal CLI credential status."""
|
|
123
150
|
|
|
124
151
|
env_token_id = (os.environ.get("MODAL_TOKEN_ID") or "").strip()
|
|
125
152
|
env_token_secret = (os.environ.get("MODAL_TOKEN_SECRET") or "").strip()
|
|
126
153
|
|
|
127
154
|
try:
|
|
128
|
-
from modal.config import config as modal_config
|
|
155
|
+
from modal.config import config as modal_config
|
|
156
|
+
from modal.config import user_config_path
|
|
129
157
|
except Exception as exc: # pragma: no cover - modal optional in some envs
|
|
130
158
|
return False, f"Modal client unavailable ({exc})"
|
|
131
159
|
|
|
@@ -169,7 +197,7 @@ def load_env() -> DemoEnv:
|
|
|
169
197
|
Backend URL:
|
|
170
198
|
- Use BACKEND_OVERRIDE (any) from CWD .env if set
|
|
171
199
|
- Else use DEV_BACKEND_URL from CWD .env ONLY if it's localhost/127.0.0.1 or :8000
|
|
172
|
-
- Else default to
|
|
200
|
+
- Else default to production backend (PROD_BASE_URL_DEFAULT)
|
|
173
201
|
|
|
174
202
|
API keys:
|
|
175
203
|
- SYNTH_API_KEY from OS -> CWD .env -> repo .env -> pkg demo .env -> state
|
|
@@ -180,7 +208,7 @@ def load_env() -> DemoEnv:
|
|
|
180
208
|
"""
|
|
181
209
|
env = DemoEnv()
|
|
182
210
|
|
|
183
|
-
os_env:
|
|
211
|
+
os_env: dict[str, str] = dict(os.environ)
|
|
184
212
|
|
|
185
213
|
# CWD .env
|
|
186
214
|
cwd_env_path = os.path.join(os.getcwd(), ".env")
|
|
@@ -189,27 +217,42 @@ def load_env() -> DemoEnv:
|
|
|
189
217
|
# Repo/package .envs (fallbacks)
|
|
190
218
|
repo_root = os.path.abspath(os.path.join(os.path.dirname(__file__), "../../.."))
|
|
191
219
|
repo_env = load_dotenv_file(os.path.join(repo_root, ".env"))
|
|
192
|
-
pkg_env = load_dotenv_file(
|
|
220
|
+
pkg_env = load_dotenv_file(
|
|
221
|
+
os.path.join(repo_root, "synth_ai", "demos", "demo_task_apps", "math", ".env")
|
|
222
|
+
)
|
|
193
223
|
examples_env = load_dotenv_file(os.path.join(repo_root, "examples", "rl", ".env"))
|
|
194
224
|
|
|
195
225
|
state = _read_state()
|
|
196
226
|
|
|
227
|
+
default_root = PROD_BASE_URL_DEFAULT.rstrip("/")
|
|
228
|
+
prod_default = f"{default_root}/api"
|
|
229
|
+
|
|
197
230
|
# Backend URL resolution
|
|
198
|
-
backend_override = (
|
|
199
|
-
|
|
200
|
-
|
|
231
|
+
backend_override = (
|
|
232
|
+
os_env.get("BACKEND_OVERRIDE")
|
|
233
|
+
or cwd_env.get("BACKEND_OVERRIDE")
|
|
234
|
+
or repo_env.get("BACKEND_OVERRIDE")
|
|
235
|
+
or pkg_env.get("BACKEND_OVERRIDE")
|
|
236
|
+
or examples_env.get("BACKEND_OVERRIDE")
|
|
237
|
+
or ""
|
|
238
|
+
).strip()
|
|
239
|
+
dev_env = (
|
|
240
|
+
os_env.get("DEV_BACKEND_URL")
|
|
241
|
+
or cwd_env.get("DEV_BACKEND_URL")
|
|
242
|
+
or repo_env.get("DEV_BACKEND_URL")
|
|
243
|
+
or pkg_env.get("DEV_BACKEND_URL")
|
|
244
|
+
or ""
|
|
245
|
+
).strip()
|
|
201
246
|
if backend_override:
|
|
202
247
|
dev_url = backend_override
|
|
203
|
-
use_dev = True
|
|
204
248
|
elif dev_env:
|
|
205
249
|
lower = dev_env.lower()
|
|
206
250
|
if "localhost" in lower or "127.0.0.1" in lower or lower.endswith(":8000"):
|
|
207
251
|
dev_url = dev_env
|
|
208
|
-
use_dev = True
|
|
209
252
|
else:
|
|
210
|
-
dev_url =
|
|
253
|
+
dev_url = prod_default
|
|
211
254
|
else:
|
|
212
|
-
dev_url =
|
|
255
|
+
dev_url = prod_default
|
|
213
256
|
if not dev_url.endswith("/api"):
|
|
214
257
|
dev_url = dev_url.rstrip("/") + "/api"
|
|
215
258
|
|
|
@@ -222,7 +265,11 @@ def load_env() -> DemoEnv:
|
|
|
222
265
|
or str(state.get("SYNTH_API_KEY") or "")
|
|
223
266
|
)
|
|
224
267
|
if not synth_api_key:
|
|
225
|
-
mode =
|
|
268
|
+
mode = (
|
|
269
|
+
"prod"
|
|
270
|
+
if default_root in dev_url
|
|
271
|
+
else ("local" if ("localhost" in dev_url or "127.0.0.1" in dev_url) else "dev")
|
|
272
|
+
)
|
|
226
273
|
if mode == "prod":
|
|
227
274
|
synth_api_key = (
|
|
228
275
|
os_env.get("PROD_SYNTH_API_KEY")
|
|
@@ -267,7 +314,7 @@ def load_env() -> DemoEnv:
|
|
|
267
314
|
)
|
|
268
315
|
|
|
269
316
|
task_app_name = str(state.get("TASK_APP_NAME") or "")
|
|
270
|
-
task_app_secret_name = str(state.get("TASK_APP_SECRET_NAME") or
|
|
317
|
+
task_app_secret_name = str(state.get("TASK_APP_SECRET_NAME") or DEFAULT_TASK_APP_SECRET_NAME)
|
|
271
318
|
|
|
272
319
|
env.dev_backend_url = dev_url.rstrip("/")
|
|
273
320
|
env.synth_api_key = synth_api_key
|
|
@@ -276,22 +323,34 @@ def load_env() -> DemoEnv:
|
|
|
276
323
|
env.task_app_name = task_app_name
|
|
277
324
|
env.task_app_secret_name = task_app_secret_name
|
|
278
325
|
|
|
279
|
-
|
|
280
|
-
print
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
print(f"
|
|
286
|
-
|
|
287
|
-
|
|
326
|
+
# Suppress environment echo by default for cleaner CLI output.
|
|
327
|
+
# If needed for debugging, set SYNTH_CLI_VERBOSE=1 to print resolved values.
|
|
328
|
+
if os.getenv("SYNTH_CLI_VERBOSE", "0") == "1":
|
|
329
|
+
print("ENV:")
|
|
330
|
+
print(f" DEV_BACKEND_URL={env.dev_backend_url}")
|
|
331
|
+
print(f" SYNTH_API_KEY={_mask(env.synth_api_key)}")
|
|
332
|
+
print(f" ENVIRONMENT_API_KEY={_mask(env.env_api_key)}")
|
|
333
|
+
print(f" TASK_APP_BASE_URL={env.task_app_base_url}")
|
|
334
|
+
if task_app_name:
|
|
335
|
+
print(f" TASK_APP_NAME={task_app_name}")
|
|
336
|
+
if task_app_secret_name:
|
|
337
|
+
print(f" TASK_APP_SECRET_NAME={task_app_secret_name}")
|
|
288
338
|
return env
|
|
289
339
|
|
|
290
340
|
|
|
291
|
-
def assert_http_ok(
|
|
341
|
+
def assert_http_ok(
|
|
342
|
+
url: str, method: str = "GET", allow_redirects: bool = True, timeout: float = 10.0
|
|
343
|
+
) -> bool:
|
|
292
344
|
try:
|
|
345
|
+
import ssl
|
|
346
|
+
|
|
293
347
|
req = urllib.request.Request(url, method=method)
|
|
294
|
-
|
|
348
|
+
# Default: disable SSL verification for local/dev convenience.
|
|
349
|
+
# Set SYNTH_SSL_VERIFY=1 to enable verification.
|
|
350
|
+
ctx = ssl._create_unverified_context() # nosec: disabled by default for dev
|
|
351
|
+
if os.getenv("SYNTH_SSL_VERIFY", "0") == "1":
|
|
352
|
+
ctx = None
|
|
353
|
+
with urllib.request.urlopen(req, timeout=timeout, context=ctx) as resp: # nosec - controlled URL
|
|
295
354
|
code = getattr(resp, "status", 200)
|
|
296
355
|
return 200 <= int(code) < 400
|
|
297
356
|
except Exception:
|
|
@@ -339,16 +398,17 @@ def persist_task_url(url: str, *, name: str | None = None) -> None:
|
|
|
339
398
|
if data.get("TASK_APP_NAME") != name:
|
|
340
399
|
data["TASK_APP_NAME"] = name
|
|
341
400
|
changed.append("TASK_APP_NAME")
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
401
|
+
if data.get("TASK_APP_SECRET_NAME") != DEFAULT_TASK_APP_SECRET_NAME:
|
|
402
|
+
data["TASK_APP_SECRET_NAME"] = DEFAULT_TASK_APP_SECRET_NAME
|
|
403
|
+
changed.append("TASK_APP_SECRET_NAME")
|
|
404
|
+
elif data.get("TASK_APP_SECRET_NAME") != DEFAULT_TASK_APP_SECRET_NAME:
|
|
405
|
+
data["TASK_APP_SECRET_NAME"] = DEFAULT_TASK_APP_SECRET_NAME
|
|
406
|
+
changed.append("TASK_APP_SECRET_NAME")
|
|
347
407
|
_write_state(data)
|
|
348
408
|
if changed:
|
|
349
409
|
print(f"Saved {', '.join(changed)} to {_state_path()}")
|
|
350
|
-
if "
|
|
351
|
-
print(f"TASK_APP_SECRET_NAME={
|
|
410
|
+
if "TASK_APP_SECRET_NAME" in changed:
|
|
411
|
+
print(f"TASK_APP_SECRET_NAME={DEFAULT_TASK_APP_SECRET_NAME}")
|
|
352
412
|
|
|
353
413
|
|
|
354
414
|
def persist_api_key(key: str) -> None:
|
|
@@ -357,18 +417,24 @@ def persist_api_key(key: str) -> None:
|
|
|
357
417
|
_write_state(data)
|
|
358
418
|
|
|
359
419
|
|
|
360
|
-
def run_job(
|
|
420
|
+
def run_job(
|
|
421
|
+
env: DemoEnv,
|
|
422
|
+
config_toml_path: str,
|
|
423
|
+
*,
|
|
424
|
+
batch_size: int | None = None,
|
|
425
|
+
group_size: int | None = None,
|
|
426
|
+
model: str | None = None,
|
|
427
|
+
) -> None:
|
|
361
428
|
"""Create and stream a short RL job using the backend API (placeholder: prints cURL to execute)."""
|
|
362
429
|
backend = env.dev_backend_url.rstrip("/")
|
|
363
|
-
if backend.endswith("/api")
|
|
364
|
-
api_base = backend
|
|
365
|
-
else:
|
|
366
|
-
api_base = backend + "/api"
|
|
430
|
+
api_base = backend if backend.endswith("/api") else backend + "/api"
|
|
367
431
|
print("\nTo create an RL job, run:")
|
|
368
432
|
print(
|
|
369
|
-
|
|
433
|
+
'curl -s -X POST "' + api_base + '/rl/jobs" '
|
|
370
434
|
"-H 'Content-Type: application/json' "
|
|
371
435
|
f"-H 'Authorization: Bearer {env.synth_api_key}' "
|
|
372
436
|
"-d '{" # intentionally not fully formed here for brevity in this scaffold
|
|
373
437
|
)
|
|
374
|
-
print(
|
|
438
|
+
print(
|
|
439
|
+
" NOTE: CLI implementation will build the full JSON body with inline TOML config and stream events."
|
|
440
|
+
)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# Crafter demo task app
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# FFT job config for Qwen/Qwen3-4B on Crafter SFT dataset
|
|
2
|
+
|
|
3
|
+
[algorithm]
|
|
4
|
+
type = "offline"
|
|
5
|
+
method = "supervised_finetune"
|
|
6
|
+
variety = "fft"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
[job]
|
|
10
|
+
model = "Qwen/Qwen3-4B"
|
|
11
|
+
data = "ft_data/crafter_traces.jsonl"
|
|
12
|
+
|
|
13
|
+
[compute]
|
|
14
|
+
# Adjust as needed for your quota
|
|
15
|
+
gpu_type = "H100"
|
|
16
|
+
gpu_count = 1
|
|
17
|
+
nodes = 1
|
|
18
|
+
|
|
19
|
+
[data]
|
|
20
|
+
# Optional topology metadata (left empty for now)
|
|
21
|
+
topology = {}
|
|
22
|
+
|
|
23
|
+
# Optional local validation dataset path (JSONL). If set, the client will upload
|
|
24
|
+
# this file and wire up validation so the frontend can display val.loss.
|
|
25
|
+
# validation_path = "../ft_data/crafter_validation.jsonl"
|
|
26
|
+
|
|
27
|
+
[training]
|
|
28
|
+
mode = "sft_offline"
|
|
29
|
+
use_qlora = false
|
|
30
|
+
|
|
31
|
+
# Validation settings to emit val.loss on the frontend
|
|
32
|
+
[training.validation]
|
|
33
|
+
enabled = true
|
|
34
|
+
evaluation_strategy = "steps"
|
|
35
|
+
eval_steps = 20
|
|
36
|
+
save_best_model_at_end = true
|
|
37
|
+
metric_for_best_model = "val.loss"
|
|
38
|
+
greater_is_better = false
|
|
39
|
+
|
|
40
|
+
[hyperparameters]
|
|
41
|
+
# Minimal safe defaults; backend can override
|
|
42
|
+
n_epochs = 1
|
|
43
|
+
batch_size = 1
|
|
44
|
+
gradient_accumulation_steps = 64
|
|
45
|
+
sequence_length = 4096
|
|
46
|
+
learning_rate = 5e-6
|
|
47
|
+
warmup_ratio = 0.03
|
|
48
|
+
train_kind = "fft"
|
|
49
|
+
|
|
50
|
+
# Optional parallelism block example
|
|
51
|
+
#[hyperparameters.parallelism]
|
|
52
|
+
# tensor_parallel_size = 1
|
|
53
|
+
# pipeline_parallel_size = 1
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# RL training starting from base Qwen/Qwen3-4B (TOML-only model selection)
|
|
2
|
+
|
|
3
|
+
[algorithm]
|
|
4
|
+
type = "online"
|
|
5
|
+
method = "policy_gradient"
|
|
6
|
+
variety = "gspo"
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
[services]
|
|
10
|
+
task_url = "https://synth-laboratories--grpo-crafter-task-app-final-warming--ceb5b2.modal.run"
|
|
11
|
+
|
|
12
|
+
[compute]
|
|
13
|
+
# Cluster shape for RL pipeline
|
|
14
|
+
gpu_type = "H100"
|
|
15
|
+
gpu_count = 8
|
|
16
|
+
|
|
17
|
+
[topology]
|
|
18
|
+
# Split GPUs across vLLM, training, and reference
|
|
19
|
+
# Must sum to compute.gpu_count
|
|
20
|
+
type = "single_node_split"
|
|
21
|
+
gpus_for_vllm = 4
|
|
22
|
+
gpus_for_training = 3
|
|
23
|
+
gpus_for_ref = 1
|
|
24
|
+
tensor_parallel = 4
|
|
25
|
+
|
|
26
|
+
[vllm]
|
|
27
|
+
# Serving tensor parallel size
|
|
28
|
+
tensor_parallel_size = 4
|
|
29
|
+
max_model_len = 8192
|
|
30
|
+
|
|
31
|
+
[reference]
|
|
32
|
+
# Required by trainer/runtime; ensures dedicated/scoped scoring server config exists
|
|
33
|
+
placement = "dedicated"
|
|
34
|
+
port = 8002
|
|
35
|
+
tp = 1
|
|
36
|
+
health_max_wait_s = 180
|
|
37
|
+
health_interval_ms = 300
|
|
38
|
+
|
|
39
|
+
[model]
|
|
40
|
+
# Base model start
|
|
41
|
+
base = "Qwen/Qwen3-4B"
|
|
42
|
+
label = "crafter-rl-from-base"
|
|
43
|
+
|
|
44
|
+
[rollout]
|
|
45
|
+
max_turns = 10
|
|
46
|
+
episodes_per_batch = 64
|
|
47
|
+
policy_name = "crafter"
|
|
48
|
+
|
|
49
|
+
[evaluation]
|
|
50
|
+
# Run baseline evaluation over the first 100 seeds every 20 training iterations
|
|
51
|
+
instances = 10
|
|
52
|
+
every_n_iters = 10
|
|
53
|
+
seeds = [
|
|
54
|
+
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
|
55
|
+
]
|
|
56
|
+
|
|
57
|
+
[training]
|
|
58
|
+
log_interval = 1
|
|
59
|
+
weight_sync_interval = 1
|
|
60
|
+
# Additional RL hyperparameters can go here
|
|
61
|
+
|
|
62
|
+
# Stepwise rewards (Crafter decision-level)
|
|
63
|
+
step_rewards_enabled = true
|
|
64
|
+
step_rewards_mode = "decision_stepwise" # "off" | "decision_stepwise" | "env_sparse"
|
|
65
|
+
step_rewards_beta = 0.0
|
|
66
|
+
step_rewards_indicator_lambda = 1.0
|
|
67
|
+
# Optional selector for decision scalar: "unique" | "absolute" (default unique)
|
|
68
|
+
event_rewards_kind = "unique"
|
|
69
|
+
|
|
70
|
+
[training.weight_sync]
|
|
71
|
+
enable = true
|
|
72
|
+
targets = ["policy"]
|
|
73
|
+
weight_sync_interval = 1
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
"""Compatibility wrapper for the GRPO Crafter task app.
|
|
2
|
+
|
|
3
|
+
This module now delegates to the TaskAppConfig defined in the local example at
|
|
4
|
+
`examples/task_apps/crafter/task_app/grpo_crafter.py`. It is kept for legacy usage
|
|
5
|
+
(running the file directly or targeting `fastapi_app` from external tooling).
|
|
6
|
+
Prefer using `uvx synth-ai deploy --runtime uvicorn grpo-crafter` for local development and testing.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from __future__ import annotations
|
|
10
|
+
|
|
11
|
+
import argparse
|
|
12
|
+
import importlib.util
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
|
|
15
|
+
from fastapi.exceptions import RequestValidationError
|
|
16
|
+
from fastapi.responses import JSONResponse
|
|
17
|
+
from starlette.requests import Request
|
|
18
|
+
|
|
19
|
+
from synth_ai.sdk.task.apps import ModalDeploymentConfig, registry
|
|
20
|
+
from synth_ai.sdk.task.auth import is_api_key_header_authorized, normalize_environment_api_key
|
|
21
|
+
from synth_ai.sdk.task.server import TaskAppConfig, create_task_app, run_task_app
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _load_build_config():
|
|
25
|
+
"""Load the example's build_config, preferring package import with file fallback."""
|
|
26
|
+
# First try to import by package name (installed 'examples' package)
|
|
27
|
+
try:
|
|
28
|
+
module = importlib.import_module("examples.task_apps.crafter.task_app.grpo_crafter")
|
|
29
|
+
return module.build_config # type: ignore[attr-defined]
|
|
30
|
+
except Exception:
|
|
31
|
+
# Fallback: locate the file within the installed synth_ai distribution and exec it
|
|
32
|
+
import sys as _sys
|
|
33
|
+
|
|
34
|
+
import synth_ai
|
|
35
|
+
|
|
36
|
+
synth_ai_path = Path(synth_ai.__file__ or Path(__file__).resolve()).resolve().parent.parent
|
|
37
|
+
module_path = (
|
|
38
|
+
synth_ai_path / "examples" / "task_apps" / "crafter" / "task_app" / "grpo_crafter.py"
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
if not module_path.exists():
|
|
42
|
+
raise ImportError(
|
|
43
|
+
f"Could not find task app module at {module_path}. Make sure you're running from the synth-ai repository."
|
|
44
|
+
) from None
|
|
45
|
+
|
|
46
|
+
spec = importlib.util.spec_from_file_location(
|
|
47
|
+
"examples.task_apps.crafter.task_app.grpo_crafter", module_path
|
|
48
|
+
)
|
|
49
|
+
if spec is None or spec.loader is None:
|
|
50
|
+
raise ImportError(f"Could not load task app module at {module_path}") from None
|
|
51
|
+
|
|
52
|
+
module = importlib.util.module_from_spec(spec)
|
|
53
|
+
_sys.modules[spec.name] = module
|
|
54
|
+
spec.loader.exec_module(module)
|
|
55
|
+
return module.build_config # type: ignore[attr-defined]
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
build_config = _load_build_config()
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
APP_ID = "grpo-crafter-task-app"
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _build_base_config() -> TaskAppConfig:
|
|
65
|
+
# Lazily construct the base config to avoid heavy work at import time
|
|
66
|
+
return build_config()
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
_REGISTERED_ENTRY = registry.get(APP_ID)
|
|
71
|
+
except Exception: # pragma: no cover - registry unavailable in some contexts
|
|
72
|
+
MODAL_DEPLOYMENT: ModalDeploymentConfig | None = None
|
|
73
|
+
ENV_FILES: tuple[str, ...] = ()
|
|
74
|
+
else:
|
|
75
|
+
MODAL_DEPLOYMENT = _REGISTERED_ENTRY.modal
|
|
76
|
+
ENV_FILES = tuple(_REGISTERED_ENTRY.env_files)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def build_task_app_config() -> TaskAppConfig:
|
|
80
|
+
"""Return a fresh TaskAppConfig for this wrapper."""
|
|
81
|
+
|
|
82
|
+
base = _build_base_config()
|
|
83
|
+
return base.clone()
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
def fastapi_app():
|
|
87
|
+
"""Return the FastAPI application for Modal or other ASGI hosts."""
|
|
88
|
+
|
|
89
|
+
app = create_task_app(build_task_app_config())
|
|
90
|
+
|
|
91
|
+
# Replace default health endpoints so we can permit soft auth failures and log 422s.
|
|
92
|
+
filtered_routes = []
|
|
93
|
+
for route in app.router.routes:
|
|
94
|
+
path = getattr(route, "path", None)
|
|
95
|
+
methods = getattr(route, "methods", set()) or set()
|
|
96
|
+
if path in {"/health", "/health/rollout"} and "GET" in methods:
|
|
97
|
+
continue
|
|
98
|
+
filtered_routes.append(route)
|
|
99
|
+
app.router.routes = filtered_routes
|
|
100
|
+
|
|
101
|
+
def _log_env_key_prefix(source: str, env_key: str | None) -> str | None:
|
|
102
|
+
if not env_key:
|
|
103
|
+
return None
|
|
104
|
+
prefix = env_key[: max(1, len(env_key) // 2)]
|
|
105
|
+
print(f"[{source}] expected ENVIRONMENT_API_KEY prefix: {prefix}")
|
|
106
|
+
return prefix
|
|
107
|
+
|
|
108
|
+
@app.get("/health")
|
|
109
|
+
async def health(request: Request):
|
|
110
|
+
env_key = normalize_environment_api_key()
|
|
111
|
+
if not env_key:
|
|
112
|
+
return JSONResponse(
|
|
113
|
+
status_code=503,
|
|
114
|
+
content={"status": "unhealthy", "detail": "Missing ENVIRONMENT_API_KEY"},
|
|
115
|
+
)
|
|
116
|
+
if not is_api_key_header_authorized(request):
|
|
117
|
+
prefix = _log_env_key_prefix("health", env_key)
|
|
118
|
+
content = {"status": "healthy", "authorized": False}
|
|
119
|
+
if prefix:
|
|
120
|
+
content["expected_api_key_prefix"] = prefix
|
|
121
|
+
return JSONResponse(status_code=200, content=content)
|
|
122
|
+
return {"status": "healthy", "authorized": True}
|
|
123
|
+
|
|
124
|
+
@app.get("/health/rollout")
|
|
125
|
+
async def health_rollout(request: Request):
|
|
126
|
+
env_key = normalize_environment_api_key()
|
|
127
|
+
if not env_key:
|
|
128
|
+
return JSONResponse(
|
|
129
|
+
status_code=503,
|
|
130
|
+
content={"status": "unhealthy", "detail": "Missing ENVIRONMENT_API_KEY"},
|
|
131
|
+
)
|
|
132
|
+
if not is_api_key_header_authorized(request):
|
|
133
|
+
prefix = _log_env_key_prefix("health/rollout", env_key)
|
|
134
|
+
content = {"status": "healthy", "authorized": False}
|
|
135
|
+
if prefix:
|
|
136
|
+
content["expected_api_key_prefix"] = prefix
|
|
137
|
+
return JSONResponse(status_code=200, content=content)
|
|
138
|
+
return {"ok": True, "authorized": True}
|
|
139
|
+
|
|
140
|
+
@app.exception_handler(RequestValidationError)
|
|
141
|
+
async def _on_validation_error(request: Request, exc: RequestValidationError):
|
|
142
|
+
try:
|
|
143
|
+
hdr = request.headers
|
|
144
|
+
snapshot = {
|
|
145
|
+
"path": str(request.url.path),
|
|
146
|
+
"have_x_api_key": bool(hdr.get("x-api-key")),
|
|
147
|
+
"have_x_api_keys": bool(hdr.get("x-api-keys")),
|
|
148
|
+
"have_authorization": bool(hdr.get("authorization")),
|
|
149
|
+
"errors": exc.errors()[:5],
|
|
150
|
+
}
|
|
151
|
+
print("[422] validation", snapshot, flush=True)
|
|
152
|
+
except Exception:
|
|
153
|
+
pass
|
|
154
|
+
return JSONResponse(
|
|
155
|
+
status_code=422,
|
|
156
|
+
content={"status": "invalid", "detail": exc.errors()[:5]},
|
|
157
|
+
)
|
|
158
|
+
|
|
159
|
+
return app
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
if __name__ == "__main__":
|
|
163
|
+
parser = argparse.ArgumentParser(description="Run the Crafter task app locally")
|
|
164
|
+
parser.add_argument("--host", default="0.0.0.0")
|
|
165
|
+
parser.add_argument("--port", type=int, default=8001)
|
|
166
|
+
parser.add_argument("--reload", action="store_true", help="Enable uvicorn autoreload")
|
|
167
|
+
parser.add_argument(
|
|
168
|
+
"--env-file",
|
|
169
|
+
action="append",
|
|
170
|
+
default=[],
|
|
171
|
+
help="Additional .env files to load before startup",
|
|
172
|
+
)
|
|
173
|
+
args = parser.parse_args()
|
|
174
|
+
|
|
175
|
+
default_env = Path(__file__).resolve().parents[4] / "backend" / ".env.dev"
|
|
176
|
+
env_files = [str(default_env)] if default_env.exists() else []
|
|
177
|
+
env_files.extend(args.env_file or [])
|
|
178
|
+
|
|
179
|
+
run_task_app(
|
|
180
|
+
build_task_app_config,
|
|
181
|
+
host=args.host,
|
|
182
|
+
port=args.port,
|
|
183
|
+
reload=args.reload,
|
|
184
|
+
env_files=env_files,
|
|
185
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
"""Minimal helpers for the math task app.
|
|
4
|
+
|
|
5
|
+
This module provides a local fallback for install_problem_bank_into_shared so
|
|
6
|
+
the modal task app can import it without requiring an external math_rl package.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def install_problem_bank_into_shared() -> None:
|
|
11
|
+
"""No-op placeholder for installing the Hendrycks MATH problem bank.
|
|
12
|
+
|
|
13
|
+
In production deployments, this can download or unpack the problem bank
|
|
14
|
+
into a shared directory. For the demo scaffold, it is a no-op.
|
|
15
|
+
"""
|
|
16
|
+
return None
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import os
|
|
4
|
+
|
|
4
5
|
from fastapi import FastAPI
|
|
5
6
|
from starlette.middleware.cors import CORSMiddleware
|
|
6
7
|
|
|
@@ -11,7 +12,7 @@ except Exception: # fallback path when imported from repo root
|
|
|
11
12
|
try:
|
|
12
13
|
from examples.rl.task_app import make_app as make_rl_app # type: ignore
|
|
13
14
|
except Exception as e: # pragma: no cover
|
|
14
|
-
raise ImportError(f"Unable to import RL task app: {e}")
|
|
15
|
+
raise ImportError(f"Unable to import RL task app: {e}") from e
|
|
15
16
|
|
|
16
17
|
|
|
17
18
|
def create_app() -> FastAPI:
|