synth-ai 0.2.6.dev1__py3-none-any.whl → 0.4.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- synth_ai/__init__.py +44 -24
- synth_ai/__main__.py +30 -3
- synth_ai/cli/__init__.py +103 -48
- synth_ai/cli/__main__.py +42 -0
- synth_ai/cli/_internal/__init__.py +5 -0
- synth_ai/cli/_internal/modal_wrapper.py +31 -0
- synth_ai/cli/_internal/storage.py +20 -0
- synth_ai/cli/_internal/typer_patch.py +47 -0
- synth_ai/cli/_internal/validate_task_app.py +29 -0
- synth_ai/cli/agents/__init__.py +17 -0
- synth_ai/cli/agents/claude.py +77 -0
- synth_ai/cli/agents/codex.py +265 -0
- synth_ai/cli/agents/opencode.py +253 -0
- synth_ai/cli/commands/__init__.py +18 -0
- synth_ai/cli/commands/artifacts/__init__.py +13 -0
- synth_ai/cli/commands/artifacts/client.py +119 -0
- synth_ai/cli/commands/artifacts/config.py +57 -0
- synth_ai/cli/commands/artifacts/core.py +24 -0
- synth_ai/cli/commands/artifacts/download.py +188 -0
- synth_ai/cli/commands/artifacts/export.py +186 -0
- synth_ai/cli/commands/artifacts/list.py +156 -0
- synth_ai/cli/commands/artifacts/parsing.py +250 -0
- synth_ai/cli/commands/artifacts/show.py +336 -0
- synth_ai/cli/commands/demo/__init__.py +3 -0
- synth_ai/cli/commands/demo/core.py +153 -0
- synth_ai/cli/commands/eval/__init__.py +10 -0
- synth_ai/cli/commands/eval/config.py +338 -0
- synth_ai/cli/commands/eval/core.py +256 -0
- synth_ai/cli/commands/eval/runner.py +704 -0
- synth_ai/cli/commands/eval/validation.py +60 -0
- synth_ai/cli/commands/filter/__init__.py +12 -0
- synth_ai/cli/commands/filter/core.py +424 -0
- synth_ai/cli/commands/filter/errors.py +55 -0
- synth_ai/cli/commands/filter/validation.py +77 -0
- synth_ai/cli/commands/help/__init__.py +185 -0
- synth_ai/cli/commands/help/core.py +72 -0
- synth_ai/cli/commands/scan/__init__.py +19 -0
- synth_ai/cli/commands/scan/cloudflare_scanner.py +403 -0
- synth_ai/cli/commands/scan/core.py +344 -0
- synth_ai/cli/commands/scan/health_checker.py +242 -0
- synth_ai/cli/commands/scan/local_scanner.py +278 -0
- synth_ai/cli/commands/scan/models.py +83 -0
- synth_ai/cli/commands/smoke/__init__.py +7 -0
- synth_ai/cli/commands/smoke/core.py +1428 -0
- synth_ai/cli/commands/status/__init__.py +3 -0
- synth_ai/cli/commands/status/client.py +91 -0
- synth_ai/cli/commands/status/config.py +12 -0
- synth_ai/cli/commands/status/errors.py +11 -0
- synth_ai/cli/commands/status/subcommands/__init__.py +3 -0
- synth_ai/cli/commands/status/subcommands/config.py +13 -0
- synth_ai/cli/commands/status/subcommands/files.py +34 -0
- synth_ai/cli/commands/status/subcommands/jobs.py +51 -0
- synth_ai/cli/commands/status/subcommands/models.py +35 -0
- synth_ai/cli/commands/status/subcommands/runs.py +34 -0
- synth_ai/cli/commands/status/subcommands/session.py +77 -0
- synth_ai/cli/commands/status/subcommands/summary.py +39 -0
- synth_ai/cli/commands/status/subcommands/utils.py +41 -0
- synth_ai/cli/commands/status/utils.py +23 -0
- synth_ai/cli/commands/train/__init__.py +53 -0
- synth_ai/cli/commands/train/core.py +22 -0
- synth_ai/cli/commands/train/errors.py +117 -0
- synth_ai/cli/commands/train/judge_schemas.py +201 -0
- synth_ai/cli/commands/train/judge_validation.py +305 -0
- synth_ai/cli/commands/train/prompt_learning_validation.py +633 -0
- synth_ai/cli/commands/train/validation.py +392 -0
- synth_ai/cli/demo_apps/__init__.py +10 -0
- synth_ai/cli/demo_apps/core/__init__.py +28 -0
- synth_ai/cli/demo_apps/core/cli.py +1735 -0
- synth_ai/cli/demo_apps/crafter/__init__.py +1 -0
- synth_ai/cli/demo_apps/crafter/crafter_fft_4b.toml +55 -0
- synth_ai/cli/demo_apps/crafter/grpo_crafter_task_app.py +186 -0
- synth_ai/cli/demo_apps/crafter/rl_from_base_qwen4b.toml +74 -0
- synth_ai/cli/demo_apps/demo_registry.py +176 -0
- synth_ai/cli/demo_apps/demo_task_apps/__init__.py +7 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/core.py +117 -51
- synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/crafter_fft_4b.toml +53 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +73 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/grpo_crafter_task_app.py +185 -0
- synth_ai/cli/demo_apps/demo_task_apps/math/_common.py +16 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +2 -1
- synth_ai/cli/demo_apps/demo_task_apps/math/config.toml +73 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +3 -6
- synth_ai/cli/demo_apps/demo_task_apps/math/modal_task_app.py +738 -0
- synth_ai/cli/demo_apps/demo_task_apps/math/task_app_entry.py +39 -0
- synth_ai/cli/demo_apps/math/__init__.py +1 -0
- synth_ai/cli/demo_apps/math/_common.py +16 -0
- synth_ai/cli/demo_apps/math/app.py +38 -0
- synth_ai/cli/demo_apps/math/config.toml +75 -0
- synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
- synth_ai/cli/demo_apps/math/modal_task_app.py +698 -0
- synth_ai/cli/demo_apps/math/task_app_entry.py +53 -0
- synth_ai/cli/demo_apps/mipro/main.py +271 -0
- synth_ai/cli/demo_apps/mipro/task_app.py +922 -0
- synth_ai/cli/demo_apps/mipro/train_cfg.toml +92 -0
- synth_ai/cli/demos/__init__.py +12 -0
- synth_ai/cli/demos/demo.py +32 -0
- synth_ai/cli/demos/rl_demo.py +254 -0
- synth_ai/cli/deploy.py +216 -0
- synth_ai/cli/infra/__init__.py +14 -0
- synth_ai/cli/{balance.py → infra/balance.py} +21 -3
- synth_ai/cli/infra/mcp.py +35 -0
- synth_ai/cli/infra/modal_app.py +36 -0
- synth_ai/cli/infra/setup.py +69 -0
- synth_ai/cli/infra/status.py +16 -0
- synth_ai/cli/infra/turso.py +77 -0
- synth_ai/cli/lib/__init__.py +10 -0
- synth_ai/cli/lib/agents.py +76 -0
- synth_ai/cli/lib/apps/modal_app.py +101 -0
- synth_ai/cli/lib/apps/task_app.py +642 -0
- synth_ai/cli/lib/bin.py +39 -0
- synth_ai/cli/lib/env.py +375 -0
- synth_ai/cli/lib/errors.py +85 -0
- synth_ai/cli/lib/modal.py +315 -0
- synth_ai/cli/lib/plotting.py +126 -0
- synth_ai/cli/lib/prompt_args.py +39 -0
- synth_ai/cli/lib/prompts.py +284 -0
- synth_ai/cli/lib/sqld.py +122 -0
- synth_ai/cli/lib/task_app_discovery.py +884 -0
- synth_ai/cli/lib/task_app_env.py +295 -0
- synth_ai/cli/lib/train_cfgs.py +300 -0
- synth_ai/cli/lib/tunnel_records.py +207 -0
- synth_ai/cli/local/__init__.py +14 -0
- synth_ai/cli/local/experiment_queue/__init__.py +72 -0
- synth_ai/cli/local/experiment_queue/api_schemas.py +221 -0
- synth_ai/cli/local/experiment_queue/celery_app.py +208 -0
- synth_ai/cli/local/experiment_queue/config.py +128 -0
- synth_ai/cli/local/experiment_queue/config_utils.py +272 -0
- synth_ai/cli/local/experiment_queue/database.py +175 -0
- synth_ai/cli/local/experiment_queue/dispatcher.py +119 -0
- synth_ai/cli/local/experiment_queue/models.py +231 -0
- synth_ai/cli/local/experiment_queue/progress_info.py +160 -0
- synth_ai/cli/local/experiment_queue/results.py +373 -0
- synth_ai/cli/local/experiment_queue/schemas.py +131 -0
- synth_ai/cli/local/experiment_queue/service.py +344 -0
- synth_ai/cli/local/experiment_queue/status.py +372 -0
- synth_ai/cli/local/experiment_queue/status_tracker.py +360 -0
- synth_ai/cli/local/experiment_queue/tasks.py +1984 -0
- synth_ai/cli/local/experiment_queue/trace_storage.py +65 -0
- synth_ai/cli/local/experiment_queue/validation.py +157 -0
- synth_ai/cli/local/session/__init__.py +92 -0
- synth_ai/cli/local/session/client.py +383 -0
- synth_ai/cli/local/session/constants.py +63 -0
- synth_ai/cli/local/session/exceptions.py +105 -0
- synth_ai/cli/local/session/manager.py +139 -0
- synth_ai/cli/local/session/models.py +89 -0
- synth_ai/cli/local/session/query.py +110 -0
- synth_ai/cli/root.py +150 -102
- synth_ai/cli/task_apps/__init__.py +37 -0
- synth_ai/cli/task_apps/commands.py +3145 -0
- synth_ai/cli/task_apps/deploy.py +7 -0
- synth_ai/cli/task_apps/list.py +26 -0
- synth_ai/cli/task_apps/main.py +36 -0
- synth_ai/cli/task_apps/modal_serve.py +11 -0
- synth_ai/cli/task_apps/serve.py +11 -0
- synth_ai/cli/training/__init__.py +8 -0
- synth_ai/cli/training/train.py +5 -0
- synth_ai/cli/training/train_cfg.py +34 -0
- synth_ai/cli/{watch.py → training/watch.py} +13 -18
- synth_ai/cli/turso.py +52 -0
- synth_ai/cli/utils/__init__.py +8 -0
- synth_ai/cli/utils/experiments.py +235 -0
- synth_ai/cli/utils/queue.py +504 -0
- synth_ai/cli/{recent.py → utils/recent.py} +13 -7
- synth_ai/cli/{traces.py → utils/traces.py} +9 -5
- synth_ai/contracts/__init__.py +67 -0
- synth_ai/core/__init__.py +100 -0
- synth_ai/core/_utils/__init__.py +54 -0
- synth_ai/core/_utils/base_url.py +10 -0
- synth_ai/core/_utils/http.py +10 -0
- synth_ai/core/_utils/prompts.py +14 -0
- synth_ai/core/_utils/task_app_state.py +12 -0
- synth_ai/core/_utils/user_config.py +10 -0
- synth_ai/core/apps/common.py +116 -0
- synth_ai/core/auth.py +95 -0
- synth_ai/core/cfgs.py +240 -0
- synth_ai/core/config/__init__.py +16 -0
- synth_ai/core/config/base.py +168 -0
- synth_ai/core/config/resolver.py +89 -0
- synth_ai/core/env.py +231 -0
- synth_ai/core/errors.py +126 -0
- synth_ai/core/http.py +230 -0
- synth_ai/core/integrations/__init__.py +11 -0
- synth_ai/core/integrations/cloudflare.py +1710 -0
- synth_ai/core/integrations/mcp/__init__.py +6 -0
- synth_ai/core/integrations/mcp/__main__.py +8 -0
- synth_ai/core/integrations/mcp/claude.py +36 -0
- synth_ai/core/integrations/mcp/main.py +254 -0
- synth_ai/core/integrations/mcp/setup.py +100 -0
- synth_ai/core/integrations/modal.py +277 -0
- synth_ai/core/json.py +72 -0
- synth_ai/core/log_filter.py +99 -0
- synth_ai/core/logging.py +82 -0
- synth_ai/core/paths.py +107 -0
- synth_ai/core/pricing.py +109 -0
- synth_ai/core/process.py +233 -0
- synth_ai/core/ssl.py +25 -0
- synth_ai/core/storage/__init__.py +71 -0
- synth_ai/core/task_app_state.py +318 -0
- synth_ai/core/telemetry.py +282 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/__init__.py +5 -1
- synth_ai/{tracing_v3 → core/tracing_v3}/abstractions.py +21 -4
- synth_ai/core/tracing_v3/config.py +229 -0
- synth_ai/core/tracing_v3/constants.py +21 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/db_config.py +42 -29
- synth_ai/{tracing_v3 → core/tracing_v3}/decorators.py +80 -45
- synth_ai/{tracing_v3 → core/tracing_v3}/examples/basic_usage.py +15 -9
- synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +6 -4
- synth_ai/{tracing_v3 → core/tracing_v3}/llm_call_record_helpers.py +161 -61
- synth_ai/{tracing_v3 → core/tracing_v3}/migration_helper.py +1 -2
- synth_ai/{tracing_v3 → core/tracing_v3}/replica_sync.py +12 -7
- synth_ai/core/tracing_v3/serialization.py +130 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/session_tracer.py +88 -21
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/base.py +99 -12
- synth_ai/core/tracing_v3/storage/config.py +109 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/factory.py +11 -9
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/utils.py +15 -11
- synth_ai/core/tracing_v3/trace_utils.py +326 -0
- synth_ai/core/tracing_v3/turso/__init__.py +12 -0
- synth_ai/core/tracing_v3/turso/daemon.py +278 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/turso/models.py +7 -3
- synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/utils.py +5 -4
- synth_ai/core/urls.py +18 -0
- synth_ai/core/user_config.py +137 -0
- synth_ai/core/uvicorn.py +222 -0
- synth_ai/data/__init__.py +83 -0
- synth_ai/data/enums.py +123 -0
- synth_ai/data/rewards.py +152 -0
- synth_ai/data/traces.py +35 -0
- synth_ai/products/__init__.py +6 -0
- synth_ai/products/graph_evolve/__init__.py +46 -0
- synth_ai/products/graph_evolve/client.py +226 -0
- synth_ai/products/graph_evolve/config.py +591 -0
- synth_ai/products/graph_evolve/converters/__init__.py +42 -0
- synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
- synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
- synth_ai/products/graph_evolve/run.py +222 -0
- synth_ai/products/graph_gepa/__init__.py +23 -0
- synth_ai/products/graph_gepa/converters/__init__.py +19 -0
- synth_ai/products/graph_gepa/converters/openai_sft.py +29 -0
- synth_ai/sdk/__init__.py +123 -0
- synth_ai/sdk/api/__init__.py +1 -0
- synth_ai/sdk/api/models/supported.py +514 -0
- synth_ai/sdk/api/research_agent/__init__.py +296 -0
- synth_ai/sdk/api/train/__init__.py +85 -0
- synth_ai/sdk/api/train/builders.py +895 -0
- synth_ai/sdk/api/train/cli.py +2199 -0
- synth_ai/sdk/api/train/config_finder.py +267 -0
- synth_ai/sdk/api/train/configs/__init__.py +65 -0
- synth_ai/sdk/api/train/configs/prompt_learning.py +1706 -0
- synth_ai/sdk/api/train/configs/rl.py +187 -0
- synth_ai/sdk/api/train/configs/sft.py +99 -0
- synth_ai/sdk/api/train/configs/shared.py +81 -0
- synth_ai/sdk/api/train/context_learning.py +312 -0
- synth_ai/sdk/api/train/env_resolver.py +418 -0
- synth_ai/sdk/api/train/graph_validators.py +216 -0
- synth_ai/sdk/api/train/graphgen.py +984 -0
- synth_ai/sdk/api/train/graphgen_models.py +823 -0
- synth_ai/sdk/api/train/graphgen_validators.py +109 -0
- synth_ai/sdk/api/train/local_api.py +10 -0
- synth_ai/sdk/api/train/pollers.py +124 -0
- synth_ai/sdk/api/train/progress/__init__.py +97 -0
- synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
- synth_ai/sdk/api/train/progress/events.py +326 -0
- synth_ai/sdk/api/train/progress/results.py +428 -0
- synth_ai/sdk/api/train/progress/tracker.py +641 -0
- synth_ai/sdk/api/train/prompt_learning.py +469 -0
- synth_ai/sdk/api/train/rl.py +441 -0
- synth_ai/sdk/api/train/sft.py +396 -0
- synth_ai/sdk/api/train/summary.py +522 -0
- synth_ai/sdk/api/train/supported_algos.py +147 -0
- synth_ai/sdk/api/train/task_app.py +351 -0
- synth_ai/sdk/api/train/utils.py +279 -0
- synth_ai/sdk/api/train/validators.py +2424 -0
- synth_ai/sdk/graphs/__init__.py +15 -0
- synth_ai/sdk/graphs/completions.py +570 -0
- synth_ai/{inference → sdk/inference}/__init__.py +0 -1
- synth_ai/sdk/inference/client.py +128 -0
- synth_ai/sdk/jobs/__init__.py +16 -0
- synth_ai/sdk/jobs/client.py +371 -0
- synth_ai/sdk/judging/__init__.py +14 -0
- synth_ai/sdk/judging/base.py +24 -0
- synth_ai/sdk/judging/client.py +40 -0
- synth_ai/sdk/judging/schemas.py +222 -0
- synth_ai/sdk/judging/types.py +42 -0
- synth_ai/sdk/learning/__init__.py +99 -0
- synth_ai/sdk/learning/algorithms.py +14 -0
- synth_ai/{learning → sdk/learning}/client.py +121 -30
- synth_ai/sdk/learning/config.py +5 -0
- synth_ai/{learning → sdk/learning}/constants.py +0 -2
- synth_ai/sdk/learning/context_learning_client.py +531 -0
- synth_ai/sdk/learning/context_learning_types.py +292 -0
- synth_ai/sdk/learning/ft_client.py +7 -0
- synth_ai/{learning → sdk/learning}/health.py +15 -9
- synth_ai/{learning → sdk/learning}/jobs.py +44 -47
- synth_ai/sdk/learning/prompt_extraction.py +334 -0
- synth_ai/sdk/learning/prompt_learning_client.py +455 -0
- synth_ai/sdk/learning/prompt_learning_types.py +186 -0
- synth_ai/{rl → sdk/learning/rl}/__init__.py +13 -8
- synth_ai/{learning/rl_client.py → sdk/learning/rl/client.py} +89 -77
- synth_ai/sdk/learning/rl/config.py +31 -0
- synth_ai/{rl → sdk/learning/rl}/contracts.py +5 -14
- synth_ai/{rl → sdk/learning/rl}/env_keys.py +45 -16
- synth_ai/sdk/learning/rl/secrets.py +13 -0
- synth_ai/sdk/learning/rl_client.py +5 -0
- synth_ai/sdk/learning/sft/__init__.py +29 -0
- synth_ai/sdk/learning/sft/client.py +95 -0
- synth_ai/sdk/learning/sft/config.py +270 -0
- synth_ai/sdk/learning/sft/data.py +698 -0
- synth_ai/sdk/learning/sse.py +57 -0
- synth_ai/sdk/learning/validators.py +52 -0
- synth_ai/sdk/localapi/__init__.py +40 -0
- synth_ai/sdk/localapi/apps/__init__.py +28 -0
- synth_ai/sdk/localapi/client.py +10 -0
- synth_ai/sdk/localapi/contracts.py +10 -0
- synth_ai/sdk/localapi/helpers.py +519 -0
- synth_ai/sdk/localapi/rollouts.py +87 -0
- synth_ai/sdk/localapi/server.py +29 -0
- synth_ai/sdk/localapi/template.py +70 -0
- synth_ai/sdk/streaming/__init__.py +35 -0
- synth_ai/sdk/streaming/config.py +94 -0
- synth_ai/sdk/streaming/handlers.py +1997 -0
- synth_ai/sdk/streaming/streamer.py +713 -0
- synth_ai/sdk/streaming/types.py +112 -0
- synth_ai/sdk/task/__init__.py +164 -0
- synth_ai/sdk/task/apps/__init__.py +169 -0
- synth_ai/sdk/task/auth.py +165 -0
- synth_ai/sdk/task/client.py +175 -0
- synth_ai/sdk/task/config.py +257 -0
- synth_ai/sdk/task/contracts.py +219 -0
- synth_ai/sdk/task/datasets.py +108 -0
- synth_ai/sdk/task/errors.py +50 -0
- synth_ai/sdk/task/health.py +34 -0
- synth_ai/sdk/task/in_process.py +1190 -0
- synth_ai/sdk/task/in_process_runner.py +314 -0
- synth_ai/sdk/task/inference_api.py +299 -0
- synth_ai/sdk/task/json.py +111 -0
- synth_ai/sdk/task/proxy.py +287 -0
- synth_ai/sdk/task/rubrics/__init__.py +55 -0
- synth_ai/sdk/task/rubrics/loaders.py +156 -0
- synth_ai/sdk/task/rubrics/models.py +57 -0
- synth_ai/sdk/task/rubrics/scoring.py +116 -0
- synth_ai/sdk/task/rubrics/strict.py +149 -0
- synth_ai/sdk/task/rubrics.py +219 -0
- synth_ai/sdk/task/server.py +631 -0
- synth_ai/sdk/task/trace_correlation_helpers.py +539 -0
- synth_ai/sdk/task/tracing_utils.py +95 -0
- synth_ai/sdk/task/validators.py +441 -0
- synth_ai/sdk/task/vendors.py +59 -0
- synth_ai/sdk/training/__init__.py +102 -0
- synth_ai/sdk/tunnels/__init__.py +83 -0
- synth_ai/sdk/tunnels/cleanup.py +83 -0
- synth_ai/sdk/tunnels/ports.py +120 -0
- synth_ai/utils/__init__.py +213 -0
- synth_ai-0.4.3.dist-info/METADATA +262 -0
- synth_ai-0.4.3.dist-info/RECORD +370 -0
- {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/entry_points.txt +0 -1
- synth_ai/cli/calc.py +0 -69
- synth_ai/cli/demo.py +0 -131
- synth_ai/cli/legacy_root_backup.py +0 -470
- synth_ai/cli/man.py +0 -106
- synth_ai/cli/rl_demo.py +0 -137
- synth_ai/cli/status.py +0 -133
- synth_ai/config/base_url.py +0 -98
- synth_ai/core/experiment.py +0 -15
- synth_ai/core/system.py +0 -15
- synth_ai/demos/core/__init__.py +0 -1
- synth_ai/demos/core/cli.py +0 -685
- synth_ai/demos/demo_task_apps/__init__.py +0 -1
- synth_ai/demos/demo_task_apps/math/config.toml +0 -44
- synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
- synth_ai/environments/__init__.py +0 -31
- synth_ai/environments/environment/__init__.py +0 -1
- synth_ai/environments/environment/artifacts/__init__.py +0 -1
- synth_ai/environments/environment/artifacts/base.py +0 -52
- synth_ai/environments/environment/core.py +0 -67
- synth_ai/environments/environment/db/__init__.py +0 -1
- synth_ai/environments/environment/db/sqlite.py +0 -45
- synth_ai/environments/environment/registry.py +0 -233
- synth_ai/environments/environment/resources/sqlite.py +0 -45
- synth_ai/environments/environment/results.py +0 -1
- synth_ai/environments/environment/rewards/__init__.py +0 -1
- synth_ai/environments/environment/rewards/core.py +0 -29
- synth_ai/environments/environment/shared_engine.py +0 -26
- synth_ai/environments/environment/tools/__init__.py +0 -200
- synth_ai/environments/examples/__init__.py +0 -1
- synth_ai/environments/examples/bandit/__init__.py +0 -33
- synth_ai/environments/examples/bandit/engine.py +0 -294
- synth_ai/environments/examples/bandit/environment.py +0 -194
- synth_ai/environments/examples/bandit/taskset.py +0 -200
- synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
- synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -724
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
- synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
- synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
- synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
- synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
- synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
- synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
- synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
- synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
- synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
- synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
- synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
- synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
- synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
- synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
- synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
- synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
- synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
- synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
- synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
- synth_ai/environments/examples/crafter_classic/engine.py +0 -579
- synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
- synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
- synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
- synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
- synth_ai/environments/examples/crafter_classic/environment.py +0 -404
- synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
- synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
- synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
- synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
- synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
- synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
- synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
- synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
- synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
- synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
- synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
- synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
- synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
- synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
- synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
- synth_ai/environments/examples/crafter_custom/environment.py +0 -312
- synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
- synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
- synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
- synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
- synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
- synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
- synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
- synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
- synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
- synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
- synth_ai/environments/examples/enron/engine.py +0 -295
- synth_ai/environments/examples/enron/environment.py +0 -166
- synth_ai/environments/examples/enron/taskset.py +0 -112
- synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
- synth_ai/environments/examples/minigrid/__init__.py +0 -48
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
- synth_ai/environments/examples/minigrid/engine.py +0 -589
- synth_ai/environments/examples/minigrid/environment.py +0 -274
- synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
- synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
- synth_ai/environments/examples/minigrid/taskset.py +0 -583
- synth_ai/environments/examples/nethack/__init__.py +0 -7
- synth_ai/environments/examples/nethack/achievements.py +0 -337
- synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
- synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
- synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
- synth_ai/environments/examples/nethack/engine.py +0 -739
- synth_ai/environments/examples/nethack/environment.py +0 -256
- synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
- synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
- synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
- synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
- synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
- synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
- synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
- synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
- synth_ai/environments/examples/nethack/taskset.py +0 -323
- synth_ai/environments/examples/red/__init__.py +0 -7
- synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
- synth_ai/environments/examples/red/config_logging.py +0 -110
- synth_ai/environments/examples/red/engine.py +0 -694
- synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
- synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -28
- synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
- synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
- synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
- synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
- synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
- synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
- synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
- synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
- synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
- synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
- synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
- synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
- synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
- synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
- synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -140
- synth_ai/environments/examples/red/environment.py +0 -238
- synth_ai/environments/examples/red/taskset.py +0 -79
- synth_ai/environments/examples/red/units/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
- synth_ai/environments/examples/sokoban/engine.py +0 -678
- synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
- synth_ai/environments/examples/sokoban/environment.py +0 -229
- synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
- synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
- synth_ai/environments/examples/sokoban/taskset.py +0 -428
- synth_ai/environments/examples/sokoban/units/astar_common.py +0 -95
- synth_ai/environments/examples/tictactoe/__init__.py +0 -1
- synth_ai/environments/examples/tictactoe/engine.py +0 -368
- synth_ai/environments/examples/tictactoe/environment.py +0 -240
- synth_ai/environments/examples/tictactoe/taskset.py +0 -215
- synth_ai/environments/examples/verilog/__init__.py +0 -10
- synth_ai/environments/examples/verilog/engine.py +0 -329
- synth_ai/environments/examples/verilog/environment.py +0 -350
- synth_ai/environments/examples/verilog/taskset.py +0 -420
- synth_ai/environments/examples/wordle/__init__.py +0 -29
- synth_ai/environments/examples/wordle/engine.py +0 -398
- synth_ai/environments/examples/wordle/environment.py +0 -159
- synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
- synth_ai/environments/examples/wordle/taskset.py +0 -230
- synth_ai/environments/reproducibility/core.py +0 -42
- synth_ai/environments/reproducibility/helpers.py +0 -0
- synth_ai/environments/reproducibility/tree.py +0 -364
- synth_ai/environments/service/app.py +0 -91
- synth_ai/environments/service/core_routes.py +0 -1020
- synth_ai/environments/service/external_registry.py +0 -56
- synth_ai/environments/service/registry.py +0 -9
- synth_ai/environments/stateful/__init__.py +0 -1
- synth_ai/environments/stateful/core.py +0 -163
- synth_ai/environments/stateful/engine.py +0 -21
- synth_ai/environments/stateful/state.py +0 -7
- synth_ai/environments/tasks/api.py +0 -19
- synth_ai/environments/tasks/core.py +0 -80
- synth_ai/environments/tasks/filters.py +0 -41
- synth_ai/environments/tasks/utils.py +0 -91
- synth_ai/environments/v0_observability/history.py +0 -3
- synth_ai/environments/v0_observability/log.py +0 -2
- synth_ai/evals/base.py +0 -15
- synth_ai/experimental/synth_oss.py +0 -446
- synth_ai/http.py +0 -102
- synth_ai/inference/client.py +0 -20
- synth_ai/install_sqld.sh +0 -40
- synth_ai/jobs/client.py +0 -246
- synth_ai/learning/__init__.py +0 -24
- synth_ai/learning/config.py +0 -43
- synth_ai/learning/filtering.py +0 -0
- synth_ai/learning/ft_client.py +0 -59
- synth_ai/learning/offline/dpo.py +0 -0
- synth_ai/learning/offline/providers.py +0 -7
- synth_ai/learning/offline/sft.py +0 -0
- synth_ai/learning/offline/shared.py +0 -0
- synth_ai/learning/online/grpo.py +0 -0
- synth_ai/learning/online/irft.py +0 -0
- synth_ai/learning/prompts/banking77_injection_eval.py +0 -168
- synth_ai/learning/prompts/gepa.py +0 -0
- synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -213
- synth_ai/learning/prompts/mipro.py +0 -289
- synth_ai/learning/prompts/random_search.py +0 -246
- synth_ai/learning/prompts/run_mipro_banking77.py +0 -172
- synth_ai/learning/prompts/run_random_search_banking77.py +0 -324
- synth_ai/learning/sse.py +0 -58
- synth_ai/learning/validators.py +0 -48
- synth_ai/lm/__init__.py +0 -51
- synth_ai/lm/caching/constants.py +0 -6
- synth_ai/lm/caching/dbs.py +0 -0
- synth_ai/lm/caching/ephemeral.py +0 -102
- synth_ai/lm/caching/handler.py +0 -137
- synth_ai/lm/caching/initialize.py +0 -11
- synth_ai/lm/caching/persistent.py +0 -114
- synth_ai/lm/config.py +0 -110
- synth_ai/lm/constants.py +0 -32
- synth_ai/lm/core/__init__.py +0 -8
- synth_ai/lm/core/all.py +0 -73
- synth_ai/lm/core/exceptions.py +0 -7
- synth_ai/lm/core/main.py +0 -319
- synth_ai/lm/core/main_v3.py +0 -594
- synth_ai/lm/core/synth_models.py +0 -48
- synth_ai/lm/core/vendor_clients.py +0 -188
- synth_ai/lm/cost/__init__.py +0 -0
- synth_ai/lm/cost/monitor.py +0 -1
- synth_ai/lm/cost/statefulness.py +0 -1
- synth_ai/lm/injection.py +0 -80
- synth_ai/lm/overrides.py +0 -206
- synth_ai/lm/provider_support/__init__.py +0 -8
- synth_ai/lm/provider_support/anthropic.py +0 -972
- synth_ai/lm/provider_support/openai.py +0 -1139
- synth_ai/lm/provider_support/suppress_logging.py +0 -31
- synth_ai/lm/structured_outputs/__init__.py +0 -0
- synth_ai/lm/structured_outputs/handler.py +0 -440
- synth_ai/lm/structured_outputs/inject.py +0 -297
- synth_ai/lm/structured_outputs/rehabilitate.py +0 -185
- synth_ai/lm/tools/__init__.py +0 -3
- synth_ai/lm/tools/base.py +0 -172
- synth_ai/lm/unified_interface.py +0 -202
- synth_ai/lm/vendors/__init__.py +0 -0
- synth_ai/lm/vendors/base.py +0 -81
- synth_ai/lm/vendors/core/__init__.py +0 -0
- synth_ai/lm/vendors/core/anthropic_api.py +0 -387
- synth_ai/lm/vendors/core/gemini_api.py +0 -292
- synth_ai/lm/vendors/core/mistral_api.py +0 -322
- synth_ai/lm/vendors/core/openai_api.py +0 -220
- synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
- synth_ai/lm/vendors/local/__init__.py +0 -0
- synth_ai/lm/vendors/local/ollama.py +0 -0
- synth_ai/lm/vendors/openai_standard.py +0 -780
- synth_ai/lm/vendors/openai_standard_responses.py +0 -256
- synth_ai/lm/vendors/retries.py +0 -22
- synth_ai/lm/vendors/supported/__init__.py +0 -0
- synth_ai/lm/vendors/supported/custom_endpoint.py +0 -417
- synth_ai/lm/vendors/supported/deepseek.py +0 -69
- synth_ai/lm/vendors/supported/grok.py +0 -75
- synth_ai/lm/vendors/supported/groq.py +0 -16
- synth_ai/lm/vendors/supported/ollama.py +0 -15
- synth_ai/lm/vendors/supported/openrouter.py +0 -74
- synth_ai/lm/vendors/supported/together.py +0 -11
- synth_ai/lm/vendors/synth_client.py +0 -808
- synth_ai/lm/warmup.py +0 -186
- synth_ai/rl/secrets.py +0 -19
- synth_ai/scripts/verify_rewards.py +0 -100
- synth_ai/task/__init__.py +0 -10
- synth_ai/task/contracts.py +0 -120
- synth_ai/task/health.py +0 -28
- synth_ai/task/validators.py +0 -12
- synth_ai/tracing/__init__.py +0 -30
- synth_ai/tracing_v1/__init__.py +0 -33
- synth_ai/tracing_v3/config.py +0 -84
- synth_ai/tracing_v3/storage/config.py +0 -62
- synth_ai/tracing_v3/turso/__init__.py +0 -25
- synth_ai/tracing_v3/turso/daemon.py +0 -144
- synth_ai/tracing_v3/turso/manager.py +0 -760
- synth_ai/v0/tracing/__init__.py +0 -0
- synth_ai/v0/tracing/abstractions.py +0 -224
- synth_ai/v0/tracing/base_client.py +0 -91
- synth_ai/v0/tracing/client_manager.py +0 -131
- synth_ai/v0/tracing/config.py +0 -140
- synth_ai/v0/tracing/context.py +0 -146
- synth_ai/v0/tracing/decorators.py +0 -680
- synth_ai/v0/tracing/events/__init__.py +0 -0
- synth_ai/v0/tracing/events/manage.py +0 -147
- synth_ai/v0/tracing/events/scope.py +0 -86
- synth_ai/v0/tracing/events/store.py +0 -228
- synth_ai/v0/tracing/immediate_client.py +0 -151
- synth_ai/v0/tracing/local.py +0 -18
- synth_ai/v0/tracing/log_client_base.py +0 -73
- synth_ai/v0/tracing/retry_queue.py +0 -186
- synth_ai/v0/tracing/trackers.py +0 -515
- synth_ai/v0/tracing/upload.py +0 -510
- synth_ai/v0/tracing/utils.py +0 -9
- synth_ai/v0/tracing_v1/__init__.py +0 -16
- synth_ai/v0/tracing_v1/abstractions.py +0 -224
- synth_ai/v0/tracing_v1/base_client.py +0 -91
- synth_ai/v0/tracing_v1/client_manager.py +0 -131
- synth_ai/v0/tracing_v1/config.py +0 -140
- synth_ai/v0/tracing_v1/context.py +0 -146
- synth_ai/v0/tracing_v1/decorators.py +0 -701
- synth_ai/v0/tracing_v1/events/__init__.py +0 -0
- synth_ai/v0/tracing_v1/events/manage.py +0 -147
- synth_ai/v0/tracing_v1/events/scope.py +0 -86
- synth_ai/v0/tracing_v1/events/store.py +0 -228
- synth_ai/v0/tracing_v1/immediate_client.py +0 -151
- synth_ai/v0/tracing_v1/local.py +0 -18
- synth_ai/v0/tracing_v1/log_client_base.py +0 -73
- synth_ai/v0/tracing_v1/retry_queue.py +0 -186
- synth_ai/v0/tracing_v1/trackers.py +0 -515
- synth_ai/v0/tracing_v1/upload.py +0 -525
- synth_ai/v0/tracing_v1/utils.py +0 -9
- synth_ai/zyk/__init__.py +0 -30
- synth_ai-0.2.6.dev1.dist-info/METADATA +0 -106
- synth_ai-0.2.6.dev1.dist-info/RECORD +0 -416
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
- /synth_ai/{lm/caching → core/apps}/__init__.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
- /synth_ai/{compound/cais.py → py.typed} +0 -0
- /synth_ai/{learning → sdk/learning}/core.py +0 -0
- /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
- {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/licenses/LICENSE +0 -0
- {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
"""OpenAI SFT format to ADAS dataset converter.
|
|
2
|
+
|
|
3
|
+
This module converts OpenAI SFT format (JSONL with messages array) to ADAS format
|
|
4
|
+
for use with Graph GEPA optimization.
|
|
5
|
+
|
|
6
|
+
Example OpenAI SFT format:
|
|
7
|
+
{"messages": [
|
|
8
|
+
{"role": "system", "content": "You are a helpful assistant."},
|
|
9
|
+
{"role": "user", "content": "What is the capital of France?"},
|
|
10
|
+
{"role": "assistant", "content": "Paris"}
|
|
11
|
+
]}
|
|
12
|
+
|
|
13
|
+
Example ADAS output:
|
|
14
|
+
{
|
|
15
|
+
"tasks": [{"task_id": "sft_0000", "input": {"user_message": "..."}}],
|
|
16
|
+
"gold_outputs": [{"task_id": "sft_0000", "output": {"response": "..."}, "score": 1.0}],
|
|
17
|
+
"metadata": {"name": "converted_sft", "task_description": "...", "source_format": "openai_sft"}
|
|
18
|
+
}
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
import json
|
|
24
|
+
from collections import Counter
|
|
25
|
+
from dataclasses import dataclass, field
|
|
26
|
+
from pathlib import Path
|
|
27
|
+
from typing import Any
|
|
28
|
+
|
|
29
|
+
# Known field prefix patterns for template detection (order matters - check longer patterns first)
|
|
30
|
+
KNOWN_PREFIXES: list[tuple[str, str]] = [
|
|
31
|
+
("### Instruction", "instruction"),
|
|
32
|
+
("### Input", "input"),
|
|
33
|
+
("### Response", "response"),
|
|
34
|
+
("Instruction:", "instruction"),
|
|
35
|
+
("Question:", "question"),
|
|
36
|
+
("Context:", "context"),
|
|
37
|
+
("Input:", "input"),
|
|
38
|
+
("Output:", "output"),
|
|
39
|
+
("Query:", "query"),
|
|
40
|
+
("Document:", "document"),
|
|
41
|
+
("Text:", "text"),
|
|
42
|
+
("Passage:", "passage"),
|
|
43
|
+
]
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class ConversionError(Exception):
|
|
47
|
+
"""Raised when conversion fails completely."""
|
|
48
|
+
|
|
49
|
+
pass
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@dataclass
|
|
53
|
+
class ConversionWarning:
|
|
54
|
+
"""Non-fatal issue during conversion."""
|
|
55
|
+
|
|
56
|
+
message: str
|
|
57
|
+
example_idx: int | None = None
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
@dataclass
|
|
61
|
+
class ConversionResult:
|
|
62
|
+
"""Result of converting SFT to ADAS.
|
|
63
|
+
|
|
64
|
+
Attributes:
|
|
65
|
+
dataset: The ADAS dataset dict
|
|
66
|
+
warnings: Non-fatal issues encountered
|
|
67
|
+
stats: Conversion statistics
|
|
68
|
+
"""
|
|
69
|
+
|
|
70
|
+
dataset: dict[str, Any]
|
|
71
|
+
warnings: list[ConversionWarning] = field(default_factory=list)
|
|
72
|
+
stats: dict[str, Any] = field(default_factory=dict)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def parse_sft_example(example: dict[str, Any]) -> tuple[str | None, str | None, str | None]:
|
|
76
|
+
"""Extract system, user, assistant from messages array.
|
|
77
|
+
|
|
78
|
+
For multi-turn conversations, takes the last user and assistant messages.
|
|
79
|
+
|
|
80
|
+
Args:
|
|
81
|
+
example: Dict with "messages" key containing role/content objects
|
|
82
|
+
|
|
83
|
+
Returns:
|
|
84
|
+
Tuple of (system_prompt, user_message, assistant_response)
|
|
85
|
+
"""
|
|
86
|
+
messages = example.get("messages", [])
|
|
87
|
+
system = None
|
|
88
|
+
user = None
|
|
89
|
+
assistant = None
|
|
90
|
+
|
|
91
|
+
for msg in messages:
|
|
92
|
+
role = msg.get("role")
|
|
93
|
+
content = msg.get("content", "")
|
|
94
|
+
if role == "system":
|
|
95
|
+
system = content
|
|
96
|
+
elif role == "user":
|
|
97
|
+
user = content # Take last user message
|
|
98
|
+
elif role == "assistant":
|
|
99
|
+
assistant = content # Take last assistant message
|
|
100
|
+
|
|
101
|
+
return system, user, assistant
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def detect_system_prompt(examples: list[dict[str, Any]]) -> str | None:
|
|
105
|
+
"""Find common system prompt across all examples.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
examples: List of SFT examples
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
Most common system prompt, or None if none found
|
|
112
|
+
"""
|
|
113
|
+
system_prompts = [parse_sft_example(ex)[0] for ex in examples]
|
|
114
|
+
system_prompts = [s for s in system_prompts if s]
|
|
115
|
+
|
|
116
|
+
if not system_prompts:
|
|
117
|
+
return None
|
|
118
|
+
|
|
119
|
+
# Check if all same
|
|
120
|
+
if len(set(system_prompts)) == 1:
|
|
121
|
+
return system_prompts[0]
|
|
122
|
+
|
|
123
|
+
# Return most common
|
|
124
|
+
return Counter(system_prompts).most_common(1)[0][0]
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
def infer_template(user_messages: list[str]) -> tuple[str | None, list[str]]:
|
|
128
|
+
"""Detect if user messages follow a template pattern.
|
|
129
|
+
|
|
130
|
+
Samples first N messages and looks for common prefix patterns like
|
|
131
|
+
"Question:", "Context:", "### Instruction", etc.
|
|
132
|
+
|
|
133
|
+
Args:
|
|
134
|
+
user_messages: List of user message strings
|
|
135
|
+
|
|
136
|
+
Returns:
|
|
137
|
+
Tuple of (template_string, field_names).
|
|
138
|
+
template_string: e.g., "Question: {question}\\nContext: {context}" or None
|
|
139
|
+
field_names: e.g., ["question", "context"] or ["user_message"] as fallback
|
|
140
|
+
"""
|
|
141
|
+
if not user_messages:
|
|
142
|
+
return None, ["user_message"]
|
|
143
|
+
|
|
144
|
+
# Sample first N messages to detect pattern
|
|
145
|
+
sample = user_messages[: min(10, len(user_messages))]
|
|
146
|
+
|
|
147
|
+
# Strategy: Find common prefixes across all samples
|
|
148
|
+
detected_fields: list[tuple[str, str]] = []
|
|
149
|
+
|
|
150
|
+
for prefix, field_name in KNOWN_PREFIXES:
|
|
151
|
+
# Check if this prefix appears in most samples
|
|
152
|
+
matches = sum(1 for msg in sample if prefix in msg)
|
|
153
|
+
if matches >= len(sample) * 0.8: # 80% threshold
|
|
154
|
+
detected_fields.append((prefix, field_name))
|
|
155
|
+
|
|
156
|
+
if not detected_fields:
|
|
157
|
+
return None, ["user_message"]
|
|
158
|
+
|
|
159
|
+
# Build template string
|
|
160
|
+
# Sort by position in first message to maintain order
|
|
161
|
+
first_msg = sample[0]
|
|
162
|
+
detected_fields.sort(key=lambda x: first_msg.find(x[0]) if x[0] in first_msg else 9999)
|
|
163
|
+
|
|
164
|
+
template_parts = []
|
|
165
|
+
field_names = []
|
|
166
|
+
for prefix, field_name in detected_fields:
|
|
167
|
+
template_parts.append(f"{prefix} {{{field_name}}}")
|
|
168
|
+
field_names.append(field_name)
|
|
169
|
+
|
|
170
|
+
template = "\n".join(template_parts)
|
|
171
|
+
return template, field_names
|
|
172
|
+
|
|
173
|
+
|
|
174
|
+
def extract_fields(user_message: str, field_names: list[str]) -> dict[str, str]:
|
|
175
|
+
"""Extract field values from user message using detected prefixes.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
user_message: The raw user message string
|
|
179
|
+
field_names: List of field names to extract
|
|
180
|
+
|
|
181
|
+
Returns:
|
|
182
|
+
Dict mapping field names to extracted values, or {"user_message": ...} as fallback
|
|
183
|
+
"""
|
|
184
|
+
result: dict[str, str] = {}
|
|
185
|
+
|
|
186
|
+
for field_name in field_names:
|
|
187
|
+
# Find the prefix for this field
|
|
188
|
+
prefix = None
|
|
189
|
+
for p, fn in KNOWN_PREFIXES:
|
|
190
|
+
if fn == field_name:
|
|
191
|
+
prefix = p
|
|
192
|
+
break
|
|
193
|
+
|
|
194
|
+
if not prefix or prefix not in user_message:
|
|
195
|
+
continue
|
|
196
|
+
|
|
197
|
+
# Find start of value (after prefix)
|
|
198
|
+
start = user_message.find(prefix) + len(prefix)
|
|
199
|
+
# Skip whitespace/colon
|
|
200
|
+
while start < len(user_message) and user_message[start] in " :\n":
|
|
201
|
+
start += 1
|
|
202
|
+
|
|
203
|
+
# Find end (next prefix or end of string)
|
|
204
|
+
end = len(user_message)
|
|
205
|
+
for p, _ in KNOWN_PREFIXES:
|
|
206
|
+
if p != prefix:
|
|
207
|
+
pos = user_message.find(p, start)
|
|
208
|
+
if pos != -1 and pos < end:
|
|
209
|
+
end = pos
|
|
210
|
+
|
|
211
|
+
value = user_message[start:end].strip()
|
|
212
|
+
result[field_name] = value
|
|
213
|
+
|
|
214
|
+
return result if result else {"user_message": user_message}
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
def validate_sft_file(path: str | Path) -> tuple[list[dict[str, Any]], list[ConversionWarning]]:
|
|
218
|
+
"""Validate and load SFT file, collecting warnings.
|
|
219
|
+
|
|
220
|
+
Args:
|
|
221
|
+
path: Path to JSONL file
|
|
222
|
+
|
|
223
|
+
Returns:
|
|
224
|
+
Tuple of (valid_examples, warnings)
|
|
225
|
+
|
|
226
|
+
Raises:
|
|
227
|
+
ConversionError: If no valid examples found
|
|
228
|
+
"""
|
|
229
|
+
warnings: list[ConversionWarning] = []
|
|
230
|
+
examples: list[dict[str, Any]] = []
|
|
231
|
+
path = Path(path)
|
|
232
|
+
|
|
233
|
+
if not path.exists():
|
|
234
|
+
raise ConversionError(f"File not found: {path}")
|
|
235
|
+
|
|
236
|
+
with open(path, encoding="utf-8") as f:
|
|
237
|
+
for i, line in enumerate(f):
|
|
238
|
+
line = line.strip()
|
|
239
|
+
if not line:
|
|
240
|
+
continue
|
|
241
|
+
|
|
242
|
+
try:
|
|
243
|
+
ex = json.loads(line)
|
|
244
|
+
except json.JSONDecodeError:
|
|
245
|
+
warnings.append(ConversionWarning(f"Invalid JSON on line {i + 1}", i))
|
|
246
|
+
continue
|
|
247
|
+
|
|
248
|
+
# Check required structure
|
|
249
|
+
if "messages" not in ex:
|
|
250
|
+
warnings.append(ConversionWarning(f"Missing 'messages' on line {i + 1}", i))
|
|
251
|
+
continue
|
|
252
|
+
|
|
253
|
+
messages = ex["messages"]
|
|
254
|
+
if not isinstance(messages, list):
|
|
255
|
+
warnings.append(ConversionWarning(f"'messages' is not a list on line {i + 1}", i))
|
|
256
|
+
continue
|
|
257
|
+
|
|
258
|
+
# Check for user and assistant roles
|
|
259
|
+
roles = {m.get("role") for m in messages}
|
|
260
|
+
if "user" not in roles:
|
|
261
|
+
warnings.append(ConversionWarning(f"No 'user' role on line {i + 1}", i))
|
|
262
|
+
continue
|
|
263
|
+
if "assistant" not in roles:
|
|
264
|
+
warnings.append(ConversionWarning(f"No 'assistant' role on line {i + 1}", i))
|
|
265
|
+
continue
|
|
266
|
+
|
|
267
|
+
# Check for empty assistant response
|
|
268
|
+
assistant_content = None
|
|
269
|
+
for msg in messages:
|
|
270
|
+
if msg.get("role") == "assistant":
|
|
271
|
+
assistant_content = msg.get("content", "")
|
|
272
|
+
if not assistant_content or not assistant_content.strip():
|
|
273
|
+
warnings.append(
|
|
274
|
+
ConversionWarning(f"Empty assistant response on line {i + 1}", i)
|
|
275
|
+
)
|
|
276
|
+
continue
|
|
277
|
+
|
|
278
|
+
examples.append(ex)
|
|
279
|
+
|
|
280
|
+
if not examples:
|
|
281
|
+
raise ConversionError("No valid examples found in file")
|
|
282
|
+
|
|
283
|
+
return examples, warnings
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
def validate_sft_examples(
|
|
287
|
+
examples: list[dict[str, Any]],
|
|
288
|
+
) -> tuple[list[dict[str, Any]], list[ConversionWarning]]:
|
|
289
|
+
"""Validate a list of SFT examples in memory.
|
|
290
|
+
|
|
291
|
+
Args:
|
|
292
|
+
examples: List of SFT example dicts
|
|
293
|
+
|
|
294
|
+
Returns:
|
|
295
|
+
Tuple of (valid_examples, warnings)
|
|
296
|
+
|
|
297
|
+
Raises:
|
|
298
|
+
ConversionError: If no valid examples found
|
|
299
|
+
"""
|
|
300
|
+
warnings: list[ConversionWarning] = []
|
|
301
|
+
valid_examples: list[dict[str, Any]] = []
|
|
302
|
+
|
|
303
|
+
for i, ex in enumerate(examples):
|
|
304
|
+
# Check required structure
|
|
305
|
+
if "messages" not in ex:
|
|
306
|
+
warnings.append(ConversionWarning(f"Missing 'messages' in example {i}", i))
|
|
307
|
+
continue
|
|
308
|
+
|
|
309
|
+
messages = ex["messages"]
|
|
310
|
+
if not isinstance(messages, list):
|
|
311
|
+
warnings.append(ConversionWarning(f"'messages' is not a list in example {i}", i))
|
|
312
|
+
continue
|
|
313
|
+
|
|
314
|
+
# Check for user and assistant roles
|
|
315
|
+
roles = {m.get("role") for m in messages}
|
|
316
|
+
if "user" not in roles:
|
|
317
|
+
warnings.append(ConversionWarning(f"No 'user' role in example {i}", i))
|
|
318
|
+
continue
|
|
319
|
+
if "assistant" not in roles:
|
|
320
|
+
warnings.append(ConversionWarning(f"No 'assistant' role in example {i}", i))
|
|
321
|
+
continue
|
|
322
|
+
|
|
323
|
+
# Check for empty assistant response
|
|
324
|
+
assistant_content = None
|
|
325
|
+
for msg in messages:
|
|
326
|
+
if msg.get("role") == "assistant":
|
|
327
|
+
assistant_content = msg.get("content", "")
|
|
328
|
+
if not assistant_content or not assistant_content.strip():
|
|
329
|
+
warnings.append(ConversionWarning(f"Empty assistant response in example {i}", i))
|
|
330
|
+
continue
|
|
331
|
+
|
|
332
|
+
valid_examples.append(ex)
|
|
333
|
+
|
|
334
|
+
if not valid_examples:
|
|
335
|
+
raise ConversionError("No valid examples found")
|
|
336
|
+
|
|
337
|
+
return valid_examples, warnings
|
|
338
|
+
|
|
339
|
+
|
|
340
|
+
def convert_openai_sft(
|
|
341
|
+
source: str | Path | list[dict[str, Any]],
|
|
342
|
+
dataset_name: str = "converted_sft",
|
|
343
|
+
detect_template: bool = True,
|
|
344
|
+
max_examples: int | None = None,
|
|
345
|
+
) -> ConversionResult:
|
|
346
|
+
"""Convert OpenAI SFT format to ADAS dataset.
|
|
347
|
+
|
|
348
|
+
Args:
|
|
349
|
+
source: Path to JSONL file, or list of SFT example dicts
|
|
350
|
+
dataset_name: Name for the output dataset
|
|
351
|
+
detect_template: If True, attempt to detect field patterns in user messages
|
|
352
|
+
max_examples: Maximum number of examples to include (None for all)
|
|
353
|
+
|
|
354
|
+
Returns:
|
|
355
|
+
ConversionResult containing the ADAS dataset, warnings, and stats
|
|
356
|
+
|
|
357
|
+
Raises:
|
|
358
|
+
ConversionError: If no valid examples found
|
|
359
|
+
|
|
360
|
+
Example:
|
|
361
|
+
>>> result = convert_openai_sft("training_data.jsonl")
|
|
362
|
+
>>> print(result.dataset["tasks"][0])
|
|
363
|
+
{'task_id': 'sft_0000', 'input': {'user_message': '...'}}
|
|
364
|
+
"""
|
|
365
|
+
all_warnings: list[ConversionWarning] = []
|
|
366
|
+
|
|
367
|
+
# Load and validate examples
|
|
368
|
+
if isinstance(source, (str, Path)):
|
|
369
|
+
examples, warnings = validate_sft_file(source)
|
|
370
|
+
else:
|
|
371
|
+
examples, warnings = validate_sft_examples(source)
|
|
372
|
+
all_warnings.extend(warnings)
|
|
373
|
+
|
|
374
|
+
# Apply max_examples limit
|
|
375
|
+
if max_examples is not None and len(examples) > max_examples:
|
|
376
|
+
examples = examples[:max_examples]
|
|
377
|
+
|
|
378
|
+
# Detect common system prompt
|
|
379
|
+
system_prompt = detect_system_prompt(examples)
|
|
380
|
+
unique_system_prompts = len(set(parse_sft_example(ex)[0] for ex in examples if parse_sft_example(ex)[0]))
|
|
381
|
+
|
|
382
|
+
# Parse all examples
|
|
383
|
+
parsed = [parse_sft_example(ex) for ex in examples]
|
|
384
|
+
user_messages = [p[1] for p in parsed if p[1]]
|
|
385
|
+
assistant_messages = [p[2] for p in parsed]
|
|
386
|
+
|
|
387
|
+
# Optionally infer template
|
|
388
|
+
template: str | None = None
|
|
389
|
+
field_names = ["user_message"]
|
|
390
|
+
if detect_template and user_messages:
|
|
391
|
+
template, field_names = infer_template(user_messages)
|
|
392
|
+
|
|
393
|
+
# Build tasks and gold_outputs
|
|
394
|
+
tasks: list[dict[str, Any]] = []
|
|
395
|
+
gold_outputs: list[dict[str, Any]] = []
|
|
396
|
+
|
|
397
|
+
for i, (parsed_ex, assistant) in enumerate(zip(parsed, assistant_messages)):
|
|
398
|
+
_, user, _ = parsed_ex
|
|
399
|
+
if not user or not assistant:
|
|
400
|
+
continue
|
|
401
|
+
|
|
402
|
+
task_id = f"sft_{i:04d}"
|
|
403
|
+
|
|
404
|
+
# Extract input fields
|
|
405
|
+
if template and field_names != ["user_message"]:
|
|
406
|
+
input_dict = extract_fields(user, field_names)
|
|
407
|
+
else:
|
|
408
|
+
input_dict = {"user_message": user}
|
|
409
|
+
|
|
410
|
+
tasks.append({"task_id": task_id, "input": input_dict})
|
|
411
|
+
gold_outputs.append({"task_id": task_id, "output": {"response": assistant}, "score": 1.0})
|
|
412
|
+
|
|
413
|
+
# Build metadata
|
|
414
|
+
metadata: dict[str, Any] = {
|
|
415
|
+
"name": dataset_name,
|
|
416
|
+
"task_description": system_prompt or "Complete the assistant response",
|
|
417
|
+
"source_format": "openai_sft",
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
if template:
|
|
421
|
+
metadata["detected_template"] = template
|
|
422
|
+
metadata["input_schema"] = {
|
|
423
|
+
"type": "object",
|
|
424
|
+
"properties": {f: {"type": "string"} for f in field_names},
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
# Build stats
|
|
428
|
+
stats = {
|
|
429
|
+
"total_examples": len(examples),
|
|
430
|
+
"skipped_examples": len(all_warnings),
|
|
431
|
+
"output_examples": len(tasks),
|
|
432
|
+
"template_detected": template is not None,
|
|
433
|
+
"detected_fields": field_names,
|
|
434
|
+
"unique_system_prompts": unique_system_prompts,
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
# Warn if multiple system prompts
|
|
438
|
+
if unique_system_prompts > 1:
|
|
439
|
+
all_warnings.append(
|
|
440
|
+
ConversionWarning(
|
|
441
|
+
f"Found {unique_system_prompts} different system prompts; using most common"
|
|
442
|
+
)
|
|
443
|
+
)
|
|
444
|
+
|
|
445
|
+
dataset = {
|
|
446
|
+
"tasks": tasks,
|
|
447
|
+
"gold_outputs": gold_outputs,
|
|
448
|
+
"metadata": metadata,
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
return ConversionResult(dataset=dataset, warnings=all_warnings, stats=stats)
|
|
452
|
+
|
|
453
|
+
|
|
454
|
+
def preview_conversion(
|
|
455
|
+
source: str | Path | list[dict[str, Any]],
|
|
456
|
+
num_examples: int = 3,
|
|
457
|
+
) -> dict[str, Any]:
|
|
458
|
+
"""Preview what conversion would produce without full processing.
|
|
459
|
+
|
|
460
|
+
Args:
|
|
461
|
+
source: Path to JSONL file, or list of SFT example dicts
|
|
462
|
+
num_examples: Number of examples to show in preview
|
|
463
|
+
|
|
464
|
+
Returns:
|
|
465
|
+
Dict with preview information
|
|
466
|
+
"""
|
|
467
|
+
result = convert_openai_sft(source, max_examples=num_examples)
|
|
468
|
+
|
|
469
|
+
return {
|
|
470
|
+
"sample_tasks": result.dataset["tasks"],
|
|
471
|
+
"sample_gold_outputs": result.dataset["gold_outputs"],
|
|
472
|
+
"metadata": result.dataset["metadata"],
|
|
473
|
+
"stats": result.stats,
|
|
474
|
+
"warnings": [w.message for w in result.warnings],
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
|
|
478
|
+
__all__ = [
|
|
479
|
+
"convert_openai_sft",
|
|
480
|
+
"preview_conversion",
|
|
481
|
+
"ConversionResult",
|
|
482
|
+
"ConversionWarning",
|
|
483
|
+
"ConversionError",
|
|
484
|
+
]
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Graph Optimization for HotpotQA
|
|
2
|
+
# This config defines a policy graph optimization job for multi-hop QA.
|
|
3
|
+
|
|
4
|
+
[graph_optimization]
|
|
5
|
+
# Algorithm selection (currently: graph_gepa)
|
|
6
|
+
algorithm = "graph_gepa"
|
|
7
|
+
|
|
8
|
+
# What we're optimizing
|
|
9
|
+
dataset_name = "hotpotqa"
|
|
10
|
+
graph_type = "policy" # "policy" (solves tasks), "verifier" (judges results), or "rlm" (massive context via tools)
|
|
11
|
+
graph_structure = "dag" # "single_prompt", "dag", or "conditional"
|
|
12
|
+
|
|
13
|
+
# Custom topology guidance (optional - adds detail to graph_structure)
|
|
14
|
+
# Describes what KIND of dag/conditional/etc you want
|
|
15
|
+
topology_guidance = "Use a single-step graph with one LLM call that reasons and answers in one shot"
|
|
16
|
+
|
|
17
|
+
# Architectural patterns (optional - orthogonal to graph_type)
|
|
18
|
+
# Patterns let you require/prefer specific architectures regardless of graph_type.
|
|
19
|
+
# Example: RLM-pattern verifier, map-reduce policy, etc.
|
|
20
|
+
#
|
|
21
|
+
# [graph_optimization.patterns]
|
|
22
|
+
# required = [] # MUST use these patterns (e.g., ["rlm"] for RLM verifier)
|
|
23
|
+
# optional = [] # May try these patterns
|
|
24
|
+
# prefer = [] # Prefer these if viable
|
|
25
|
+
#
|
|
26
|
+
# Pattern values: "rlm", "map_reduce", "single_shot", "chain_of_thought", "digest_combine"
|
|
27
|
+
# When RLM is required: auto-adds tools (materialize_context, local_grep, etc.)
|
|
28
|
+
|
|
29
|
+
# Which models the generated graph can use in its nodes
|
|
30
|
+
allowed_policy_models = ["gpt-4o-mini", "gpt-4o"]
|
|
31
|
+
|
|
32
|
+
# Evolution parameters
|
|
33
|
+
[graph_optimization.evolution]
|
|
34
|
+
num_generations = 5
|
|
35
|
+
children_per_generation = 3
|
|
36
|
+
|
|
37
|
+
# Proposer LLM configuration
|
|
38
|
+
[graph_optimization.proposer]
|
|
39
|
+
model = "gpt-4.1"
|
|
40
|
+
temperature = 0.7
|
|
41
|
+
max_tokens = 4096
|
|
42
|
+
|
|
43
|
+
# Training/evaluation seeds
|
|
44
|
+
# With feedback_fraction=0.5, half go to proposer feedback, half to Pareto evaluation
|
|
45
|
+
# To get 10 pareto seeds, we need 20 train seeds total
|
|
46
|
+
[graph_optimization.seeds]
|
|
47
|
+
train = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
|
|
48
|
+
validation = [100, 101, 102, 103, 104]
|
|
49
|
+
|
|
50
|
+
# Resource limits
|
|
51
|
+
[graph_optimization.limits]
|
|
52
|
+
max_spend_usd = 10.0
|
|
53
|
+
timeout_seconds = 3600
|
|
54
|
+
|
|
55
|
+
# Multi-objective Pareto configuration (epsilon-Pareto dominance)
|
|
56
|
+
# Defines when candidates are "indifferent" on each objective
|
|
57
|
+
|
|
58
|
+
# Multi-objective Pareto configuration
|
|
59
|
+
[graph_optimization.pareto_floors]
|
|
60
|
+
|
|
61
|
+
# Focus ONLY on reward for Pareto comparison (ignore latency/cost in dominance)
|
|
62
|
+
use_latency = false
|
|
63
|
+
use_cost = false
|
|
64
|
+
|
|
65
|
+
# Soft floors: below these, differences are ignored (noise reduction)
|
|
66
|
+
# (These only matter if use_latency/use_cost are true)
|
|
67
|
+
latency_s = 2.0 # Don't discriminate on latency below 2 seconds
|
|
68
|
+
cost_usd = 0.10 # Don't discriminate on cost below $0.10/seed
|
|
69
|
+
|
|
70
|
+
# Hard ceilings: disqualify candidates exceeding budget limits
|
|
71
|
+
# These reject candidates entirely (even though cost/latency are disabled for Pareto)
|
|
72
|
+
max_latency_s = 30.0 # Disqualify if mean latency > 30s
|
|
73
|
+
max_cost_usd = 1.00 # Disqualify if mean cost/seed > $1.00
|
|
74
|
+
|
|
75
|
+
# Indifference points: define trade-off equivalences at anchor points
|
|
76
|
+
# Example: At 80% accuracy, 2s latency, $0.50 cost:
|
|
77
|
+
# - +2% accuracy ≈ -0.4s latency ≈ -$0.10 cost (equivalent improvements)
|
|
78
|
+
# - Differences below 0.5% accuracy are considered noise
|
|
79
|
+
|
|
80
|
+
[[graph_optimization.indifference_points]]
|
|
81
|
+
# Anchor point (where we define trade-offs)
|
|
82
|
+
reward = 0.80 # 80% accuracy
|
|
83
|
+
latency_s = 2.0 # 2 seconds
|
|
84
|
+
cost_usd = 0.50 # $0.50 per seed
|
|
85
|
+
|
|
86
|
+
# Trade-off equivalences at this anchor (these amounts are equivalent improvements)
|
|
87
|
+
reward_delta = 0.02 # +2% accuracy is equivalent to...
|
|
88
|
+
latency_delta = 0.4 # -0.4 seconds latency, or...
|
|
89
|
+
cost_delta = 0.10 # -$0.10 cost
|
|
90
|
+
|
|
91
|
+
# Noise floors for each objective (differences smaller than these are ignored)
|
|
92
|
+
reward_noise = 0.005 # 0.5% accuracy differences are noise
|
|
93
|
+
latency_noise = 0.1 # 100ms latency differences are noise
|
|
94
|
+
cost_noise = 0.01 # $0.01 cost differences are noise
|
|
95
|
+
|
|
96
|
+
# You can add multiple anchor points for different regions of the search space
|
|
97
|
+
# [[graph_optimization.indifference_points]]
|
|
98
|
+
# reward = 0.90
|
|
99
|
+
# latency_s = 1.5
|
|
100
|
+
# cost_usd = 0.30
|
|
101
|
+
# reward_delta = 0.01 # Tighter at higher accuracy (harder to improve)
|
|
102
|
+
# latency_delta = 0.2
|
|
103
|
+
# cost_delta = 0.05
|
|
104
|
+
# reward_noise = 0.003
|
|
105
|
+
|
|
106
|
+
# Optional dataset-specific config (passed to task app)
|
|
107
|
+
[graph_optimization.dataset_config]
|
|
108
|
+
# Add any dataset-specific parameters here
|
|
109
|
+
# e.g., max_context_length = 4096
|