synth-ai 0.2.14__py3-none-any.whl → 0.2.17__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/README.md +1 -0
- examples/analyze_semantic_words.sh +2 -2
- examples/blog_posts/pokemon_vl/README.md +98 -0
- examples/blog_posts/pokemon_vl/configs/eval_qwen3_vl.toml +25 -0
- examples/blog_posts/pokemon_vl/configs/eval_rl_final.toml +24 -0
- examples/blog_posts/pokemon_vl/configs/filter_high_reward.toml +10 -0
- examples/blog_posts/pokemon_vl/configs/train_rl_from_sft.toml +42 -0
- examples/blog_posts/pokemon_vl/configs/train_sft_qwen4b_vl.toml +40 -0
- examples/blog_posts/warming_up_to_rl/README.md +158 -0
- examples/blog_posts/warming_up_to_rl/configs/eval_ft_qwen4b.toml +25 -0
- examples/blog_posts/warming_up_to_rl/configs/eval_groq_qwen32b.toml +25 -0
- examples/blog_posts/warming_up_to_rl/configs/eval_openai_gpt_oss_120b.toml +29 -0
- examples/blog_posts/warming_up_to_rl/configs/filter_high_reward_dataset.toml +10 -0
- examples/blog_posts/warming_up_to_rl/configs/train_rl_from_sft.toml +41 -0
- examples/blog_posts/warming_up_to_rl/configs/train_sft_qwen4b.toml +40 -0
- examples/dev/qwen3_32b_qlora_4xh100.toml +5 -0
- examples/multi_step/SFT_README.md +147 -0
- examples/multi_step/configs/crafter_rl_outcome.toml +1 -1
- examples/multi_step/configs/crafter_rl_stepwise_hosted_judge.toml +73 -115
- examples/multi_step/configs/crafter_rl_stepwise_shaped.toml +1 -1
- examples/multi_step/configs/crafter_rl_stepwise_simple.toml +1 -1
- examples/multi_step/configs/crafter_rl_stepwise_simple_NEW_FORMAT.toml +105 -0
- examples/multi_step/configs/crafter_sft_qwen30b_lora.toml +62 -0
- examples/multi_step/configs/verilog_rl_lora.toml +80 -123
- examples/multi_step/convert_traces_to_sft.py +84 -0
- examples/multi_step/run_sft_qwen30b.sh +45 -0
- examples/qwen_coder/configs/coder_lora_30b.toml +1 -2
- examples/qwen_coder/configs/coder_lora_4b.toml +5 -1
- examples/qwen_coder/configs/coder_lora_small.toml +1 -2
- examples/qwen_vl/BUGS_AND_FIXES.md +232 -0
- examples/qwen_vl/IMAGE_VALIDATION_COMPLETE.md +271 -0
- examples/qwen_vl/IMAGE_VALIDATION_SUMMARY.md +260 -0
- examples/qwen_vl/INFERENCE_SFT_TESTS.md +412 -0
- examples/qwen_vl/NEXT_STEPS_2B.md +325 -0
- examples/qwen_vl/QUICKSTART.md +327 -0
- examples/qwen_vl/QUICKSTART_RL_VISION.md +110 -0
- examples/qwen_vl/README.md +152 -0
- examples/qwen_vl/RL_VISION_COMPLETE.md +475 -0
- examples/qwen_vl/RL_VISION_TESTING.md +333 -0
- examples/qwen_vl/SDK_VISION_INTEGRATION.md +328 -0
- examples/qwen_vl/SETUP_COMPLETE.md +274 -0
- examples/qwen_vl/VISION_TESTS_COMPLETE.md +489 -0
- examples/qwen_vl/VLM_PIPELINE_COMPLETE.md +242 -0
- examples/qwen_vl/__init__.py +2 -0
- examples/qwen_vl/collect_data_via_cli.md +415 -0
- examples/qwen_vl/collect_vision_traces.py +368 -0
- examples/qwen_vl/configs/crafter_rl_vision_qwen3vl4b.toml +110 -0
- examples/qwen_vl/configs/crafter_vlm_sft_example.toml +59 -0
- examples/qwen_vl/configs/eval_gpt4o_mini_vision.toml +26 -0
- examples/qwen_vl/configs/eval_gpt4o_vision_proper.toml +29 -0
- examples/qwen_vl/configs/eval_gpt5nano_vision.toml +26 -0
- examples/qwen_vl/configs/eval_qwen3vl_vision.toml +26 -0
- examples/qwen_vl/configs/filter_qwen3vl_sft.toml +49 -0
- examples/qwen_vl/configs/filter_vision_sft.toml +52 -0
- examples/qwen_vl/configs/filter_vision_test.toml +8 -0
- examples/qwen_vl/configs/sft_qwen3_vl_2b_test.toml +54 -0
- examples/qwen_vl/crafter_gpt5nano_agent.py +308 -0
- examples/qwen_vl/crafter_qwen_vl_agent.py +300 -0
- examples/qwen_vl/run_vision_comparison.sh +61 -0
- examples/qwen_vl/run_vision_sft_pipeline.sh +175 -0
- examples/qwen_vl/test_image_validation.py +201 -0
- examples/qwen_vl/test_sft_vision_data.py +110 -0
- examples/rl/README.md +6 -6
- examples/rl/configs/eval_base_qwen.toml +17 -0
- examples/rl/configs/eval_rl_qwen.toml +13 -0
- examples/rl/configs/rl_from_base_qwen.toml +62 -0
- examples/rl/configs/rl_from_base_qwen17.toml +79 -0
- examples/rl/configs/rl_from_ft_qwen.toml +37 -0
- examples/rl/run_eval.py +436 -0
- examples/rl/run_rl_and_save.py +111 -0
- examples/rl/task_app/README.md +21 -0
- examples/rl/task_app/math_single_step.py +990 -0
- examples/rl/task_app/math_task_app.py +111 -0
- examples/run_crafter_demo.sh +2 -2
- examples/sft/README.md +6 -6
- examples/sft/configs/crafter_fft_qwen0p6b.toml +7 -2
- examples/sft/configs/crafter_lora_qwen0p6b.toml +7 -3
- examples/sft/evaluate.py +2 -4
- examples/sft/export_dataset.py +7 -4
- examples/swe/task_app/README.md +33 -3
- examples/swe/task_app/grpo_swe_mini.py +4 -1
- examples/swe/task_app/grpo_swe_mini_task_app.py +0 -12
- examples/swe/task_app/hosted/envs/crafter/react_agent.py +1 -1
- examples/swe/task_app/hosted/envs/mini_swe/environment.py +50 -23
- examples/swe/task_app/hosted/inference/openai_client.py +4 -4
- examples/swe/task_app/hosted/policy_routes.py +0 -2
- examples/swe/task_app/hosted/rollout.py +0 -8
- examples/swe/task_app/morph_backend.py +178 -0
- examples/task_apps/crafter/task_app/README.md +1 -1
- examples/task_apps/crafter/task_app/grpo_crafter.py +70 -10
- examples/task_apps/crafter/task_app/grpo_crafter_task_app.py +1 -1
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/policy.py +63 -27
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/react_agent.py +1 -2
- examples/task_apps/crafter/task_app/synth_envs_hosted/inference/openai_client.py +48 -50
- examples/task_apps/crafter/task_app/synth_envs_hosted/policy_routes.py +75 -36
- examples/task_apps/crafter/task_app/synth_envs_hosted/rollout.py +31 -15
- examples/task_apps/enron/__init__.py +1 -0
- examples/task_apps/enron/task_app/grpo_enron_task_app.py +1 -1
- examples/task_apps/math/README.md +1 -2
- examples/task_apps/pokemon_red/README.md +3 -4
- examples/task_apps/pokemon_red/eval_image_only_gpt4o.toml +6 -5
- examples/task_apps/pokemon_red/eval_pokemon_red_policy.py +1 -2
- examples/task_apps/pokemon_red/task_app.py +36 -5
- examples/task_apps/sokoban/README.md +2 -3
- examples/task_apps/verilog/eval_groq_qwen32b.toml +12 -14
- examples/task_apps/verilog/task_app/grpo_verilog_task_app.py +1 -1
- examples/vlm/README.md +3 -3
- examples/vlm/configs/crafter_vlm_gpt4o.toml +5 -0
- examples/vlm/crafter_openai_vlm_agent.py +3 -5
- examples/vlm/filter_image_rows.py +1 -1
- examples/vlm/run_crafter_vlm_benchmark.py +2 -2
- examples/warming_up_to_rl/_utils.py +92 -0
- examples/warming_up_to_rl/analyze_trace_db.py +1 -1
- examples/warming_up_to_rl/configs/crafter_fft.toml +5 -0
- examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml +2 -0
- examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml +2 -0
- examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml +2 -1
- examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +2 -1
- examples/warming_up_to_rl/configs/rl_from_ft.toml +2 -0
- examples/warming_up_to_rl/export_trace_sft.py +174 -60
- examples/warming_up_to_rl/readme.md +63 -132
- examples/warming_up_to_rl/run_fft_and_save.py +1 -1
- examples/warming_up_to_rl/run_local_rollout_traced.py +1 -1
- examples/warming_up_to_rl/run_rl_and_save.py +1 -1
- examples/warming_up_to_rl/task_app/README.md +42 -0
- examples/warming_up_to_rl/task_app/grpo_crafter.py +827 -0
- examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py +135 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/README.md +173 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py +5 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py +143 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py +1226 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/__init__.py +1 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/__init__.py +6 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/app.py +1 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/environment.py +522 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/policy.py +454 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py +108 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py +305 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py +47 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py +204 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py +5 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +618 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py +100 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +1084 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py +195 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +1861 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py +5 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py +211 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py +161 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py +137 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py +62 -0
- examples/workflows/math_rl/configs/rl_from_base_qwen.toml +27 -0
- examples/workflows/math_rl/configs/rl_from_base_qwen17.toml +5 -0
- synth_ai/__init__.py +44 -30
- synth_ai/_utils/__init__.py +47 -0
- synth_ai/_utils/base_url.py +10 -0
- synth_ai/_utils/http.py +10 -0
- synth_ai/_utils/prompts.py +10 -0
- synth_ai/_utils/task_app_state.py +12 -0
- synth_ai/_utils/user_config.py +10 -0
- synth_ai/api/models/supported.py +144 -7
- synth_ai/api/train/__init__.py +13 -1
- synth_ai/api/train/builders.py +9 -3
- synth_ai/api/train/cli.py +155 -17
- synth_ai/api/train/config_finder.py +18 -11
- synth_ai/api/train/configs/__init__.py +8 -1
- synth_ai/api/train/configs/rl.py +32 -7
- synth_ai/api/train/configs/sft.py +6 -2
- synth_ai/api/train/configs/shared.py +59 -2
- synth_ai/api/train/env_resolver.py +13 -10
- synth_ai/auth/credentials.py +119 -0
- synth_ai/cli/__init__.py +61 -69
- synth_ai/cli/_modal_wrapper.py +7 -5
- synth_ai/cli/_typer_patch.py +0 -2
- synth_ai/cli/_validate_task_app.py +22 -4
- synth_ai/cli/commands/__init__.py +17 -0
- synth_ai/cli/commands/demo/__init__.py +6 -0
- synth_ai/cli/commands/demo/core.py +163 -0
- synth_ai/cli/commands/deploy/__init__.py +23 -0
- synth_ai/cli/commands/deploy/core.py +614 -0
- synth_ai/cli/commands/deploy/errors.py +72 -0
- synth_ai/cli/commands/deploy/validation.py +11 -0
- synth_ai/cli/commands/eval/__init__.py +19 -0
- synth_ai/cli/commands/eval/core.py +1109 -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 +388 -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 +177 -0
- synth_ai/cli/commands/help/core.py +73 -0
- synth_ai/cli/commands/status/__init__.py +64 -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/runs.py +81 -0
- synth_ai/cli/commands/status/subcommands/summary.py +47 -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 +21 -0
- synth_ai/cli/commands/train/errors.py +117 -0
- synth_ai/cli/commands/train/judge_schemas.py +199 -0
- synth_ai/cli/commands/train/judge_validation.py +304 -0
- synth_ai/cli/commands/train/validation.py +443 -0
- synth_ai/cli/demo.py +2 -162
- synth_ai/cli/deploy/__init__.py +28 -0
- synth_ai/cli/deploy/core.py +5 -0
- synth_ai/cli/deploy/errors.py +23 -0
- synth_ai/cli/deploy/validation.py +5 -0
- synth_ai/cli/eval/__init__.py +36 -0
- synth_ai/cli/eval/core.py +5 -0
- synth_ai/cli/eval/errors.py +31 -0
- synth_ai/cli/eval/validation.py +5 -0
- synth_ai/cli/filter/__init__.py +28 -0
- synth_ai/cli/filter/core.py +5 -0
- synth_ai/cli/filter/errors.py +23 -0
- synth_ai/cli/filter/validation.py +5 -0
- synth_ai/cli/legacy_root_backup.py +3 -1
- synth_ai/cli/lib/__init__.py +10 -0
- synth_ai/cli/lib/task_app_discovery.py +7 -0
- synth_ai/cli/lib/task_app_env.py +518 -0
- synth_ai/cli/modal_serve/__init__.py +12 -0
- synth_ai/cli/modal_serve/core.py +14 -0
- synth_ai/cli/modal_serve/errors.py +8 -0
- synth_ai/cli/modal_serve/validation.py +11 -0
- synth_ai/cli/recent.py +2 -1
- synth_ai/cli/serve/__init__.py +12 -0
- synth_ai/cli/serve/core.py +14 -0
- synth_ai/cli/serve/errors.py +8 -0
- synth_ai/cli/serve/validation.py +11 -0
- synth_ai/cli/setup.py +21 -0
- synth_ai/cli/status.py +7 -126
- synth_ai/cli/task_app_deploy.py +7 -0
- synth_ai/cli/task_app_list.py +25 -0
- synth_ai/cli/task_app_modal_serve.py +11 -0
- synth_ai/cli/task_app_serve.py +11 -0
- synth_ai/cli/task_apps.py +110 -1499
- synth_ai/cli/traces.py +1 -1
- synth_ai/cli/train/__init__.py +12 -0
- synth_ai/cli/train/core.py +21 -0
- synth_ai/cli/train/errors.py +8 -0
- synth_ai/cli/train/validation.py +24 -0
- synth_ai/cli/train.py +5 -0
- synth_ai/cli/turso.py +1 -1
- synth_ai/cli/watch.py +1 -1
- synth_ai/demos/__init__.py +10 -0
- synth_ai/demos/core/__init__.py +28 -1
- synth_ai/demos/crafter/__init__.py +1 -0
- synth_ai/demos/crafter/crafter_fft_4b.toml +55 -0
- synth_ai/demos/crafter/grpo_crafter_task_app.py +185 -0
- synth_ai/demos/crafter/rl_from_base_qwen4b.toml +74 -0
- synth_ai/demos/demo_registry.py +176 -0
- synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +1 -1
- synth_ai/demos/math/__init__.py +1 -0
- synth_ai/demos/math/_common.py +16 -0
- synth_ai/demos/math/app.py +38 -0
- synth_ai/demos/math/config.toml +76 -0
- synth_ai/demos/math/deploy_modal.py +54 -0
- synth_ai/demos/math/modal_task_app.py +702 -0
- synth_ai/demos/math/task_app_entry.py +51 -0
- synth_ai/environments/environment/core.py +7 -1
- synth_ai/environments/examples/bandit/engine.py +0 -1
- synth_ai/environments/examples/bandit/environment.py +0 -1
- synth_ai/environments/examples/red/engine.py +33 -12
- synth_ai/environments/examples/red/engine_helpers/reward_components.py +151 -179
- synth_ai/environments/examples/red/environment.py +26 -0
- synth_ai/environments/examples/red/trace_hooks_v3.py +168 -0
- synth_ai/environments/examples/wordle/environment.py +0 -1
- synth_ai/evals/base.py +16 -5
- synth_ai/evals/client.py +1 -1
- synth_ai/http.py +8 -22
- synth_ai/inference/client.py +1 -1
- synth_ai/judge_schemas.py +4 -5
- synth_ai/learning/client.py +1 -1
- synth_ai/learning/health.py +1 -1
- synth_ai/learning/jobs.py +1 -1
- synth_ai/learning/rl/client.py +4 -2
- synth_ai/learning/rl/env_keys.py +1 -1
- synth_ai/learning/rl/secrets.py +1 -1
- synth_ai/learning/sft/client.py +1 -1
- synth_ai/learning/sft/data.py +407 -4
- synth_ai/learning/validators.py +4 -1
- synth_ai/streaming/__init__.py +29 -0
- synth_ai/streaming/config.py +94 -0
- synth_ai/streaming/handlers.py +469 -0
- synth_ai/streaming/streamer.py +301 -0
- synth_ai/streaming/types.py +95 -0
- synth_ai/task/apps/__init__.py +4 -2
- synth_ai/task/config.py +6 -4
- synth_ai/task/rubrics/__init__.py +1 -2
- synth_ai/task/rubrics/loaders.py +14 -10
- synth_ai/task/rubrics.py +219 -0
- synth_ai/task/trace_correlation_helpers.py +24 -11
- synth_ai/task/tracing_utils.py +14 -3
- synth_ai/task/validators.py +0 -1
- synth_ai/tracing_v3/abstractions.py +3 -3
- synth_ai/tracing_v3/config.py +15 -13
- synth_ai/tracing_v3/constants.py +21 -0
- synth_ai/tracing_v3/db_config.py +3 -1
- synth_ai/tracing_v3/decorators.py +10 -7
- synth_ai/tracing_v3/llm_call_record_helpers.py +5 -5
- synth_ai/tracing_v3/migration_helper.py +1 -2
- synth_ai/tracing_v3/session_tracer.py +7 -7
- synth_ai/tracing_v3/storage/base.py +29 -29
- synth_ai/tracing_v3/storage/config.py +3 -3
- synth_ai/tracing_v3/turso/daemon.py +8 -9
- synth_ai/tracing_v3/turso/native_manager.py +80 -72
- synth_ai/tracing_v3/utils.py +2 -2
- synth_ai/utils/__init__.py +101 -0
- synth_ai/utils/base_url.py +94 -0
- synth_ai/utils/cli.py +131 -0
- synth_ai/utils/env.py +294 -0
- synth_ai/utils/http.py +172 -0
- synth_ai/utils/modal.py +308 -0
- synth_ai/utils/process.py +212 -0
- synth_ai/utils/prompts.py +39 -0
- synth_ai/utils/sqld.py +122 -0
- synth_ai/utils/task_app_discovery.py +882 -0
- synth_ai/utils/task_app_env.py +186 -0
- synth_ai/utils/task_app_state.py +318 -0
- synth_ai/utils/user_config.py +137 -0
- synth_ai/v0/config/__init__.py +1 -5
- synth_ai/v0/config/base_url.py +1 -7
- synth_ai/v0/tracing/config.py +1 -1
- synth_ai/v0/tracing/decorators.py +1 -1
- synth_ai/v0/tracing/upload.py +1 -1
- synth_ai/v0/tracing_v1/config.py +1 -1
- synth_ai/v0/tracing_v1/decorators.py +1 -1
- synth_ai/v0/tracing_v1/upload.py +1 -1
- {synth_ai-0.2.14.dist-info → synth_ai-0.2.17.dist-info}/METADATA +91 -32
- {synth_ai-0.2.14.dist-info → synth_ai-0.2.17.dist-info}/RECORD +341 -154
- synth_ai/cli/man.py +0 -106
- synth_ai/cli/tui.py +0 -57
- synth_ai/compound/cais.py +0 -0
- synth_ai/core/experiment.py +0 -13
- synth_ai/core/system.py +0 -15
- synth_ai/demo_registry.py +0 -295
- synth_ai/handshake.py +0 -109
- synth_ai/tui/__init__.py +0 -5
- synth_ai/tui/__main__.py +0 -13
- synth_ai/tui/cli/__init__.py +0 -1
- synth_ai/tui/cli/query_experiments.py +0 -164
- synth_ai/tui/cli/query_experiments_v3.py +0 -164
- synth_ai/tui/dashboard.py +0 -906
- {synth_ai-0.2.14.dist-info → synth_ai-0.2.17.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.14.dist-info → synth_ai-0.2.17.dist-info}/entry_points.txt +0 -0
- {synth_ai-0.2.14.dist-info → synth_ai-0.2.17.dist-info}/licenses/LICENSE +0 -0
- {synth_ai-0.2.14.dist-info → synth_ai-0.2.17.dist-info}/top_level.txt +0 -0
|
@@ -1,179 +1,110 @@
|
|
|
1
1
|
# Warming Up to RL (Crafter)
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
## Quick Reference Commands
|
|
6
|
-
|
|
7
|
-
- Serve task app locally with tracing:
|
|
8
|
-
```bash
|
|
9
|
-
uvx synth-ai serve --port 8001 --env-file examples/warming_up_to_rl/.env --trace traces/v3
|
|
10
|
-
```
|
|
11
|
-
- Deploy to Modal:
|
|
12
|
-
```bash
|
|
13
|
-
uvx synth-ai deploy grpo-crafter --name grpo-crafter-task-app
|
|
14
|
-
```
|
|
15
|
-
- Groq rollout (server-side):
|
|
16
|
-
```bash
|
|
17
|
-
uv run python examples/warming_up_to_rl/run_eval.py --toml examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml --use-rollout
|
|
18
|
-
```
|
|
19
|
-
- Export SFT data from traced runs:
|
|
20
|
-
```bash
|
|
21
|
-
python examples/warming_up_to_rl/export_trace_sft.py --db traces/v3/synth_ai.db --output ft_data/crafter_traces.jsonl
|
|
22
|
-
```
|
|
23
|
-
- FFT via CLI:
|
|
24
|
-
```bash
|
|
25
|
-
uvx synth-ai train --type sft --config examples/warming_up_to_rl/configs/crafter_fft.toml --dataset /absolute/path/to/data.jsonl
|
|
26
|
-
```
|
|
27
|
-
- Evaluate FFT checkpoint:
|
|
28
|
-
```bash
|
|
29
|
-
uv run python examples/warming_up_to_rl/run_eval.py --toml examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml --use-rollout
|
|
30
|
-
```
|
|
31
|
-
- RL via CLI (FFT-first):
|
|
32
|
-
```bash
|
|
33
|
-
uvx synth-ai train --type rl --config examples/warming_up_to_rl/configs/rl_from_ft.toml
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
---
|
|
3
|
+
This folder contains an end-to-end Crafter workflow: stand up the task app, collect Groq-powered rollouts, export tracing data for supervised fine-tuning, run FFT/RL jobs, and evaluate checkpoints. Commands assume the repository root as the working directory unless stated otherwise.
|
|
37
4
|
|
|
38
5
|
## 1. Prerequisites
|
|
39
6
|
|
|
40
7
|
- Python 3.11+
|
|
41
|
-
- `uv
|
|
42
|
-
- Modal CLI (`modal token new`) if you plan to deploy the task app
|
|
43
|
-
-
|
|
44
|
-
- `SYNTH_API_KEY`
|
|
45
|
-
- `
|
|
46
|
-
|
|
47
|
-
- Optional: `GROQ_API_KEY`, `OPENAI_API_KEY` for proxy endpoints
|
|
48
|
-
|
|
49
|
-
`uvx synth-ai setup` can populate the `.env` by guiding you through the dashboard handshake.
|
|
8
|
+
- [`uv`](https://docs.astral.sh/uv/) / `uvx` (or install `synth-ai` inside a virtualenv)
|
|
9
|
+
- Modal CLI (`modal token new`) if you plan to deploy the task app remotely
|
|
10
|
+
- API keys:
|
|
11
|
+
- `SYNTH_API_KEY` and `ENVIRONMENT_API_KEY` are required for CLI flows
|
|
12
|
+
- `GROQ_API_KEY` (used by the Groq policy) and optional `OPENAI_API_KEY`
|
|
13
|
+
- Run `uvx synth-ai setup` once to pair with the Synth dashboard and populate `~/.synth-ai/user_config.json`
|
|
50
14
|
|
|
51
|
-
|
|
15
|
+
## 2. Task App
|
|
52
16
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
### Local development
|
|
17
|
+
### Local serve (FastAPI)
|
|
56
18
|
|
|
57
19
|
```bash
|
|
58
|
-
uvx synth-ai serve
|
|
20
|
+
uvx synth-ai serve \
|
|
21
|
+
--env-file examples/warming_up_to_rl/.env \
|
|
22
|
+
--host 127.0.0.1 --port 8001 \
|
|
23
|
+
--trace traces/v3
|
|
59
24
|
```
|
|
60
25
|
|
|
61
|
-
- `--trace`
|
|
62
|
-
- Add `--
|
|
26
|
+
- `--trace` creates/uses `traces/v3/task_app_traces_<timestamp>.db` for the lifetime of the server. All rollouts append to this file.
|
|
27
|
+
- Add `--trace-db` to override the SQLite path (one DB per server instance).
|
|
28
|
+
- Pass `--reload` during development for auto-reload.
|
|
63
29
|
|
|
64
30
|
### Modal deploy / serve
|
|
65
31
|
|
|
66
32
|
```bash
|
|
67
|
-
uvx synth-ai deploy grpo-crafter --name grpo-crafter-task-app
|
|
68
|
-
uvx synth-ai modal-serve grpo-crafter --name grpo-crafter-task-app
|
|
33
|
+
uvx synth-ai deploy grpo-crafter --name grpo-crafter-task-app
|
|
34
|
+
uvx synth-ai modal-serve grpo-crafter --name grpo-crafter-task-app
|
|
69
35
|
```
|
|
70
36
|
|
|
71
|
-
Both commands
|
|
72
|
-
|
|
73
|
-
## 3.
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
- Groq Qwen3-32B:
|
|
78
|
-
```bash
|
|
79
|
-
uv run python examples/warming_up_to_rl/run_eval.py --toml examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml --use-rollout
|
|
80
|
-
```
|
|
81
|
-
- Synth vLLM Qwen3-4B (Modal-hosted inference URL specified in TOML):
|
|
82
|
-
```bash
|
|
83
|
-
uv run python examples/warming_up_to_rl/run_eval.py --toml examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml --use-rollout
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
`--use-rollout` drives the task app’s `/rollout` endpoint so achievements and metrics are captured. Without it the script issues per-step `initialize/step/terminate` calls.
|
|
87
|
-
|
|
88
|
-
## 4. Tracing and SFT Dataset Export
|
|
89
|
-
|
|
90
|
-
1. Serve the task app with tracing enabled (see Section 2). Optionally, run the traced rollout helper against the running server:
|
|
91
|
-
```bash
|
|
92
|
-
uv run python examples/warming_up_to_rl/run_local_rollout_traced.py \
|
|
93
|
-
--base-url http://localhost:8001 \
|
|
94
|
-
--api-key "$ENVIRONMENT_API_KEY" \
|
|
95
|
-
--inference-api-key "$GROQ_API_KEY" \
|
|
96
|
-
--model qwen/qwen3-32b \
|
|
97
|
-
--inference-url https://api.groq.com/openai \
|
|
98
|
-
--max-llm-calls 3 \
|
|
99
|
-
--run-id local-trace
|
|
100
|
-
```
|
|
101
|
-
2. Inspect local trace databases:
|
|
102
|
-
```bash
|
|
103
|
-
uvx synth-ai traces --limit 10
|
|
104
|
-
```
|
|
105
|
-
3. Export JSONL suitable for SFT:
|
|
106
|
-
```bash
|
|
107
|
-
python examples/warming_up_to_rl/export_trace_sft.py \
|
|
108
|
-
--db traces/v3/synth_ai.db \
|
|
109
|
-
--min-achievements 3 \
|
|
110
|
-
--output ft_data/crafter_traces.jsonl
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
The exporter enriches each example with achievements unlocked, model metadata, and reward summaries.
|
|
114
|
-
|
|
115
|
-
## 5. SFT / FFT Training
|
|
116
|
-
|
|
117
|
-
### Preferred: `uvx synth-ai train`
|
|
37
|
+
Both commands reuse the same tracing defaults; the backend persists rollouts into the configured SQLite/Turso store.
|
|
38
|
+
|
|
39
|
+
## 3. Collect rollouts
|
|
40
|
+
|
|
41
|
+
Hit the running task app with the local helper to gather a traced rollout (Groq policy shown below):
|
|
118
42
|
|
|
119
43
|
```bash
|
|
120
|
-
|
|
121
|
-
--
|
|
122
|
-
--
|
|
123
|
-
--
|
|
44
|
+
python examples/warming_up_to_rl/run_local_rollout_traced.py \
|
|
45
|
+
--base-url http://localhost:8001 \
|
|
46
|
+
--api-key "$ENVIRONMENT_API_KEY" \
|
|
47
|
+
--inference-api-key "$GROQ_API_KEY" \
|
|
48
|
+
--model qwen/qwen3-32b \
|
|
49
|
+
--inference-url https://api.groq.com/openai \
|
|
50
|
+
--max-llm-calls 3 \
|
|
51
|
+
--run-id local-trace
|
|
124
52
|
```
|
|
125
53
|
|
|
126
|
-
|
|
127
|
-
-
|
|
128
|
-
-
|
|
129
|
-
- Submit the job and poll until completion unless `--no-poll` is set.
|
|
54
|
+
Artifacts produced per rollout:
|
|
55
|
+
- `traces/v3/task_app_traces_<timestamp>.db`: the task app’s append-only database (one per server lifetime; new rollouts append rows).
|
|
56
|
+
- `local-trace_trace.json`: single-run JSON snapshot for inspection.
|
|
130
57
|
|
|
131
|
-
|
|
58
|
+
## 4. Export SFT-ready data
|
|
132
59
|
|
|
133
60
|
```bash
|
|
134
|
-
|
|
135
|
-
--toml examples/warming_up_to_rl/configs/crafter_fft.toml \
|
|
136
|
-
--data /absolute/path/to/crafter_traces.jsonl \
|
|
137
|
-
--poll-seconds 1800
|
|
61
|
+
python examples/warming_up_to_rl/export_trace_sft.py
|
|
138
62
|
```
|
|
139
63
|
|
|
140
|
-
|
|
64
|
+
- When run without `--in`, the script lists every `task_app_traces*.db` under the current directory (and subdirectories), sorted by recency, and prompts you to pick one (the newest is marked `← most recent`).
|
|
65
|
+
- The exporter validates the trace data, filters sessions, and writes JSONL to `ft_data/crafter_sft.jsonl` by default (override with `--out`).
|
|
141
66
|
|
|
142
|
-
##
|
|
67
|
+
## 5. FFT / SFT Training
|
|
143
68
|
|
|
144
|
-
|
|
69
|
+
Recommended via CLI:
|
|
145
70
|
|
|
146
71
|
```bash
|
|
147
|
-
|
|
72
|
+
uvx synth-ai train \
|
|
73
|
+
--type sft \
|
|
74
|
+
--config examples/warming_up_to_rl/configs/crafter_fft.toml \
|
|
75
|
+
--dataset /absolute/path/to/crafter_sft.jsonl
|
|
148
76
|
```
|
|
149
77
|
|
|
150
|
-
|
|
78
|
+
The CLI uploads training data, submits the job to the Synth backend, and polls for completion. A legacy helper (`run_fft_and_save.py`) is still provided for ad-hoc usage.
|
|
151
79
|
|
|
152
|
-
##
|
|
80
|
+
## 6. Evaluate checkpoints
|
|
153
81
|
|
|
154
|
-
|
|
82
|
+
Update the relevant TOML with the model identifier (e.g., `model = "ft:<model_id>"`) and run:
|
|
155
83
|
|
|
156
84
|
```bash
|
|
157
|
-
|
|
158
|
-
--
|
|
159
|
-
--
|
|
85
|
+
uv run python examples/warming_up_to_rl/run_eval.py \
|
|
86
|
+
--toml examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml \
|
|
87
|
+
--use-rollout
|
|
160
88
|
```
|
|
161
89
|
|
|
162
|
-
|
|
90
|
+
`--use-rollout` exercises the `/rollout` endpoint so achievements/rewards are surfaced in traces.
|
|
163
91
|
|
|
164
|
-
|
|
92
|
+
## 7. RL Training
|
|
165
93
|
|
|
166
94
|
```bash
|
|
167
|
-
|
|
168
|
-
--
|
|
95
|
+
uvx synth-ai train \
|
|
96
|
+
--type rl \
|
|
97
|
+
--config examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml
|
|
169
98
|
```
|
|
170
99
|
|
|
171
|
-
|
|
100
|
+
Start from `rl_from_ft.toml` if you want to bootstrap from a previously fine-tuned checkpoint.
|
|
101
|
+
|
|
102
|
+
---
|
|
172
103
|
|
|
173
|
-
|
|
104
|
+
### Notes on tracing
|
|
174
105
|
|
|
175
|
-
- `
|
|
176
|
-
- `
|
|
177
|
-
- `
|
|
106
|
+
- **One SQLite DB per server:** every task app instance maintains a single `task_app_traces_<timestamp>.db` and appends each new rollout. If you want a fresh file, start another `synth-ai serve` with a different `--trace-db` path.
|
|
107
|
+
- **JSON snapshots per run:** `run_local_rollout_traced.py` writes `<run_id>_trace.json` so you can inspect or hand-edit individual runs.
|
|
108
|
+
- **Exporter discovery:** the SFT exporter recursively catalogs all `task_app_traces*.db` files beneath the task app directory, allowing you to select any historical snapshot when exporting training data.
|
|
178
109
|
|
|
179
|
-
|
|
110
|
+
These conventions keep tracing predictable: continuous history per server, easy selection of historical DBs, and one-off JSON exports for quick analysis.
|
|
@@ -448,7 +448,7 @@ async def main() -> None:
|
|
|
448
448
|
|
|
449
449
|
print(f"Ops executed: {ops}")
|
|
450
450
|
print(
|
|
451
|
-
"Tip: export TASKAPP_TRACING_ENABLED=1 and optionally TASKAPP_SFT_OUTPUT_DIR before running `uvx synth-ai
|
|
451
|
+
"Tip: export TASKAPP_TRACING_ENABLED=1 and optionally TASKAPP_SFT_OUTPUT_DIR before running `uvx synth-ai deploy --runtime uvicorn …` to persist traces/SFT."
|
|
452
452
|
)
|
|
453
453
|
except httpx.HTTPStatusError as exc:
|
|
454
454
|
detail = (
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# Crafter Task App
|
|
2
|
+
|
|
3
|
+
This example is now wired through the shared Synth task-app harness. Use the
|
|
4
|
+
`uvx synth-ai` CLI to run it locally or deploy it to Modal without touching the
|
|
5
|
+
underlying FastAPI plumbing.
|
|
6
|
+
|
|
7
|
+
## Local development
|
|
8
|
+
```bash
|
|
9
|
+
uvx synth-ai deploy --runtime uvicorn grpo-crafter --port 8001
|
|
10
|
+
# Optional extras:
|
|
11
|
+
# --env-file path/to/.env # load additional environment variables
|
|
12
|
+
# --reload # enable uvicorn auto-reload
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Useful endpoints while the server is running:
|
|
16
|
+
- `GET http://localhost:8001/health`
|
|
17
|
+
- `GET http://localhost:8001/info`
|
|
18
|
+
- `GET http://localhost:8001/task_info?seed=42`
|
|
19
|
+
- `POST http://localhost:8001/rollout`
|
|
20
|
+
|
|
21
|
+
## Deploy to Modal
|
|
22
|
+
```bash
|
|
23
|
+
uvx synth-ai deploy grpo-crafter --name grpo-crafter-task-app
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Requirements:
|
|
27
|
+
- Modal CLI installed and authenticated (`modal token new`).
|
|
28
|
+
- Either provide an `.env` with `ENVIRONMENT_API_KEY`, `GROQ_API_KEY`, and `OPENAI_API_KEY`
|
|
29
|
+
(recommended; pass via `--env-file`). The deploy command injects these values via an inline
|
|
30
|
+
Modal secret plus `Secret.from_dotenv`, so the minted environment key stays in sync with
|
|
31
|
+
what the CLI sends.
|
|
32
|
+
- Or ensure Modal secrets `groq-api-key` and `openai-api-key` exist and continue to supply
|
|
33
|
+
model vendor credentials that way.
|
|
34
|
+
|
|
35
|
+
The CLI generates a Modal entrypoint on the fly using the shared
|
|
36
|
+
`TaskAppConfig`, ensuring the container matches the local FastAPI behavior.
|
|
37
|
+
|
|
38
|
+
## Compatibility note
|
|
39
|
+
`examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py` remains as a
|
|
40
|
+
legacy wrapper exposing `fastapi_app()` and a `__main__` entrypoint. Behind the
|
|
41
|
+
scenes it proxies to the shared configuration; prefer the CLI workflow above
|
|
42
|
+
for new automation and tests.
|