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
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"""Synth AI Core Layer.
|
|
2
|
+
|
|
3
|
+
This module provides internal plumbing that SDK and CLI can share:
|
|
4
|
+
- Environment resolution
|
|
5
|
+
- HTTP client utilities
|
|
6
|
+
- Error types
|
|
7
|
+
- Logging
|
|
8
|
+
- Pricing
|
|
9
|
+
- Config base classes
|
|
10
|
+
|
|
11
|
+
Dependency rules:
|
|
12
|
+
- core/ can import data/
|
|
13
|
+
- core/ should NOT import sdk/ or cli/
|
|
14
|
+
- core/ should NOT import click (leave that to cli/)
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
# Config base classes
|
|
20
|
+
from synth_ai.core.config import BaseJobConfig, ConfigValidator
|
|
21
|
+
|
|
22
|
+
# Environment utilities
|
|
23
|
+
from synth_ai.core.env import (
|
|
24
|
+
PROD_BASE_URL,
|
|
25
|
+
get_api_key,
|
|
26
|
+
get_backend_url,
|
|
27
|
+
load_env_file,
|
|
28
|
+
mask_value,
|
|
29
|
+
resolve_env_file,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# Error types
|
|
33
|
+
from synth_ai.core.errors import (
|
|
34
|
+
AuthenticationError,
|
|
35
|
+
ConfigError,
|
|
36
|
+
HTTPError,
|
|
37
|
+
JobError,
|
|
38
|
+
ModelNotSupportedError,
|
|
39
|
+
StorageError,
|
|
40
|
+
SynthError,
|
|
41
|
+
TimeoutError,
|
|
42
|
+
ValidationError,
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
# HTTP utilities
|
|
46
|
+
from synth_ai.core.http import AsyncHttpClient, sleep
|
|
47
|
+
|
|
48
|
+
# Logging
|
|
49
|
+
from synth_ai.core.logging import (
|
|
50
|
+
SDK_LOGGER_NAME,
|
|
51
|
+
configure_logging,
|
|
52
|
+
get_logger,
|
|
53
|
+
suppress_noisy_loggers,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
# Pricing
|
|
57
|
+
from synth_ai.core.pricing import (
|
|
58
|
+
MODEL_PRICES,
|
|
59
|
+
TokenRates,
|
|
60
|
+
estimate_cost,
|
|
61
|
+
get_token_rates,
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
__all__ = [
|
|
65
|
+
# Errors
|
|
66
|
+
"SynthError",
|
|
67
|
+
"ConfigError",
|
|
68
|
+
"AuthenticationError",
|
|
69
|
+
"ValidationError",
|
|
70
|
+
"HTTPError",
|
|
71
|
+
"JobError",
|
|
72
|
+
"TimeoutError",
|
|
73
|
+
"StorageError",
|
|
74
|
+
"ModelNotSupportedError",
|
|
75
|
+
# Environment
|
|
76
|
+
"get_api_key",
|
|
77
|
+
"get_backend_url",
|
|
78
|
+
"resolve_env_file",
|
|
79
|
+
"load_env_file",
|
|
80
|
+
"mask_value",
|
|
81
|
+
"PROD_BASE_URL",
|
|
82
|
+
# HTTP
|
|
83
|
+
"AsyncHttpClient",
|
|
84
|
+
"sleep",
|
|
85
|
+
# Logging
|
|
86
|
+
"get_logger",
|
|
87
|
+
"configure_logging",
|
|
88
|
+
"suppress_noisy_loggers",
|
|
89
|
+
"SDK_LOGGER_NAME",
|
|
90
|
+
# Pricing
|
|
91
|
+
"TokenRates",
|
|
92
|
+
"MODEL_PRICES",
|
|
93
|
+
"get_token_rates",
|
|
94
|
+
"estimate_cost",
|
|
95
|
+
# Config
|
|
96
|
+
"BaseJobConfig",
|
|
97
|
+
"ConfigValidator",
|
|
98
|
+
]
|
|
99
|
+
|
|
100
|
+
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Compatibility shims for legacy `synth_ai.core._utils.*` imports.
|
|
3
|
+
|
|
4
|
+
These modules re-export the public symbols so existing downstream code
|
|
5
|
+
continues to work without modification.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from __future__ import annotations
|
|
9
|
+
|
|
10
|
+
from importlib import import_module
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
# Modules that can be eagerly loaded (no circular deps)
|
|
14
|
+
_EAGER_MAPPING = {
|
|
15
|
+
"base_url": "synth_ai.core.env",
|
|
16
|
+
"http": "synth_ai.core.http",
|
|
17
|
+
"task_app_state": "synth_ai.core.task_app_state",
|
|
18
|
+
"user_config": "synth_ai.core.user_config",
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
# Modules that must be lazily loaded (have CLI deps)
|
|
22
|
+
_LAZY_MAPPING = {
|
|
23
|
+
"prompts": "synth_ai.cli.lib.prompt_args",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
__all__ = sorted(list(_EAGER_MAPPING.keys()) + list(_LAZY_MAPPING.keys()))
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def __getattr__(name: str) -> Any:
|
|
30
|
+
if name in _EAGER_MAPPING:
|
|
31
|
+
module = import_module(_EAGER_MAPPING[name])
|
|
32
|
+
globals()[name] = module
|
|
33
|
+
return module
|
|
34
|
+
if name in _LAZY_MAPPING:
|
|
35
|
+
module = import_module(_LAZY_MAPPING[name])
|
|
36
|
+
globals()[name] = module
|
|
37
|
+
return module
|
|
38
|
+
raise AttributeError(f"module 'synth_ai.core._utils' has no attribute '{name}'")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def __dir__() -> list[str]:
|
|
42
|
+
return sorted(set(globals()) | set(__all__))
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# Eagerly load non-circular modules
|
|
46
|
+
for _name in _EAGER_MAPPING:
|
|
47
|
+
try:
|
|
48
|
+
_module = import_module(_EAGER_MAPPING[_name])
|
|
49
|
+
globals()[_name] = _module
|
|
50
|
+
if hasattr(_module, "__all__"):
|
|
51
|
+
for _attr in _module.__all__:
|
|
52
|
+
globals().setdefault(_attr, getattr(_module, _attr))
|
|
53
|
+
except ImportError:
|
|
54
|
+
pass
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from synth_ai.core.env import * # noqa: F401,F403
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
from synth_ai.core.env import __all__ as __wrapped_all__ # type: ignore[attr-defined]
|
|
7
|
+
except ImportError: # pragma: no cover - defensive
|
|
8
|
+
__wrapped_all__ = []
|
|
9
|
+
|
|
10
|
+
__all__ = list(__wrapped_all__)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from synth_ai.core.http import * # noqa: F401,F403
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
from synth_ai.core.http import __all__ as __wrapped_all__ # type: ignore[attr-defined]
|
|
7
|
+
except ImportError: # pragma: no cover - defensive
|
|
8
|
+
__wrapped_all__ = []
|
|
9
|
+
|
|
10
|
+
__all__ = list(__wrapped_all__)
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""Lazy re-export of prompt utilities to avoid circular imports."""
|
|
2
|
+
from __future__ import annotations
|
|
3
|
+
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
# Functions available via __getattr__:
|
|
7
|
+
# - ensure_required_args
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def __getattr__(name: str) -> Any:
|
|
11
|
+
if name == "ensure_required_args":
|
|
12
|
+
from synth_ai.cli.lib import prompt_args
|
|
13
|
+
return getattr(prompt_args, name)
|
|
14
|
+
raise AttributeError(f"module 'synth_ai.core._utils.prompts' has no attribute '{name}'")
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from synth_ai.core.task_app_state import * # noqa: F401,F403
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
from synth_ai.core.task_app_state import (
|
|
7
|
+
__all__ as __wrapped_all__, # type: ignore[attr-defined]
|
|
8
|
+
)
|
|
9
|
+
except ImportError: # pragma: no cover - defensive
|
|
10
|
+
__wrapped_all__ = []
|
|
11
|
+
|
|
12
|
+
__all__ = list(__wrapped_all__)
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from synth_ai.core.user_config import * # noqa: F401,F403
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
from synth_ai.core.user_config import __all__ as __wrapped_all__ # type: ignore[attr-defined]
|
|
7
|
+
except ImportError: # pragma: no cover - defensive
|
|
8
|
+
__wrapped_all__ = []
|
|
9
|
+
|
|
10
|
+
__all__ = list(__wrapped_all__)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import ast
|
|
2
|
+
import importlib.util as importlib
|
|
3
|
+
import py_compile
|
|
4
|
+
import subprocess
|
|
5
|
+
import sys
|
|
6
|
+
from ast import Module as AstModule
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from types import ModuleType
|
|
9
|
+
from typing import Any, cast
|
|
10
|
+
|
|
11
|
+
from fastapi.routing import APIRoute
|
|
12
|
+
from starlette.types import ASGIApp
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def run_ruff_check(path: Path, fix: bool = False) -> int:
|
|
16
|
+
cmd = ["ruff", "check", "--extend-ignore", "I001,I002"]
|
|
17
|
+
if fix:
|
|
18
|
+
cmd.append("--fix")
|
|
19
|
+
cmd.append(str(path))
|
|
20
|
+
try:
|
|
21
|
+
return subprocess.run(cmd, check=False).returncode
|
|
22
|
+
except FileNotFoundError:
|
|
23
|
+
return 0
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def extract_routes_from_app(app: object) -> list[str]:
|
|
27
|
+
router = getattr(app, "router", None)
|
|
28
|
+
if router is None:
|
|
29
|
+
return []
|
|
30
|
+
routes = getattr(router, "routes", None)
|
|
31
|
+
if routes is None:
|
|
32
|
+
return []
|
|
33
|
+
return [getattr(route, "path", '') for route in routes]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
def build_fastapi_route_index(app: ASGIApp) -> dict[str, list[APIRoute]]:
|
|
37
|
+
router = getattr(app, "router", None)
|
|
38
|
+
if router is None:
|
|
39
|
+
raise ValueError("App does not expose a FastAPI router")
|
|
40
|
+
entries: dict[str, list[APIRoute]] = {}
|
|
41
|
+
for route in getattr(router, "routes", []):
|
|
42
|
+
if isinstance(route, APIRoute):
|
|
43
|
+
entries.setdefault(route.path, []).append(route)
|
|
44
|
+
return entries
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def get_asgi_app(module: ModuleType) -> ASGIApp:
|
|
48
|
+
def _coerce_app(candidate: Any) -> ASGIApp | None:
|
|
49
|
+
if candidate is None:
|
|
50
|
+
return None
|
|
51
|
+
if callable(candidate):
|
|
52
|
+
return cast(ASGIApp, candidate)
|
|
53
|
+
return None
|
|
54
|
+
|
|
55
|
+
app = _coerce_app(getattr(module, "app", None))
|
|
56
|
+
if app:
|
|
57
|
+
return app
|
|
58
|
+
asgi_factory_names = (
|
|
59
|
+
"fastapi_app",
|
|
60
|
+
"create_app",
|
|
61
|
+
"build_app",
|
|
62
|
+
"configure_app",
|
|
63
|
+
"get_app",
|
|
64
|
+
"app_factory",
|
|
65
|
+
)
|
|
66
|
+
for name in asgi_factory_names:
|
|
67
|
+
factory = getattr(module, name, None)
|
|
68
|
+
if callable(factory):
|
|
69
|
+
produced = factory()
|
|
70
|
+
coerced = _coerce_app(produced)
|
|
71
|
+
if coerced is not None:
|
|
72
|
+
app = coerced
|
|
73
|
+
break
|
|
74
|
+
if app is None:
|
|
75
|
+
raise RuntimeError("Task app must expose an ASGI application via `app = FastAPI(...)` or a callable factory.")
|
|
76
|
+
return app
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
def get_module(path: Path) -> AstModule:
|
|
80
|
+
try:
|
|
81
|
+
src = path.read_text(encoding="utf-8")
|
|
82
|
+
except OSError as exc:
|
|
83
|
+
raise ValueError(f"Unable to read file {path}: {exc}") from exc
|
|
84
|
+
try:
|
|
85
|
+
return ast.parse(src, filename=str(path))
|
|
86
|
+
except SyntaxError as exc:
|
|
87
|
+
raise ValueError(f"{path} contains invalid Python syntax: {exc}") from exc
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def load_module(
|
|
91
|
+
path: Path,
|
|
92
|
+
module_name: str | None = None
|
|
93
|
+
) -> ModuleType:
|
|
94
|
+
name = module_name or path.stem
|
|
95
|
+
spec = importlib.spec_from_file_location(name, str(path))
|
|
96
|
+
if spec is None or spec.loader is None:
|
|
97
|
+
raise RuntimeError(f"Unable to load module spec for {path}")
|
|
98
|
+
module = importlib.module_from_spec(spec)
|
|
99
|
+
if module_name:
|
|
100
|
+
sys.modules[module_name] = module
|
|
101
|
+
try:
|
|
102
|
+
spec.loader.exec_module(module)
|
|
103
|
+
except Exception as exc:
|
|
104
|
+
if module_name:
|
|
105
|
+
sys.modules.pop(module_name, None)
|
|
106
|
+
raise ImportError(f"Failed to import module: {exc}") from exc
|
|
107
|
+
return module
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
def validate_py_file_compiles(path: Path) -> None:
|
|
111
|
+
path = path.resolve()
|
|
112
|
+
try:
|
|
113
|
+
py_compile.compile(str(path), doraise=True)
|
|
114
|
+
except py_compile.PyCompileError as exc:
|
|
115
|
+
raise ValueError(f"Failed to compile {path}: {exc.msg}") from exc
|
|
116
|
+
return None
|
synth_ai/core/auth.py
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import contextlib
|
|
2
|
+
import time
|
|
3
|
+
import webbrowser
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
|
|
6
|
+
import requests
|
|
7
|
+
from requests import RequestException
|
|
8
|
+
|
|
9
|
+
from synth_ai.core.urls import FRONTEND_URL_BASE
|
|
10
|
+
|
|
11
|
+
INIT_URL = FRONTEND_URL_BASE + "/api/sdk/handshake/init"
|
|
12
|
+
TOKEN_URL = FRONTEND_URL_BASE + "/api/sdk/handshake/token"
|
|
13
|
+
POLL_INTERVAL = 3
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass
|
|
17
|
+
class AuthSession:
|
|
18
|
+
device_code: str
|
|
19
|
+
verification_uri: str
|
|
20
|
+
expires_at: float
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def init_auth_session() -> AuthSession:
|
|
24
|
+
try:
|
|
25
|
+
res = requests.post(INIT_URL, timeout=10)
|
|
26
|
+
except RequestException as exc:
|
|
27
|
+
raise RuntimeError(f"Failed to reach handshake init endpoint: {exc}") from exc
|
|
28
|
+
if res.status_code != 200:
|
|
29
|
+
body = res.text.strip()
|
|
30
|
+
raise RuntimeError(f"Handshake init failed ({res.status_code}): {body or 'no response body'}")
|
|
31
|
+
|
|
32
|
+
try:
|
|
33
|
+
data = res.json()
|
|
34
|
+
except ValueError as err:
|
|
35
|
+
raise RuntimeError("Handshake init returned malformed JSON.") from err
|
|
36
|
+
|
|
37
|
+
device_code = str(data.get("device_code") or "").strip()
|
|
38
|
+
verification_uri = str(data.get("verification_uri") or "").strip()
|
|
39
|
+
expires_in = int(data.get("expires_in") or 600)
|
|
40
|
+
if not device_code or not verification_uri or not expires_in:
|
|
41
|
+
raise RuntimeError("Handshake init response missing device_code or verification_uri or expires_in.")
|
|
42
|
+
|
|
43
|
+
return AuthSession(
|
|
44
|
+
device_code=device_code,
|
|
45
|
+
verification_uri=verification_uri,
|
|
46
|
+
expires_at=time.time() + expires_in
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def fetch_data(device_code: str) -> requests.Response | None:
|
|
51
|
+
try:
|
|
52
|
+
return requests.post(
|
|
53
|
+
TOKEN_URL,
|
|
54
|
+
json={"device_code": device_code},
|
|
55
|
+
timeout=10,
|
|
56
|
+
)
|
|
57
|
+
except RequestException:
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def fetch_credentials_from_web_browser() -> dict:
|
|
62
|
+
print(f"Fetching your credentials from {FRONTEND_URL_BASE}")
|
|
63
|
+
|
|
64
|
+
auth_session = init_auth_session()
|
|
65
|
+
|
|
66
|
+
with contextlib.suppress(Exception):
|
|
67
|
+
webbrowser.open(auth_session.verification_uri)
|
|
68
|
+
|
|
69
|
+
data = None
|
|
70
|
+
while time.time() <= auth_session.expires_at:
|
|
71
|
+
res = fetch_data(auth_session.device_code)
|
|
72
|
+
if not res:
|
|
73
|
+
time.sleep(POLL_INTERVAL)
|
|
74
|
+
continue
|
|
75
|
+
if res.status_code == 200:
|
|
76
|
+
try:
|
|
77
|
+
data = res.json()
|
|
78
|
+
except ValueError as err:
|
|
79
|
+
raise RuntimeError("Handshake token returned malformed JSON.") from err
|
|
80
|
+
break
|
|
81
|
+
if res.status_code in (404, 410):
|
|
82
|
+
raise RuntimeError("Handshake failed: device code expired or was revoked.")
|
|
83
|
+
time.sleep(POLL_INTERVAL)
|
|
84
|
+
if data is None:
|
|
85
|
+
raise TimeoutError("Handshake timed out before credentials were returned.")
|
|
86
|
+
|
|
87
|
+
print(f"Connected to {FRONTEND_URL_BASE}")
|
|
88
|
+
credentials = data.get("keys")
|
|
89
|
+
if not isinstance(credentials, dict):
|
|
90
|
+
credentials = {}
|
|
91
|
+
|
|
92
|
+
return {
|
|
93
|
+
"SYNTH_API_KEY": str(credentials.get("synth") or "").strip(),
|
|
94
|
+
"ENVIRONMENT_API_KEY": str(credentials.get("rl_env") or "").strip()
|
|
95
|
+
}
|
synth_ai/core/cfgs.py
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Any, Literal, Optional, cast
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
from synth_ai.core.paths import get_bin_path
|
|
8
|
+
from synth_ai.core.telemetry import log_error, log_info
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class LocalDeployCfg(BaseModel):
|
|
12
|
+
task_app_path: Path
|
|
13
|
+
env_api_key: str
|
|
14
|
+
trace: bool = True
|
|
15
|
+
host: str = "127.0.0.1"
|
|
16
|
+
port: int = 8000
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def create(
|
|
20
|
+
cls,
|
|
21
|
+
*,
|
|
22
|
+
task_app_path: Path,
|
|
23
|
+
env_api_key: str,
|
|
24
|
+
trace: bool = True,
|
|
25
|
+
host: str = "127.0.0.1",
|
|
26
|
+
port: int = 8000
|
|
27
|
+
) -> "LocalDeployCfg":
|
|
28
|
+
ctx: dict[str, Any] = {
|
|
29
|
+
"task_app_path": str(task_app_path),
|
|
30
|
+
"trace": trace,
|
|
31
|
+
"host": host,
|
|
32
|
+
"port": port,
|
|
33
|
+
}
|
|
34
|
+
log_info("creating LocalDeployCfg", ctx=ctx)
|
|
35
|
+
try:
|
|
36
|
+
cfg = cls(
|
|
37
|
+
task_app_path=task_app_path,
|
|
38
|
+
env_api_key=env_api_key,
|
|
39
|
+
trace=trace,
|
|
40
|
+
host=host,
|
|
41
|
+
port=port,
|
|
42
|
+
)
|
|
43
|
+
return cfg
|
|
44
|
+
except Exception as exc:
|
|
45
|
+
ctx["error"] = type(exc).__name__
|
|
46
|
+
log_error("LocalDeployCfg creation failed", ctx=ctx)
|
|
47
|
+
raise
|
|
48
|
+
|
|
49
|
+
@classmethod
|
|
50
|
+
def create_from_dict(
|
|
51
|
+
cls,
|
|
52
|
+
data: dict[str, Any]
|
|
53
|
+
) -> "LocalDeployCfg":
|
|
54
|
+
path = Path(data["task_app_path"])
|
|
55
|
+
trace = bool(data.get("trace", True))
|
|
56
|
+
host = str(data.get("host", "127.0.0.1"))
|
|
57
|
+
port = int(data.get("port", 8000))
|
|
58
|
+
ctx: dict[str, Any] = {
|
|
59
|
+
"task_app_path": str(path),
|
|
60
|
+
"trace": trace,
|
|
61
|
+
"host": host,
|
|
62
|
+
"port": port,
|
|
63
|
+
}
|
|
64
|
+
log_info("creating LocalDeployCfg from dict", ctx=ctx)
|
|
65
|
+
env_api_key = data.get("env_api_key")
|
|
66
|
+
if not env_api_key or not isinstance(env_api_key, str):
|
|
67
|
+
raise ValueError("env_api_key is required in local deploy configuration")
|
|
68
|
+
|
|
69
|
+
try:
|
|
70
|
+
cfg = cls(
|
|
71
|
+
task_app_path=path,
|
|
72
|
+
env_api_key=env_api_key,
|
|
73
|
+
trace=trace,
|
|
74
|
+
host=host,
|
|
75
|
+
port=port,
|
|
76
|
+
)
|
|
77
|
+
return cfg
|
|
78
|
+
except (KeyError, TypeError, ValueError) as err:
|
|
79
|
+
ctx["error"] = type(err).__name__
|
|
80
|
+
log_error("LocalDeployCfg from dict failed", ctx=ctx)
|
|
81
|
+
raise ValueError(f"Invalid local deploy configuration: {err}") from err
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class ModalDeployCfg(BaseModel):
|
|
85
|
+
task_app_path: Path
|
|
86
|
+
modal_app_path: Path
|
|
87
|
+
modal_bin_path: Path
|
|
88
|
+
synth_api_key: str
|
|
89
|
+
env_api_key: str
|
|
90
|
+
cmd_arg: Literal["deploy", "serve"] = "deploy"
|
|
91
|
+
modal_app_name: Optional[str] = None
|
|
92
|
+
dry_run: bool = False
|
|
93
|
+
|
|
94
|
+
@classmethod
|
|
95
|
+
def create(
|
|
96
|
+
cls,
|
|
97
|
+
*,
|
|
98
|
+
task_app_path: Path,
|
|
99
|
+
modal_app_path: Path,
|
|
100
|
+
synth_api_key: str,
|
|
101
|
+
env_api_key: str,
|
|
102
|
+
modal_bin_path: Path | None = None,
|
|
103
|
+
cmd_arg: Literal["deploy", "serve"] = "deploy",
|
|
104
|
+
modal_app_name: Optional[str] = None,
|
|
105
|
+
dry_run: bool = False,
|
|
106
|
+
) -> "ModalDeployCfg":
|
|
107
|
+
ctx: dict[str, Any] = {
|
|
108
|
+
"task_app_path": str(task_app_path),
|
|
109
|
+
"modal_app_path": str(modal_app_path),
|
|
110
|
+
"cmd_arg": cmd_arg,
|
|
111
|
+
"dry_run": dry_run,
|
|
112
|
+
"modal_app_name": modal_app_name,
|
|
113
|
+
"modal_bin_path": str(modal_bin_path) if modal_bin_path else None,
|
|
114
|
+
}
|
|
115
|
+
log_info("creating ModalDeployCfg", ctx=ctx)
|
|
116
|
+
modal_bin_path = modal_bin_path or get_bin_path("modal")
|
|
117
|
+
if modal_bin_path is None:
|
|
118
|
+
ctx["error"] = "ModalCLINotFound"
|
|
119
|
+
log_error("ModalDeployCfg creation failed", ctx=ctx)
|
|
120
|
+
raise ValueError("Modal CLI not found; install `modal` or pass --modal-cli with its path.")
|
|
121
|
+
ctx["modal_bin_path"] = str(modal_bin_path)
|
|
122
|
+
try:
|
|
123
|
+
cfg = cls(
|
|
124
|
+
task_app_path=task_app_path,
|
|
125
|
+
modal_app_path=modal_app_path,
|
|
126
|
+
modal_bin_path=modal_bin_path,
|
|
127
|
+
synth_api_key=synth_api_key,
|
|
128
|
+
env_api_key=env_api_key,
|
|
129
|
+
cmd_arg=cmd_arg,
|
|
130
|
+
modal_app_name=modal_app_name,
|
|
131
|
+
dry_run=dry_run,
|
|
132
|
+
)
|
|
133
|
+
return cfg
|
|
134
|
+
except Exception as exc:
|
|
135
|
+
ctx["error"] = type(exc).__name__
|
|
136
|
+
log_error("ModalDeployCfg creation failed", ctx=ctx)
|
|
137
|
+
raise
|
|
138
|
+
|
|
139
|
+
@classmethod
|
|
140
|
+
def create_from_kwargs(cls, **kwargs: Any) -> "ModalDeployCfg":
|
|
141
|
+
ctx: dict[str, Any] = {**kwargs}
|
|
142
|
+
log_info("creating ModalDeployCfg from kwargs", ctx=ctx)
|
|
143
|
+
|
|
144
|
+
synth_api_key = kwargs.get("synth_api_key")
|
|
145
|
+
if not synth_api_key or not isinstance(synth_api_key, str):
|
|
146
|
+
raise ValueError("synth_api_key must be provided as a string")
|
|
147
|
+
env_api_key = kwargs.get("env_api_key")
|
|
148
|
+
if not env_api_key or not isinstance(env_api_key, str):
|
|
149
|
+
raise ValueError("env_api_key must be provided as a string")
|
|
150
|
+
|
|
151
|
+
cmd_arg = str(kwargs.get("modal_mode", "deploy")).strip().lower()
|
|
152
|
+
if cmd_arg not in {"deploy", "serve"}:
|
|
153
|
+
raise ValueError("`--modal-mode` must be either 'deploy' or 'serve'.")
|
|
154
|
+
|
|
155
|
+
dry_run = bool(kwargs.get("dry_run", False))
|
|
156
|
+
if dry_run and os.getenv("CTX") == "mcp":
|
|
157
|
+
ctx["error"] = "dry_run_mcp"
|
|
158
|
+
log_error("ModalDeployCfg create_from_kwargs blocked", ctx=ctx)
|
|
159
|
+
raise ValueError("`synth-ai deploy --runtime modal --dry-run` cannot be used by MCP")
|
|
160
|
+
if dry_run and cmd_arg == "serve":
|
|
161
|
+
ctx["error"] = "dry_run_serve"
|
|
162
|
+
log_error("ModalDeployCfg create_from_kwargs blocked", ctx=ctx)
|
|
163
|
+
raise ValueError("`synth-ai deploy --runtime modal --modal-mode serve` cannot be used with `--dry-run`")
|
|
164
|
+
|
|
165
|
+
modal_bin_path_arg = kwargs.get("modal_cli")
|
|
166
|
+
modal_bin_path = Path(str(modal_bin_path_arg)).expanduser() if modal_bin_path_arg else get_bin_path("modal")
|
|
167
|
+
if modal_bin_path is None or not modal_bin_path.exists():
|
|
168
|
+
ctx["error"] = "ModalCLINotFound"
|
|
169
|
+
log_error("ModalDeployCfg create_from_kwargs failed", ctx=ctx)
|
|
170
|
+
raise ValueError('Modal binary not found via shutil.which("modal"). Install `modal` or pass --modal-cli with its path.')
|
|
171
|
+
modal_bin_path = modal_bin_path.resolve()
|
|
172
|
+
|
|
173
|
+
modal_app_name = kwargs.get("name")
|
|
174
|
+
if modal_app_name is not None:
|
|
175
|
+
modal_app_name = str(modal_app_name).strip() or None
|
|
176
|
+
|
|
177
|
+
literal_cmd = cast(Literal["deploy", "serve"], cmd_arg)
|
|
178
|
+
|
|
179
|
+
task_app_path = kwargs.get("task_app_path")
|
|
180
|
+
modal_app_path = kwargs.get("modal_app")
|
|
181
|
+
|
|
182
|
+
if not task_app_path:
|
|
183
|
+
raise ValueError("task_app_path is required")
|
|
184
|
+
if not modal_app_path:
|
|
185
|
+
raise ValueError("modal_app is required")
|
|
186
|
+
|
|
187
|
+
if not isinstance(task_app_path, Path):
|
|
188
|
+
task_app_path = Path(task_app_path)
|
|
189
|
+
if not isinstance(modal_app_path, Path):
|
|
190
|
+
modal_app_path = Path(modal_app_path)
|
|
191
|
+
|
|
192
|
+
try:
|
|
193
|
+
cfg = cls(
|
|
194
|
+
task_app_path=task_app_path,
|
|
195
|
+
modal_app_path=modal_app_path,
|
|
196
|
+
modal_bin_path=modal_bin_path,
|
|
197
|
+
synth_api_key=synth_api_key,
|
|
198
|
+
env_api_key=env_api_key,
|
|
199
|
+
cmd_arg=literal_cmd,
|
|
200
|
+
modal_app_name=modal_app_name,
|
|
201
|
+
dry_run=dry_run,
|
|
202
|
+
)
|
|
203
|
+
return cfg
|
|
204
|
+
except Exception as exc:
|
|
205
|
+
ctx["error"] = type(exc).__name__
|
|
206
|
+
log_error("ModalDeployCfg from kwargs failed", ctx=ctx)
|
|
207
|
+
raise
|
|
208
|
+
|
|
209
|
+
|
|
210
|
+
class CFDeployCfg(BaseModel):
|
|
211
|
+
task_app_path: Path
|
|
212
|
+
env_api_key: str
|
|
213
|
+
host: str = "127.0.0.1"
|
|
214
|
+
port: int = 8000
|
|
215
|
+
mode: Literal["quick", "managed"] = "quick"
|
|
216
|
+
tunnel_token: Optional[str] = None
|
|
217
|
+
subdomain: Optional[str] = None
|
|
218
|
+
trace: bool = True
|
|
219
|
+
|
|
220
|
+
@classmethod
|
|
221
|
+
def create(
|
|
222
|
+
cls,
|
|
223
|
+
*,
|
|
224
|
+
task_app_path: Path,
|
|
225
|
+
env_api_key: str,
|
|
226
|
+
host: str = "127.0.0.1",
|
|
227
|
+
port: int = 8000,
|
|
228
|
+
mode: Literal["quick", "managed"] = "quick",
|
|
229
|
+
subdomain: Optional[str] = None,
|
|
230
|
+
trace: bool = True,
|
|
231
|
+
) -> "CFDeployCfg":
|
|
232
|
+
return cls(
|
|
233
|
+
task_app_path=task_app_path,
|
|
234
|
+
env_api_key=env_api_key,
|
|
235
|
+
host=host,
|
|
236
|
+
port=port,
|
|
237
|
+
mode=mode,
|
|
238
|
+
subdomain=subdomain,
|
|
239
|
+
trace=trace,
|
|
240
|
+
)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"""Configuration base classes and utilities.
|
|
2
|
+
|
|
3
|
+
This module provides base classes for job configs and common
|
|
4
|
+
configuration patterns used across the SDK.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from .base import BaseJobConfig, ConfigValidator
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"BaseJobConfig",
|
|
13
|
+
"ConfigValidator",
|
|
14
|
+
]
|
|
15
|
+
|
|
16
|
+
|