synth-ai 0.2.9.dev5__py3-none-any.whl → 0.2.9.dev6__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.
- examples/__init__.py +16 -0
- examples/crafter_debug_render.py +23 -17
- examples/qwen_coder/README.md +102 -0
- examples/qwen_coder/_shared.py +113 -0
- examples/qwen_coder/configs/coder_lora_30b.toml +61 -0
- examples/qwen_coder/configs/coder_lora_4b.toml +57 -0
- examples/qwen_coder/configs/coder_lora_small.toml +58 -0
- examples/qwen_coder/generate_dataset.py +98 -0
- examples/qwen_coder/infer_ft_smoke.py +64 -0
- examples/qwen_coder/infer_prod_proxy.py +73 -0
- examples/qwen_coder/infer_via_synth.py +87 -0
- examples/qwen_coder/scripts/infer_coder.sh +18 -0
- examples/qwen_coder/scripts/train_coder_30b.sh +21 -0
- examples/qwen_coder/sft_full_17b.py +103 -0
- examples/qwen_coder/sft_lora_30b.py +110 -0
- examples/qwen_coder/subset_jsonl.py +38 -0
- examples/qwen_coder/validate_jsonl.py +59 -0
- examples/rl/configs/eval_base_qwen.toml +1 -1
- examples/rl/configs/rl_from_base_qwen17.toml +1 -1
- examples/rl/download_dataset.py +26 -10
- examples/rl/run_eval.py +53 -52
- examples/rl/run_rl_and_save.py +29 -12
- examples/rl/task_app/math_single_step.py +180 -41
- examples/rl/task_app/math_task_app.py +14 -6
- examples/sft/README.md +139 -0
- examples/sft/configs/crafter_fft_qwen0p6b.toml +44 -0
- examples/sft/configs/crafter_lora_qwen0p6b.toml +45 -0
- examples/sft/evaluate.py +117 -0
- examples/sft/export_dataset.py +117 -0
- examples/sft/generate_traces.py +162 -0
- examples/swe/__init__.py +12 -0
- examples/swe/task_app/README.md +105 -0
- examples/swe/task_app/__init__.py +2 -0
- examples/swe/task_app/grpo_swe_mini.py +571 -0
- examples/swe/task_app/grpo_swe_mini_task_app.py +136 -0
- examples/swe/task_app/hosted/README.md +173 -0
- examples/swe/task_app/hosted/__init__.py +5 -0
- examples/swe/task_app/hosted/branching.py +143 -0
- examples/swe/task_app/hosted/environment_routes.py +1289 -0
- examples/swe/task_app/hosted/envs/__init__.py +1 -0
- examples/swe/task_app/hosted/envs/crafter/__init__.py +6 -0
- examples/swe/task_app/hosted/envs/crafter/app.py +1 -0
- examples/swe/task_app/hosted/envs/crafter/environment.py +522 -0
- examples/swe/task_app/hosted/envs/crafter/policy.py +478 -0
- examples/swe/task_app/hosted/envs/crafter/react_agent.py +108 -0
- examples/swe/task_app/hosted/envs/crafter/shared.py +305 -0
- examples/swe/task_app/hosted/envs/crafter/tools.py +47 -0
- examples/swe/task_app/hosted/envs/mini_swe/__init__.py +8 -0
- examples/swe/task_app/hosted/envs/mini_swe/environment.py +1164 -0
- examples/swe/task_app/hosted/envs/mini_swe/policy.py +355 -0
- examples/swe/task_app/hosted/envs/mini_swe/shared.py +83 -0
- examples/swe/task_app/hosted/envs/mini_swe/tools.py +96 -0
- examples/swe/task_app/hosted/hosted_app.py +204 -0
- examples/swe/task_app/hosted/inference/__init__.py +5 -0
- examples/swe/task_app/hosted/inference/openai_client.py +618 -0
- examples/swe/task_app/hosted/main.py +100 -0
- examples/swe/task_app/hosted/policy_routes.py +1079 -0
- examples/swe/task_app/hosted/registry.py +195 -0
- examples/swe/task_app/hosted/rollout.py +1869 -0
- examples/swe/task_app/hosted/storage/__init__.py +5 -0
- examples/swe/task_app/hosted/storage/volume.py +211 -0
- examples/swe/task_app/hosted/test_agents.py +161 -0
- examples/swe/task_app/hosted/test_service.py +137 -0
- examples/swe/task_app/hosted/utils.py +62 -0
- examples/vlm/README.md +68 -0
- examples/vlm/configs/crafter_vlm_gpt4o.toml +44 -0
- examples/vlm/crafter_image_only_agent.py +207 -0
- examples/vlm/crafter_openai_vlm_agent.py +277 -0
- examples/vlm/filter_image_rows.py +63 -0
- examples/vlm/run_crafter_vlm_benchmark.py +316 -0
- examples/warming_up_to_rl/analyze_trace_db.py +12 -10
- examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +11 -1
- examples/warming_up_to_rl/export_trace_sft.py +218 -36
- examples/warming_up_to_rl/groq_test.py +15 -8
- examples/warming_up_to_rl/manage_secrets.py +29 -25
- examples/warming_up_to_rl/readme.md +9 -2
- examples/warming_up_to_rl/run_eval.py +137 -61
- examples/warming_up_to_rl/run_fft_and_save.py +131 -60
- examples/warming_up_to_rl/run_local_rollout.py +88 -39
- examples/warming_up_to_rl/run_local_rollout_modal.py +114 -28
- examples/warming_up_to_rl/run_local_rollout_parallel.py +81 -20
- examples/warming_up_to_rl/run_local_rollout_traced.py +126 -23
- examples/warming_up_to_rl/run_rl_and_save.py +35 -12
- examples/warming_up_to_rl/run_rollout_remote.py +44 -19
- examples/warming_up_to_rl/task_app/README.md +6 -2
- examples/warming_up_to_rl/task_app/grpo_crafter.py +319 -57
- examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py +11 -30
- examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py +9 -11
- examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py +137 -182
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/app.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/environment.py +150 -57
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/policy.py +105 -69
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py +19 -7
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py +45 -42
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py +47 -45
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +198 -92
- examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py +0 -2
- examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +361 -263
- examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py +21 -23
- examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +394 -274
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py +56 -62
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py +1 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py +6 -15
- examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py +4 -3
- synth/__init__.py +14 -0
- synth_ai/__init__.py +20 -4
- synth_ai/api/models/supported.py +376 -0
- synth_ai/api/train/builders.py +157 -26
- synth_ai/api/train/cli.py +213 -57
- synth_ai/api/train/config_finder.py +65 -5
- synth_ai/api/train/env_resolver.py +33 -15
- synth_ai/api/train/pollers.py +13 -4
- synth_ai/api/train/supported_algos.py +139 -0
- synth_ai/api/train/task_app.py +5 -3
- synth_ai/api/train/utils.py +33 -48
- synth_ai/cli/__init__.py +19 -4
- synth_ai/cli/_modal_wrapper.py +28 -0
- synth_ai/cli/_typer_patch.py +49 -0
- synth_ai/cli/balance.py +2 -3
- synth_ai/cli/calc.py +1 -1
- synth_ai/cli/demo.py +21 -6
- synth_ai/cli/recent.py +2 -2
- synth_ai/cli/rl_demo.py +77 -17
- synth_ai/cli/root.py +116 -39
- synth_ai/cli/status.py +2 -2
- synth_ai/cli/task_apps.py +1699 -259
- synth_ai/cli/traces.py +7 -4
- synth_ai/cli/turso.py +73 -0
- synth_ai/cli/watch.py +12 -18
- synth_ai/core/experiment.py +0 -2
- synth_ai/demo_registry.py +68 -31
- synth_ai/demos/core/cli.py +516 -194
- synth_ai/demos/demo_task_apps/__init__.py +3 -3
- synth_ai/demos/demo_task_apps/core.py +64 -28
- synth_ai/demos/demo_task_apps/crafter/configs/crafter_fft_4b.toml +2 -3
- synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +37 -30
- synth_ai/demos/demo_task_apps/math/_common.py +1 -2
- synth_ai/demos/demo_task_apps/math/app.py +2 -1
- synth_ai/demos/demo_task_apps/math/deploy_modal.py +3 -6
- synth_ai/demos/demo_task_apps/math/modal_task_app.py +183 -82
- synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -2
- synth_ai/environments/examples/bandit/engine.py +12 -4
- synth_ai/environments/examples/bandit/taskset.py +4 -4
- synth_ai/environments/examples/crafter_classic/environment.py +76 -1
- synth_ai/environments/reproducibility/tree.py +5 -6
- synth_ai/environments/service/app.py +11 -12
- synth_ai/environments/service/core_routes.py +10 -9
- synth_ai/environments/stateful/engine.py +1 -1
- synth_ai/environments/tasks/core.py +1 -0
- synth_ai/environments/tasks/filters.py +5 -6
- synth_ai/environments/tasks/utils.py +4 -5
- synth_ai/evals/base.py +0 -2
- synth_ai/handshake.py +11 -9
- synth_ai/http.py +1 -1
- synth_ai/http_client.py +43 -11
- synth_ai/inference/__init__.py +0 -2
- synth_ai/inference/client.py +20 -6
- synth_ai/jobs/client.py +103 -78
- synth_ai/learning/__init__.py +41 -6
- synth_ai/learning/algorithms.py +14 -0
- synth_ai/learning/client.py +121 -29
- synth_ai/learning/config.py +2 -40
- synth_ai/learning/constants.py +0 -2
- synth_ai/learning/ft_client.py +4 -56
- synth_ai/learning/health.py +13 -7
- synth_ai/learning/jobs.py +43 -47
- synth_ai/{rl → learning/rl}/__init__.py +14 -5
- synth_ai/learning/rl/client.py +267 -0
- synth_ai/learning/rl/config.py +31 -0
- synth_ai/{rl → learning/rl}/contracts.py +5 -10
- synth_ai/{rl → learning/rl}/env_keys.py +45 -16
- synth_ai/learning/rl/secrets.py +13 -0
- synth_ai/learning/rl_client.py +2 -253
- synth_ai/learning/sft/__init__.py +29 -0
- synth_ai/learning/sft/client.py +68 -0
- synth_ai/learning/sft/config.py +270 -0
- synth_ai/learning/sft/data.py +295 -0
- synth_ai/learning/sse.py +25 -26
- synth_ai/learning/validators.py +25 -24
- synth_ai/lm/__init__.py +21 -47
- synth_ai/task/__init__.py +26 -27
- synth_ai/task/apps/__init__.py +18 -19
- synth_ai/task/auth.py +35 -23
- synth_ai/task/client.py +15 -13
- synth_ai/task/contracts.py +37 -35
- synth_ai/task/datasets.py +9 -6
- synth_ai/task/errors.py +11 -10
- synth_ai/task/health.py +17 -11
- synth_ai/task/json.py +58 -24
- synth_ai/task/proxy.py +15 -14
- synth_ai/task/rubrics.py +22 -15
- synth_ai/task/server.py +43 -17
- synth_ai/task/tracing_utils.py +12 -7
- synth_ai/task/validators.py +0 -1
- synth_ai/task/vendors.py +5 -7
- synth_ai/tracing_v3/__init__.py +2 -0
- synth_ai/tracing_v3/abstractions.py +21 -4
- synth_ai/tracing_v3/db_config.py +26 -1
- synth_ai/tracing_v3/decorators.py +18 -15
- synth_ai/tracing_v3/examples/basic_usage.py +3 -2
- synth_ai/tracing_v3/hooks.py +6 -4
- synth_ai/tracing_v3/llm_call_record_helpers.py +6 -6
- synth_ai/tracing_v3/replica_sync.py +1 -0
- synth_ai/tracing_v3/session_tracer.py +63 -16
- synth_ai/tracing_v3/storage/base.py +89 -1
- synth_ai/tracing_v3/storage/config.py +21 -8
- synth_ai/tracing_v3/storage/factory.py +10 -8
- synth_ai/tracing_v3/storage/utils.py +4 -2
- synth_ai/tracing_v3/turso/daemon.py +7 -2
- synth_ai/tracing_v3/turso/models.py +5 -2
- synth_ai/tracing_v3/turso/native_manager.py +1173 -0
- synth_ai/tracing_v3/utils.py +4 -3
- synth_ai/v0/api/__init__.py +8 -0
- synth_ai/v0/api/models/__init__.py +8 -0
- synth_ai/v0/api/models/supported.py +8 -0
- synth_ai/v0/config/__init__.py +15 -0
- synth_ai/v0/config/base_url.py +12 -0
- synth_ai/v0/lm/__init__.py +51 -0
- synth_ai/{lm → v0/lm}/caching/ephemeral.py +3 -5
- synth_ai/{lm → v0/lm}/caching/handler.py +4 -4
- synth_ai/{lm → v0/lm}/caching/initialize.py +1 -1
- synth_ai/{lm → v0/lm}/caching/persistent.py +1 -1
- synth_ai/{lm → v0/lm}/config.py +6 -1
- synth_ai/{lm → v0/lm}/core/all.py +9 -9
- synth_ai/{lm → v0/lm}/core/exceptions.py +0 -2
- synth_ai/{lm → v0/lm}/core/main.py +19 -7
- synth_ai/{lm → v0/lm}/core/main_v3.py +10 -10
- synth_ai/{lm → v0/lm}/core/synth_models.py +2 -15
- synth_ai/{lm → v0/lm}/core/vendor_clients.py +6 -4
- synth_ai/{lm → v0/lm}/overrides.py +4 -4
- synth_ai/{lm → v0/lm}/provider_support/anthropic.py +4 -4
- synth_ai/{lm → v0/lm}/provider_support/openai.py +5 -5
- synth_ai/{lm → v0/lm}/structured_outputs/handler.py +5 -5
- synth_ai/{lm → v0/lm}/structured_outputs/rehabilitate.py +1 -1
- synth_ai/{lm → v0/lm}/vendors/core/anthropic_api.py +16 -16
- synth_ai/{lm → v0/lm}/vendors/core/gemini_api.py +5 -5
- synth_ai/{lm → v0/lm}/vendors/core/mistral_api.py +5 -5
- synth_ai/{lm → v0/lm}/vendors/core/openai_api.py +12 -10
- synth_ai/{lm → v0/lm}/vendors/openai_standard.py +11 -9
- synth_ai/{lm → v0/lm}/vendors/openai_standard_responses.py +8 -5
- synth_ai/{lm → v0/lm}/vendors/supported/custom_endpoint.py +4 -6
- synth_ai/{lm → v0/lm}/vendors/supported/deepseek.py +2 -2
- synth_ai/{lm → v0/lm}/vendors/supported/grok.py +2 -2
- synth_ai/{lm → v0/lm}/vendors/supported/groq.py +1 -1
- synth_ai/{lm → v0/lm}/vendors/supported/ollama.py +1 -1
- synth_ai/{lm → v0/lm}/vendors/supported/openrouter.py +3 -3
- synth_ai/{lm → v0/lm}/vendors/supported/together.py +1 -1
- synth_ai/{lm → v0/lm}/vendors/synth_client.py +38 -11
- synth_ai/v0/tracing/upload.py +32 -135
- synth_ai/v0/tracing_v3/__init__.py +10 -0
- synth_ai/v0/tracing_v3/abstractions.py +3 -0
- synth_ai/v0/tracing_v3/decorators.py +3 -0
- synth_ai/v0/tracing_v3/llm_call_record_helpers.py +3 -0
- synth_ai/v0/tracing_v3/session_tracer.py +3 -0
- synth_ai-0.2.9.dev6.dist-info/METADATA +191 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/RECORD +291 -262
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/top_level.txt +1 -0
- examples/common_old/backend.py +0 -21
- examples/evals_old/README.md +0 -98
- examples/evals_old/__init__.py +0 -6
- examples/evals_old/compare_models.py +0 -1037
- examples/evals_old/example_log.md +0 -145
- examples/evals_old/run_demo.sh +0 -126
- examples/evals_old/trace_analysis.py +0 -270
- examples/finetuning_old/_backup_synth_qwen/config.toml +0 -29
- examples/finetuning_old/_backup_synth_qwen/example_log.md +0 -324
- examples/finetuning_old/_backup_synth_qwen/filter_traces.py +0 -60
- examples/finetuning_old/_backup_synth_qwen/filter_traces_achievements.py +0 -239
- examples/finetuning_old/_backup_synth_qwen/purge_v3_traces.py +0 -109
- examples/finetuning_old/_backup_synth_qwen/react_agent_lm.py +0 -1924
- examples/finetuning_old/_backup_synth_qwen/readme.md +0 -49
- examples/finetuning_old/_backup_synth_qwen/run_crafter_qwen4b.py +0 -114
- examples/finetuning_old/_backup_synth_qwen/run_demo.sh +0 -195
- examples/finetuning_old/_backup_synth_qwen/sft_kickoff.py +0 -118
- examples/finetuning_old/synth_qwen_v1/README.md +0 -68
- examples/finetuning_old/synth_qwen_v1/filter_traces.py +0 -60
- examples/finetuning_old/synth_qwen_v1/filter_traces_achievements.py +0 -239
- examples/finetuning_old/synth_qwen_v1/finetune.py +0 -46
- examples/finetuning_old/synth_qwen_v1/hello_ft_model.py +0 -71
- examples/finetuning_old/synth_qwen_v1/infer.py +0 -37
- examples/finetuning_old/synth_qwen_v1/poll.py +0 -44
- examples/finetuning_old/synth_qwen_v1/prepare_data.py +0 -35
- examples/finetuning_old/synth_qwen_v1/purge_v3_traces.py +0 -109
- examples/finetuning_old/synth_qwen_v1/react_agent_lm.py +0 -1932
- examples/finetuning_old/synth_qwen_v1/run_crafter_sft_job.py +0 -207
- examples/finetuning_old/synth_qwen_v1/run_ft_job.py +0 -232
- examples/finetuning_old/synth_qwen_v1/upload_data.py +0 -34
- examples/finetuning_old/synth_qwen_v1/util.py +0 -147
- examples/rl_old/task_app.py +0 -962
- examples/warming_up_to_rl/old/event_rewards.md +0 -234
- examples/warming_up_to_rl/old/notes.md +0 -73
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -738
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
- synth_ai/experimental/synth_oss.py +0 -446
- synth_ai/install_sqld.sh +0 -40
- synth_ai/learning/filtering.py +0 -0
- 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/rl/secrets.py +0 -19
- synth_ai/scripts/verify_rewards.py +0 -100
- synth_ai/tracing/__init__.py +0 -30
- synth_ai/tracing_v1/__init__.py +0 -33
- synth_ai/tracing_v3/turso/__init__.py +0 -25
- synth_ai/tracing_v3/turso/manager.py +0 -774
- synth_ai/zyk/__init__.py +0 -30
- synth_ai-0.2.9.dev5.dist-info/METADATA +0 -131
- /synth_ai/{lm → v0/lm}/caching/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/caching/constants.py +0 -0
- /synth_ai/{lm → v0/lm}/caching/dbs.py +0 -0
- /synth_ai/{lm → v0/lm}/constants.py +0 -0
- /synth_ai/{lm → v0/lm}/core/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/cost/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/cost/monitor.py +0 -0
- /synth_ai/{lm → v0/lm}/cost/statefulness.py +0 -0
- /synth_ai/{lm → v0/lm}/injection.py +0 -0
- /synth_ai/{lm → v0/lm}/provider_support/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/provider_support/suppress_logging.py +0 -0
- /synth_ai/{lm → v0/lm}/structured_outputs/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/structured_outputs/inject.py +0 -0
- /synth_ai/{lm → v0/lm}/tools/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/tools/base.py +0 -0
- /synth_ai/{lm → v0/lm}/unified_interface.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/base.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/core/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/core/synth_dev_api.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/local/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/local/ollama.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/retries.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/supported/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/warmup.py +0 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/entry_points.txt +0 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.9.dev6.dist-info}/licenses/LICENSE +0 -0
synth_ai/cli/traces.py
CHANGED
|
@@ -26,7 +26,7 @@ def register(cli):
|
|
|
26
26
|
console = Console()
|
|
27
27
|
|
|
28
28
|
async def _run():
|
|
29
|
-
from synth_ai.tracing_v3.
|
|
29
|
+
from synth_ai.tracing_v3.storage.factory import StorageConfig, create_storage
|
|
30
30
|
|
|
31
31
|
# Discover DBs under ./synth_ai.db/dbs (or override via env)
|
|
32
32
|
root = os.getenv("SYNTH_TRACES_ROOT", "./synth_ai.db/dbs")
|
|
@@ -51,13 +51,14 @@ def register(cli):
|
|
|
51
51
|
for fn in files:
|
|
52
52
|
fp = os.path.join(dp, fn)
|
|
53
53
|
import contextlib
|
|
54
|
+
|
|
54
55
|
with contextlib.suppress(OSError):
|
|
55
56
|
total += os.path.getsize(fp)
|
|
56
57
|
return total
|
|
57
58
|
|
|
58
59
|
async def db_counts(db_dir: str) -> tuple[int, dict[str, int], int, str | None, int]:
|
|
59
60
|
data_file = os.path.join(db_dir, "data")
|
|
60
|
-
mgr =
|
|
61
|
+
mgr = create_storage(StorageConfig(connection_string=f"sqlite+aiosqlite:///{data_file}"))
|
|
61
62
|
await mgr.initialize()
|
|
62
63
|
try:
|
|
63
64
|
traces_df = await mgr.query_traces("SELECT COUNT(*) AS c FROM session_traces")
|
|
@@ -73,9 +74,11 @@ def register(cli):
|
|
|
73
74
|
system_counts = (
|
|
74
75
|
{
|
|
75
76
|
str(r["system_type"] or "-"): int(r["c"] or 0)
|
|
76
|
-
for _, r in
|
|
77
|
+
for _, r in systems_df.iterrows()
|
|
77
78
|
}
|
|
78
|
-
if systems_df is not None
|
|
79
|
+
if systems_df is not None
|
|
80
|
+
and hasattr(systems_df, "iterrows")
|
|
81
|
+
and not systems_df.empty
|
|
79
82
|
else {}
|
|
80
83
|
)
|
|
81
84
|
except Exception:
|
synth_ai/cli/turso.py
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"""Utility CLI command for managing Turso sqld binaries."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import subprocess
|
|
6
|
+
|
|
7
|
+
import click
|
|
8
|
+
|
|
9
|
+
from .root import SQLD_VERSION, find_sqld_binary, install_sqld
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
def register(cli: click.Group) -> None:
|
|
13
|
+
"""Register the turso command on the main CLI group."""
|
|
14
|
+
|
|
15
|
+
cli.add_command(turso)
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _get_sqld_version(binary: str) -> str | None:
|
|
19
|
+
"""Return the version string reported by the sqld binary."""
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
result = subprocess.run(
|
|
23
|
+
[binary, "--version"],
|
|
24
|
+
capture_output=True,
|
|
25
|
+
text=True,
|
|
26
|
+
check=True,
|
|
27
|
+
timeout=5,
|
|
28
|
+
)
|
|
29
|
+
except (OSError, subprocess.CalledProcessError, ValueError):
|
|
30
|
+
return None
|
|
31
|
+
|
|
32
|
+
output = result.stdout.strip() or result.stderr.strip()
|
|
33
|
+
return output or None
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@click.command()
|
|
37
|
+
@click.option(
|
|
38
|
+
"--force",
|
|
39
|
+
is_flag=True,
|
|
40
|
+
help="Reinstall the pinned sqld build even if one is already available.",
|
|
41
|
+
)
|
|
42
|
+
def turso(force: bool) -> None:
|
|
43
|
+
"""Ensure the Turso sqld binary required for tracing v3 is installed."""
|
|
44
|
+
|
|
45
|
+
existing_path = find_sqld_binary()
|
|
46
|
+
|
|
47
|
+
if existing_path and not force:
|
|
48
|
+
version_info = _get_sqld_version(existing_path)
|
|
49
|
+
click.echo(f"✅ Turso sqld detected at {existing_path}.")
|
|
50
|
+
if version_info:
|
|
51
|
+
click.echo(f" Reported version: {version_info}")
|
|
52
|
+
if version_info and SQLD_VERSION not in version_info:
|
|
53
|
+
click.echo(
|
|
54
|
+
f"⚠️ Pinned version is {SQLD_VERSION}. Run with --force to install the supported build."
|
|
55
|
+
)
|
|
56
|
+
else:
|
|
57
|
+
click.echo("No action taken. Use --force to reinstall the pinned build.")
|
|
58
|
+
return
|
|
59
|
+
|
|
60
|
+
if existing_path and force:
|
|
61
|
+
click.echo(f"♻️ Reinstalling Turso sqld {SQLD_VERSION} (previously at {existing_path}).")
|
|
62
|
+
else:
|
|
63
|
+
click.echo(f"📦 Installing Turso sqld {SQLD_VERSION}…")
|
|
64
|
+
|
|
65
|
+
try:
|
|
66
|
+
installed_path = install_sqld()
|
|
67
|
+
except subprocess.CalledProcessError as exc: # pragma: no cover - surfaced as Click error
|
|
68
|
+
raise click.ClickException(
|
|
69
|
+
f"sqld installation failed (exit code {exc.returncode})."
|
|
70
|
+
) from exc
|
|
71
|
+
|
|
72
|
+
click.echo(f"✅ sqld installed to {installed_path}")
|
|
73
|
+
click.echo("Ensure ~/.local/bin is on your PATH before running Synth AI services.")
|
synth_ai/cli/watch.py
CHANGED
|
@@ -16,6 +16,12 @@ from rich.console import Console, Group
|
|
|
16
16
|
from rich.panel import Panel
|
|
17
17
|
from rich.table import Table
|
|
18
18
|
|
|
19
|
+
from synth_ai.tracing_v3.storage.factory import StorageConfig, create_storage
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def _open_db(db_url: str):
|
|
23
|
+
return create_storage(StorageConfig(connection_string=db_url))
|
|
24
|
+
|
|
19
25
|
|
|
20
26
|
class _State:
|
|
21
27
|
def __init__(self):
|
|
@@ -48,9 +54,7 @@ def _format_int(value: Any) -> str:
|
|
|
48
54
|
|
|
49
55
|
|
|
50
56
|
async def _fetch_experiments(db_url: str):
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
db = AsyncSQLTraceManager(db_url)
|
|
57
|
+
db = _open_db(db_url)
|
|
54
58
|
await db.initialize()
|
|
55
59
|
try:
|
|
56
60
|
df = await db.query_traces(
|
|
@@ -114,9 +118,7 @@ def _experiments_table(df, limit: int | None = None) -> Table:
|
|
|
114
118
|
|
|
115
119
|
|
|
116
120
|
async def _experiment_detail(db_url: str, experiment_id: str) -> dict[str, Any]:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
db = AsyncSQLTraceManager(db_url)
|
|
121
|
+
db = _open_db(db_url)
|
|
120
122
|
await db.initialize()
|
|
121
123
|
try:
|
|
122
124
|
exp_df = await db.query_traces(
|
|
@@ -253,9 +255,7 @@ def register(cli):
|
|
|
253
255
|
console = Console()
|
|
254
256
|
|
|
255
257
|
async def _run():
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
db = AsyncSQLTraceManager(db_url)
|
|
258
|
+
db = _open_db(db_url)
|
|
259
259
|
await db.initialize()
|
|
260
260
|
try:
|
|
261
261
|
df = await db.get_model_usage(model_name=model_name)
|
|
@@ -396,9 +396,7 @@ def _parse_hours(args: list[str]) -> float | None:
|
|
|
396
396
|
|
|
397
397
|
|
|
398
398
|
async def _usage_table(db_url: str, model_name: str | None):
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
db = AsyncSQLTraceManager(db_url)
|
|
399
|
+
db = _open_db(db_url)
|
|
402
400
|
await db.initialize()
|
|
403
401
|
try:
|
|
404
402
|
df = await db.get_model_usage(model_name=model_name)
|
|
@@ -418,9 +416,7 @@ async def _usage_table(db_url: str, model_name: str | None):
|
|
|
418
416
|
|
|
419
417
|
|
|
420
418
|
async def _traces_table(db_url: str, limit: int):
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
db = AsyncSQLTraceManager(db_url)
|
|
419
|
+
db = _open_db(db_url)
|
|
424
420
|
await db.initialize()
|
|
425
421
|
try:
|
|
426
422
|
df = await db.query_traces("SELECT * FROM session_summary ORDER BY created_at DESC")
|
|
@@ -453,10 +449,8 @@ async def _recent_table(db_url: str, hours: float, limit: int):
|
|
|
453
449
|
# Inline the recent query to avoid cross-module coupling
|
|
454
450
|
from datetime import timedelta
|
|
455
451
|
|
|
456
|
-
from synth_ai.tracing_v3.turso.manager import AsyncSQLTraceManager
|
|
457
|
-
|
|
458
452
|
start_time = datetime.now() - timedelta(hours=hours)
|
|
459
|
-
db =
|
|
453
|
+
db = _open_db(db_url)
|
|
460
454
|
await db.initialize()
|
|
461
455
|
try:
|
|
462
456
|
query = """
|
synth_ai/core/experiment.py
CHANGED
synth_ai/demo_registry.py
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import textwrap
|
|
6
|
+
from collections.abc import Callable, Iterable
|
|
6
7
|
from dataclasses import dataclass
|
|
7
8
|
from pathlib import Path
|
|
8
|
-
from typing import Callable, Iterable
|
|
9
9
|
|
|
10
10
|
REPO_ROOT = Path(__file__).resolve().parents[1]
|
|
11
11
|
|
|
@@ -85,7 +85,7 @@ DEMO_TEMPLATES: tuple[DemoTemplate, ...] = (
|
|
|
85
85
|
DemoTemplate(
|
|
86
86
|
template_id="crafter-local",
|
|
87
87
|
name="Crafter GRPO (local FastAPI)",
|
|
88
|
-
description="Lightweight wrapper around
|
|
88
|
+
description="Lightweight wrapper around examples/warming_up_to_rl/task_app/grpo_crafter for local experimentation.",
|
|
89
89
|
copy_specs=(
|
|
90
90
|
CopySpec(
|
|
91
91
|
"synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py",
|
|
@@ -103,6 +103,34 @@ DEMO_TEMPLATES: tuple[DemoTemplate, ...] = (
|
|
|
103
103
|
"synth_ai/demos/demo_task_apps/crafter/configs/crafter_fft_4b.toml",
|
|
104
104
|
"configs/crafter_fft_4b.toml",
|
|
105
105
|
),
|
|
106
|
+
CopySpec(
|
|
107
|
+
"examples/warming_up_to_rl/task_app/grpo_crafter.py",
|
|
108
|
+
"grpo_crafter.py",
|
|
109
|
+
),
|
|
110
|
+
CopySpec(
|
|
111
|
+
"examples/warming_up_to_rl/task_app/synth_envs_hosted",
|
|
112
|
+
"synth_envs_hosted",
|
|
113
|
+
),
|
|
114
|
+
CopySpec(
|
|
115
|
+
"examples/warming_up_to_rl/run_local_rollout.py",
|
|
116
|
+
"run_local_rollout.py",
|
|
117
|
+
),
|
|
118
|
+
CopySpec(
|
|
119
|
+
"examples/warming_up_to_rl/run_local_rollout_traced.py",
|
|
120
|
+
"run_local_rollout_traced.py",
|
|
121
|
+
),
|
|
122
|
+
CopySpec(
|
|
123
|
+
"examples/warming_up_to_rl/export_trace_sft.py",
|
|
124
|
+
"export_trace_sft.py",
|
|
125
|
+
),
|
|
126
|
+
CopySpec(
|
|
127
|
+
"examples/warming_up_to_rl/run_fft_and_save.py",
|
|
128
|
+
"run_fft_and_save.py",
|
|
129
|
+
),
|
|
130
|
+
CopySpec(
|
|
131
|
+
"examples/warming_up_to_rl/run_local_rollout_modal.py",
|
|
132
|
+
"run_local_rollout_modal.py",
|
|
133
|
+
),
|
|
106
134
|
),
|
|
107
135
|
default_subdir="crafter_demo",
|
|
108
136
|
env_lines=(
|
|
@@ -137,12 +165,16 @@ def _postprocess_math_modal(root: Path) -> None:
|
|
|
137
165
|
return
|
|
138
166
|
text = task_path.read_text(encoding="utf-8")
|
|
139
167
|
text = text.replace('App("hendrycks-math-task-app")', 'App("hendrycks-math-task-app-demo")')
|
|
140
|
-
text = text.replace(
|
|
168
|
+
text = text.replace(
|
|
169
|
+
'DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-secret"',
|
|
170
|
+
'DEFAULT_TASK_APP_SECRET_NAME = "hendrycks-math-task-app-demo-secret"',
|
|
171
|
+
)
|
|
141
172
|
task_path.write_text(text, encoding="utf-8")
|
|
142
173
|
|
|
143
174
|
|
|
144
|
-
CRAFT_DEMO_TEMPLATE =
|
|
145
|
-
|
|
175
|
+
CRAFT_DEMO_TEMPLATE = (
|
|
176
|
+
textwrap.dedent(
|
|
177
|
+
'''
|
|
146
178
|
"""Demo-friendly wrapper for the GRPO Crafter task app."""
|
|
147
179
|
|
|
148
180
|
from __future__ import annotations
|
|
@@ -151,7 +183,12 @@ import argparse
|
|
|
151
183
|
from pathlib import Path
|
|
152
184
|
|
|
153
185
|
from synth_ai.task.apps import ModalDeploymentConfig, registry
|
|
154
|
-
|
|
186
|
+
import sys
|
|
187
|
+
from pathlib import Path
|
|
188
|
+
_EXAMPLES_TASK_APP = Path(__file__).resolve().parents[4] / "examples" / "warming_up_to_rl" / "task_app"
|
|
189
|
+
if str(_EXAMPLES_TASK_APP) not in sys.path:
|
|
190
|
+
sys.path.insert(0, str(_EXAMPLES_TASK_APP))
|
|
191
|
+
from grpo_crafter import build_config
|
|
155
192
|
from synth_ai.task.server import TaskAppConfig, create_task_app, run_task_app
|
|
156
193
|
|
|
157
194
|
|
|
@@ -159,28 +196,6 @@ APP_ID = "grpo-crafter-demo"
|
|
|
159
196
|
BASE_APP_ID = "grpo-crafter"
|
|
160
197
|
|
|
161
198
|
|
|
162
|
-
_BASE_CONFIG = build_config()
|
|
163
|
-
TASK_APP_CONFIG = TaskAppConfig(
|
|
164
|
-
app_id="grpo-crafter-demo",
|
|
165
|
-
name=_BASE_CONFIG.name,
|
|
166
|
-
description=_BASE_CONFIG.description,
|
|
167
|
-
base_task_info=_BASE_CONFIG.base_task_info,
|
|
168
|
-
describe_taskset=_BASE_CONFIG.describe_taskset,
|
|
169
|
-
provide_task_instances=_BASE_CONFIG.provide_task_instances,
|
|
170
|
-
rollout=_BASE_CONFIG.rollout,
|
|
171
|
-
dataset_registry=_BASE_CONFIG.dataset_registry,
|
|
172
|
-
rubrics=_BASE_CONFIG.rubrics,
|
|
173
|
-
proxy=_BASE_CONFIG.proxy,
|
|
174
|
-
routers=_BASE_CONFIG.routers,
|
|
175
|
-
middleware=_BASE_CONFIG.middleware,
|
|
176
|
-
app_state=_BASE_CONFIG.app_state,
|
|
177
|
-
require_api_key=_BASE_CONFIG.require_api_key,
|
|
178
|
-
expose_debug_env=_BASE_CONFIG.expose_debug_env,
|
|
179
|
-
cors_origins=_BASE_CONFIG.cors_origins,
|
|
180
|
-
startup_hooks=_BASE_CONFIG.startup_hooks,
|
|
181
|
-
shutdown_hooks=_BASE_CONFIG.shutdown_hooks,
|
|
182
|
-
)
|
|
183
|
-
|
|
184
199
|
try:
|
|
185
200
|
_BASE_ENTRY = registry.get(BASE_APP_ID)
|
|
186
201
|
except Exception: # pragma: no cover - registry may be unavailable
|
|
@@ -213,7 +228,28 @@ ENV_FILES: tuple[str, ...] = ()
|
|
|
213
228
|
def build_task_app_config() -> TaskAppConfig:
|
|
214
229
|
"""Return a fresh TaskAppConfig for the demo wrapper."""
|
|
215
230
|
|
|
216
|
-
|
|
231
|
+
# Build config dynamically so environment variables are read at runtime
|
|
232
|
+
_base_config = build_config()
|
|
233
|
+
return TaskAppConfig(
|
|
234
|
+
app_id="grpo-crafter-demo",
|
|
235
|
+
name=_base_config.name,
|
|
236
|
+
description=_base_config.description,
|
|
237
|
+
base_task_info=_base_config.base_task_info,
|
|
238
|
+
describe_taskset=_base_config.describe_taskset,
|
|
239
|
+
provide_task_instances=_base_config.provide_task_instances,
|
|
240
|
+
rollout=_base_config.rollout,
|
|
241
|
+
dataset_registry=_base_config.dataset_registry,
|
|
242
|
+
rubrics=_base_config.rubrics,
|
|
243
|
+
proxy=_base_config.proxy,
|
|
244
|
+
routers=_base_config.routers,
|
|
245
|
+
middleware=_base_config.middleware,
|
|
246
|
+
app_state=_base_config.app_state,
|
|
247
|
+
require_api_key=_base_config.require_api_key,
|
|
248
|
+
expose_debug_env=_base_config.expose_debug_env,
|
|
249
|
+
cors_origins=_base_config.cors_origins,
|
|
250
|
+
startup_hooks=_base_config.startup_hooks,
|
|
251
|
+
shutdown_hooks=_base_config.shutdown_hooks,
|
|
252
|
+
)
|
|
217
253
|
|
|
218
254
|
|
|
219
255
|
def fastapi_app():
|
|
@@ -247,7 +283,9 @@ if __name__ == "__main__":
|
|
|
247
283
|
env_files=env_files,
|
|
248
284
|
)
|
|
249
285
|
'''
|
|
250
|
-
).strip()
|
|
286
|
+
).strip()
|
|
287
|
+
+ "\n"
|
|
288
|
+
)
|
|
251
289
|
|
|
252
290
|
|
|
253
291
|
def _postprocess_crafter_local(root: Path) -> None:
|
|
@@ -255,4 +293,3 @@ def _postprocess_crafter_local(root: Path) -> None:
|
|
|
255
293
|
if not task_path.exists():
|
|
256
294
|
return
|
|
257
295
|
task_path.write_text(CRAFT_DEMO_TEMPLATE, encoding="utf-8")
|
|
258
|
-
|