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,591 @@
|
|
|
1
|
+
"""Configuration for Graph Optimization jobs.
|
|
2
|
+
|
|
3
|
+
This module provides Pydantic models for loading and validating
|
|
4
|
+
graph optimization configuration from TOML files.
|
|
5
|
+
|
|
6
|
+
Supports multiple algorithms:
|
|
7
|
+
- graph_gepa: Grammatical Evolution for graph structure optimization
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
from enum import Enum
|
|
13
|
+
from pathlib import Path
|
|
14
|
+
from typing import Any, Dict, List, Optional
|
|
15
|
+
|
|
16
|
+
try:
|
|
17
|
+
import tomllib
|
|
18
|
+
except ImportError:
|
|
19
|
+
import tomli as tomllib # type: ignore[import-not-found]
|
|
20
|
+
|
|
21
|
+
from pydantic import BaseModel, Field, field_validator
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class GraphType(str, Enum):
|
|
25
|
+
"""What the graph does.
|
|
26
|
+
|
|
27
|
+
- POLICY: Maps inputs to outputs (standard LLM pipeline)
|
|
28
|
+
- VERIFIER: Judges/scores existing results
|
|
29
|
+
- RLM: Recursive Language Model - handles massive context (1M+ tokens) by keeping
|
|
30
|
+
it out of prompts and searching via tools. Auto-adds materialize_context,
|
|
31
|
+
local_grep, local_search, query_lm, and codex_exec tools.
|
|
32
|
+
"""
|
|
33
|
+
POLICY = "policy" # Maps inputs to outputs, solves tasks
|
|
34
|
+
VERIFIER = "verifier" # Judges/scores existing results
|
|
35
|
+
RLM = "rlm" # Recursive LM - massive context via tool search
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class GraphPattern(str, Enum):
|
|
39
|
+
"""Architectural patterns for graph structure.
|
|
40
|
+
|
|
41
|
+
These patterns can be applied to ANY graph type (policy, verifier, rlm).
|
|
42
|
+
They describe HOW the graph processes data, not WHAT it does.
|
|
43
|
+
|
|
44
|
+
Use patterns to guide the proposer toward specific architectures:
|
|
45
|
+
- patterns.required=["rlm"] → MUST use RLM pattern (auto-adds tools)
|
|
46
|
+
- patterns.optional=["rlm", "map_reduce"] → May try either pattern
|
|
47
|
+
- patterns.prefer=["map_reduce"] → Prefer this pattern when viable
|
|
48
|
+
|
|
49
|
+
Patterns:
|
|
50
|
+
- RLM: Tool-based search for massive context (1M+ tokens).
|
|
51
|
+
Materializes context to files, uses grep/search tools.
|
|
52
|
+
Good for: RAG, codebase search, document QA.
|
|
53
|
+
|
|
54
|
+
- MAP_REDUCE: Parallel processing for variable-length inputs.
|
|
55
|
+
Maps over items in parallel, then reduces/aggregates.
|
|
56
|
+
Good for: scoring events, processing lists, chunking.
|
|
57
|
+
|
|
58
|
+
- SINGLE_SHOT: Single LLM call, minimal structure.
|
|
59
|
+
Good for: classification, simple QA.
|
|
60
|
+
|
|
61
|
+
- CHAIN_OF_THOUGHT: Multi-step reasoning, sequential nodes.
|
|
62
|
+
Good for: complex reasoning, multi-hop QA.
|
|
63
|
+
|
|
64
|
+
- DIGEST_COMBINE: Two-stage: digest in parallel, then combine.
|
|
65
|
+
Good for: verifiers analyzing multiple aspects.
|
|
66
|
+
"""
|
|
67
|
+
RLM = "rlm"
|
|
68
|
+
MAP_REDUCE = "map_reduce"
|
|
69
|
+
SINGLE_SHOT = "single_shot"
|
|
70
|
+
CHAIN_OF_THOUGHT = "chain_of_thought"
|
|
71
|
+
DIGEST_COMBINE = "digest_combine"
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
class PatternConfig(BaseModel):
|
|
75
|
+
"""Configuration for which architectural patterns the proposer should use.
|
|
76
|
+
|
|
77
|
+
Patterns are orthogonal to graph_type - you can have an RLM-pattern verifier
|
|
78
|
+
or a map-reduce-pattern policy. This lets you guide the proposer toward
|
|
79
|
+
specific architectures without changing the fundamental graph type.
|
|
80
|
+
|
|
81
|
+
Examples:
|
|
82
|
+
# RLM verifier (MUST use RLM pattern - auto-adds tools & guidance)
|
|
83
|
+
patterns = PatternConfig(required=["rlm"])
|
|
84
|
+
|
|
85
|
+
# Let proposer try different patterns
|
|
86
|
+
patterns = PatternConfig(optional=["rlm", "map_reduce", "digest_combine"])
|
|
87
|
+
|
|
88
|
+
# Prefer map-reduce but allow alternatives
|
|
89
|
+
patterns = PatternConfig(
|
|
90
|
+
required=[],
|
|
91
|
+
optional=["map_reduce", "digest_combine"],
|
|
92
|
+
prefer=["map_reduce"]
|
|
93
|
+
)
|
|
94
|
+
|
|
95
|
+
When RLM pattern is in required/prefer:
|
|
96
|
+
- Tools are auto-added: materialize_context, local_grep, local_search, etc.
|
|
97
|
+
- Proposer receives RLM-specific guidance for tool-based search patterns
|
|
98
|
+
"""
|
|
99
|
+
required: List[str] = Field(
|
|
100
|
+
default_factory=list,
|
|
101
|
+
description="Patterns the graph MUST use. Proposer will incorporate all required patterns."
|
|
102
|
+
)
|
|
103
|
+
optional: List[str] = Field(
|
|
104
|
+
default_factory=list,
|
|
105
|
+
description="Patterns the proposer MAY consider. These are suggestions, not requirements."
|
|
106
|
+
)
|
|
107
|
+
prefer: List[str] = Field(
|
|
108
|
+
default_factory=list,
|
|
109
|
+
description="Patterns to prefer when multiple options are viable."
|
|
110
|
+
)
|
|
111
|
+
|
|
112
|
+
def to_api_dict(self) -> Dict[str, Any]:
|
|
113
|
+
"""Convert to API request format."""
|
|
114
|
+
return {
|
|
115
|
+
"required": [GraphPattern(p).value for p in self.required],
|
|
116
|
+
"optional": [GraphPattern(p).value for p in self.optional],
|
|
117
|
+
"prefer": [GraphPattern(p).value for p in self.prefer],
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class GraphStructure(str, Enum):
|
|
122
|
+
"""Structural complexity of the graph."""
|
|
123
|
+
SINGLE_PROMPT = "single_prompt" # One LLM call, minimal structure
|
|
124
|
+
DAG = "dag" # Multiple nodes in sequence, no branching
|
|
125
|
+
CONDITIONAL = "conditional" # Full graph with conditional branching
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class ProposerConfig(BaseModel):
|
|
129
|
+
"""Configuration for the LLM proposer."""
|
|
130
|
+
model: str = Field(default="gpt-4.1", description="Model for proposing patches")
|
|
131
|
+
temperature: float = Field(default=0.7, ge=0.0, le=2.0)
|
|
132
|
+
max_tokens: int = Field(default=4096, gt=0)
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class EvolutionConfig(BaseModel):
|
|
136
|
+
"""Evolution algorithm parameters."""
|
|
137
|
+
num_generations: int = Field(default=5, ge=1, description="Number of evolution generations")
|
|
138
|
+
children_per_generation: int = Field(default=3, ge=1, description="Children per generation")
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
class SeedsConfig(BaseModel):
|
|
142
|
+
"""Train and validation seed configuration."""
|
|
143
|
+
train: List[int] = Field(default_factory=lambda: list(range(10)))
|
|
144
|
+
validation: List[int] = Field(default_factory=lambda: list(range(100, 105)))
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class LimitsConfig(BaseModel):
|
|
148
|
+
"""Resource limits for the job."""
|
|
149
|
+
max_spend_usd: float = Field(default=10.0, gt=0)
|
|
150
|
+
timeout_seconds: int = Field(default=3600, gt=0)
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
class IndifferencePointConfig(BaseModel):
|
|
154
|
+
"""Defines trade-off equivalences at a specific anchor point.
|
|
155
|
+
|
|
156
|
+
Example: At 80% accuracy, 2s latency, $0.50 cost:
|
|
157
|
+
- +2% accuracy change is equivalent to -0.4s latency or -$0.10 cost
|
|
158
|
+
- Differences below 0.5% accuracy are considered noise
|
|
159
|
+
"""
|
|
160
|
+
# Anchor point (where trade-offs are defined)
|
|
161
|
+
reward: float = Field(..., description="Anchor reward (e.g., 0.80 for 80%)")
|
|
162
|
+
latency_s: float = Field(..., description="Anchor latency in seconds")
|
|
163
|
+
cost_usd: float = Field(..., description="Anchor cost per seed in USD")
|
|
164
|
+
|
|
165
|
+
# Trade-off equivalences at this anchor
|
|
166
|
+
reward_delta: float = Field(default=0.02, description="Reward change considered equivalent")
|
|
167
|
+
latency_delta: float = Field(default=0.4, description="Latency change (s) equivalent to reward_delta")
|
|
168
|
+
cost_delta: float = Field(default=0.10, description="Cost change ($) equivalent to reward_delta")
|
|
169
|
+
|
|
170
|
+
# Noise floors for each objective (differences smaller than these are ignored)
|
|
171
|
+
reward_noise: float = Field(default=0.005, description="Reward diffs below this are noise (e.g., 0.5%)")
|
|
172
|
+
latency_noise: float = Field(default=0.1, description="Latency diffs below this (s) are noise")
|
|
173
|
+
cost_noise: float = Field(default=0.01, description="Cost diffs below this ($) are noise")
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class ParetoFloorsConfig(BaseModel):
|
|
177
|
+
"""Configuration for multi-objective Pareto comparison.
|
|
178
|
+
|
|
179
|
+
Controls:
|
|
180
|
+
1. Which objectives are included in Pareto comparison (enable flags)
|
|
181
|
+
2. Soft floors below which differences are ignored (indifference regions)
|
|
182
|
+
3. Hard ceilings that disqualify candidates entirely (budget constraints)
|
|
183
|
+
"""
|
|
184
|
+
# Enable/disable objectives in Pareto comparison
|
|
185
|
+
use_latency: bool = Field(default=True, description="Include latency in Pareto comparison")
|
|
186
|
+
use_cost: bool = Field(default=True, description="Include cost in Pareto comparison")
|
|
187
|
+
|
|
188
|
+
# Soft floors: below these, all values are "equally good"
|
|
189
|
+
latency_s: float = Field(default=2.0, description="Don't discriminate on latency below this (s)")
|
|
190
|
+
cost_usd: float = Field(default=0.10, description="Don't discriminate on cost below this ($/seed)")
|
|
191
|
+
|
|
192
|
+
# Hard ceilings: disqualify candidates exceeding these limits
|
|
193
|
+
max_latency_s: Optional[float] = Field(default=None, description="Disqualify if mean latency > this")
|
|
194
|
+
max_cost_usd: Optional[float] = Field(default=None, description="Disqualify if mean cost/seed > this")
|
|
195
|
+
min_reward: Optional[float] = Field(default=None, description="Disqualify if mean reward < this")
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
# ============================================================================
|
|
199
|
+
# ADAS Dataset Format Models
|
|
200
|
+
# ============================================================================
|
|
201
|
+
|
|
202
|
+
class TaskInput(BaseModel):
|
|
203
|
+
"""A single task/example in an ADAS dataset.
|
|
204
|
+
|
|
205
|
+
For POLICY graphs: Contains the problem to solve.
|
|
206
|
+
For VERIFIER graphs: Contains a trace to evaluate.
|
|
207
|
+
|
|
208
|
+
Example (Policy - QA):
|
|
209
|
+
{
|
|
210
|
+
"task_id": "q123",
|
|
211
|
+
"input": {
|
|
212
|
+
"question": "What is the capital of France?",
|
|
213
|
+
"context": "Paris is the capital and largest city of France."
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
Example (Verifier - Game traces):
|
|
218
|
+
{
|
|
219
|
+
"task_id": "trace_001",
|
|
220
|
+
"input": {
|
|
221
|
+
"game_state": {...},
|
|
222
|
+
"agent_action": "move_north",
|
|
223
|
+
"outcome": "success"
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
"""
|
|
227
|
+
task_id: Optional[str] = Field(default=None, description="Unique identifier for this task")
|
|
228
|
+
id: Optional[str] = Field(default=None, description="Alternate ID field (task_id preferred)")
|
|
229
|
+
input: Dict[str, Any] = Field(..., description="Input data passed to the graph")
|
|
230
|
+
|
|
231
|
+
@field_validator("input", mode="before")
|
|
232
|
+
@classmethod
|
|
233
|
+
def ensure_input_dict(cls, v: Any) -> Dict[str, Any]:
|
|
234
|
+
if v is None:
|
|
235
|
+
return {}
|
|
236
|
+
if not isinstance(v, dict):
|
|
237
|
+
raise ValueError(f"Task input must be a dict, got {type(v).__name__}")
|
|
238
|
+
return v
|
|
239
|
+
|
|
240
|
+
def get_task_id(self) -> str:
|
|
241
|
+
"""Get the task ID, preferring task_id over id."""
|
|
242
|
+
return self.task_id or self.id or "unknown"
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
class GoldOutput(BaseModel):
|
|
246
|
+
"""Ground truth for scoring a task.
|
|
247
|
+
|
|
248
|
+
For POLICY graphs: The expected answer/output.
|
|
249
|
+
For VERIFIER graphs: The gold score (0.0-1.0) from human evaluation.
|
|
250
|
+
|
|
251
|
+
Example (Policy - QA):
|
|
252
|
+
{
|
|
253
|
+
"task_id": "q123",
|
|
254
|
+
"output": {"answer": "Paris"},
|
|
255
|
+
"score": 1.0 # Optional: gold score for the expected output
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
Example (Verifier calibration):
|
|
259
|
+
{
|
|
260
|
+
"task_id": "trace_001",
|
|
261
|
+
"output": {}, # May be empty for verifiers
|
|
262
|
+
"score": 0.75 # Human calibration score
|
|
263
|
+
}
|
|
264
|
+
"""
|
|
265
|
+
task_id: Optional[str] = Field(default=None, description="Must match a TaskInput.task_id")
|
|
266
|
+
output: Dict[str, Any] = Field(default_factory=dict, description="Expected output fields")
|
|
267
|
+
score: Optional[float] = Field(default=None, ge=0.0, le=1.0, description="Gold score (0.0-1.0)")
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
class ADASDatasetMetadata(BaseModel):
|
|
271
|
+
"""Metadata about an ADAS dataset.
|
|
272
|
+
|
|
273
|
+
Provides context for graph generation and optimization.
|
|
274
|
+
"""
|
|
275
|
+
name: Optional[str] = Field(default=None, description="Dataset name/identifier")
|
|
276
|
+
task_description: Optional[str] = Field(default=None, description="What task this dataset represents")
|
|
277
|
+
input_schema: Optional[Dict[str, Any]] = Field(default=None, description="Schema of task inputs")
|
|
278
|
+
output_schema: Optional[Dict[str, Any]] = Field(default=None, description="Schema of expected outputs")
|
|
279
|
+
domain: Optional[str] = Field(default=None, description="Domain (qa, code, games, etc.)")
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
class ADASDataset(BaseModel):
|
|
283
|
+
"""Complete ADAS dataset format for inline upload.
|
|
284
|
+
|
|
285
|
+
This is the schema for the `dataset` field in GraphOptimizationConfig
|
|
286
|
+
when uploading data directly instead of using a pre-registered dataset.
|
|
287
|
+
|
|
288
|
+
Example:
|
|
289
|
+
{
|
|
290
|
+
"tasks": [
|
|
291
|
+
{"task_id": "q1", "input": {"question": "What is 2+2?"}},
|
|
292
|
+
{"task_id": "q2", "input": {"question": "What is 3+3?"}}
|
|
293
|
+
],
|
|
294
|
+
"gold_outputs": [
|
|
295
|
+
{"task_id": "q1", "output": {"answer": "4"}, "score": 1.0},
|
|
296
|
+
{"task_id": "q2", "output": {"answer": "6"}, "score": 1.0}
|
|
297
|
+
],
|
|
298
|
+
"metadata": {
|
|
299
|
+
"name": "simple_math",
|
|
300
|
+
"task_description": "Answer basic math questions"
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
"""
|
|
304
|
+
tasks: List[TaskInput] = Field(..., min_length=1, description="List of tasks/examples")
|
|
305
|
+
gold_outputs: List[GoldOutput] = Field(..., min_length=1, description="Ground truth for each task")
|
|
306
|
+
metadata: ADASDatasetMetadata = Field(default_factory=ADASDatasetMetadata)
|
|
307
|
+
|
|
308
|
+
@field_validator("tasks", mode="before")
|
|
309
|
+
@classmethod
|
|
310
|
+
def validate_tasks(cls, v: Any) -> List[Dict[str, Any]]:
|
|
311
|
+
if not isinstance(v, list):
|
|
312
|
+
raise ValueError(f"tasks must be a list, got {type(v).__name__}")
|
|
313
|
+
if len(v) == 0:
|
|
314
|
+
raise ValueError("tasks list cannot be empty")
|
|
315
|
+
return v
|
|
316
|
+
|
|
317
|
+
@field_validator("gold_outputs", mode="before")
|
|
318
|
+
@classmethod
|
|
319
|
+
def validate_gold_outputs(cls, v: Any) -> List[Dict[str, Any]]:
|
|
320
|
+
if not isinstance(v, list):
|
|
321
|
+
raise ValueError(f"gold_outputs must be a list, got {type(v).__name__}")
|
|
322
|
+
if len(v) == 0:
|
|
323
|
+
raise ValueError("gold_outputs list cannot be empty")
|
|
324
|
+
return v
|
|
325
|
+
|
|
326
|
+
def validate_task_ids(self) -> List[str]:
|
|
327
|
+
"""Validate that gold_outputs reference valid task IDs.
|
|
328
|
+
|
|
329
|
+
Returns list of warnings (non-fatal issues).
|
|
330
|
+
"""
|
|
331
|
+
warnings = []
|
|
332
|
+
task_ids = {t.get_task_id() for t in self.tasks}
|
|
333
|
+
gold_task_ids = {g.task_id for g in self.gold_outputs if g.task_id}
|
|
334
|
+
|
|
335
|
+
# Check for gold outputs without matching tasks
|
|
336
|
+
orphan_golds = gold_task_ids - task_ids
|
|
337
|
+
if orphan_golds:
|
|
338
|
+
warnings.append(
|
|
339
|
+
f"Gold outputs reference unknown task IDs: {list(orphan_golds)[:5]}"
|
|
340
|
+
)
|
|
341
|
+
|
|
342
|
+
# Check for tasks without gold outputs
|
|
343
|
+
missing_golds = task_ids - gold_task_ids
|
|
344
|
+
if missing_golds:
|
|
345
|
+
warnings.append(
|
|
346
|
+
f"Tasks without gold outputs: {list(missing_golds)[:5]}"
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
return warnings
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
class GraphOptimizationConfig(BaseModel):
|
|
353
|
+
"""Complete configuration for a graph optimization job.
|
|
354
|
+
|
|
355
|
+
Example TOML:
|
|
356
|
+
[graph_optimization]
|
|
357
|
+
algorithm = "graph_gepa"
|
|
358
|
+
dataset_name = "hotpotqa"
|
|
359
|
+
graph_type = "policy"
|
|
360
|
+
graph_structure = "dag"
|
|
361
|
+
|
|
362
|
+
[graph_optimization.evolution]
|
|
363
|
+
num_generations = 5
|
|
364
|
+
children_per_generation = 3
|
|
365
|
+
|
|
366
|
+
[graph_optimization.proposer]
|
|
367
|
+
model = "gpt-4.1"
|
|
368
|
+
|
|
369
|
+
[graph_optimization.seeds]
|
|
370
|
+
train = [0, 1, 2, 3, 4]
|
|
371
|
+
validation = [100, 101, 102]
|
|
372
|
+
|
|
373
|
+
[graph_optimization.limits]
|
|
374
|
+
max_spend_usd = 10.0
|
|
375
|
+
"""
|
|
376
|
+
|
|
377
|
+
# Algorithm selection
|
|
378
|
+
algorithm: str = Field(default="graph_gepa", description="Optimization algorithm (currently: 'graph_gepa')")
|
|
379
|
+
|
|
380
|
+
# Required
|
|
381
|
+
dataset_name: str = Field(..., description="Dataset to optimize for (e.g., 'hotpotqa')")
|
|
382
|
+
|
|
383
|
+
# Graph configuration
|
|
384
|
+
graph_type: GraphType = Field(default=GraphType.POLICY)
|
|
385
|
+
graph_structure: GraphStructure = Field(default=GraphStructure.DAG)
|
|
386
|
+
|
|
387
|
+
# Custom topology guidance (adds detail to graph_structure, doesn't replace it)
|
|
388
|
+
topology_guidance: Optional[str] = Field(
|
|
389
|
+
default=None,
|
|
390
|
+
description="Additional guidance on what kind of graph to build within the chosen structure (e.g., 'Use a single LLM call that reasons and answers in one shot')"
|
|
391
|
+
)
|
|
392
|
+
|
|
393
|
+
# Pattern configuration - architectural patterns orthogonal to graph_type
|
|
394
|
+
patterns: Optional[PatternConfig] = Field(
|
|
395
|
+
default=None,
|
|
396
|
+
description=(
|
|
397
|
+
"Configure which architectural patterns the proposer should use/consider. "
|
|
398
|
+
"Patterns are orthogonal to graph_type - you can have an RLM-pattern verifier. "
|
|
399
|
+
"Example: patterns=PatternConfig(required=['rlm']) for RLM-style verifier."
|
|
400
|
+
)
|
|
401
|
+
)
|
|
402
|
+
|
|
403
|
+
# Optional warm start from a saved graph in the registry
|
|
404
|
+
initial_graph_id: Optional[str] = Field(
|
|
405
|
+
default=None,
|
|
406
|
+
description="Optional graph_id from the graphs registry to warm-start evolution.",
|
|
407
|
+
)
|
|
408
|
+
|
|
409
|
+
# Allowed policy models - which models the generated graph can use
|
|
410
|
+
allowed_policy_models: List[str] = Field(
|
|
411
|
+
default_factory=lambda: ["gpt-4o-mini", "gpt-4o"],
|
|
412
|
+
description="Models the graph is allowed to use in its nodes"
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
# Nested configs
|
|
416
|
+
evolution: EvolutionConfig = Field(default_factory=EvolutionConfig)
|
|
417
|
+
proposer: ProposerConfig = Field(default_factory=ProposerConfig)
|
|
418
|
+
seeds: SeedsConfig = Field(default_factory=SeedsConfig)
|
|
419
|
+
limits: LimitsConfig = Field(default_factory=LimitsConfig)
|
|
420
|
+
|
|
421
|
+
# Multi-objective Pareto configuration
|
|
422
|
+
indifference_points: List[IndifferencePointConfig] = Field(
|
|
423
|
+
default_factory=list,
|
|
424
|
+
description="Trade-off equivalences at anchor points"
|
|
425
|
+
)
|
|
426
|
+
pareto_floors: Optional[ParetoFloorsConfig] = Field(
|
|
427
|
+
default=None,
|
|
428
|
+
description="Thresholds below which metric differences are ignored"
|
|
429
|
+
)
|
|
430
|
+
|
|
431
|
+
# Optional dataset-specific config
|
|
432
|
+
dataset_config: Dict[str, Any] = Field(default_factory=dict)
|
|
433
|
+
|
|
434
|
+
# Constraint: max LLM calls per execution
|
|
435
|
+
max_llm_calls_per_run: Optional[int] = Field(
|
|
436
|
+
default=None,
|
|
437
|
+
ge=1,
|
|
438
|
+
description="Maximum LLM calls allowed per graph execution (e.g., 1, 2, 5).",
|
|
439
|
+
)
|
|
440
|
+
|
|
441
|
+
|
|
442
|
+
# Inline dataset upload (for verifier calibration, custom datasets)
|
|
443
|
+
# Format: {"name": str, "task_description": str, "examples": [...]}
|
|
444
|
+
dataset: Optional[Dict[str, Any]] = Field(
|
|
445
|
+
default=None,
|
|
446
|
+
description="Inline dataset for upload (ADAS format). If provided, dataset_name is used as identifier."
|
|
447
|
+
)
|
|
448
|
+
|
|
449
|
+
# Task context for initial graph generation (when dataset doesn't provide it)
|
|
450
|
+
task_description: Optional[str] = Field(default=None, description="Description of the task")
|
|
451
|
+
input_schema: Optional[Dict[str, Any]] = Field(default=None, description="Expected input format")
|
|
452
|
+
output_schema: Optional[Dict[str, Any]] = Field(default=None, description="Expected output format")
|
|
453
|
+
|
|
454
|
+
# Problem specification - detailed task info for the graph proposer
|
|
455
|
+
# This should include domain-specific constraints (e.g., valid labels for classification tasks)
|
|
456
|
+
problem_spec: Optional[str] = Field(
|
|
457
|
+
default=None,
|
|
458
|
+
description=(
|
|
459
|
+
"Detailed problem specification for the graph proposer. "
|
|
460
|
+
"Include domain-specific information like valid output labels, constraints, "
|
|
461
|
+
"and any other information needed to generate correct graphs. "
|
|
462
|
+
"If provided, this is combined with task_description for the proposer context."
|
|
463
|
+
)
|
|
464
|
+
)
|
|
465
|
+
|
|
466
|
+
# Scoring configuration
|
|
467
|
+
scoring_strategy: str = Field(default="rubric", description="Scoring strategy: 'default', 'rubric', 'mae'")
|
|
468
|
+
judge_model: str = Field(default="gpt-4o-mini", description="Model for LLM judge scoring")
|
|
469
|
+
|
|
470
|
+
@field_validator("graph_type", mode="before")
|
|
471
|
+
@classmethod
|
|
472
|
+
def validate_graph_type(cls, v: Any) -> GraphType:
|
|
473
|
+
if isinstance(v, str):
|
|
474
|
+
return GraphType(v.lower())
|
|
475
|
+
return v
|
|
476
|
+
|
|
477
|
+
@field_validator("graph_structure", mode="before")
|
|
478
|
+
@classmethod
|
|
479
|
+
def validate_graph_structure(cls, v: Any) -> GraphStructure:
|
|
480
|
+
if isinstance(v, str):
|
|
481
|
+
return GraphStructure(v.lower())
|
|
482
|
+
return v
|
|
483
|
+
|
|
484
|
+
@classmethod
|
|
485
|
+
def from_toml(cls, path: str | Path) -> "GraphOptimizationConfig":
|
|
486
|
+
"""Load configuration from a TOML file.
|
|
487
|
+
|
|
488
|
+
Args:
|
|
489
|
+
path: Path to the TOML configuration file
|
|
490
|
+
|
|
491
|
+
Returns:
|
|
492
|
+
Parsed GraphOptimizationConfig
|
|
493
|
+
|
|
494
|
+
Raises:
|
|
495
|
+
FileNotFoundError: If config file doesn't exist
|
|
496
|
+
ValueError: If config is invalid
|
|
497
|
+
"""
|
|
498
|
+
path = Path(path)
|
|
499
|
+
if not path.exists():
|
|
500
|
+
raise FileNotFoundError(f"Config file not found: {path}")
|
|
501
|
+
|
|
502
|
+
with open(path, "rb") as f:
|
|
503
|
+
data = tomllib.load(f)
|
|
504
|
+
|
|
505
|
+
# Extract graph_optimization section
|
|
506
|
+
if "graph_optimization" not in data:
|
|
507
|
+
raise ValueError(
|
|
508
|
+
f"Config file must have a [graph_optimization] section. "
|
|
509
|
+
f"Found sections: {list(data.keys())}"
|
|
510
|
+
)
|
|
511
|
+
|
|
512
|
+
config_data = data["graph_optimization"]
|
|
513
|
+
return cls(**config_data)
|
|
514
|
+
|
|
515
|
+
def to_request_dict(self) -> Dict[str, Any]:
|
|
516
|
+
"""Convert config to API request format.
|
|
517
|
+
|
|
518
|
+
Returns:
|
|
519
|
+
Dictionary suitable for POST to /graph-gepa/jobs
|
|
520
|
+
"""
|
|
521
|
+
request = {
|
|
522
|
+
"dataset_name": self.dataset_name,
|
|
523
|
+
"train_seeds": self.seeds.train,
|
|
524
|
+
"val_seeds": self.seeds.validation,
|
|
525
|
+
"num_generations": self.evolution.num_generations,
|
|
526
|
+
"children_per_generation": self.evolution.children_per_generation,
|
|
527
|
+
"proposer_model": self.proposer.model,
|
|
528
|
+
"graph_type": self.graph_type.value,
|
|
529
|
+
"graph_structure": self.graph_structure.value,
|
|
530
|
+
"allowed_policy_models": self.allowed_policy_models,
|
|
531
|
+
"dataset_config": self.dataset_config,
|
|
532
|
+
"scoring_strategy": self.scoring_strategy,
|
|
533
|
+
"judge_model": self.judge_model,
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
if self.max_llm_calls_per_run is not None:
|
|
537
|
+
request["max_llm_calls_per_run"] = int(self.max_llm_calls_per_run)
|
|
538
|
+
|
|
539
|
+
# Only include topology_guidance if set
|
|
540
|
+
if self.topology_guidance:
|
|
541
|
+
request["topology_guidance"] = self.topology_guidance
|
|
542
|
+
|
|
543
|
+
# Include pattern configuration if set
|
|
544
|
+
if self.patterns:
|
|
545
|
+
request["patterns"] = self.patterns.to_api_dict()
|
|
546
|
+
|
|
547
|
+
if self.initial_graph_id:
|
|
548
|
+
request["initial_graph_id"] = self.initial_graph_id
|
|
549
|
+
|
|
550
|
+
# Inline dataset upload (for verifier calibration, custom datasets)
|
|
551
|
+
if self.dataset:
|
|
552
|
+
# Validate dataset structure using Pydantic model
|
|
553
|
+
try:
|
|
554
|
+
validated = ADASDataset(**self.dataset)
|
|
555
|
+
# Check for task ID consistency (non-fatal warnings)
|
|
556
|
+
warnings = validated.validate_task_ids()
|
|
557
|
+
if warnings:
|
|
558
|
+
import logging
|
|
559
|
+
logger = logging.getLogger(__name__)
|
|
560
|
+
for w in warnings:
|
|
561
|
+
logger.warning(f"[ADASDataset] {w}")
|
|
562
|
+
except Exception as e:
|
|
563
|
+
raise ValueError(
|
|
564
|
+
f"Invalid ADAS dataset format: {e}\n"
|
|
565
|
+
f"Expected format: {{'tasks': [...], 'gold_outputs': [...], 'metadata': {{...}}}}\n"
|
|
566
|
+
f"See ADASDataset model for full schema.\n"
|
|
567
|
+
f"Got keys: {list(self.dataset.keys())}"
|
|
568
|
+
)
|
|
569
|
+
request["dataset"] = self.dataset
|
|
570
|
+
|
|
571
|
+
# Task context for initial graph generation
|
|
572
|
+
if self.task_description:
|
|
573
|
+
request["task_description"] = self.task_description
|
|
574
|
+
if self.input_schema:
|
|
575
|
+
request["input_schema"] = self.input_schema
|
|
576
|
+
if self.output_schema:
|
|
577
|
+
request["output_schema"] = self.output_schema
|
|
578
|
+
if self.problem_spec:
|
|
579
|
+
request["problem_spec"] = self.problem_spec
|
|
580
|
+
|
|
581
|
+
# Include indifference points for epsilon-Pareto dominance
|
|
582
|
+
if self.indifference_points:
|
|
583
|
+
request["indifference_points"] = [
|
|
584
|
+
p.model_dump() for p in self.indifference_points
|
|
585
|
+
]
|
|
586
|
+
|
|
587
|
+
# Include pareto floors for noise reduction
|
|
588
|
+
if self.pareto_floors:
|
|
589
|
+
request["pareto_floors"] = self.pareto_floors.model_dump()
|
|
590
|
+
|
|
591
|
+
return request
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"""Dataset converters for Graph GEPA.
|
|
2
|
+
|
|
3
|
+
This module provides converters to transform common dataset formats
|
|
4
|
+
into ADAS format for use with Graph GEPA optimization.
|
|
5
|
+
|
|
6
|
+
Supported formats:
|
|
7
|
+
- OpenAI SFT: JSONL with messages array (system, user, assistant roles)
|
|
8
|
+
|
|
9
|
+
Example:
|
|
10
|
+
>>> from synth_ai.products.graph_gepa.converters import convert_openai_sft
|
|
11
|
+
>>>
|
|
12
|
+
>>> # Convert from file
|
|
13
|
+
>>> result = convert_openai_sft("training_data.jsonl")
|
|
14
|
+
>>> adas_dataset = result.dataset
|
|
15
|
+
>>>
|
|
16
|
+
>>> # Use in GraphOptimizationConfig
|
|
17
|
+
>>> from synth_ai.products.graph_gepa import GraphOptimizationConfig
|
|
18
|
+
>>> config = GraphOptimizationConfig(
|
|
19
|
+
... dataset_name="my_qa_task",
|
|
20
|
+
... dataset=adas_dataset,
|
|
21
|
+
... graph_type="policy",
|
|
22
|
+
... ...
|
|
23
|
+
... )
|
|
24
|
+
"""
|
|
25
|
+
|
|
26
|
+
from __future__ import annotations
|
|
27
|
+
|
|
28
|
+
from .openai_sft import (
|
|
29
|
+
ConversionError,
|
|
30
|
+
ConversionResult,
|
|
31
|
+
ConversionWarning,
|
|
32
|
+
convert_openai_sft,
|
|
33
|
+
preview_conversion,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
__all__ = [
|
|
37
|
+
"convert_openai_sft",
|
|
38
|
+
"preview_conversion",
|
|
39
|
+
"ConversionResult",
|
|
40
|
+
"ConversionWarning",
|
|
41
|
+
"ConversionError",
|
|
42
|
+
]
|