synth-ai 0.2.9.dev11__py3-none-any.whl → 0.4.1__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.
Potentially problematic release.
This version of synth-ai might be problematic. Click here for more details.
- synth_ai/__init__.py +44 -45
- synth_ai/__main__.py +30 -3
- synth_ai/cli/__init__.py +104 -78
- 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/baseline/__init__.py +12 -0
- synth_ai/cli/commands/baseline/core.py +636 -0
- synth_ai/cli/commands/baseline/list.py +94 -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 +19 -0
- synth_ai/cli/commands/eval/core.py +1113 -0
- synth_ai/cli/commands/eval/errors.py +81 -0
- synth_ai/cli/commands/eval/validation.py +133 -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 +1438 -0
- synth_ai/cli/commands/status/__init__.py +66 -0
- synth_ai/cli/commands/status/client.py +192 -0
- synth_ai/cli/commands/status/config.py +92 -0
- synth_ai/cli/commands/status/errors.py +20 -0
- synth_ai/cli/commands/status/formatters.py +164 -0
- synth_ai/cli/commands/status/subcommands/__init__.py +9 -0
- synth_ai/cli/commands/status/subcommands/files.py +79 -0
- synth_ai/cli/commands/status/subcommands/jobs.py +334 -0
- synth_ai/cli/commands/status/subcommands/models.py +79 -0
- synth_ai/cli/commands/status/subcommands/pricing.py +23 -0
- synth_ai/cli/commands/status/subcommands/runs.py +81 -0
- synth_ai/cli/commands/status/subcommands/session.py +182 -0
- synth_ai/cli/commands/status/subcommands/summary.py +47 -0
- synth_ai/cli/commands/status/subcommands/usage.py +203 -0
- synth_ai/cli/commands/status/utils.py +114 -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/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/core.py +440 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -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/modal_task_app.py +742 -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 +76 -0
- synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
- synth_ai/cli/demo_apps/math/modal_task_app.py +702 -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 +933 -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/infra/balance.py +216 -0
- 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 +643 -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 +30 -103
- synth_ai/cli/task_apps/__init__.py +26 -0
- synth_ai/cli/task_apps/commands.py +3153 -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/training/watch.py +506 -0
- synth_ai/cli/turso.py +34 -55
- synth_ai/cli/usage.py +159 -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/utils/recent.py +133 -0
- synth_ai/cli/utils/traces.py +164 -0
- 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 +220 -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/core/tracing_v3/__init__.py +99 -0
- synth_ai/core/tracing_v3/config.py +229 -0
- synth_ai/core/tracing_v3/constants.py +21 -0
- synth_ai/core/tracing_v3/db_config.py +182 -0
- synth_ai/core/tracing_v3/decorators.py +401 -0
- synth_ai/core/tracing_v3/examples/basic_usage.py +194 -0
- synth_ai/core/tracing_v3/llm_call_record_helpers.py +437 -0
- synth_ai/core/tracing_v3/migration_helper.py +119 -0
- synth_ai/core/tracing_v3/replica_sync.py +262 -0
- synth_ai/core/tracing_v3/serialization.py +130 -0
- synth_ai/core/tracing_v3/session_tracer.py +542 -0
- synth_ai/core/tracing_v3/storage/base.py +211 -0
- synth_ai/core/tracing_v3/storage/config.py +109 -0
- synth_ai/core/tracing_v3/storage/factory.py +39 -0
- synth_ai/core/tracing_v3/storage/utils.py +206 -0
- 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/core/tracing_v3/turso/models.py +470 -0
- synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
- synth_ai/core/tracing_v3/utils.py +108 -0
- 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 +110 -0
- synth_ai/data/enums.py +141 -0
- synth_ai/data/rewards.py +152 -0
- synth_ai/data/specs.py +36 -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/sdk/__init__.py +119 -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 +86 -0
- synth_ai/sdk/api/research_agent/cli.py +428 -0
- synth_ai/sdk/api/research_agent/config.py +357 -0
- synth_ai/sdk/api/research_agent/job.py +717 -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 +2188 -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 +188 -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/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 +470 -0
- synth_ai/sdk/api/train/rl.py +442 -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 +331 -0
- synth_ai/sdk/api/train/utils.py +279 -0
- synth_ai/sdk/api/train/validators.py +2424 -0
- synth_ai/sdk/baseline/__init__.py +25 -0
- synth_ai/sdk/baseline/config.py +209 -0
- synth_ai/sdk/baseline/discovery.py +216 -0
- synth_ai/sdk/baseline/execution.py +154 -0
- synth_ai/sdk/graphs/__init__.py +15 -0
- synth_ai/sdk/graphs/completions.py +570 -0
- synth_ai/sdk/inference/__init__.py +6 -0
- 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 +15 -0
- synth_ai/sdk/judging/base.py +24 -0
- synth_ai/sdk/judging/client.py +191 -0
- synth_ai/sdk/judging/schemas.py +222 -0
- synth_ai/sdk/judging/types.py +42 -0
- synth_ai/sdk/learning/__init__.py +69 -0
- synth_ai/sdk/learning/client.py +240 -0
- synth_ai/sdk/learning/ft_client.py +7 -0
- synth_ai/sdk/learning/health.py +49 -0
- synth_ai/sdk/learning/jobs.py +202 -0
- 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 +185 -0
- synth_ai/sdk/learning/rl/client.py +268 -0
- synth_ai/sdk/learning/rl/contracts.py +27 -0
- synth_ai/sdk/learning/rl/env_keys.py +166 -0
- synth_ai/sdk/learning/rl/secrets.py +13 -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/validators.py +52 -0
- synth_ai/sdk/research_agent/__init__.py +34 -0
- synth_ai/sdk/research_agent/container_builder.py +328 -0
- synth_ai/sdk/research_agent/container_spec.py +198 -0
- synth_ai/sdk/research_agent/defaults.py +34 -0
- synth_ai/sdk/research_agent/results_collector.py +69 -0
- synth_ai/sdk/specs/__init__.py +46 -0
- synth_ai/sdk/specs/dataclasses.py +149 -0
- synth_ai/sdk/specs/loader.py +144 -0
- synth_ai/sdk/specs/serializer.py +199 -0
- synth_ai/sdk/specs/validation.py +250 -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 +704 -0
- synth_ai/sdk/streaming/types.py +112 -0
- synth_ai/sdk/task/__init__.py +151 -0
- synth_ai/sdk/task/apps/__init__.py +133 -0
- synth_ai/sdk/task/config.py +261 -0
- synth_ai/sdk/task/contracts.py +298 -0
- synth_ai/sdk/task/datasets.py +108 -0
- synth_ai/sdk/task/in_process.py +1190 -0
- synth_ai/sdk/task/in_process_runner.py +309 -0
- synth_ai/sdk/task/inference_api.py +299 -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/server.py +580 -0
- synth_ai/sdk/task/trace_correlation_helpers.py +506 -0
- synth_ai/sdk/task/tracing_utils.py +95 -0
- synth_ai/sdk/task/validators.py +456 -0
- synth_ai/sdk/tracing/__init__.py +39 -0
- synth_ai/sdk/training/__init__.py +102 -0
- synth_ai/sdk/usage/__init__.py +37 -0
- synth_ai/sdk/usage/client.py +171 -0
- synth_ai/sdk/usage/models.py +261 -0
- synth_ai/utils/__init__.py +213 -0
- synth_ai-0.4.1.dist-info/METADATA +195 -0
- synth_ai-0.4.1.dist-info/RECORD +379 -0
- synth_ai-0.4.1.dist-info/entry_points.txt +2 -0
- synth_ai-0.4.1.dist-info/top_level.txt +1 -0
- examples/__init__.py +0 -16
- examples/analyze_semantic_words.sh +0 -17
- examples/crafter_debug_render.py +0 -186
- examples/qwen_coder/README.md +0 -102
- examples/qwen_coder/_shared.py +0 -113
- examples/qwen_coder/configs/coder_lora_30b.toml +0 -61
- examples/qwen_coder/configs/coder_lora_4b.toml +0 -57
- examples/qwen_coder/configs/coder_lora_small.toml +0 -58
- examples/qwen_coder/generate_dataset.py +0 -98
- examples/qwen_coder/infer_ft_smoke.py +0 -64
- examples/qwen_coder/infer_prod_proxy.py +0 -73
- examples/qwen_coder/infer_via_synth.py +0 -87
- examples/qwen_coder/scripts/infer_coder.sh +0 -18
- examples/qwen_coder/scripts/train_coder_30b.sh +0 -21
- examples/qwen_coder/sft_full_17b.py +0 -103
- examples/qwen_coder/sft_lora_30b.py +0 -110
- examples/qwen_coder/subset_jsonl.py +0 -38
- examples/qwen_coder/validate_jsonl.py +0 -59
- examples/rl/README.md +0 -169
- examples/rl/configs/eval_base_qwen.toml +0 -15
- examples/rl/configs/eval_rl_qwen.toml +0 -11
- examples/rl/configs/rl_from_base_qwen.toml +0 -35
- examples/rl/configs/rl_from_base_qwen17.toml +0 -74
- examples/rl/configs/rl_from_ft_qwen.toml +0 -35
- examples/rl/download_dataset.py +0 -80
- examples/rl/run_eval.py +0 -436
- examples/rl/run_rl_and_save.py +0 -111
- examples/rl/task_app/README.md +0 -22
- examples/rl/task_app/math_single_step.py +0 -991
- examples/rl/task_app/math_task_app.py +0 -115
- examples/run_crafter_demo.sh +0 -10
- examples/sft/README.md +0 -139
- examples/sft/configs/crafter_fft_qwen0p6b.toml +0 -44
- examples/sft/configs/crafter_lora_qwen0p6b.toml +0 -45
- examples/sft/evaluate.py +0 -117
- examples/sft/export_dataset.py +0 -117
- examples/sft/generate_traces.py +0 -162
- examples/swe/__init__.py +0 -12
- examples/swe/task_app/README.md +0 -105
- examples/swe/task_app/__init__.py +0 -2
- examples/swe/task_app/grpo_swe_mini.py +0 -571
- examples/swe/task_app/grpo_swe_mini_task_app.py +0 -136
- examples/swe/task_app/hosted/README.md +0 -173
- examples/swe/task_app/hosted/__init__.py +0 -5
- examples/swe/task_app/hosted/branching.py +0 -143
- examples/swe/task_app/hosted/environment_routes.py +0 -1289
- examples/swe/task_app/hosted/envs/__init__.py +0 -1
- examples/swe/task_app/hosted/envs/crafter/__init__.py +0 -6
- examples/swe/task_app/hosted/envs/crafter/app.py +0 -1
- examples/swe/task_app/hosted/envs/crafter/environment.py +0 -522
- examples/swe/task_app/hosted/envs/crafter/policy.py +0 -478
- examples/swe/task_app/hosted/envs/crafter/react_agent.py +0 -108
- examples/swe/task_app/hosted/envs/crafter/shared.py +0 -305
- examples/swe/task_app/hosted/envs/crafter/tools.py +0 -47
- examples/swe/task_app/hosted/envs/mini_swe/__init__.py +0 -8
- examples/swe/task_app/hosted/envs/mini_swe/environment.py +0 -1164
- examples/swe/task_app/hosted/envs/mini_swe/policy.py +0 -355
- examples/swe/task_app/hosted/envs/mini_swe/shared.py +0 -83
- examples/swe/task_app/hosted/envs/mini_swe/tools.py +0 -96
- examples/swe/task_app/hosted/hosted_app.py +0 -204
- examples/swe/task_app/hosted/inference/__init__.py +0 -5
- examples/swe/task_app/hosted/inference/openai_client.py +0 -618
- examples/swe/task_app/hosted/main.py +0 -100
- examples/swe/task_app/hosted/policy_routes.py +0 -1079
- examples/swe/task_app/hosted/registry.py +0 -195
- examples/swe/task_app/hosted/rollout.py +0 -1869
- examples/swe/task_app/hosted/storage/__init__.py +0 -5
- examples/swe/task_app/hosted/storage/volume.py +0 -211
- examples/swe/task_app/hosted/test_agents.py +0 -161
- examples/swe/task_app/hosted/test_service.py +0 -137
- examples/swe/task_app/hosted/utils.py +0 -62
- examples/vlm/README.md +0 -68
- examples/vlm/configs/crafter_vlm_gpt4o.toml +0 -44
- examples/vlm/crafter_image_only_agent.py +0 -207
- examples/vlm/crafter_openai_vlm_agent.py +0 -277
- examples/vlm/filter_image_rows.py +0 -63
- examples/vlm/run_crafter_vlm_benchmark.py +0 -316
- examples/warming_up_to_rl/analyze_trace_db.py +0 -422
- examples/warming_up_to_rl/configs/crafter_fft.toml +0 -48
- examples/warming_up_to_rl/configs/crafter_fft_4b.toml +0 -54
- examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml +0 -20
- examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml +0 -13
- examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml +0 -23
- examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +0 -83
- examples/warming_up_to_rl/configs/rl_from_ft.toml +0 -56
- examples/warming_up_to_rl/export_trace_sft.py +0 -723
- examples/warming_up_to_rl/groq_test.py +0 -95
- examples/warming_up_to_rl/manage_secrets.py +0 -131
- examples/warming_up_to_rl/readme.md +0 -179
- examples/warming_up_to_rl/run_eval.py +0 -510
- examples/warming_up_to_rl/run_fft_and_save.py +0 -380
- examples/warming_up_to_rl/run_local_rollout.py +0 -237
- examples/warming_up_to_rl/run_local_rollout_modal.py +0 -246
- examples/warming_up_to_rl/run_local_rollout_parallel.py +0 -403
- examples/warming_up_to_rl/run_local_rollout_traced.py +0 -475
- examples/warming_up_to_rl/run_rl_and_save.py +0 -124
- examples/warming_up_to_rl/run_rollout_remote.py +0 -154
- examples/warming_up_to_rl/task_app/README.md +0 -42
- examples/warming_up_to_rl/task_app/grpo_crafter.py +0 -700
- examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py +0 -146
- examples/warming_up_to_rl/task_app/synth_envs_hosted/README.md +0 -173
- examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py +0 -5
- examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py +0 -143
- examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py +0 -1226
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/__init__.py +0 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/__init__.py +0 -6
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/app.py +0 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/environment.py +0 -522
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/policy.py +0 -478
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py +0 -108
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py +0 -305
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py +0 -47
- examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py +0 -204
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py +0 -5
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +0 -618
- examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py +0 -100
- examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +0 -1083
- examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py +0 -195
- examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +0 -1869
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py +0 -5
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py +0 -211
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py +0 -161
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py +0 -137
- examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py +0 -62
- synth/__init__.py +0 -14
- synth_ai/api/models/supported.py +0 -376
- synth_ai/api/train/__init__.py +0 -5
- synth_ai/api/train/builders.py +0 -296
- synth_ai/api/train/cli.py +0 -606
- synth_ai/api/train/config_finder.py +0 -228
- synth_ai/api/train/env_resolver.py +0 -347
- synth_ai/api/train/pollers.py +0 -75
- synth_ai/api/train/supported_algos.py +0 -139
- synth_ai/api/train/task_app.py +0 -195
- synth_ai/api/train/utils.py +0 -217
- synth_ai/cli/_modal_wrapper.py +0 -28
- synth_ai/cli/_typer_patch.py +0 -49
- synth_ai/cli/balance.py +0 -203
- synth_ai/cli/calc.py +0 -69
- synth_ai/cli/demo.py +0 -159
- synth_ai/cli/legacy_root_backup.py +0 -470
- synth_ai/cli/man.py +0 -106
- synth_ai/cli/recent.py +0 -127
- synth_ai/cli/rl_demo.py +0 -274
- synth_ai/cli/status.py +0 -133
- synth_ai/cli/task_apps.py +0 -2782
- synth_ai/cli/traces.py +0 -163
- synth_ai/cli/watch.py +0 -505
- synth_ai/config/base_url.py +0 -107
- synth_ai/core/experiment.py +0 -13
- synth_ai/core/system.py +0 -15
- synth_ai/demo_registry.py +0 -295
- synth_ai/demos/core/__init__.py +0 -1
- synth_ai/demos/core/cli.py +0 -1756
- synth_ai/demos/demo_task_apps/core.py +0 -440
- synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +0 -172
- 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 -739
- synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -37
- 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 -302
- 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/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/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 -479
- 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/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 -363
- synth_ai/environments/service/app.py +0 -97
- synth_ai/environments/service/core_routes.py +0 -1021
- 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 -81
- synth_ai/environments/tasks/filters.py +0 -40
- synth_ai/environments/tasks/utils.py +0 -90
- synth_ai/environments/v0_observability/history.py +0 -3
- synth_ai/environments/v0_observability/log.py +0 -2
- synth_ai/evals/base.py +0 -13
- synth_ai/handshake.py +0 -109
- synth_ai/http.py +0 -26
- synth_ai/http_client.py +0 -136
- synth_ai/inference/__init__.py +0 -5
- synth_ai/inference/client.py +0 -34
- synth_ai/jobs/client.py +0 -271
- synth_ai/learning/__init__.py +0 -59
- synth_ai/learning/client.py +0 -241
- synth_ai/learning/ft_client.py +0 -7
- synth_ai/learning/health.py +0 -49
- synth_ai/learning/jobs.py +0 -201
- synth_ai/learning/rl/client.py +0 -267
- synth_ai/learning/rl/contracts.py +0 -27
- synth_ai/learning/rl/env_keys.py +0 -166
- synth_ai/learning/rl/secrets.py +0 -13
- synth_ai/learning/sft/client.py +0 -68
- synth_ai/learning/sft/config.py +0 -270
- synth_ai/learning/sft/data.py +0 -295
- synth_ai/learning/validators.py +0 -49
- synth_ai/lm/__init__.py +0 -25
- synth_ai/main.py +0 -6
- synth_ai/task/__init__.py +0 -102
- synth_ai/task/apps/__init__.py +0 -128
- synth_ai/task/contracts.py +0 -137
- synth_ai/task/datasets.py +0 -108
- synth_ai/task/proxy.py +0 -259
- synth_ai/task/server.py +0 -424
- synth_ai/task/tracing_utils.py +0 -84
- synth_ai/task/validators.py +0 -11
- synth_ai/tracing_v3/__init__.py +0 -97
- synth_ai/tracing_v3/config.py +0 -84
- synth_ai/tracing_v3/db_config.py +0 -194
- synth_ai/tracing_v3/decorators.py +0 -369
- synth_ai/tracing_v3/examples/basic_usage.py +0 -189
- synth_ai/tracing_v3/llm_call_record_helpers.py +0 -337
- synth_ai/tracing_v3/migration_helper.py +0 -120
- synth_ai/tracing_v3/replica_sync.py +0 -258
- synth_ai/tracing_v3/session_tracer.py +0 -530
- synth_ai/tracing_v3/storage/base.py +0 -210
- synth_ai/tracing_v3/storage/config.py +0 -75
- synth_ai/tracing_v3/storage/factory.py +0 -39
- synth_ai/tracing_v3/storage/utils.py +0 -204
- synth_ai/tracing_v3/turso/daemon.py +0 -149
- synth_ai/tracing_v3/turso/models.py +0 -469
- synth_ai/tracing_v3/turso/native_manager.py +0 -1173
- synth_ai/tracing_v3/utils.py +0 -108
- synth_ai/v0/api/__init__.py +0 -8
- synth_ai/v0/api/models/__init__.py +0 -8
- synth_ai/v0/api/models/supported.py +0 -8
- synth_ai/v0/config/__init__.py +0 -15
- synth_ai/v0/config/base_url.py +0 -12
- synth_ai/v0/lm/__init__.py +0 -51
- synth_ai/v0/lm/caching/constants.py +0 -6
- synth_ai/v0/lm/caching/dbs.py +0 -0
- synth_ai/v0/lm/caching/ephemeral.py +0 -100
- synth_ai/v0/lm/caching/handler.py +0 -137
- synth_ai/v0/lm/caching/initialize.py +0 -11
- synth_ai/v0/lm/caching/persistent.py +0 -114
- synth_ai/v0/lm/config.py +0 -115
- synth_ai/v0/lm/constants.py +0 -32
- synth_ai/v0/lm/core/__init__.py +0 -8
- synth_ai/v0/lm/core/all.py +0 -73
- synth_ai/v0/lm/core/exceptions.py +0 -5
- synth_ai/v0/lm/core/main.py +0 -331
- synth_ai/v0/lm/core/main_v3.py +0 -594
- synth_ai/v0/lm/core/synth_models.py +0 -35
- synth_ai/v0/lm/core/vendor_clients.py +0 -190
- synth_ai/v0/lm/cost/__init__.py +0 -0
- synth_ai/v0/lm/cost/monitor.py +0 -1
- synth_ai/v0/lm/cost/statefulness.py +0 -1
- synth_ai/v0/lm/injection.py +0 -80
- synth_ai/v0/lm/overrides.py +0 -206
- synth_ai/v0/lm/provider_support/__init__.py +0 -8
- synth_ai/v0/lm/provider_support/anthropic.py +0 -972
- synth_ai/v0/lm/provider_support/openai.py +0 -1139
- synth_ai/v0/lm/provider_support/suppress_logging.py +0 -31
- synth_ai/v0/lm/structured_outputs/__init__.py +0 -0
- synth_ai/v0/lm/structured_outputs/handler.py +0 -440
- synth_ai/v0/lm/structured_outputs/inject.py +0 -297
- synth_ai/v0/lm/structured_outputs/rehabilitate.py +0 -185
- synth_ai/v0/lm/tools/__init__.py +0 -3
- synth_ai/v0/lm/tools/base.py +0 -172
- synth_ai/v0/lm/unified_interface.py +0 -202
- synth_ai/v0/lm/vendors/__init__.py +0 -0
- synth_ai/v0/lm/vendors/base.py +0 -81
- synth_ai/v0/lm/vendors/core/__init__.py +0 -0
- synth_ai/v0/lm/vendors/core/anthropic_api.py +0 -387
- synth_ai/v0/lm/vendors/core/gemini_api.py +0 -292
- synth_ai/v0/lm/vendors/core/mistral_api.py +0 -322
- synth_ai/v0/lm/vendors/core/openai_api.py +0 -227
- synth_ai/v0/lm/vendors/core/synth_dev_api.py +0 -0
- synth_ai/v0/lm/vendors/local/__init__.py +0 -0
- synth_ai/v0/lm/vendors/local/ollama.py +0 -0
- synth_ai/v0/lm/vendors/openai_standard.py +0 -782
- synth_ai/v0/lm/vendors/openai_standard_responses.py +0 -259
- synth_ai/v0/lm/vendors/retries.py +0 -22
- synth_ai/v0/lm/vendors/supported/__init__.py +0 -0
- synth_ai/v0/lm/vendors/supported/custom_endpoint.py +0 -415
- synth_ai/v0/lm/vendors/supported/deepseek.py +0 -69
- synth_ai/v0/lm/vendors/supported/grok.py +0 -75
- synth_ai/v0/lm/vendors/supported/groq.py +0 -16
- synth_ai/v0/lm/vendors/supported/ollama.py +0 -15
- synth_ai/v0/lm/vendors/supported/openrouter.py +0 -74
- synth_ai/v0/lm/vendors/supported/together.py +0 -11
- synth_ai/v0/lm/vendors/synth_client.py +0 -835
- synth_ai/v0/lm/warmup.py +0 -186
- 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 -409
- 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/v0/tracing_v3/__init__.py +0 -10
- synth_ai/v0/tracing_v3/abstractions.py +0 -3
- synth_ai/v0/tracing_v3/decorators.py +0 -3
- synth_ai/v0/tracing_v3/llm_call_record_helpers.py +0 -3
- synth_ai/v0/tracing_v3/session_tracer.py +0 -3
- synth_ai-0.2.9.dev11.dist-info/METADATA +0 -191
- synth_ai-0.2.9.dev11.dist-info/RECORD +0 -571
- synth_ai-0.2.9.dev11.dist-info/entry_points.txt +0 -3
- synth_ai-0.2.9.dev11.dist-info/top_level.txt +0 -3
- /synth_ai/{demos/demo_task_apps → cli/demo_apps}/crafter/__init__.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/__init__.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/crafter_fft_4b.toml +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/_common.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/config.toml +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +0 -0
- /synth_ai/{v0/lm/caching → core/apps}/__init__.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/abstractions.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/hooks.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}/algorithms.py +0 -0
- /synth_ai/{learning → sdk/learning}/config.py +0 -0
- /synth_ai/{learning → sdk/learning}/constants.py +0 -0
- /synth_ai/{learning → sdk/learning}/core.py +0 -0
- /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
- /synth_ai/{learning → sdk/learning}/rl/__init__.py +0 -0
- /synth_ai/{learning → sdk/learning}/rl/config.py +0 -0
- /synth_ai/{learning → sdk/learning}/rl_client.py +0 -0
- /synth_ai/{learning → sdk/learning}/sft/__init__.py +0 -0
- /synth_ai/{learning → sdk/learning}/sse.py +0 -0
- /synth_ai/{task → sdk/task}/auth.py +0 -0
- /synth_ai/{task → sdk/task}/client.py +0 -0
- /synth_ai/{task → sdk/task}/errors.py +0 -0
- /synth_ai/{task → sdk/task}/health.py +0 -0
- /synth_ai/{task → sdk/task}/json.py +0 -0
- /synth_ai/{task → sdk/task}/rubrics.py +0 -0
- /synth_ai/{task → sdk/task}/vendors.py +0 -0
- {synth_ai-0.2.9.dev11.dist-info → synth_ai-0.4.1.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.9.dev11.dist-info → synth_ai-0.4.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"""Tracing v3 - Turso/sqld based tracing implementation.
|
|
2
|
+
|
|
3
|
+
This module provides a modern, async-first tracing system for capturing and storing
|
|
4
|
+
detailed execution traces from AI systems. It's designed to handle high-throughput
|
|
5
|
+
scenarios with proper async/await patterns throughout.
|
|
6
|
+
|
|
7
|
+
Architecture Overview:
|
|
8
|
+
---------------------
|
|
9
|
+
The v3 tracing system is built on several key components:
|
|
10
|
+
|
|
11
|
+
1. **Data Abstractions** (`abstractions.py`):
|
|
12
|
+
- Dataclass-based models for traces, events, and messages
|
|
13
|
+
- Type-safe representations of session data
|
|
14
|
+
- Support for multiple event types (Runtime, Environment, LM/CAIS)
|
|
15
|
+
|
|
16
|
+
2. **Session Tracer** (`session_tracer.py`):
|
|
17
|
+
- Main interface for creating and managing trace sessions
|
|
18
|
+
- Async context managers for session and timestep management
|
|
19
|
+
- Automatic event and message recording with proper ordering
|
|
20
|
+
|
|
21
|
+
3. **Async Storage** (`turso/manager.py`):
|
|
22
|
+
- SQLAlchemy async engine with Turso/sqld backend
|
|
23
|
+
- Batch insert capabilities for high-throughput scenarios
|
|
24
|
+
- Analytics views for querying trace data
|
|
25
|
+
|
|
26
|
+
4. **Decorators** (`decorators.py`):
|
|
27
|
+
- Context-aware decorators using asyncio's ContextVar
|
|
28
|
+
- Automatic LLM call tracing with token/cost tracking
|
|
29
|
+
- Session and turn number propagation across async boundaries
|
|
30
|
+
|
|
31
|
+
5. **Hook System** (`hooks.py`):
|
|
32
|
+
- Extensible hook points throughout the tracing lifecycle
|
|
33
|
+
- Support for both sync and async hook callbacks
|
|
34
|
+
- Pre/post processing of events and messages
|
|
35
|
+
|
|
36
|
+
6. **Replica Sync** (`replica_sync.py`):
|
|
37
|
+
- Optional background sync with remote Turso database
|
|
38
|
+
- Local embedded SQLite for low-latency writes
|
|
39
|
+
- Configurable sync intervals
|
|
40
|
+
|
|
41
|
+
Key Features:
|
|
42
|
+
------------
|
|
43
|
+
- **Async-First**: All database operations are async, preventing blocking
|
|
44
|
+
- **Context Propagation**: Session/turn info flows through async call chains
|
|
45
|
+
- **Type Safety**: Full typing support with dataclasses and type hints
|
|
46
|
+
- **Extensibility**: Hook system allows custom processing logic
|
|
47
|
+
- **Performance**: Batch operations and connection pooling for efficiency
|
|
48
|
+
|
|
49
|
+
Usage Example:
|
|
50
|
+
-------------
|
|
51
|
+
from synth_ai.core.tracing_v3 import SessionTracer
|
|
52
|
+
|
|
53
|
+
tracer = SessionTracer()
|
|
54
|
+
await tracer.initialize()
|
|
55
|
+
|
|
56
|
+
async with tracer.session() as session_id:
|
|
57
|
+
async with tracer.timestep("step1", turn_number=1):
|
|
58
|
+
# Record events during execution
|
|
59
|
+
await tracer.record_event(RuntimeEvent(...))
|
|
60
|
+
await tracer.record_message("User input", "user")
|
|
61
|
+
|
|
62
|
+
Configuration:
|
|
63
|
+
-------------
|
|
64
|
+
The system uses environment variables for configuration:
|
|
65
|
+
- TURSO_LOCAL_DB_URL: Local SQLite database URL
|
|
66
|
+
- TURSO_POOL_SIZE: Connection pool size (default: 8)
|
|
67
|
+
- TURSO_ECHO_SQL: Enable SQL logging (default: false)
|
|
68
|
+
- SQLD_DB_PATH: Path to SQLite database file
|
|
69
|
+
|
|
70
|
+
See `config.py` for full configuration options.
|
|
71
|
+
"""
|
|
72
|
+
|
|
73
|
+
from .abstractions import (
|
|
74
|
+
BaseEvent,
|
|
75
|
+
EnvironmentEvent,
|
|
76
|
+
RuntimeEvent,
|
|
77
|
+
SessionEventMarkovBlanketMessage,
|
|
78
|
+
SessionMessageContent,
|
|
79
|
+
SessionTimeStep,
|
|
80
|
+
SessionTrace,
|
|
81
|
+
TimeRecord,
|
|
82
|
+
)
|
|
83
|
+
from .config import TursoConfig
|
|
84
|
+
from .llm_call_record_helpers import BaseLMResponse
|
|
85
|
+
from .session_tracer import SessionTracer
|
|
86
|
+
|
|
87
|
+
__all__ = [
|
|
88
|
+
"SessionTracer",
|
|
89
|
+
"SessionTrace",
|
|
90
|
+
"SessionTimeStep",
|
|
91
|
+
"BaseEvent",
|
|
92
|
+
"RuntimeEvent",
|
|
93
|
+
"EnvironmentEvent",
|
|
94
|
+
"SessionEventMarkovBlanketMessage",
|
|
95
|
+
"SessionMessageContent",
|
|
96
|
+
"TimeRecord",
|
|
97
|
+
"TursoConfig",
|
|
98
|
+
"BaseLMResponse",
|
|
99
|
+
]
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"""Configuration helpers for tracing v3.
|
|
2
|
+
|
|
3
|
+
This module centralises the logic for discovering which datastore the tracer
|
|
4
|
+
should use. Historically the project defaulted to a local SQLite file which
|
|
5
|
+
breaks under parallel load. The new resolver inspects environment variables
|
|
6
|
+
and defaults to Turso/libSQL whenever credentials are supplied, while keeping a
|
|
7
|
+
SQLite fallback for contributors without remote access.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
from __future__ import annotations
|
|
11
|
+
|
|
12
|
+
import os
|
|
13
|
+
from dataclasses import dataclass, field
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
from typing import Any
|
|
16
|
+
from urllib.parse import parse_qsl, urlencode, urlparse, urlunparse
|
|
17
|
+
|
|
18
|
+
from synth_ai.core.tracing_v3.constants import canonical_trace_db_path
|
|
19
|
+
|
|
20
|
+
# STARTUP DIAGNOSTIC - Commented out to reduce noise
|
|
21
|
+
# print(f"[TRACING_V3_CONFIG_LOADED] Python={sys.version_info.major}.{sys.version_info.minor} MODAL_IS_REMOTE={os.getenv('MODAL_IS_REMOTE')}", flush=True)
|
|
22
|
+
|
|
23
|
+
# ---------------------------------------------------------------------------
|
|
24
|
+
# DSN resolution helpers
|
|
25
|
+
# ---------------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
_CANONICAL_DB_PATH = canonical_trace_db_path()
|
|
28
|
+
_DEFAULT_TRACE_DIR = Path(os.getenv("SYNTH_TRACES_DIR", _CANONICAL_DB_PATH.parent))
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _normalise_path(path: Path) -> Path:
|
|
32
|
+
"""Resolve relative paths and expand user/home markers."""
|
|
33
|
+
path = path.expanduser()
|
|
34
|
+
if not path.is_absolute():
|
|
35
|
+
path = (Path.cwd() / path).resolve()
|
|
36
|
+
return path
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _is_modal_environment() -> bool:
|
|
40
|
+
"""Detect if running in Modal container.
|
|
41
|
+
|
|
42
|
+
Modal automatically sets MODAL_IS_REMOTE=1 in all deployed containers.
|
|
43
|
+
We check this first, then fall back to other Modal env vars.
|
|
44
|
+
"""
|
|
45
|
+
# Modal sets this in all deployed containers
|
|
46
|
+
if os.getenv("MODAL_IS_REMOTE") == "1":
|
|
47
|
+
return True
|
|
48
|
+
|
|
49
|
+
# Additional Modal env vars as fallback
|
|
50
|
+
return bool(
|
|
51
|
+
os.getenv("MODAL_TASK_ID")
|
|
52
|
+
or os.getenv("MODAL_ENVIRONMENT")
|
|
53
|
+
or os.getenv("SERVICE", "").upper() == "MODAL"
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def _split_auth_from_url(url: str) -> tuple[str, str | None]:
|
|
58
|
+
"""Strip any auth_token query parameter from a DSN."""
|
|
59
|
+
parsed = urlparse(url)
|
|
60
|
+
if not parsed.query:
|
|
61
|
+
return url, None
|
|
62
|
+
|
|
63
|
+
params = dict(parse_qsl(parsed.query, keep_blank_values=True))
|
|
64
|
+
token = params.pop("auth_token", None)
|
|
65
|
+
query = urlencode(params, doseq=True)
|
|
66
|
+
# urlunparse will omit the '?' automatically when query is empty
|
|
67
|
+
sanitised = urlunparse(parsed._replace(query=query))
|
|
68
|
+
return sanitised, token
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
def _default_sqlite_url(*, ensure_dir: bool = True) -> tuple[str, str | None]:
|
|
72
|
+
"""Generate a SQLite URL from SYNTH_TRACES_DIR if set, otherwise raise."""
|
|
73
|
+
traces_dir = os.getenv("SYNTH_TRACES_DIR")
|
|
74
|
+
if traces_dir:
|
|
75
|
+
dir_path = _normalise_path(Path(traces_dir))
|
|
76
|
+
if ensure_dir:
|
|
77
|
+
dir_path.mkdir(parents=True, exist_ok=True)
|
|
78
|
+
db_path = dir_path / "synth_traces.db"
|
|
79
|
+
sqlite_url = f"sqlite+aiosqlite:///{db_path}"
|
|
80
|
+
return sqlite_url, None
|
|
81
|
+
raise RuntimeError("SQLite fallback is disabled; configure LIBSQL_URL or run sqld locally.")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def resolve_trace_db_settings(*, ensure_dir: bool = True) -> tuple[str, str | None]:
|
|
85
|
+
"""Resolve the tracing database URL and optional auth token.
|
|
86
|
+
|
|
87
|
+
Resolution order:
|
|
88
|
+
1. `SYNTH_TRACES_DB` (explicit DSN override)
|
|
89
|
+
2. `LIBSQL_URL` / `TURSO_DATABASE_URL` (remote libSQL endpoints)
|
|
90
|
+
3. `TURSO_LOCAL_DB_URL` (legacy env for local sqld)
|
|
91
|
+
4. Modal environment: plain SQLite file (no sqld, no auth)
|
|
92
|
+
5. Local dev: sqld default
|
|
93
|
+
"""
|
|
94
|
+
import logging
|
|
95
|
+
logger = logging.getLogger(__name__)
|
|
96
|
+
|
|
97
|
+
explicit = os.getenv("SYNTH_TRACES_DB")
|
|
98
|
+
if explicit:
|
|
99
|
+
logger.info(f"[TRACE_CONFIG] Using explicit SYNTH_TRACES_DB: {explicit}")
|
|
100
|
+
return _split_auth_from_url(explicit)
|
|
101
|
+
|
|
102
|
+
remote = os.getenv("LIBSQL_URL") or os.getenv("TURSO_DATABASE_URL")
|
|
103
|
+
if remote:
|
|
104
|
+
logger.info(f"[TRACE_CONFIG] Using remote Turso: {remote}")
|
|
105
|
+
url, token = _split_auth_from_url(remote)
|
|
106
|
+
if token:
|
|
107
|
+
return url, token
|
|
108
|
+
env_token = os.getenv("LIBSQL_AUTH_TOKEN") or os.getenv("TURSO_AUTH_TOKEN")
|
|
109
|
+
return url, env_token
|
|
110
|
+
|
|
111
|
+
local_override = os.getenv("TURSO_LOCAL_DB_URL")
|
|
112
|
+
if local_override:
|
|
113
|
+
logger.info(f"[TRACE_CONFIG] Using TURSO_LOCAL_DB_URL: {local_override}")
|
|
114
|
+
url, token = _split_auth_from_url(local_override)
|
|
115
|
+
if token:
|
|
116
|
+
return url, token
|
|
117
|
+
env_token = os.getenv("LIBSQL_AUTH_TOKEN") or os.getenv("TURSO_AUTH_TOKEN")
|
|
118
|
+
return url, env_token
|
|
119
|
+
|
|
120
|
+
# Check for SYNTH_TRACES_DIR to generate SQLite URL
|
|
121
|
+
traces_dir = os.getenv("SYNTH_TRACES_DIR")
|
|
122
|
+
if traces_dir:
|
|
123
|
+
try:
|
|
124
|
+
sqlite_url, _ = _default_sqlite_url(ensure_dir=ensure_dir)
|
|
125
|
+
logger.info(f"[TRACE_CONFIG] Using SQLite from SYNTH_TRACES_DIR: {sqlite_url}")
|
|
126
|
+
return sqlite_url, None
|
|
127
|
+
except RuntimeError:
|
|
128
|
+
pass # Fall through to other options
|
|
129
|
+
|
|
130
|
+
# Modal environment: use plain SQLite file (no sqld daemon, no auth required)
|
|
131
|
+
is_modal = _is_modal_environment()
|
|
132
|
+
logger.info(f"[TRACE_CONFIG] Modal detection: {is_modal} (MODAL_IS_REMOTE={os.getenv('MODAL_IS_REMOTE')})")
|
|
133
|
+
if is_modal:
|
|
134
|
+
logger.info("[TRACE_CONFIG] Using Modal SQLite: file:/tmp/synth_traces.db")
|
|
135
|
+
return "file:/tmp/synth_traces.db", None
|
|
136
|
+
|
|
137
|
+
# Local dev: default to sqld HTTP API
|
|
138
|
+
default_url = os.getenv("LIBSQL_DEFAULT_URL", "http://127.0.0.1:8081")
|
|
139
|
+
logger.info(f"[TRACE_CONFIG] Using local sqld: {default_url}")
|
|
140
|
+
return default_url, None
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
def resolve_trace_db_url(*, ensure_dir: bool = True) -> str:
|
|
144
|
+
"""Return just the DSN, discarding any auth token."""
|
|
145
|
+
url, _ = resolve_trace_db_settings(ensure_dir=ensure_dir)
|
|
146
|
+
return url
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def resolve_trace_db_auth_token() -> str | None:
|
|
150
|
+
"""Return the resolved auth token for the tracing datastore."""
|
|
151
|
+
_, token = resolve_trace_db_settings()
|
|
152
|
+
return token
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
# ---------------------------------------------------------------------------
|
|
156
|
+
# Config dataclasses
|
|
157
|
+
# ---------------------------------------------------------------------------
|
|
158
|
+
|
|
159
|
+
DEFAULT_DB_FILE = str(_normalise_path(_DEFAULT_TRACE_DIR) / _CANONICAL_DB_PATH.name)
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
@dataclass
|
|
163
|
+
class TursoConfig:
|
|
164
|
+
"""Configuration for Turso/sqld connection."""
|
|
165
|
+
|
|
166
|
+
# Default values matching serve.sh
|
|
167
|
+
DEFAULT_DB_FILE = DEFAULT_DB_FILE
|
|
168
|
+
DEFAULT_HTTP_PORT = 8080
|
|
169
|
+
|
|
170
|
+
# Resolve DB URL and auth token from environment (libSQL preferred)
|
|
171
|
+
db_url: str = field(default_factory=resolve_trace_db_url)
|
|
172
|
+
|
|
173
|
+
# Remote database sync configuration
|
|
174
|
+
sync_url: str = os.getenv("LIBSQL_SYNC_URL") or os.getenv("TURSO_SYNC_URL", "")
|
|
175
|
+
auth_token: str = resolve_trace_db_auth_token() or ""
|
|
176
|
+
sync_interval: int = int(
|
|
177
|
+
os.getenv("TURSO_SYNC_SECONDS", "2")
|
|
178
|
+
) # 2 seconds for responsive local development
|
|
179
|
+
|
|
180
|
+
# Connection pool settings
|
|
181
|
+
pool_size: int = int(os.getenv("TURSO_POOL_SIZE", "8"))
|
|
182
|
+
max_overflow: int = int(os.getenv("TURSO_MAX_OVERFLOW", "16"))
|
|
183
|
+
pool_timeout: float = float(os.getenv("TURSO_POOL_TIMEOUT", "30.0"))
|
|
184
|
+
pool_recycle: int = int(os.getenv("TURSO_POOL_RECYCLE", "3600"))
|
|
185
|
+
|
|
186
|
+
# SQLite settings
|
|
187
|
+
foreign_keys: bool = os.getenv("TURSO_FOREIGN_KEYS", "true").lower() == "true"
|
|
188
|
+
journal_mode: str = os.getenv("TURSO_JOURNAL_MODE", "WAL")
|
|
189
|
+
|
|
190
|
+
# Performance settings
|
|
191
|
+
echo_sql: bool = os.getenv("TURSO_ECHO_SQL", "false").lower() == "true"
|
|
192
|
+
batch_size: int = int(os.getenv("TURSO_BATCH_SIZE", "1000"))
|
|
193
|
+
|
|
194
|
+
# Daemon settings (for local sqld) - match serve.sh defaults
|
|
195
|
+
sqld_binary: str = os.getenv("SQLD_BINARY", "sqld")
|
|
196
|
+
sqld_db_path: str = os.getenv("SQLD_DB_PATH", DEFAULT_DB_FILE)
|
|
197
|
+
sqld_http_port: int = int(os.getenv("SQLD_HTTP_PORT", "8080"))
|
|
198
|
+
sqld_idle_shutdown: int = int(os.getenv("SQLD_IDLE_SHUTDOWN", "0")) # 0 = no idle shutdown
|
|
199
|
+
|
|
200
|
+
def get_connect_args(self) -> dict[str, str]:
|
|
201
|
+
"""Get SQLAlchemy connection arguments."""
|
|
202
|
+
args: dict[str, str] = {}
|
|
203
|
+
if self.auth_token:
|
|
204
|
+
args["auth_token"] = self.auth_token
|
|
205
|
+
return args
|
|
206
|
+
|
|
207
|
+
def get_engine_kwargs(self) -> dict[str, Any]:
|
|
208
|
+
"""Get SQLAlchemy engine creation kwargs."""
|
|
209
|
+
kwargs: dict[str, Any] = {
|
|
210
|
+
"echo": self.echo_sql,
|
|
211
|
+
"future": True,
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
# Only add pool settings for non-SQLite URLs
|
|
215
|
+
if not (self.db_url.startswith("sqlite") or ":memory:" in self.db_url):
|
|
216
|
+
kwargs.update(
|
|
217
|
+
{
|
|
218
|
+
"pool_size": self.pool_size,
|
|
219
|
+
"max_overflow": self.max_overflow,
|
|
220
|
+
"pool_timeout": self.pool_timeout,
|
|
221
|
+
"pool_recycle": self.pool_recycle,
|
|
222
|
+
}
|
|
223
|
+
)
|
|
224
|
+
|
|
225
|
+
return kwargs
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
# Global config instance
|
|
229
|
+
CONFIG = TursoConfig()
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from datetime import datetime
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
|
|
6
|
+
TRACE_DB_DIR = Path("traces")
|
|
7
|
+
TRACE_DB_BASENAME = "turso_task_app_traces"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def canonical_trace_db_name(*, timestamp: datetime | None = None) -> str:
|
|
11
|
+
"""Return the canonical trace database filename (with optional timestamp suffix)."""
|
|
12
|
+
|
|
13
|
+
if timestamp is None:
|
|
14
|
+
return f"{TRACE_DB_BASENAME}.db"
|
|
15
|
+
return f"{TRACE_DB_BASENAME}_{timestamp.strftime('%Y-%m-%d_%H-%M-%S')}.db"
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def canonical_trace_db_path(*, timestamp: datetime | None = None) -> Path:
|
|
19
|
+
"""Return the canonical trace database path within the default trace directory."""
|
|
20
|
+
|
|
21
|
+
return TRACE_DB_DIR / canonical_trace_db_name(timestamp=timestamp)
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Centralized database configuration for v3 tracing.
|
|
3
|
+
"""
|
|
4
|
+
|
|
5
|
+
import logging
|
|
6
|
+
import os
|
|
7
|
+
import shutil
|
|
8
|
+
from typing import TYPE_CHECKING, Optional
|
|
9
|
+
|
|
10
|
+
from synth_ai.core.tracing_v3.constants import canonical_trace_db_path
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from .turso.daemon import SqldDaemon
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class DatabaseConfig:
|
|
19
|
+
"""Centralized database configuration management."""
|
|
20
|
+
|
|
21
|
+
# Default values from serve.sh
|
|
22
|
+
DEFAULT_DB_FILE = str(canonical_trace_db_path())
|
|
23
|
+
DEFAULT_HTTP_PORT = 8080
|
|
24
|
+
|
|
25
|
+
def __init__(
|
|
26
|
+
self, db_path: str | None = None, http_port: int | None = None, use_sqld: bool = True
|
|
27
|
+
):
|
|
28
|
+
"""
|
|
29
|
+
Initialize database configuration.
|
|
30
|
+
|
|
31
|
+
Args:
|
|
32
|
+
db_path: Path to database file. If None, uses DEFAULT_DB_FILE from serve.sh.
|
|
33
|
+
http_port: Hrana WebSocket port for sqld daemon (env: SQLD_HTTP_PORT). If None, uses DEFAULT_HTTP_PORT.
|
|
34
|
+
use_sqld: Whether to use sqld daemon or direct SQLite.
|
|
35
|
+
"""
|
|
36
|
+
self.use_sqld = use_sqld and self._sqld_binary_available()
|
|
37
|
+
# Note: SQLD_HTTP_PORT is actually the hrana port (8080), not the HTTP API port
|
|
38
|
+
self.hrana_port = http_port or int(os.getenv("SQLD_HTTP_PORT", self.DEFAULT_HTTP_PORT))
|
|
39
|
+
self._daemon: SqldDaemon | None = None
|
|
40
|
+
|
|
41
|
+
# Set up database path to match serve.sh configuration
|
|
42
|
+
if db_path is None:
|
|
43
|
+
# Use the same database file as serve.sh
|
|
44
|
+
self.db_file = os.getenv("SQLD_DB_PATH", self.DEFAULT_DB_FILE)
|
|
45
|
+
# For sqld, db_base_path is just the filename without directory
|
|
46
|
+
self.db_base_path = self.db_file
|
|
47
|
+
else:
|
|
48
|
+
self.db_file = db_path
|
|
49
|
+
self.db_base_path = db_path
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def database_url(self) -> str:
|
|
53
|
+
"""Get the SQLAlchemy database URL."""
|
|
54
|
+
# Always use direct file access with aiosqlite
|
|
55
|
+
# (sqld HTTP interface is not compatible with SQLAlchemy)
|
|
56
|
+
|
|
57
|
+
# Check if sqld is running - it creates a directory structure
|
|
58
|
+
abs_path = os.path.abspath(self.db_file)
|
|
59
|
+
sqld_data_path = os.path.join(abs_path, "dbs", "default", "data")
|
|
60
|
+
|
|
61
|
+
if not os.path.exists(sqld_data_path) and not os.path.exists(abs_path):
|
|
62
|
+
raise RuntimeError(
|
|
63
|
+
"sqld data directory not found. Run `sqld --db-path <path>` before using the tracing database."
|
|
64
|
+
)
|
|
65
|
+
|
|
66
|
+
# Use http:// for local sqld HTTP API port
|
|
67
|
+
# sqld has two ports: hrana_port (Hrana WebSocket) and hrana_port+1 (HTTP API)
|
|
68
|
+
# Python libsql client uses HTTP API with http:// URLs
|
|
69
|
+
http_api_port = self.hrana_port + 1
|
|
70
|
+
return f"http://127.0.0.1:{http_api_port}"
|
|
71
|
+
|
|
72
|
+
def _sqld_binary_available(self) -> bool:
|
|
73
|
+
"""Check if the sqld (Turso) binary is available on PATH."""
|
|
74
|
+
# Respect explicit SQLD_BINARY override when present
|
|
75
|
+
binary_override = os.getenv("SQLD_BINARY")
|
|
76
|
+
candidates = [binary_override, "sqld", "libsql-server"]
|
|
77
|
+
|
|
78
|
+
for candidate in candidates:
|
|
79
|
+
if candidate and shutil.which(candidate):
|
|
80
|
+
return True
|
|
81
|
+
|
|
82
|
+
if binary_override:
|
|
83
|
+
raise RuntimeError(
|
|
84
|
+
f"Configured SQLD_BINARY='{binary_override}' but the executable was not found on PATH."
|
|
85
|
+
)
|
|
86
|
+
raise RuntimeError(
|
|
87
|
+
"sqld binary not detected; install Turso's sqld or set SQLD_BINARY so that libSQL can be used."
|
|
88
|
+
)
|
|
89
|
+
|
|
90
|
+
def start_daemon(self, wait_time: float = 2.0):
|
|
91
|
+
"""
|
|
92
|
+
Start the sqld daemon if configured.
|
|
93
|
+
|
|
94
|
+
Args:
|
|
95
|
+
wait_time: Time to wait for daemon startup.
|
|
96
|
+
|
|
97
|
+
Returns:
|
|
98
|
+
The daemon instance.
|
|
99
|
+
"""
|
|
100
|
+
if not self.use_sqld:
|
|
101
|
+
raise RuntimeError("Database not configured to use sqld daemon")
|
|
102
|
+
|
|
103
|
+
if self._daemon is None:
|
|
104
|
+
# Import here to avoid circular dependency
|
|
105
|
+
from .turso.daemon import SqldDaemon
|
|
106
|
+
|
|
107
|
+
self._daemon = SqldDaemon(db_path=self.db_base_path, hrana_port=self.hrana_port)
|
|
108
|
+
|
|
109
|
+
self._daemon.start()
|
|
110
|
+
|
|
111
|
+
# Wait for daemon to be ready
|
|
112
|
+
import time
|
|
113
|
+
|
|
114
|
+
time.sleep(wait_time)
|
|
115
|
+
|
|
116
|
+
return self._daemon
|
|
117
|
+
|
|
118
|
+
def stop_daemon(self):
|
|
119
|
+
"""Stop the sqld daemon if running."""
|
|
120
|
+
if self._daemon:
|
|
121
|
+
self._daemon.stop()
|
|
122
|
+
self._daemon = None
|
|
123
|
+
|
|
124
|
+
def get_daemon_and_url(self, wait_time: float = 2.0) -> tuple[Optional["SqldDaemon"], str]:
|
|
125
|
+
"""
|
|
126
|
+
Get daemon (starting if needed) and database URL.
|
|
127
|
+
|
|
128
|
+
Returns:
|
|
129
|
+
Tuple of (daemon or None, database_url)
|
|
130
|
+
"""
|
|
131
|
+
daemon = None
|
|
132
|
+
if self.use_sqld:
|
|
133
|
+
daemon = self.start_daemon(wait_time)
|
|
134
|
+
|
|
135
|
+
return daemon, self.database_url
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
# Global default configuration
|
|
139
|
+
_default_config: DatabaseConfig | None = None
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def get_default_db_config() -> DatabaseConfig:
|
|
143
|
+
"""Get the default database configuration."""
|
|
144
|
+
global _default_config
|
|
145
|
+
if _default_config is None:
|
|
146
|
+
# Check environment variable for database path
|
|
147
|
+
db_path = os.environ.get("SYNTH_AI_V3_DB_PATH")
|
|
148
|
+
use_sqld = os.environ.get("SYNTH_AI_V3_USE_SQLD", "true").lower() == "true"
|
|
149
|
+
|
|
150
|
+
# Check if sqld is already running (started by serve.sh)
|
|
151
|
+
import subprocess
|
|
152
|
+
|
|
153
|
+
sqld_hrana_port = int(os.getenv("SQLD_HTTP_PORT", DatabaseConfig.DEFAULT_HTTP_PORT))
|
|
154
|
+
sqld_http_port = sqld_hrana_port + 1
|
|
155
|
+
sqld_running = False
|
|
156
|
+
try:
|
|
157
|
+
# Check for either hrana or http port in the process command line
|
|
158
|
+
result = subprocess.run(
|
|
159
|
+
["pgrep", "-f", f"sqld.*(--hrana-listen-addr.*:{sqld_hrana_port}|--http-listen-addr.*:{sqld_http_port})"],
|
|
160
|
+
capture_output=True,
|
|
161
|
+
text=True,
|
|
162
|
+
)
|
|
163
|
+
if result.returncode == 0:
|
|
164
|
+
# sqld is already running, don't start a new one
|
|
165
|
+
sqld_running = True
|
|
166
|
+
use_sqld = False
|
|
167
|
+
logger.debug(f"✅ Detected sqld already running on ports {sqld_hrana_port} (hrana) and {sqld_http_port} (http)")
|
|
168
|
+
except Exception as e:
|
|
169
|
+
logger.debug(f"Could not check for sqld process: {e}")
|
|
170
|
+
|
|
171
|
+
if not sqld_running and use_sqld:
|
|
172
|
+
logger.warning("sqld service not detected. Start the Turso daemon (./serve.sh) before running tracing workloads.")
|
|
173
|
+
|
|
174
|
+
_default_config = DatabaseConfig(db_path=db_path, use_sqld=use_sqld)
|
|
175
|
+
|
|
176
|
+
return _default_config
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def set_default_db_config(config: DatabaseConfig):
|
|
180
|
+
"""Set the default database configuration."""
|
|
181
|
+
global _default_config
|
|
182
|
+
_default_config = config
|