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,175 @@
|
|
|
1
|
+
"""Async HTTP client for interacting with Task Apps.
|
|
2
|
+
|
|
3
|
+
Prefer synth_ai.sdk.localapi.client moving forward. This module remains for
|
|
4
|
+
backward compatibility during the naming transition.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
import asyncio
|
|
10
|
+
import os
|
|
11
|
+
from typing import Any
|
|
12
|
+
|
|
13
|
+
import httpx
|
|
14
|
+
from pydantic import BaseModel
|
|
15
|
+
|
|
16
|
+
from .contracts import RolloutRequest, RolloutResponse, TaskInfo
|
|
17
|
+
from .json import to_jsonable
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def _prepare_payload(payload: Any) -> Any:
|
|
21
|
+
if payload is None:
|
|
22
|
+
return None
|
|
23
|
+
if isinstance(payload, BaseModel):
|
|
24
|
+
return payload.model_dump(mode="json", by_alias=True)
|
|
25
|
+
return to_jsonable(payload)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class TaskAppClient:
|
|
29
|
+
def __init__(
|
|
30
|
+
self,
|
|
31
|
+
base_url: str,
|
|
32
|
+
api_key: str | None = None,
|
|
33
|
+
*,
|
|
34
|
+
timeout: float = 600.0,
|
|
35
|
+
retries: int = 3,
|
|
36
|
+
) -> None:
|
|
37
|
+
self.base_url = base_url.rstrip("/")
|
|
38
|
+
self.api_key = api_key
|
|
39
|
+
self.timeout = timeout
|
|
40
|
+
self.retries = max(1, retries)
|
|
41
|
+
self._client: httpx.AsyncClient | None = None
|
|
42
|
+
self.env = _TaskAppEnvironmentClient(self)
|
|
43
|
+
|
|
44
|
+
async def __aenter__(self) -> TaskAppClient:
|
|
45
|
+
await self._ensure_client()
|
|
46
|
+
return self
|
|
47
|
+
|
|
48
|
+
async def __aexit__(self, exc_type, exc, tb) -> None:
|
|
49
|
+
await self.aclose()
|
|
50
|
+
|
|
51
|
+
async def _ensure_client(self) -> httpx.AsyncClient:
|
|
52
|
+
if self._client is None:
|
|
53
|
+
self._client = httpx.AsyncClient(
|
|
54
|
+
base_url=self.base_url,
|
|
55
|
+
timeout=httpx.Timeout(self.timeout),
|
|
56
|
+
follow_redirects=True,
|
|
57
|
+
)
|
|
58
|
+
return self._client
|
|
59
|
+
|
|
60
|
+
def _headers(self) -> dict[str, str]:
|
|
61
|
+
headers: dict[str, str] = {}
|
|
62
|
+
# Primary key
|
|
63
|
+
primary = (self.api_key or "").strip()
|
|
64
|
+
if primary:
|
|
65
|
+
headers["X-API-Key"] = primary
|
|
66
|
+
# Also set Authorization for clients that read bearer tokens
|
|
67
|
+
headers.setdefault("Authorization", f"Bearer {primary}")
|
|
68
|
+
# Include ALL available environment keys via CSV in X-API-Keys
|
|
69
|
+
keys: list[str] = []
|
|
70
|
+
if primary:
|
|
71
|
+
keys.append(primary)
|
|
72
|
+
aliases = (os.getenv("ENVIRONMENT_API_KEY_ALIASES") or "").strip()
|
|
73
|
+
if aliases:
|
|
74
|
+
for part in aliases.split(","):
|
|
75
|
+
trimmed = part.strip()
|
|
76
|
+
if trimmed and trimmed not in keys:
|
|
77
|
+
keys.append(trimmed)
|
|
78
|
+
if keys:
|
|
79
|
+
headers["X-API-Keys"] = ",".join(keys)
|
|
80
|
+
return headers
|
|
81
|
+
|
|
82
|
+
async def aclose(self) -> None:
|
|
83
|
+
if self._client is not None:
|
|
84
|
+
await self._client.aclose()
|
|
85
|
+
self._client = None
|
|
86
|
+
|
|
87
|
+
async def _request(
|
|
88
|
+
self,
|
|
89
|
+
method: str,
|
|
90
|
+
path: str,
|
|
91
|
+
*,
|
|
92
|
+
params: dict[str, Any] | list[tuple[str, Any]] | None = None,
|
|
93
|
+
json_payload: Any = None,
|
|
94
|
+
) -> httpx.Response:
|
|
95
|
+
client = await self._ensure_client()
|
|
96
|
+
payload = _prepare_payload(json_payload)
|
|
97
|
+
headers = self._headers()
|
|
98
|
+
last_exc: Exception | None = None
|
|
99
|
+
for attempt in range(self.retries):
|
|
100
|
+
try:
|
|
101
|
+
response = await client.request(
|
|
102
|
+
method,
|
|
103
|
+
path,
|
|
104
|
+
headers=headers,
|
|
105
|
+
params=params,
|
|
106
|
+
json=payload,
|
|
107
|
+
)
|
|
108
|
+
response.raise_for_status()
|
|
109
|
+
return response
|
|
110
|
+
except httpx.HTTPStatusError as exc:
|
|
111
|
+
if 500 <= exc.response.status_code < 600 and attempt + 1 < self.retries:
|
|
112
|
+
await asyncio.sleep(0.1 * (attempt + 1))
|
|
113
|
+
last_exc = exc
|
|
114
|
+
continue
|
|
115
|
+
raise
|
|
116
|
+
except httpx.HTTPError as exc:
|
|
117
|
+
last_exc = exc
|
|
118
|
+
if attempt + 1 >= self.retries:
|
|
119
|
+
raise
|
|
120
|
+
await asyncio.sleep(0.1 * (attempt + 1))
|
|
121
|
+
if last_exc: # pragma: no cover - defensive
|
|
122
|
+
raise last_exc
|
|
123
|
+
raise RuntimeError("Unreachable code in TaskAppClient._request")
|
|
124
|
+
|
|
125
|
+
async def health(self) -> dict[str, Any]:
|
|
126
|
+
response = await self._request("GET", "/health")
|
|
127
|
+
return response.json()
|
|
128
|
+
|
|
129
|
+
async def info(self) -> dict[str, Any]:
|
|
130
|
+
response = await self._request("GET", "/info")
|
|
131
|
+
return response.json()
|
|
132
|
+
|
|
133
|
+
async def task_info(self, seeds: list[int] | None = None) -> TaskInfo | list[TaskInfo]:
|
|
134
|
+
params: list[tuple[str, Any]] | None = None
|
|
135
|
+
if seeds:
|
|
136
|
+
params = [("seed", seed) for seed in seeds]
|
|
137
|
+
response = await self._request("GET", "/task_info", params=params)
|
|
138
|
+
data = response.json()
|
|
139
|
+
if isinstance(data, list):
|
|
140
|
+
return [TaskInfo.model_validate(item) for item in data]
|
|
141
|
+
return TaskInfo.model_validate(data)
|
|
142
|
+
|
|
143
|
+
async def rollout(self, request: RolloutRequest) -> RolloutResponse:
|
|
144
|
+
response = await self._request("POST", "/rollout", json_payload=request)
|
|
145
|
+
data = response.json()
|
|
146
|
+
return RolloutResponse.model_validate(data)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
class LocalAPIClient(TaskAppClient):
|
|
150
|
+
"""Alias for TaskAppClient with LocalAPI naming."""
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class _TaskAppEnvironmentClient:
|
|
154
|
+
def __init__(self, client: TaskAppClient) -> None:
|
|
155
|
+
self._client = client
|
|
156
|
+
|
|
157
|
+
async def initialize(self, env_name: str, payload: dict[str, Any]) -> dict[str, Any]:
|
|
158
|
+
response = await self._client._request(
|
|
159
|
+
"POST", f"/env/{env_name}/initialize", json_payload=payload
|
|
160
|
+
)
|
|
161
|
+
return response.json()
|
|
162
|
+
|
|
163
|
+
async def step(self, env_name: str, payload: dict[str, Any]) -> dict[str, Any]:
|
|
164
|
+
response = await self._client._request(
|
|
165
|
+
"POST", f"/env/{env_name}/step", json_payload=payload
|
|
166
|
+
)
|
|
167
|
+
return response.json()
|
|
168
|
+
|
|
169
|
+
async def terminate(
|
|
170
|
+
self, env_name: str, payload: dict[str, Any] | None = None
|
|
171
|
+
) -> dict[str, Any]:
|
|
172
|
+
response = await self._client._request(
|
|
173
|
+
"POST", f"/env/{env_name}/terminate", json_payload=payload or {}
|
|
174
|
+
)
|
|
175
|
+
return response.json()
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"""Configuration dataclasses for task app CLI commands (eval, filter)."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from dataclasses import dataclass, field
|
|
6
|
+
from pathlib import Path
|
|
7
|
+
from typing import Any, Literal
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
@dataclass(slots=True)
|
|
11
|
+
class EvalConfig:
|
|
12
|
+
"""Configuration for 'synth-ai eval' command.
|
|
13
|
+
|
|
14
|
+
Validates and provides defaults for evaluation runs against task apps.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
# Required: Task app identifier
|
|
18
|
+
app_id: str
|
|
19
|
+
|
|
20
|
+
# Required: Model to evaluate
|
|
21
|
+
model: str
|
|
22
|
+
|
|
23
|
+
# Required: Seeds to run
|
|
24
|
+
seeds: list[int]
|
|
25
|
+
|
|
26
|
+
# Optional: Task app URL (None = spawn in-process)
|
|
27
|
+
task_app_url: str | None = None
|
|
28
|
+
|
|
29
|
+
# Optional: Data split to use
|
|
30
|
+
split: str = "train"
|
|
31
|
+
|
|
32
|
+
# Optional: Maximum turns/steps per episode
|
|
33
|
+
max_turns: int | None = None
|
|
34
|
+
|
|
35
|
+
# Optional: Maximum LLM calls per episode
|
|
36
|
+
max_llm_calls: int = 10
|
|
37
|
+
|
|
38
|
+
# Optional: Concurrency for parallel rollouts
|
|
39
|
+
concurrency: int = 1
|
|
40
|
+
|
|
41
|
+
# Optional: Environment name
|
|
42
|
+
env_name: str | None = None
|
|
43
|
+
|
|
44
|
+
# Optional: Policy name
|
|
45
|
+
policy_name: str | None = None
|
|
46
|
+
|
|
47
|
+
# Optional: Trace format ("compact", "full", "structured")
|
|
48
|
+
trace_format: Literal["compact", "full", "structured"] = "compact"
|
|
49
|
+
|
|
50
|
+
# Optional: Whether to return traces in response
|
|
51
|
+
return_trace: bool = False
|
|
52
|
+
|
|
53
|
+
# Optional: Environment config overrides
|
|
54
|
+
env_config: dict[str, Any] = field(default_factory=dict)
|
|
55
|
+
|
|
56
|
+
# Optional: Policy config overrides
|
|
57
|
+
policy_config: dict[str, Any] = field(default_factory=dict)
|
|
58
|
+
|
|
59
|
+
# Optional: Metadata for traces
|
|
60
|
+
metadata: dict[str, str] = field(default_factory=dict)
|
|
61
|
+
|
|
62
|
+
# Optional: SQL query for metadata filtering
|
|
63
|
+
metadata_sql: str | None = None
|
|
64
|
+
|
|
65
|
+
def __post_init__(self):
|
|
66
|
+
"""Validate configuration after initialization."""
|
|
67
|
+
if not self.app_id:
|
|
68
|
+
raise ValueError("app_id is required")
|
|
69
|
+
|
|
70
|
+
if not self.model:
|
|
71
|
+
raise ValueError("model is required")
|
|
72
|
+
|
|
73
|
+
if not self.seeds:
|
|
74
|
+
raise ValueError("seeds list cannot be empty")
|
|
75
|
+
|
|
76
|
+
if not isinstance(self.seeds, list):
|
|
77
|
+
raise ValueError("seeds must be a list of integers")
|
|
78
|
+
|
|
79
|
+
if self.concurrency < 1:
|
|
80
|
+
raise ValueError("concurrency must be >= 1")
|
|
81
|
+
|
|
82
|
+
if self.max_llm_calls < 1:
|
|
83
|
+
raise ValueError("max_llm_calls must be >= 1")
|
|
84
|
+
|
|
85
|
+
if self.max_turns is not None and self.max_turns < 1:
|
|
86
|
+
raise ValueError("max_turns must be >= 1")
|
|
87
|
+
|
|
88
|
+
if self.trace_format not in ("compact", "full", "structured"):
|
|
89
|
+
raise ValueError(f"trace_format must be 'compact', 'full', or 'structured', got: {self.trace_format}")
|
|
90
|
+
|
|
91
|
+
@classmethod
|
|
92
|
+
def from_dict(cls, data: dict[str, Any]) -> EvalConfig:
|
|
93
|
+
"""Create EvalConfig from a dictionary (e.g. from TOML).
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
data: Dictionary with eval configuration
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
Validated EvalConfig instance
|
|
100
|
+
"""
|
|
101
|
+
# Extract known fields
|
|
102
|
+
config_dict = {
|
|
103
|
+
"app_id": data.get("app_id"),
|
|
104
|
+
"model": data.get("model"),
|
|
105
|
+
"seeds": data.get("seeds", []),
|
|
106
|
+
"task_app_url": data.get("task_app_url"),
|
|
107
|
+
"split": data.get("split", "train"),
|
|
108
|
+
"max_turns": data.get("max_turns"),
|
|
109
|
+
"max_llm_calls": data.get("max_llm_calls", 10),
|
|
110
|
+
"concurrency": data.get("concurrency", 1),
|
|
111
|
+
"env_name": data.get("env_name"),
|
|
112
|
+
"policy_name": data.get("policy_name"),
|
|
113
|
+
"trace_format": data.get("trace_format", "compact"),
|
|
114
|
+
"return_trace": data.get("return_trace", False),
|
|
115
|
+
"env_config": data.get("env_config", {}),
|
|
116
|
+
"policy_config": data.get("policy_config", {}),
|
|
117
|
+
"metadata": data.get("metadata", {}),
|
|
118
|
+
"metadata_sql": data.get("metadata_sql"),
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
return cls(**config_dict)
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
@dataclass(slots=True)
|
|
125
|
+
class FilterConfig:
|
|
126
|
+
"""Configuration for 'synth-ai filter' command.
|
|
127
|
+
|
|
128
|
+
Validates and provides defaults for filtering traces into SFT datasets.
|
|
129
|
+
"""
|
|
130
|
+
|
|
131
|
+
# Required: Database path or URL
|
|
132
|
+
db: str
|
|
133
|
+
|
|
134
|
+
# Required: Output JSONL path
|
|
135
|
+
output: str
|
|
136
|
+
|
|
137
|
+
# Optional: Filter by data splits
|
|
138
|
+
splits: list[str] = field(default_factory=list)
|
|
139
|
+
|
|
140
|
+
# Optional: Filter by task IDs
|
|
141
|
+
task_ids: list[str] = field(default_factory=list)
|
|
142
|
+
|
|
143
|
+
# Optional: Filter by models
|
|
144
|
+
models: list[str] = field(default_factory=list)
|
|
145
|
+
|
|
146
|
+
# Optional: Minimum official score threshold
|
|
147
|
+
min_official_score: float | None = None
|
|
148
|
+
|
|
149
|
+
# Optional: Maximum official score threshold
|
|
150
|
+
max_official_score: float | None = None
|
|
151
|
+
|
|
152
|
+
# Optional: Minimum judge scores (judge_name -> min_score)
|
|
153
|
+
min_judge_scores: dict[str, float] = field(default_factory=dict)
|
|
154
|
+
|
|
155
|
+
# Optional: Maximum judge scores (judge_name -> max_score)
|
|
156
|
+
max_judge_scores: dict[str, float] = field(default_factory=dict)
|
|
157
|
+
|
|
158
|
+
# Optional: Limit number of examples
|
|
159
|
+
limit: int | None = None
|
|
160
|
+
|
|
161
|
+
# Optional: Offset for pagination
|
|
162
|
+
offset: int | None = None
|
|
163
|
+
|
|
164
|
+
# Optional: Whether to shuffle results
|
|
165
|
+
shuffle: bool = False
|
|
166
|
+
|
|
167
|
+
# Optional: Random seed for shuffling
|
|
168
|
+
shuffle_seed: int | None = None
|
|
169
|
+
|
|
170
|
+
def __post_init__(self):
|
|
171
|
+
"""Validate configuration after initialization."""
|
|
172
|
+
if not self.db:
|
|
173
|
+
raise ValueError("db (database path or URL) is required")
|
|
174
|
+
|
|
175
|
+
if not self.output:
|
|
176
|
+
raise ValueError("output (JSONL file path) is required")
|
|
177
|
+
|
|
178
|
+
# Validate output has .jsonl extension
|
|
179
|
+
output_path = Path(self.output)
|
|
180
|
+
if output_path.suffix.lower() not in (".jsonl", ".json"):
|
|
181
|
+
raise ValueError(f"output must be a .jsonl or .json file, got: {self.output}")
|
|
182
|
+
|
|
183
|
+
# Validate score thresholds
|
|
184
|
+
if (
|
|
185
|
+
self.min_official_score is not None
|
|
186
|
+
and self.max_official_score is not None
|
|
187
|
+
and self.min_official_score > self.max_official_score
|
|
188
|
+
):
|
|
189
|
+
raise ValueError("min_official_score cannot be greater than max_official_score")
|
|
190
|
+
|
|
191
|
+
# Validate limit/offset
|
|
192
|
+
if self.limit is not None and self.limit < 1:
|
|
193
|
+
raise ValueError("limit must be >= 1")
|
|
194
|
+
|
|
195
|
+
if self.offset is not None and self.offset < 0:
|
|
196
|
+
raise ValueError("offset must be >= 0")
|
|
197
|
+
|
|
198
|
+
# Validate shuffle seed requires shuffle
|
|
199
|
+
if self.shuffle_seed is not None and not self.shuffle:
|
|
200
|
+
raise ValueError("shuffle_seed requires shuffle=true")
|
|
201
|
+
|
|
202
|
+
@classmethod
|
|
203
|
+
def from_dict(cls, data: dict[str, Any]) -> FilterConfig:
|
|
204
|
+
"""Create FilterConfig from a dictionary (e.g. from TOML).
|
|
205
|
+
|
|
206
|
+
Args:
|
|
207
|
+
data: Dictionary with filter configuration
|
|
208
|
+
|
|
209
|
+
Returns:
|
|
210
|
+
Validated FilterConfig instance
|
|
211
|
+
"""
|
|
212
|
+
# Extract known fields
|
|
213
|
+
config_dict = {
|
|
214
|
+
"db": data.get("db"),
|
|
215
|
+
"output": data.get("output"),
|
|
216
|
+
"splits": data.get("splits", []),
|
|
217
|
+
"task_ids": data.get("task_ids", []),
|
|
218
|
+
"models": data.get("models", []),
|
|
219
|
+
"min_official_score": data.get("min_official_score"),
|
|
220
|
+
"max_official_score": data.get("max_official_score"),
|
|
221
|
+
"min_judge_scores": data.get("min_judge_scores", {}),
|
|
222
|
+
"max_judge_scores": data.get("max_judge_scores", {}),
|
|
223
|
+
"limit": data.get("limit"),
|
|
224
|
+
"offset": data.get("offset"),
|
|
225
|
+
"shuffle": data.get("shuffle", False),
|
|
226
|
+
"shuffle_seed": data.get("shuffle_seed"),
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
return cls(**config_dict)
|
|
230
|
+
|
|
231
|
+
def get_db_url(self) -> str:
|
|
232
|
+
"""Convert db path to proper SQLite URL if needed.
|
|
233
|
+
|
|
234
|
+
Returns:
|
|
235
|
+
Database URL suitable for SQLAlchemy/aiosqlite
|
|
236
|
+
"""
|
|
237
|
+
db_value = self.db.strip()
|
|
238
|
+
if "://" in db_value:
|
|
239
|
+
return db_value
|
|
240
|
+
else:
|
|
241
|
+
db_path = Path(db_value).expanduser().resolve()
|
|
242
|
+
# Ensure parent directory exists
|
|
243
|
+
db_path.parent.mkdir(parents=True, exist_ok=True)
|
|
244
|
+
return f"sqlite+aiosqlite:///{db_path}"
|
|
245
|
+
|
|
246
|
+
def get_output_path(self) -> Path:
|
|
247
|
+
"""Get resolved output path with parent directory created.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Resolved Path object with parent directory created
|
|
251
|
+
"""
|
|
252
|
+
output_path = Path(self.output).expanduser().resolve()
|
|
253
|
+
output_path.parent.mkdir(parents=True, exist_ok=True)
|
|
254
|
+
return output_path
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
"""Contracts for Task Apps.
|
|
2
|
+
|
|
3
|
+
Prefer synth_ai.sdk.localapi.contracts moving forward. This module remains for
|
|
4
|
+
backward compatibility during the naming transition.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from enum import Enum
|
|
11
|
+
from typing import Any, Literal
|
|
12
|
+
|
|
13
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class RolloutMode(str, Enum):
|
|
17
|
+
"""Mode controls how rollout infrastructure processes inference URLs."""
|
|
18
|
+
RL = "rl"
|
|
19
|
+
EVAL = "eval"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class OutputMode(str, Enum):
|
|
23
|
+
"""Controls how the policy expects model outputs.
|
|
24
|
+
|
|
25
|
+
- TOOL_CALLS: Use function/tool calling (default, current behavior)
|
|
26
|
+
- TEXT: Plain text in message.content
|
|
27
|
+
- STRUCTURED: JSON via response_format (OpenAI json_schema, Groq json_object, Gemini responseSchema)
|
|
28
|
+
"""
|
|
29
|
+
TOOL_CALLS = "tool_calls"
|
|
30
|
+
TEXT = "text"
|
|
31
|
+
STRUCTURED = "structured"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class StructuredOutputConfig(BaseModel):
|
|
35
|
+
"""Configuration for structured output mode (OutputMode.STRUCTURED).
|
|
36
|
+
|
|
37
|
+
Defines the JSON schema that the model must conform to when using structured outputs.
|
|
38
|
+
This is normalized across providers:
|
|
39
|
+
- OpenAI: response_format.json_schema
|
|
40
|
+
- Groq: response_format.json_schema or json_object
|
|
41
|
+
- Gemini: generationConfig.responseSchema
|
|
42
|
+
"""
|
|
43
|
+
schema: dict[str, Any] = Field(
|
|
44
|
+
...,
|
|
45
|
+
description="JSON Schema for the expected response structure"
|
|
46
|
+
)
|
|
47
|
+
schema_name: str = Field(
|
|
48
|
+
default="response",
|
|
49
|
+
description="Name for the schema (required by some providers)"
|
|
50
|
+
)
|
|
51
|
+
strict: bool = Field(
|
|
52
|
+
default=True,
|
|
53
|
+
description="Whether to enforce strict schema validation (OpenAI strict mode)"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
@dataclass(frozen=True)
|
|
58
|
+
class TaskAppEndpoints:
|
|
59
|
+
"""Required Task App endpoints used by RL trainers and clients.
|
|
60
|
+
|
|
61
|
+
Task Apps run as lightweight HTTP services (often on Modal) that expose these
|
|
62
|
+
standard endpoints. Additional endpoints (proxies, debug routes) may be added
|
|
63
|
+
by individual task apps as needed.
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
root: str = "/"
|
|
67
|
+
health: str = "/health"
|
|
68
|
+
info: str = "/info"
|
|
69
|
+
task_info: str = "/task_info"
|
|
70
|
+
rollout: str = "/rollout"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
@dataclass(frozen=True)
|
|
74
|
+
class LocalAPIEndpoints(TaskAppEndpoints):
|
|
75
|
+
"""Alias for TaskAppEndpoints with LocalAPI naming."""
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
# --- Unified rollout schema used by Task App services and SDK utilities ---
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class RolloutEnvSpec(BaseModel):
|
|
82
|
+
env_id: str | None = None
|
|
83
|
+
env_name: str | None = None
|
|
84
|
+
config: dict[str, Any] = Field(default_factory=dict)
|
|
85
|
+
seed: int | None = None
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class RolloutPolicySpec(BaseModel):
|
|
89
|
+
policy_id: str | None = None
|
|
90
|
+
policy_name: str | None = None
|
|
91
|
+
config: dict[str, Any] = Field(default_factory=dict)
|
|
92
|
+
|
|
93
|
+
# Output mode configuration (defaults to tool_calls for backward compatibility)
|
|
94
|
+
output_mode: OutputMode = Field(
|
|
95
|
+
default=OutputMode.TOOL_CALLS,
|
|
96
|
+
description="How the policy expects model outputs: tool_calls, text, or structured"
|
|
97
|
+
)
|
|
98
|
+
structured_config: StructuredOutputConfig | None = Field(
|
|
99
|
+
default=None,
|
|
100
|
+
description="Configuration for structured output mode (required if output_mode=STRUCTURED)"
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class RolloutRecordConfig(BaseModel):
|
|
105
|
+
logprobs: bool = False
|
|
106
|
+
value: bool = False
|
|
107
|
+
return_trace: bool = False
|
|
108
|
+
trace_format: Literal["compact", "full", "structured"] = "compact"
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
class RolloutSafetyConfig(BaseModel):
|
|
112
|
+
max_time_s: float = 3600.0
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class RolloutRequest(BaseModel):
|
|
116
|
+
run_id: str
|
|
117
|
+
env: RolloutEnvSpec
|
|
118
|
+
policy: RolloutPolicySpec
|
|
119
|
+
record: RolloutRecordConfig = RolloutRecordConfig()
|
|
120
|
+
on_done: str = "reset"
|
|
121
|
+
safety: RolloutSafetyConfig = RolloutSafetyConfig()
|
|
122
|
+
training_session_id: str | None = None
|
|
123
|
+
synth_base_url: str | None = None
|
|
124
|
+
mode: RolloutMode = RolloutMode.RL # Default to RL mode for training/optimization
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
class RolloutMetrics(BaseModel):
|
|
128
|
+
episode_returns: list[float]
|
|
129
|
+
mean_return: float
|
|
130
|
+
num_steps: int
|
|
131
|
+
num_episodes: int = 0
|
|
132
|
+
outcome_score: float | None = None
|
|
133
|
+
events_score: float | None = None
|
|
134
|
+
details: dict[str, Any] = Field(default_factory=dict)
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
class RolloutResponse(BaseModel):
|
|
138
|
+
"""Response from a rollout execution (trace-only)."""
|
|
139
|
+
run_id: str
|
|
140
|
+
branches: dict[str, list[str]] = Field(default_factory=dict)
|
|
141
|
+
metrics: RolloutMetrics
|
|
142
|
+
aborted: bool = False
|
|
143
|
+
trace_correlation_id: str | None = None
|
|
144
|
+
trace: dict[str, Any] | None = None
|
|
145
|
+
pipeline_metadata: dict[str, Any] = Field(default_factory=dict)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
class _ExtraAllowModel(BaseModel):
|
|
149
|
+
"""Base helper that preserves unknown keys while still exposing typed attributes."""
|
|
150
|
+
|
|
151
|
+
model_config = ConfigDict(extra="allow")
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
class TaskDescriptor(_ExtraAllowModel):
|
|
155
|
+
"""Human-readable task identifiers shown in UIs and logs."""
|
|
156
|
+
|
|
157
|
+
id: str
|
|
158
|
+
name: str
|
|
159
|
+
description: str | None = None
|
|
160
|
+
version: str | None = None
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
class DatasetInfo(_ExtraAllowModel):
|
|
164
|
+
"""Metadata about the prompt/task dataset powering the environment."""
|
|
165
|
+
|
|
166
|
+
id: str | None = None
|
|
167
|
+
name: str | None = None
|
|
168
|
+
version: str | None = None
|
|
169
|
+
splits: list[str] | None = None
|
|
170
|
+
default_split: str | None = None
|
|
171
|
+
description: str | None = None
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
class RubricCriterion(_ExtraAllowModel):
|
|
175
|
+
id: str
|
|
176
|
+
description: str
|
|
177
|
+
weight: float | None = None
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class RubricSection(_ExtraAllowModel):
|
|
181
|
+
name: str
|
|
182
|
+
criteria: list[RubricCriterion] = Field(default_factory=list)
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
class RubricInfo(_ExtraAllowModel):
|
|
186
|
+
"""Outcome and event scoring definitions used by judges."""
|
|
187
|
+
|
|
188
|
+
outcome: RubricSection | None = None
|
|
189
|
+
events: RubricSection | None = None
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
class InferenceInfo(_ExtraAllowModel):
|
|
193
|
+
"""Recommended defaults for policy model routing."""
|
|
194
|
+
|
|
195
|
+
model: str | None = None
|
|
196
|
+
inference_url: str | None = None
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class LimitsInfo(_ExtraAllowModel):
|
|
200
|
+
"""Operational limits the environment enforces."""
|
|
201
|
+
|
|
202
|
+
max_turns: int | None = None
|
|
203
|
+
max_response_tokens: int | None = None
|
|
204
|
+
timeout_seconds: int | None = None
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class TaskInfo(_ExtraAllowModel):
|
|
208
|
+
"""Static metadata describing the capabilities of a Task App task."""
|
|
209
|
+
|
|
210
|
+
task: TaskDescriptor
|
|
211
|
+
environment: str
|
|
212
|
+
dataset: DatasetInfo
|
|
213
|
+
rubric: RubricInfo
|
|
214
|
+
inference: InferenceInfo
|
|
215
|
+
limits: LimitsInfo
|
|
216
|
+
task_metadata: dict[str, Any] = Field(
|
|
217
|
+
default_factory=dict,
|
|
218
|
+
description="Task-specific extras (e.g. prompt version info, documentation links).",
|
|
219
|
+
)
|