synth-ai 0.2.9.dev0__py3-none-any.whl → 0.2.23.dev3__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.
- examples/README.md +1 -0
- examples/__init__.py +16 -0
- examples/analyze_semantic_words.sh +17 -0
- examples/baseline/banking77_baseline.py +243 -0
- examples/baseline/banking77_pipeline_baseline.py +294 -0
- examples/baseline/crafter_baseline.py +407 -0
- examples/baseline/pokemon_red_baseline.py +326 -0
- examples/baseline/simple_baseline.py +56 -0
- examples/baseline/warming_up_to_rl_baseline.py +239 -0
- examples/blog_posts/gepa/README.md +355 -0
- examples/blog_posts/gepa/configs/banking77_gepa_local.toml +95 -0
- examples/blog_posts/gepa/configs/banking77_gepa_test.toml +80 -0
- examples/blog_posts/gepa/configs/banking77_mipro_local.toml +50 -0
- examples/blog_posts/gepa/configs/banking77_pipeline_gepa_local.toml +101 -0
- examples/blog_posts/gepa/configs/banking77_pipeline_gepa_test.toml +96 -0
- examples/blog_posts/gepa/configs/hotpotqa_gepa_local.toml +57 -0
- examples/blog_posts/gepa/configs/hotpotqa_gepa_qwen.toml +35 -0
- examples/blog_posts/gepa/configs/hotpotqa_mipro_local.toml +51 -0
- examples/blog_posts/gepa/configs/hover_gepa_local.toml +57 -0
- examples/blog_posts/gepa/configs/hover_gepa_qwen.toml +35 -0
- examples/blog_posts/gepa/configs/hover_mipro_local.toml +51 -0
- examples/blog_posts/gepa/configs/ifbench_gepa_local.toml +57 -0
- examples/blog_posts/gepa/configs/ifbench_gepa_qwen.toml +35 -0
- examples/blog_posts/gepa/configs/ifbench_mipro_local.toml +51 -0
- examples/blog_posts/gepa/configs/pupa_gepa_local.toml +58 -0
- examples/blog_posts/gepa/configs/pupa_mipro_local.toml +52 -0
- examples/blog_posts/gepa/deploy_banking77_task_app.sh +54 -0
- examples/blog_posts/gepa/gepa_baseline.py +204 -0
- examples/blog_posts/gepa/query_prompts_example.py +97 -0
- examples/blog_posts/gepa/run_gepa_banking77.sh +112 -0
- examples/blog_posts/gepa/run_gepa_banking77_pipeline.sh +163 -0
- examples/blog_posts/gepa/task_apps.py +105 -0
- examples/blog_posts/gepa/test_gepa_local.sh +67 -0
- examples/blog_posts/gepa/verify_banking77_setup.sh +123 -0
- examples/blog_posts/mipro/README.md +415 -0
- examples/blog_posts/mipro/configs/banking77_mipro_local.toml +91 -0
- examples/blog_posts/mipro/configs/banking77_mipro_test.toml +87 -0
- examples/blog_posts/mipro/configs/banking77_pipeline_mipro_gemini_flash_lite_local.toml +98 -0
- examples/blog_posts/mipro/configs/banking77_pipeline_mipro_gpt41mini_local.toml +96 -0
- examples/blog_posts/mipro/configs/banking77_pipeline_mipro_local.toml +94 -0
- examples/blog_posts/mipro/configs/banking77_pipeline_mipro_test.toml +170 -0
- examples/blog_posts/mipro/deploy_banking77_pipeline_task_app.sh +59 -0
- examples/blog_posts/mipro/deploy_banking77_task_app.sh +41 -0
- examples/blog_posts/mipro/multi_step.md +79 -0
- examples/blog_posts/mipro/run_mipro_banking77.sh +191 -0
- examples/blog_posts/mipro/run_mipro_banking77_pipeline.sh +171 -0
- examples/blog_posts/mipro/run_mipro_banking77_pipeline_gemini_flash_lite.sh +177 -0
- examples/blog_posts/mipro/run_mipro_banking77_pipeline_gpt41mini.sh +173 -0
- examples/blog_posts/mipro/verify_banking77_setup.sh +117 -0
- examples/blog_posts/pokemon_vl/README.md +98 -0
- examples/blog_posts/pokemon_vl/configs/eval_gpt5nano.toml +26 -0
- examples/blog_posts/pokemon_vl/configs/eval_qwen3_vl.toml +27 -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 +43 -0
- examples/blog_posts/pokemon_vl/configs/train_sft_qwen4b_vl.toml +40 -0
- examples/blog_posts/pokemon_vl/extract_images.py +239 -0
- examples/blog_posts/pokemon_vl/pokemon_vl_baseline.py +326 -0
- examples/blog_posts/pokemon_vl/run_eval_extract_images.py +209 -0
- examples/blog_posts/pokemon_vl/run_qwen_eval_extract_images.py +212 -0
- examples/blog_posts/pokemon_vl/text_box_analysis.md +106 -0
- examples/blog_posts/warming_up_to_rl/ARCHITECTURE.md +195 -0
- examples/blog_posts/warming_up_to_rl/FINAL_TEST_RESULTS.md +127 -0
- examples/blog_posts/warming_up_to_rl/INFERENCE_SUCCESS.md +132 -0
- examples/blog_posts/warming_up_to_rl/README.md +158 -0
- examples/blog_posts/warming_up_to_rl/SMOKE_TESTING.md +164 -0
- examples/blog_posts/warming_up_to_rl/SMOKE_TEST_COMPLETE.md +253 -0
- examples/blog_posts/warming_up_to_rl/configs/eval_baseline_qwen32b_10x20.toml +25 -0
- examples/blog_posts/warming_up_to_rl/configs/eval_ft_qwen4b.toml +25 -0
- examples/blog_posts/warming_up_to_rl/configs/eval_ft_qwen4b_10x20.toml +26 -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/smoke_test.toml +75 -0
- examples/blog_posts/warming_up_to_rl/configs/train_rl_from_sft.toml +91 -0
- examples/blog_posts/warming_up_to_rl/configs/train_sft_qwen4b.toml +40 -0
- examples/blog_posts/warming_up_to_rl/warming_up_to_rl_baseline.py +187 -0
- examples/crafter_debug_render.py +186 -0
- examples/dev/qwen3_32b_qlora_4xh100.toml +45 -0
- examples/gepa/banking77_pipeline_gepa.toml +96 -0
- examples/gepa/multi_stage_gepa_example.toml +84 -0
- examples/gepa/run_gepa_banking77_pipeline.sh +157 -0
- examples/multi_step/SFT_README.md +147 -0
- examples/multi_step/configs/README_verilog_rl.md +77 -0
- examples/multi_step/configs/VERILOG_REWARDS.md +103 -0
- examples/multi_step/configs/VERILOG_RL_CHECKLIST.md +196 -0
- examples/multi_step/configs/crafter_eval_synth_qwen4b.toml +35 -0
- examples/multi_step/configs/crafter_eval_text_only_groq_qwen32b.toml +36 -0
- examples/multi_step/configs/crafter_rl_outcome.toml +75 -0
- examples/multi_step/configs/crafter_rl_stepwise_hosted_judge.toml +145 -0
- examples/multi_step/configs/crafter_rl_stepwise_shaped.toml +84 -0
- examples/multi_step/configs/crafter_rl_stepwise_simple.toml +79 -0
- 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/crafter_synth_backend.md +40 -0
- examples/multi_step/configs/verilog_eval_groq_qwen32b.toml +31 -0
- examples/multi_step/configs/verilog_eval_synth_qwen8b.toml +33 -0
- examples/multi_step/configs/verilog_rl_lora.toml +147 -0
- examples/multi_step/convert_traces_to_sft.py +84 -0
- examples/multi_step/crafter_rl_lora.md +70 -0
- examples/multi_step/judges/crafter_backend_judge.py +220 -0
- examples/multi_step/judges/verilog_backend_judge.py +234 -0
- examples/multi_step/readme.md +48 -0
- examples/multi_step/run_sft_qwen30b.sh +45 -0
- examples/multi_step/sse_metrics_streaming_notes.md +357 -0
- examples/multi_step/task_app_config_notes.md +494 -0
- examples/multi_step/verilog_rl_lora.md +218 -0
- examples/qwen_coder/README.md +102 -0
- examples/qwen_coder/_shared.py +113 -0
- examples/qwen_coder/configs/coder_lora_30b.toml +60 -0
- examples/qwen_coder/configs/coder_lora_4b.toml +61 -0
- examples/qwen_coder/configs/coder_lora_small.toml +57 -0
- examples/qwen_coder/generate_dataset.py +98 -0
- examples/qwen_coder/infer_ft_smoke.py +65 -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 +19 -0
- examples/qwen_coder/scripts/train_coder_30b.sh +22 -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 +39 -0
- examples/qwen_coder/todos.md +38 -0
- examples/qwen_coder/validate_jsonl.py +60 -0
- 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 +169 -0
- 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 +80 -0
- examples/rl/configs/rl_from_ft_qwen.toml +37 -0
- examples/rl/download_dataset.py +80 -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
- {synth_ai/task/apps → examples/rl/task_app}/math_single_step.py +188 -50
- examples/rl/task_app/math_task_app.py +111 -0
- examples/run_crafter_demo.sh +10 -0
- examples/sdk_prompt_learning_example.py +55 -0
- examples/sft/README.md +139 -0
- examples/sft/configs/crafter_fft_qwen0p6b.toml +49 -0
- examples/sft/configs/crafter_lora_qwen0p6b.toml +49 -0
- examples/sft/evaluate.py +117 -0
- examples/sft/export_dataset.py +120 -0
- examples/sft/generate_traces.py +164 -0
- examples/swe/__init__.py +12 -0
- examples/swe/task_app/README.md +135 -0
- examples/swe/task_app/__init__.py +2 -0
- examples/swe/task_app/grpo_swe_mini.py +604 -0
- examples/swe/task_app/grpo_swe_mini_task_app.py +124 -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 +1191 -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 +584 -0
- examples/swe/task_app/hosted/main.py +100 -0
- examples/swe/task_app/hosted/policy_routes.py +1094 -0
- examples/swe/task_app/hosted/registry.py +195 -0
- examples/swe/task_app/hosted/rollout.py +1905 -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 +136 -0
- examples/swe/task_app/hosted/utils.py +62 -0
- examples/swe/task_app/morph_backend.py +178 -0
- examples/task_apps/IMAGE_ONLY_EVAL_QUICKSTART.md +258 -0
- examples/task_apps/TESTING.md +275 -0
- examples/task_apps/banking77/__init__.py +6 -0
- examples/task_apps/banking77/banking77_task_app.py +912 -0
- examples/task_apps/banking77/deploy_wrapper.py +46 -0
- examples/task_apps/banking77_pipeline/__init__.py +6 -0
- examples/task_apps/banking77_pipeline/banking77_pipeline_task_app.py +489 -0
- examples/task_apps/banking77_pipeline/deploy_wrapper.py +50 -0
- examples/task_apps/crafter/CREATE_SFT_DATASET.md +286 -0
- examples/task_apps/crafter/EVAL_IMAGE_ONLY_RESULTS.md +152 -0
- examples/task_apps/crafter/FILTER_COMMAND_STATUS.md +187 -0
- examples/task_apps/crafter/FILTER_COMMAND_SUCCESS.md +281 -0
- examples/task_apps/crafter/QUERY_EXAMPLES.md +203 -0
- examples/task_apps/crafter/README_IMAGE_ONLY_EVAL.md +316 -0
- examples/task_apps/crafter/eval_image_only_gpt4o.toml +28 -0
- examples/task_apps/crafter/eval_text_only_groq_llama.toml +36 -0
- examples/task_apps/crafter/filter_sft_dataset.toml +16 -0
- examples/task_apps/crafter/task_app/README.md +42 -0
- examples/task_apps/crafter/task_app/__init__.py +5 -0
- examples/task_apps/crafter/task_app/grpo_crafter.py +1055 -0
- examples/task_apps/crafter/task_app/grpo_crafter_task_app.py +146 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/README.md +173 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/__init__.py +5 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/branching.py +143 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/environment_routes.py +1226 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/__init__.py +1 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/__init__.py +6 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/app.py +1 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/environment.py +532 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/policy.py +583 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/react_agent.py +122 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/shared.py +305 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/envs/crafter/tools.py +47 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/hosted_app.py +253 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/inference/__init__.py +5 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/inference/openai_client.py +999 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/main.py +100 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/policy_routes.py +1252 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/registry.py +195 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/rollout.py +2233 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/storage/__init__.py +5 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/storage/volume.py +211 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/test_agents.py +161 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/test_service.py +136 -0
- examples/task_apps/crafter/task_app/synth_envs_hosted/utils.py +411 -0
- examples/task_apps/dev/pokemon_emerald/__init__.py +2 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/README.md +811 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/__init__.py +120 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/action.py +160 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/memory.py +155 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/perception.py +69 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/planning.py +96 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/simple.py +1502 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/agent/system_prompt.py +4 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/grab_map.py +68 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/manual.py +216 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/__init__.py +35 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emerald_utils.py +631 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/emulator.py +1544 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/enums.py +1428 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/memory_reader.py +4848 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/types.py +41 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pokemon_env/utils.py +298 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/pyproject.toml +95 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/run.py +204 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/app.py +2152 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/client.py +429 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server/frame_server.py +155 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/README.md +78 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/run_tests.py +122 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_direct.py +76 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_agent_prompts.py +413 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_battle_state_formatting.py +204 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection.py +133 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_dialogue_detection_comprehensive.py +229 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_direct_agent_emulator.py +300 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_fps_adjustment_pytest.py +205 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_direct.py +200 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_house_to_outside_transition.py +284 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_map_ground_truth_comparison.py +468 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_memory_map.py +575 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_server_map_validation.py +311 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests/test_torchic_state.py +259 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/anticheat.py +372 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/checkpoint.py +296 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/error_handler.py +275 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/get_local_ip.py +22 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/helpers.py +44 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/llm_logger.py +514 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_formatter.py +415 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher.py +1763 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_stitcher_singleton.py +33 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_trimmer.py +106 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/map_visualizer.py +334 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/ocr_dialogue.py +1020 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/recording.py +188 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/state_formatter.py +1481 -0
- examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils/vlm.py +862 -0
- examples/task_apps/dev/pokemon_emerald/modal_app.py +114 -0
- examples/task_apps/dev/pokemon_emerald/task_app/README.md +81 -0
- examples/task_apps/dev/pokemon_emerald/task_app/__init__.py +6 -0
- examples/task_apps/dev/pokemon_emerald/task_app/pokemon_emerald.py +685 -0
- examples/task_apps/enron/__init__.py +2 -0
- examples/task_apps/enron/eval_groq_qwen32.toml +16 -0
- examples/task_apps/enron/filter_sft.toml +5 -0
- examples/task_apps/enron/task_app/README.md +14 -0
- examples/task_apps/enron/task_app/__init__.py +1 -0
- examples/task_apps/enron/task_app/grpo_enron.py +906 -0
- examples/task_apps/enron/task_app/grpo_enron_task_app.py +146 -0
- examples/task_apps/enron/tests/__init__.py +4 -0
- examples/task_apps/enron/tests/conftest.py +115 -0
- examples/task_apps/enron/tests/integration/__init__.py +4 -0
- examples/task_apps/enron/tests/integration/test_enron_eval.py +179 -0
- examples/task_apps/enron/tests/integration/test_enron_rollout.py +135 -0
- examples/task_apps/enron/tests/unit/__init__.py +4 -0
- examples/task_apps/enron/tests/unit/test_enron_environment.py +126 -0
- examples/task_apps/gepa_benchmarks/__init__.py +7 -0
- examples/task_apps/gepa_benchmarks/common.py +260 -0
- examples/task_apps/gepa_benchmarks/hotpotqa_task_app.py +507 -0
- examples/task_apps/gepa_benchmarks/hover_task_app.py +436 -0
- examples/task_apps/gepa_benchmarks/ifbench_task_app.py +563 -0
- examples/task_apps/gepa_benchmarks/pupa_task_app.py +460 -0
- examples/task_apps/math/README.md +21 -0
- examples/task_apps/math/math_single_step.py +1000 -0
- examples/task_apps/math/math_task_app.py +115 -0
- examples/task_apps/pokemon_battle/__init__.py +2 -0
- examples/task_apps/pokemon_battle/modal_app.py +104 -0
- examples/task_apps/pokemon_battle/task_app/README.md +68 -0
- examples/task_apps/pokemon_battle/task_app/__init__.py +6 -0
- examples/task_apps/pokemon_battle/task_app/pokemon_showdown.py +932 -0
- examples/task_apps/pokemon_red/EVAL_IMAGE_ONLY_COMPLETE.md +283 -0
- examples/task_apps/pokemon_red/EVAL_IMAGE_ONLY_STATUS.md +155 -0
- examples/task_apps/pokemon_red/README.md +356 -0
- examples/task_apps/pokemon_red/README_IMAGE_ONLY_EVAL.md +428 -0
- examples/task_apps/pokemon_red/__init__.py +3 -0
- examples/task_apps/pokemon_red/eval_image_only_gpt4o.toml +30 -0
- examples/task_apps/pokemon_red/eval_pokemon_red_policy.py +224 -0
- examples/task_apps/pokemon_red/pallet_town_rl_config.toml +75 -0
- examples/task_apps/pokemon_red/task_app.py +1048 -0
- examples/task_apps/pokemon_red/test_pallet_town_rewards.py +193 -0
- examples/task_apps/sokoban/README.md +306 -0
- examples/task_apps/sokoban/__init__.py +3 -0
- examples/task_apps/sokoban/eval_groq_qwen32.toml +16 -0
- examples/task_apps/sokoban/eval_openai_gpt5.toml +16 -0
- examples/task_apps/sokoban/filter_sft.toml +5 -0
- examples/task_apps/sokoban/task_app.py +1058 -0
- examples/task_apps/sokoban/tests/__init__.py +4 -0
- examples/task_apps/sokoban/tests/conftest.py +113 -0
- examples/task_apps/sokoban/tests/integration/__init__.py +4 -0
- examples/task_apps/sokoban/tests/integration/test_sokoban_eval.py +57 -0
- examples/task_apps/sokoban/tests/integration/test_sokoban_rollout.py +198 -0
- examples/task_apps/sokoban/tests/unit/__init__.py +4 -0
- examples/task_apps/sokoban/tests/unit/test_sokoban_environment.py +114 -0
- examples/task_apps/verilog/__init__.py +1 -0
- examples/task_apps/verilog/eval_groq_qwen32b.toml +22 -0
- examples/task_apps/verilog/filter_sft.toml +5 -0
- examples/task_apps/verilog/task_app/README.md +12 -0
- examples/task_apps/verilog/task_app/__init__.py +1 -0
- examples/task_apps/verilog/task_app/grpo_verilog.py +1166 -0
- examples/task_apps/verilog/task_app/grpo_verilog_task_app.py +145 -0
- examples/task_apps/verilog/tests/__init__.py +4 -0
- examples/task_apps/verilog/tests/conftest.py +115 -0
- examples/task_apps/verilog/tests/integration/__init__.py +4 -0
- examples/task_apps/verilog/tests/integration/test_verilog_eval.py +181 -0
- examples/task_apps/verilog/tests/integration/test_verilog_rollout.py +55 -0
- examples/task_apps/verilog/tests/unit/__init__.py +4 -0
- examples/task_apps/verilog/tests/unit/test_verilog_scoring.py +118 -0
- examples/tunnel_gepa_banking77/README.md +106 -0
- examples/tunnel_gepa_banking77/banking77_gepa_tunnel.toml +95 -0
- examples/tunnel_gepa_banking77/keep_tunnel_running.py +60 -0
- examples/tunnel_gepa_banking77/run_gepa_with_tunnel.sh +226 -0
- examples/vlm/PROPOSAL.md +53 -0
- examples/vlm/README.md +68 -0
- examples/vlm/configs/crafter_vlm_gpt4o.toml +49 -0
- examples/vlm/crafter_image_only_agent.py +207 -0
- examples/vlm/crafter_openai_vlm_agent.py +275 -0
- examples/vlm/filter_image_rows.py +63 -0
- examples/vlm/run_crafter_vlm_benchmark.py +316 -0
- examples/warming_up_to_rl/_utils.py +92 -0
- examples/warming_up_to_rl/analyze_trace_db.py +422 -0
- examples/warming_up_to_rl/configs/crafter_fft.toml +53 -0
- examples/warming_up_to_rl/configs/crafter_fft_4b.toml +54 -0
- examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml +22 -0
- examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml +15 -0
- examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml +24 -0
- examples/warming_up_to_rl/configs/eval_stepwise_complex.toml +35 -0
- examples/warming_up_to_rl/configs/eval_stepwise_consistent.toml +26 -0
- examples/warming_up_to_rl/configs/eval_stepwise_per_achievement.toml +36 -0
- examples/warming_up_to_rl/configs/eval_stepwise_simple.toml +32 -0
- examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +85 -0
- examples/warming_up_to_rl/configs/rl_from_ft.toml +58 -0
- examples/warming_up_to_rl/export_trace_sft.py +837 -0
- examples/warming_up_to_rl/groq_test.py +97 -0
- examples/warming_up_to_rl/manage_secrets.py +131 -0
- examples/warming_up_to_rl/old/event_rewards.md +234 -0
- examples/warming_up_to_rl/old/notes.md +73 -0
- examples/warming_up_to_rl/readme.md +110 -0
- examples/warming_up_to_rl/run_eval.py +736 -0
- examples/warming_up_to_rl/run_fft_and_save.py +380 -0
- examples/warming_up_to_rl/run_local_rollout.py +239 -0
- examples/warming_up_to_rl/run_local_rollout_modal.py +248 -0
- examples/warming_up_to_rl/run_local_rollout_parallel.py +405 -0
- examples/warming_up_to_rl/run_local_rollout_traced.py +477 -0
- examples/warming_up_to_rl/run_rl_and_save.py +124 -0
- examples/warming_up_to_rl/run_rollout_remote.py +156 -0
- examples/warming_up_to_rl/task_app/README.md +42 -0
- examples/warming_up_to_rl/task_app/grpo_crafter.py +876 -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 +253 -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 +729 -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 +1114 -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 +1891 -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 +129 -0
- examples/workflows/math_rl/configs/eval_base_qwen.toml +15 -0
- examples/workflows/math_rl/configs/eval_rl_qwen.toml +11 -0
- examples/workflows/math_rl/configs/rl_from_base_qwen.toml +62 -0
- examples/workflows/math_rl/configs/rl_from_base_qwen17.toml +80 -0
- examples/workflows/math_rl/configs/rl_from_ft_qwen.toml +35 -0
- examples/workflows/math_rl/download_dataset.py +80 -0
- examples/workflows/math_rl/run_eval.py +436 -0
- examples/workflows/math_rl/run_rl_and_save.py +111 -0
- synth_ai/__init__.py +47 -23
- 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 +514 -0
- synth_ai/api/train/__init__.py +60 -2
- synth_ai/api/train/builders.py +347 -39
- synth_ai/api/train/cli.py +895 -160
- synth_ai/api/train/config_finder.py +103 -25
- synth_ai/api/train/configs/__init__.py +65 -0
- synth_ai/api/train/configs/prompt_learning.py +496 -0
- synth_ai/api/train/configs/rl.py +188 -0
- synth_ai/api/train/configs/sft.py +99 -0
- synth_ai/api/train/configs/shared.py +81 -0
- synth_ai/api/train/env_resolver.py +70 -20
- synth_ai/api/train/pollers.py +29 -4
- synth_ai/api/train/prompt_learning.py +425 -0
- synth_ai/api/train/sft.py +390 -0
- synth_ai/api/train/supported_algos.py +147 -0
- synth_ai/api/train/task_app.py +6 -4
- synth_ai/api/train/utils.py +64 -52
- synth_ai/api/train/validators.py +1117 -0
- synth_ai/api/tunnel.py +49 -0
- synth_ai/auth/credentials.py +94 -0
- synth_ai/baseline/__init__.py +25 -0
- synth_ai/baseline/config.py +209 -0
- synth_ai/baseline/discovery.py +214 -0
- synth_ai/baseline/execution.py +146 -0
- synth_ai/cfgs.py +227 -0
- synth_ai/cli/__init__.py +85 -63
- synth_ai/cli/_modal_wrapper.py +31 -0
- synth_ai/cli/_storage.py +20 -0
- synth_ai/cli/_typer_patch.py +47 -0
- synth_ai/cli/_validate_task_app.py +29 -0
- synth_ai/cli/balance.py +16 -4
- synth_ai/cli/calc.py +36 -21
- synth_ai/cli/claude.py +70 -0
- synth_ai/cli/codex.py +267 -0
- synth_ai/cli/commands/__init__.py +18 -0
- synth_ai/cli/commands/baseline/__init__.py +12 -0
- synth_ai/cli/commands/baseline/core.py +637 -0
- synth_ai/cli/commands/baseline/list.py +93 -0
- synth_ai/cli/commands/demo/__init__.py +6 -0
- synth_ai/cli/commands/demo/core.py +163 -0
- synth_ai/cli/commands/eval/__init__.py +19 -0
- synth_ai/cli/commands/eval/core.py +1112 -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/smoke/__init__.py +7 -0
- synth_ai/cli/commands/smoke/core.py +1437 -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 +22 -0
- synth_ai/cli/commands/status/subcommands/runs.py +81 -0
- synth_ai/cli/commands/status/subcommands/session.py +183 -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 +21 -0
- synth_ai/cli/commands/train/errors.py +117 -0
- synth_ai/cli/commands/train/judge_schemas.py +200 -0
- synth_ai/cli/commands/train/judge_validation.py +305 -0
- synth_ai/cli/commands/train/validation.py +386 -0
- synth_ai/cli/demo.py +32 -140
- synth_ai/cli/deploy.py +233 -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 +28 -22
- 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/mcp.py +34 -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/opencode.py +256 -0
- synth_ai/cli/recent.py +13 -7
- synth_ai/cli/rl_demo.py +156 -116
- synth_ai/cli/root.py +131 -132
- 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 +49 -0
- synth_ai/cli/status.py +7 -125
- 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 +2284 -257
- synth_ai/cli/traces.py +9 -5
- 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 +73 -0
- synth_ai/cli/watch.py +13 -18
- synth_ai/demos/__init__.py +10 -0
- synth_ai/demos/core/__init__.py +28 -1
- synth_ai/demos/core/cli.py +579 -291
- 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/__init__.py +3 -3
- synth_ai/demos/demo_task_apps/core.py +64 -28
- synth_ai/demos/demo_task_apps/crafter/__init__.py +1 -0
- synth_ai/demos/demo_task_apps/crafter/configs/crafter_fft_4b.toml +53 -0
- synth_ai/demos/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +73 -0
- synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +184 -0
- 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 +185 -83
- synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -2
- 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 +703 -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 +12 -5
- synth_ai/environments/examples/bandit/environment.py +0 -1
- synth_ai/environments/examples/bandit/taskset.py +4 -4
- synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +7 -4
- synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +9 -5
- synth_ai/environments/examples/crafter_classic/environment.py +93 -2
- synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +4 -3
- synth_ai/environments/examples/enron/engine.py +7 -2
- synth_ai/environments/examples/enron/environment.py +68 -0
- synth_ai/environments/examples/red/engine.py +60 -12
- synth_ai/environments/examples/red/engine_helpers/memory_map.py +7 -0
- synth_ai/environments/examples/red/engine_helpers/reward_components.py +151 -179
- synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_progression.py +477 -0
- synth_ai/environments/examples/red/engine_helpers/state_extraction.py +32 -0
- synth_ai/environments/examples/red/environment.py +86 -0
- synth_ai/environments/examples/red/trace_hooks_v3.py +168 -0
- synth_ai/environments/examples/sokoban/taskset.py +116 -0
- synth_ai/environments/examples/verilog/engine.py +104 -12
- synth_ai/environments/examples/wordle/environment.py +0 -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/__init__.py +15 -0
- synth_ai/evals/base.py +14 -5
- synth_ai/evals/client.py +82 -0
- synth_ai/evals/types.py +42 -0
- synth_ai/http.py +8 -22
- synth_ai/http_client.py +45 -12
- synth_ai/inference/__init__.py +0 -2
- synth_ai/inference/client.py +21 -7
- synth_ai/jobs/client.py +129 -80
- synth_ai/judge_schemas.py +127 -0
- synth_ai/learning/__init__.py +51 -6
- synth_ai/learning/algorithms.py +14 -0
- synth_ai/learning/client.py +122 -30
- 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 +14 -8
- synth_ai/learning/jobs.py +43 -47
- synth_ai/learning/prompt_learning_client.py +276 -0
- synth_ai/learning/prompt_learning_types.py +185 -0
- synth_ai/{rl → learning/rl}/__init__.py +14 -5
- synth_ai/learning/rl/client.py +269 -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 +698 -0
- synth_ai/learning/sse.py +25 -26
- synth_ai/learning/validators.py +29 -25
- synth_ai/mcp/__init__.py +5 -0
- synth_ai/mcp/__main__.py +8 -0
- synth_ai/mcp/main.py +254 -0
- synth_ai/mcp/setup.py +100 -0
- synth_ai/modal.py +257 -0
- synth_ai/pricing/__init__.py +3 -0
- synth_ai/pricing/model_pricing.py +64 -0
- synth_ai/session/__init__.py +75 -0
- synth_ai/session/client.py +383 -0
- synth_ai/session/constants.py +63 -0
- synth_ai/session/exceptions.py +105 -0
- synth_ai/session/manager.py +139 -0
- synth_ai/session/models.py +89 -0
- synth_ai/session/query.py +110 -0
- synth_ai/spec/__init__.py +46 -0
- synth_ai/spec/dataclasses.py +149 -0
- synth_ai/spec/loader.py +144 -0
- synth_ai/spec/serializer.py +199 -0
- synth_ai/spec/validation.py +250 -0
- synth_ai/streaming/__init__.py +29 -0
- synth_ai/streaming/config.py +94 -0
- synth_ai/streaming/handlers.py +589 -0
- synth_ai/streaming/streamer.py +320 -0
- synth_ai/streaming/types.py +95 -0
- synth_ai/task/__init__.py +50 -30
- synth_ai/task/apps/__init__.py +63 -19
- synth_ai/task/auth.py +35 -23
- synth_ai/task/client.py +15 -13
- synth_ai/task/config.py +261 -0
- synth_ai/task/contracts.py +165 -64
- synth_ai/task/datasets.py +9 -6
- synth_ai/task/errors.py +11 -10
- synth_ai/task/health.py +17 -11
- synth_ai/task/inference_api.py +101 -0
- synth_ai/task/json.py +58 -24
- synth_ai/task/proxy.py +59 -66
- synth_ai/task/rubrics/__init__.py +55 -0
- synth_ai/task/rubrics/loaders.py +156 -0
- synth_ai/task/rubrics/models.py +57 -0
- synth_ai/task/rubrics/scoring.py +116 -0
- synth_ai/task/rubrics/strict.py +149 -0
- synth_ai/task/rubrics.py +22 -15
- synth_ai/task/server.py +65 -31
- synth_ai/task/trace_correlation_helpers.py +328 -0
- synth_ai/task/tracing_utils.py +44 -28
- synth_ai/task/validators.py +449 -6
- synth_ai/task/vendors.py +5 -7
- synth_ai/tracing_v3/__init__.py +4 -0
- synth_ai/tracing_v3/abstractions.py +21 -4
- synth_ai/tracing_v3/config.py +167 -22
- synth_ai/tracing_v3/constants.py +21 -0
- synth_ai/tracing_v3/db_config.py +42 -29
- synth_ai/tracing_v3/decorators.py +80 -45
- synth_ai/tracing_v3/examples/basic_usage.py +15 -9
- synth_ai/tracing_v3/hooks.py +6 -4
- synth_ai/tracing_v3/llm_call_record_helpers.py +161 -61
- synth_ai/tracing_v3/migration_helper.py +1 -2
- synth_ai/tracing_v3/replica_sync.py +12 -7
- synth_ai/tracing_v3/serialization.py +130 -0
- synth_ai/tracing_v3/session_tracer.py +73 -16
- synth_ai/tracing_v3/storage/base.py +89 -1
- synth_ai/tracing_v3/storage/config.py +63 -16
- synth_ai/tracing_v3/storage/factory.py +11 -9
- synth_ai/tracing_v3/storage/utils.py +15 -11
- synth_ai/tracing_v3/trace_utils.py +317 -0
- synth_ai/tracing_v3/turso/__init__.py +8 -21
- synth_ai/tracing_v3/turso/daemon.py +123 -15
- synth_ai/tracing_v3/turso/models.py +5 -2
- synth_ai/tracing_v3/turso/native_manager.py +1293 -0
- synth_ai/tracing_v3/utils.py +5 -4
- synth_ai/tunnel.py +143 -0
- synth_ai/tunnel_deploy.py +278 -0
- synth_ai/types.py +8 -0
- synth_ai/urls.py +11 -0
- synth_ai/utils/__init__.py +166 -0
- synth_ai/utils/agents.py +74 -0
- synth_ai/utils/apps.py +152 -0
- synth_ai/utils/base_url.py +94 -0
- synth_ai/utils/bin.py +39 -0
- synth_ai/utils/claude.py +36 -0
- synth_ai/utils/cli.py +284 -0
- synth_ai/utils/config.py +81 -0
- synth_ai/utils/env.py +346 -0
- synth_ai/utils/errors.py +85 -0
- synth_ai/utils/http.py +172 -0
- synth_ai/utils/json.py +72 -0
- synth_ai/utils/log_filter.py +99 -0
- synth_ai/utils/logging.py +198 -0
- synth_ai/utils/modal.py +299 -0
- synth_ai/utils/paths.py +95 -0
- synth_ai/utils/process.py +233 -0
- synth_ai/utils/prompts.py +39 -0
- synth_ai/utils/sqld.py +122 -0
- synth_ai/utils/ssl.py +25 -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/tunnel/__init__.py +12 -0
- synth_ai/utils/tunnel/config.py +55 -0
- synth_ai/utils/user_config.py +137 -0
- synth_ai/uvicorn.py +77 -0
- synth_ai-0.2.23.dev3.dist-info/METADATA +357 -0
- synth_ai-0.2.23.dev3.dist-info/RECORD +983 -0
- {synth_ai-0.2.9.dev0.dist-info → synth_ai-0.2.23.dev3.dist-info}/entry_points.txt +0 -1
- {synth_ai-0.2.9.dev0.dist-info → synth_ai-0.2.23.dev3.dist-info}/top_level.txt +1 -0
- synth_ai/cli/man.py +0 -106
- synth_ai/core/experiment.py +0 -15
- synth_ai/core/system.py +0 -15
- synth_ai/demo_registry.py +0 -258
- synth_ai/environments/examples/sokoban/units/astar_common.py +0 -95
- synth_ai/experimental/synth_oss.py +0 -446
- synth_ai/handshake.py +0 -107
- synth_ai/install_sqld.sh +0 -40
- 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/lm/__init__.py +0 -51
- synth_ai/lm/caching/constants.py +0 -6
- synth_ai/lm/caching/dbs.py +0 -0
- synth_ai/lm/caching/ephemeral.py +0 -102
- synth_ai/lm/caching/handler.py +0 -137
- synth_ai/lm/caching/initialize.py +0 -11
- synth_ai/lm/caching/persistent.py +0 -114
- synth_ai/lm/config.py +0 -110
- synth_ai/lm/constants.py +0 -32
- synth_ai/lm/core/__init__.py +0 -8
- synth_ai/lm/core/all.py +0 -73
- synth_ai/lm/core/exceptions.py +0 -7
- synth_ai/lm/core/main.py +0 -319
- synth_ai/lm/core/main_v3.py +0 -594
- synth_ai/lm/core/synth_models.py +0 -48
- synth_ai/lm/core/vendor_clients.py +0 -188
- synth_ai/lm/cost/monitor.py +0 -1
- synth_ai/lm/cost/statefulness.py +0 -1
- synth_ai/lm/injection.py +0 -80
- synth_ai/lm/overrides.py +0 -206
- synth_ai/lm/provider_support/__init__.py +0 -8
- synth_ai/lm/provider_support/anthropic.py +0 -972
- synth_ai/lm/provider_support/openai.py +0 -1139
- synth_ai/lm/provider_support/suppress_logging.py +0 -31
- synth_ai/lm/structured_outputs/handler.py +0 -440
- synth_ai/lm/structured_outputs/inject.py +0 -297
- synth_ai/lm/structured_outputs/rehabilitate.py +0 -185
- synth_ai/lm/tools/__init__.py +0 -3
- synth_ai/lm/tools/base.py +0 -172
- synth_ai/lm/unified_interface.py +0 -202
- synth_ai/lm/vendors/base.py +0 -81
- synth_ai/lm/vendors/core/anthropic_api.py +0 -387
- synth_ai/lm/vendors/core/gemini_api.py +0 -292
- synth_ai/lm/vendors/core/mistral_api.py +0 -322
- synth_ai/lm/vendors/core/openai_api.py +0 -225
- synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
- synth_ai/lm/vendors/local/ollama.py +0 -0
- synth_ai/lm/vendors/openai_standard.py +0 -780
- synth_ai/lm/vendors/openai_standard_responses.py +0 -256
- synth_ai/lm/vendors/retries.py +0 -22
- synth_ai/lm/vendors/supported/custom_endpoint.py +0 -417
- synth_ai/lm/vendors/supported/deepseek.py +0 -69
- synth_ai/lm/vendors/supported/grok.py +0 -75
- synth_ai/lm/vendors/supported/groq.py +0 -16
- synth_ai/lm/vendors/supported/ollama.py +0 -15
- synth_ai/lm/vendors/supported/openrouter.py +0 -74
- synth_ai/lm/vendors/supported/together.py +0 -11
- synth_ai/lm/vendors/synth_client.py +0 -808
- synth_ai/lm/warmup.py +0 -186
- synth_ai/rl/secrets.py +0 -19
- synth_ai/scripts/verify_rewards.py +0 -100
- synth_ai/task/apps/grpo_crafter.py +0 -438
- synth_ai/tracing/__init__.py +0 -30
- synth_ai/tracing_v1/__init__.py +0 -33
- synth_ai/tracing_v3/turso/manager.py +0 -774
- synth_ai/v0/tracing/abstractions.py +0 -224
- synth_ai/v0/tracing/base_client.py +0 -91
- synth_ai/v0/tracing/client_manager.py +0 -131
- synth_ai/v0/tracing/config.py +0 -142
- synth_ai/v0/tracing/context.py +0 -146
- synth_ai/v0/tracing/decorators.py +0 -682
- synth_ai/v0/tracing/events/__init__.py +0 -0
- synth_ai/v0/tracing/events/manage.py +0 -147
- synth_ai/v0/tracing/events/scope.py +0 -86
- synth_ai/v0/tracing/events/store.py +0 -228
- synth_ai/v0/tracing/immediate_client.py +0 -151
- synth_ai/v0/tracing/local.py +0 -18
- synth_ai/v0/tracing/log_client_base.py +0 -73
- synth_ai/v0/tracing/retry_queue.py +0 -186
- synth_ai/v0/tracing/trackers.py +0 -515
- synth_ai/v0/tracing/upload.py +0 -512
- synth_ai/v0/tracing/utils.py +0 -9
- synth_ai/v0/tracing_v1/__init__.py +0 -16
- synth_ai/v0/tracing_v1/abstractions.py +0 -224
- synth_ai/v0/tracing_v1/base_client.py +0 -91
- synth_ai/v0/tracing_v1/client_manager.py +0 -131
- synth_ai/v0/tracing_v1/config.py +0 -142
- synth_ai/v0/tracing_v1/context.py +0 -146
- synth_ai/v0/tracing_v1/decorators.py +0 -703
- synth_ai/v0/tracing_v1/events/__init__.py +0 -0
- synth_ai/v0/tracing_v1/events/manage.py +0 -147
- synth_ai/v0/tracing_v1/events/scope.py +0 -86
- synth_ai/v0/tracing_v1/events/store.py +0 -228
- synth_ai/v0/tracing_v1/immediate_client.py +0 -151
- synth_ai/v0/tracing_v1/local.py +0 -18
- synth_ai/v0/tracing_v1/log_client_base.py +0 -73
- synth_ai/v0/tracing_v1/retry_queue.py +0 -186
- synth_ai/v0/tracing_v1/trackers.py +0 -515
- synth_ai/v0/tracing_v1/upload.py +0 -527
- synth_ai/v0/tracing_v1/utils.py +0 -9
- synth_ai/zyk/__init__.py +0 -30
- synth_ai-0.2.9.dev0.dist-info/METADATA +0 -131
- synth_ai-0.2.9.dev0.dist-info/RECORD +0 -444
- {synth_ai/lm/caching → examples/task_apps}/__init__.py +0 -0
- {synth_ai/lm/cost → examples/task_apps/crafter}/__init__.py +0 -0
- {synth_ai/lm/structured_outputs → examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/server}/__init__.py +0 -0
- {synth_ai/lm/vendors → examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/tests}/__init__.py +0 -0
- {synth_ai/lm/vendors/core → examples/task_apps/dev/pokemon_emerald/external/pokeagent-speedrun/utils}/__init__.py +0 -0
- {synth_ai/lm/vendors/local → examples/task_apps/math}/__init__.py +0 -0
- {synth_ai/lm/vendors/supported → examples/workflows}/__init__.py +0 -0
- {synth_ai/v0/tracing → examples/workflows/math_rl}/__init__.py +0 -0
- /synth_ai/{compound/cais.py → cli/__main__.py} +0 -0
- /synth_ai/{learning/filtering.py → py.typed} +0 -0
- {synth_ai-0.2.9.dev0.dist-info → synth_ai-0.2.23.dev3.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.9.dev0.dist-info → synth_ai-0.2.23.dev3.dist-info}/licenses/LICENSE +0 -0
synth_ai/v0/tracing_v1/upload.py
DELETED
|
@@ -1,527 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
import json
|
|
3
|
-
import logging
|
|
4
|
-
import os
|
|
5
|
-
import ssl
|
|
6
|
-
import time
|
|
7
|
-
import warnings
|
|
8
|
-
from typing import Any, TypedDict
|
|
9
|
-
|
|
10
|
-
import requests
|
|
11
|
-
from dotenv import load_dotenv
|
|
12
|
-
from pydantic import BaseModel, ConfigDict, field_validator
|
|
13
|
-
from requests.adapters import HTTPAdapter
|
|
14
|
-
from urllib3.poolmanager import PoolManager
|
|
15
|
-
|
|
16
|
-
from synth_ai.config.base_url import PROD_BASE_URL_DEFAULT
|
|
17
|
-
|
|
18
|
-
from .abstractions import Dataset, SystemTrace
|
|
19
|
-
from .events.store import event_store
|
|
20
|
-
|
|
21
|
-
load_dotenv()
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
# Issue deprecation warning and raise not supported error for backend upload functionality
|
|
25
|
-
def _raise_not_supported_error():
|
|
26
|
-
"""Raise an error for backend upload functionality that is no longer supported."""
|
|
27
|
-
warnings.warn(
|
|
28
|
-
"Backend upload functionality in synth_ai.tracing_v1 is no longer supported. "
|
|
29
|
-
"Please use synth_ai.tracing_v2 for new tracing functionality.",
|
|
30
|
-
DeprecationWarning,
|
|
31
|
-
stacklevel=3,
|
|
32
|
-
)
|
|
33
|
-
raise NotImplementedError(
|
|
34
|
-
"Backend upload functionality is no longer supported in synth_ai.tracing_v1. "
|
|
35
|
-
"Please use synth_ai.tracing_v2 instead."
|
|
36
|
-
)
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
# NOTE: This may cause memory issues in the future
|
|
40
|
-
def validate_json(data: dict[str, Any]) -> None:
|
|
41
|
-
"""Validate that a dictionary contains only JSON-serializable values.
|
|
42
|
-
|
|
43
|
-
Args:
|
|
44
|
-
data: Dictionary to validate for JSON serialization
|
|
45
|
-
|
|
46
|
-
Raises:
|
|
47
|
-
ValueError: If the dictionary contains non-serializable values
|
|
48
|
-
"""
|
|
49
|
-
|
|
50
|
-
try:
|
|
51
|
-
json.dumps(data)
|
|
52
|
-
except (TypeError, OverflowError) as e:
|
|
53
|
-
raise ValueError(f"Contains non-JSON-serializable values: {e}. {data}")
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def createPayload(dataset: Dataset, traces: list[SystemTrace]) -> dict[str, Any]:
|
|
57
|
-
payload = {
|
|
58
|
-
"traces": [trace.to_dict() for trace in traces], # Convert SystemTrace objects to dicts
|
|
59
|
-
"dataset": dataset.to_dict(),
|
|
60
|
-
}
|
|
61
|
-
return payload
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
class TLSAdapter(HTTPAdapter):
|
|
65
|
-
def init_poolmanager(self, connections, maxsize, block=False):
|
|
66
|
-
"""Create and initialize the urllib3 PoolManager."""
|
|
67
|
-
ctx = ssl.create_default_context()
|
|
68
|
-
ctx.set_ciphers("DEFAULT@SECLEVEL=1")
|
|
69
|
-
self.poolmanager = PoolManager(
|
|
70
|
-
num_pools=connections,
|
|
71
|
-
maxsize=maxsize,
|
|
72
|
-
block=block,
|
|
73
|
-
ssl_version=ssl.PROTOCOL_TLSv1_2,
|
|
74
|
-
ssl_context=ctx,
|
|
75
|
-
)
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
def load_signed_url(signed_url: str, dataset: Dataset, traces: list[SystemTrace]) -> None:
|
|
79
|
-
payload = createPayload(dataset, traces)
|
|
80
|
-
validate_json(payload)
|
|
81
|
-
|
|
82
|
-
session = requests.Session()
|
|
83
|
-
adapter = TLSAdapter()
|
|
84
|
-
session.mount("https://", adapter)
|
|
85
|
-
|
|
86
|
-
try:
|
|
87
|
-
response = session.put(
|
|
88
|
-
signed_url, json=payload, headers={"Content-Type": "application/json"}
|
|
89
|
-
)
|
|
90
|
-
response.raise_for_status()
|
|
91
|
-
except requests.exceptions.RequestException as e:
|
|
92
|
-
print(f"Error making request: {str(e)}")
|
|
93
|
-
print(f"Request payload: {payload}") # Debugging info
|
|
94
|
-
raise
|
|
95
|
-
|
|
96
|
-
if response.status_code != 200:
|
|
97
|
-
raise ValueError(
|
|
98
|
-
f"Failed to load signed URL Status Code: {response.status_code} "
|
|
99
|
-
f"Response: {response.text}, Signed URL: {signed_url}"
|
|
100
|
-
)
|
|
101
|
-
else:
|
|
102
|
-
pass
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def send_system_traces_s3(
|
|
106
|
-
dataset: Dataset,
|
|
107
|
-
traces: list[SystemTrace],
|
|
108
|
-
base_url: str,
|
|
109
|
-
api_key: str,
|
|
110
|
-
system_id: str,
|
|
111
|
-
system_name: str,
|
|
112
|
-
verbose: bool = False,
|
|
113
|
-
):
|
|
114
|
-
upload_id, signed_url = get_upload_id(base_url, api_key, system_id, system_name, verbose)
|
|
115
|
-
load_signed_url(signed_url, dataset, traces)
|
|
116
|
-
|
|
117
|
-
token_url = f"{base_url}/v1/auth/token"
|
|
118
|
-
try:
|
|
119
|
-
token_response = requests.get(token_url, headers={"customer_specific_api_key": api_key})
|
|
120
|
-
token_response.raise_for_status()
|
|
121
|
-
access_token = token_response.json()["access_token"]
|
|
122
|
-
except requests.exceptions.RequestException as e:
|
|
123
|
-
logging.error(f"Error obtaining access token: {e}")
|
|
124
|
-
raise
|
|
125
|
-
|
|
126
|
-
api_url = f"{base_url}/v1/uploads/process-upload/{upload_id}"
|
|
127
|
-
data = {"signed_url": signed_url}
|
|
128
|
-
headers = {
|
|
129
|
-
"Content-Type": "application/json",
|
|
130
|
-
"Authorization": f"Bearer {access_token}",
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
try:
|
|
134
|
-
response = requests.post(api_url, headers=headers, json=data)
|
|
135
|
-
response.raise_for_status()
|
|
136
|
-
|
|
137
|
-
response_data = response.json()
|
|
138
|
-
upload_id = response_data.get("upload_id")
|
|
139
|
-
signed_url = response_data.get("signed_url")
|
|
140
|
-
return upload_id, signed_url
|
|
141
|
-
except requests.exceptions.HTTPError as e:
|
|
142
|
-
logging.error(f"HTTP error occurred: {e}")
|
|
143
|
-
raise
|
|
144
|
-
except Exception as e:
|
|
145
|
-
logging.error(f"An error occurred: {e}")
|
|
146
|
-
raise
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
def get_upload_id(
|
|
150
|
-
base_url: str, api_key: str, system_id: str, system_name: str, verbose: bool = False
|
|
151
|
-
) -> tuple[str, str]:
|
|
152
|
-
"""
|
|
153
|
-
Modified client-side function to send both system_id and system_name.
|
|
154
|
-
"""
|
|
155
|
-
token_url = f"{base_url}/v1/auth/token"
|
|
156
|
-
token_response = requests.get(token_url, headers={"customer_specific_api_key": api_key})
|
|
157
|
-
token_response.raise_for_status()
|
|
158
|
-
access_token = token_response.json()["access_token"]
|
|
159
|
-
|
|
160
|
-
# Include system_name in the query parameters
|
|
161
|
-
api_url = (
|
|
162
|
-
f"{base_url}/v1/uploads/get-upload-id-signed-url?"
|
|
163
|
-
f"system_id={system_id}&system_name={system_name}"
|
|
164
|
-
)
|
|
165
|
-
headers = {
|
|
166
|
-
"Content-Type": "application/json",
|
|
167
|
-
"Authorization": f"Bearer {access_token}",
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
try:
|
|
171
|
-
response = requests.get(api_url, headers=headers)
|
|
172
|
-
response.raise_for_status()
|
|
173
|
-
upload_id = response.json()["upload_id"]
|
|
174
|
-
signed_url = response.json()["signed_url"]
|
|
175
|
-
return upload_id, signed_url
|
|
176
|
-
except requests.exceptions.HTTPError as e:
|
|
177
|
-
logging.error(f"HTTP error occurred: {e}")
|
|
178
|
-
raise
|
|
179
|
-
except Exception as e:
|
|
180
|
-
logging.error(f"An error occurred: {e}")
|
|
181
|
-
raise
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
class UploadValidator(BaseModel):
|
|
185
|
-
"""Validator for upload data format."""
|
|
186
|
-
|
|
187
|
-
model_config = ConfigDict(
|
|
188
|
-
from_attributes=True, # Replaces the deprecated orm_mode
|
|
189
|
-
validate_assignment=True,
|
|
190
|
-
extra="forbid", # Prevent additional fields
|
|
191
|
-
)
|
|
192
|
-
|
|
193
|
-
traces: list[dict[str, Any]]
|
|
194
|
-
dataset: dict[str, Any]
|
|
195
|
-
|
|
196
|
-
@field_validator("traces")
|
|
197
|
-
@classmethod
|
|
198
|
-
def validate_traces(cls, traces: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
|
199
|
-
if not traces:
|
|
200
|
-
raise ValueError("Traces list cannot be empty")
|
|
201
|
-
|
|
202
|
-
for trace in traces:
|
|
203
|
-
# Validate required fields in each trace
|
|
204
|
-
if "system_instance_id" not in trace:
|
|
205
|
-
raise ValueError("Each trace must have a system_instance_id")
|
|
206
|
-
if "partition" not in trace:
|
|
207
|
-
raise ValueError("Each trace must have a partition")
|
|
208
|
-
|
|
209
|
-
# Validate metadata if present
|
|
210
|
-
if "metadata" in trace and trace["metadata"] is not None:
|
|
211
|
-
if not isinstance(trace["metadata"], dict):
|
|
212
|
-
raise ValueError("Metadata must be a dictionary")
|
|
213
|
-
|
|
214
|
-
# Validate partition structure
|
|
215
|
-
partition = trace["partition"]
|
|
216
|
-
if not isinstance(partition, list):
|
|
217
|
-
raise ValueError("Partition must be a list")
|
|
218
|
-
|
|
219
|
-
for part in partition:
|
|
220
|
-
if "partition_index" not in part:
|
|
221
|
-
raise ValueError("Each partition element must have a partition_index")
|
|
222
|
-
if "events" not in part:
|
|
223
|
-
raise ValueError("Each partition element must have an events list")
|
|
224
|
-
|
|
225
|
-
# Validate events
|
|
226
|
-
events = part["events"]
|
|
227
|
-
if not isinstance(events, list):
|
|
228
|
-
raise ValueError("Events must be a list")
|
|
229
|
-
|
|
230
|
-
for event in events:
|
|
231
|
-
required_fields = [
|
|
232
|
-
"event_type",
|
|
233
|
-
"opened",
|
|
234
|
-
"closed",
|
|
235
|
-
"partition_index",
|
|
236
|
-
]
|
|
237
|
-
missing_fields = [f for f in required_fields if f not in event]
|
|
238
|
-
if missing_fields:
|
|
239
|
-
raise ValueError(f"Event missing required fields: {missing_fields}")
|
|
240
|
-
|
|
241
|
-
return traces
|
|
242
|
-
|
|
243
|
-
@field_validator("dataset")
|
|
244
|
-
@classmethod
|
|
245
|
-
def validate_dataset(cls, dataset: dict[str, Any]) -> dict[str, Any]:
|
|
246
|
-
required_fields = ["questions", "reward_signals"]
|
|
247
|
-
missing_fields = [f for f in required_fields if f not in dataset]
|
|
248
|
-
if missing_fields:
|
|
249
|
-
raise ValueError(f"Dataset missing required fields: {missing_fields}")
|
|
250
|
-
|
|
251
|
-
# Validate questions
|
|
252
|
-
questions = dataset["questions"]
|
|
253
|
-
if not isinstance(questions, list):
|
|
254
|
-
raise ValueError("Questions must be a list")
|
|
255
|
-
|
|
256
|
-
for question in questions:
|
|
257
|
-
if "intent" not in question or "criteria" not in question:
|
|
258
|
-
raise ValueError("Each question must have intent and criteria")
|
|
259
|
-
|
|
260
|
-
# Validate reward signals
|
|
261
|
-
reward_signals = dataset["reward_signals"]
|
|
262
|
-
if not isinstance(reward_signals, list):
|
|
263
|
-
raise ValueError("Reward signals must be a list")
|
|
264
|
-
|
|
265
|
-
return dataset
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
def validate_upload(traces: list[dict[str, Any]], dataset: dict[str, Any]):
|
|
269
|
-
# Validate the upload format before sending to server.
|
|
270
|
-
# Raises ValueError if validation fails.
|
|
271
|
-
try:
|
|
272
|
-
UploadValidator(traces=traces, dataset=dataset)
|
|
273
|
-
return True
|
|
274
|
-
except ValueError as e:
|
|
275
|
-
raise ValueError(f"Upload validation failed: {str(e)}")
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
def is_event_loop_running():
|
|
279
|
-
try:
|
|
280
|
-
asyncio.get_running_loop() # Check if there's a running event loop
|
|
281
|
-
return True
|
|
282
|
-
except RuntimeError:
|
|
283
|
-
# This exception is raised if no event loop is running
|
|
284
|
-
return False
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
def format_upload_output(
|
|
288
|
-
dataset: Dataset, traces: list[SystemTrace]
|
|
289
|
-
) -> tuple[list[dict[str, Any]], list[dict[str, Any]], list[dict[str, Any]]]:
|
|
290
|
-
# Format questions array
|
|
291
|
-
questions_data = [
|
|
292
|
-
{"intent": q.intent, "criteria": q.criteria, "id": q.id} for q in dataset.questions
|
|
293
|
-
]
|
|
294
|
-
|
|
295
|
-
# Format reward signals array with error handling
|
|
296
|
-
reward_signals_data = [
|
|
297
|
-
{
|
|
298
|
-
"system_instance_id": rs.system_instance_id,
|
|
299
|
-
"reward": rs.reward,
|
|
300
|
-
"question_id": rs.question_id,
|
|
301
|
-
"annotation": rs.annotation if hasattr(rs, "annotation") else None,
|
|
302
|
-
}
|
|
303
|
-
for rs in dataset.reward_signals
|
|
304
|
-
]
|
|
305
|
-
|
|
306
|
-
# Format traces array
|
|
307
|
-
traces_data = [
|
|
308
|
-
{
|
|
309
|
-
"system_instance_id": t.system_instance_id,
|
|
310
|
-
"metadata": t.metadata if t.metadata else None,
|
|
311
|
-
"partition": [
|
|
312
|
-
{
|
|
313
|
-
"partition_index": p.partition_index,
|
|
314
|
-
"events": [e.to_dict() for e in p.events],
|
|
315
|
-
}
|
|
316
|
-
for p in t.partition
|
|
317
|
-
],
|
|
318
|
-
}
|
|
319
|
-
for t in traces
|
|
320
|
-
]
|
|
321
|
-
|
|
322
|
-
return questions_data, reward_signals_data, traces_data
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
class UploadIdResponse(TypedDict):
|
|
326
|
-
message: str
|
|
327
|
-
upload_id: str
|
|
328
|
-
signed_url: str
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
class ProcessUploadResponse(TypedDict):
|
|
332
|
-
status: str
|
|
333
|
-
upload_id: str
|
|
334
|
-
signed_url: str
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
def upload(
|
|
338
|
-
dataset: Dataset,
|
|
339
|
-
traces: list[SystemTrace] = [],
|
|
340
|
-
verbose: bool = False,
|
|
341
|
-
show_payload: bool = False,
|
|
342
|
-
) -> tuple[
|
|
343
|
-
ProcessUploadResponse,
|
|
344
|
-
list[dict[str, Any]],
|
|
345
|
-
list[dict[str, Any]],
|
|
346
|
-
list[dict[str, Any]],
|
|
347
|
-
]:
|
|
348
|
-
"""Upload all system traces and dataset to the server.
|
|
349
|
-
|
|
350
|
-
DEPRECATED: Backend upload functionality is no longer supported in v1.
|
|
351
|
-
|
|
352
|
-
Args:
|
|
353
|
-
dataset: Dataset containing questions and reward signals
|
|
354
|
-
traces: List of system traces to upload
|
|
355
|
-
verbose: Whether to print verbose output
|
|
356
|
-
show_payload: Whether to show the payload being sent
|
|
357
|
-
|
|
358
|
-
Returns:
|
|
359
|
-
Tuple containing:
|
|
360
|
-
- response: Server response with status, upload_id, and signed_url
|
|
361
|
-
- questions_json: List of formatted questions
|
|
362
|
-
- reward_signals_json: List of formatted reward signals
|
|
363
|
-
- traces_json: List of formatted traces
|
|
364
|
-
|
|
365
|
-
Raises:
|
|
366
|
-
ValueError: If no system traces found or validation fails
|
|
367
|
-
requests.exceptions.HTTPError: If server request fails
|
|
368
|
-
RuntimeError: If SYNTH_API_KEY environment variable not set
|
|
369
|
-
"""
|
|
370
|
-
_raise_not_supported_error()
|
|
371
|
-
return upload_helper(dataset, traces, verbose, show_payload)
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
def upload_helper(
|
|
375
|
-
dataset: Dataset,
|
|
376
|
-
traces: list[SystemTrace] = [],
|
|
377
|
-
verbose: bool = False,
|
|
378
|
-
show_payload: bool = False,
|
|
379
|
-
) -> tuple[
|
|
380
|
-
ProcessUploadResponse,
|
|
381
|
-
list[dict[str, Any]],
|
|
382
|
-
list[dict[str, Any]],
|
|
383
|
-
list[dict[str, Any]],
|
|
384
|
-
]:
|
|
385
|
-
"""Helper function to handle the upload process.
|
|
386
|
-
|
|
387
|
-
Returns same type as upload() function.
|
|
388
|
-
"""
|
|
389
|
-
_raise_not_supported_error()
|
|
390
|
-
api_key = os.getenv("SYNTH_API_KEY")
|
|
391
|
-
if not api_key:
|
|
392
|
-
raise ValueError("SYNTH_API_KEY environment variable not set")
|
|
393
|
-
base_url = os.getenv("SYNTH_ENDPOINT_OVERRIDE", PROD_BASE_URL_DEFAULT)
|
|
394
|
-
|
|
395
|
-
from .decorators import _local, active_events_var
|
|
396
|
-
from .trackers import synth_tracker_async
|
|
397
|
-
|
|
398
|
-
# First close any tracker events
|
|
399
|
-
if hasattr(synth_tracker_async, "active_events"):
|
|
400
|
-
for event_type, event in list(synth_tracker_async.active_events.items()):
|
|
401
|
-
if event and event.closed is None:
|
|
402
|
-
event.closed = time.time()
|
|
403
|
-
try:
|
|
404
|
-
event_store.add_event(
|
|
405
|
-
event.system_name,
|
|
406
|
-
event.system_id,
|
|
407
|
-
event.system_instance_id,
|
|
408
|
-
event,
|
|
409
|
-
)
|
|
410
|
-
if verbose:
|
|
411
|
-
print(f"Closed and stored tracker async event: {event_type}")
|
|
412
|
-
except Exception as e:
|
|
413
|
-
logging.error(f"Failed to store tracker event {event_type}: {str(e)}")
|
|
414
|
-
synth_tracker_async.active_events.clear()
|
|
415
|
-
|
|
416
|
-
# End all active events before uploading
|
|
417
|
-
if hasattr(_local, "active_events"):
|
|
418
|
-
for event_type, event in _local.active_events.items():
|
|
419
|
-
if event and event.closed is None:
|
|
420
|
-
event.closed = time.time()
|
|
421
|
-
if hasattr(_local, "system_instance_id"):
|
|
422
|
-
try:
|
|
423
|
-
event_store.add_event(
|
|
424
|
-
_local.system_name,
|
|
425
|
-
_local.system_id,
|
|
426
|
-
_local.system_instance_id,
|
|
427
|
-
event,
|
|
428
|
-
)
|
|
429
|
-
if verbose:
|
|
430
|
-
print(f"Closed and stored active event: {event_type}")
|
|
431
|
-
except Exception as e:
|
|
432
|
-
logging.error(f"Failed to store event {event_type}: {str(e)}")
|
|
433
|
-
_local.active_events.clear()
|
|
434
|
-
|
|
435
|
-
# NEW: Close all open asynchronous events
|
|
436
|
-
active_events_async = active_events_var.get()
|
|
437
|
-
if active_events_async:
|
|
438
|
-
current_time = time.time()
|
|
439
|
-
for event_type, event in list(active_events_async.items()):
|
|
440
|
-
if event and event.closed is None:
|
|
441
|
-
event.closed = current_time
|
|
442
|
-
try:
|
|
443
|
-
event_store.add_event(
|
|
444
|
-
event.system_name,
|
|
445
|
-
event.system_id,
|
|
446
|
-
event.system_instance_id,
|
|
447
|
-
event,
|
|
448
|
-
)
|
|
449
|
-
if verbose:
|
|
450
|
-
print(f"Closed and stored async event: {event_type}")
|
|
451
|
-
except Exception as e:
|
|
452
|
-
logging.error(f"Failed to store async event {event_type}: {str(e)}")
|
|
453
|
-
active_events_var.set({})
|
|
454
|
-
|
|
455
|
-
# Also close any unclosed events in existing traces
|
|
456
|
-
logged_traces = event_store.get_system_traces()
|
|
457
|
-
traces = logged_traces + traces
|
|
458
|
-
# traces = event_store.get_system_traces() if len(traces) == 0 else traces
|
|
459
|
-
current_time = time.time()
|
|
460
|
-
for trace in traces:
|
|
461
|
-
for partition in trace.partition:
|
|
462
|
-
for event in partition.events:
|
|
463
|
-
if event.closed is None:
|
|
464
|
-
event.closed = current_time
|
|
465
|
-
event_store.add_event(
|
|
466
|
-
trace.system_name,
|
|
467
|
-
trace.system_id,
|
|
468
|
-
trace.system_instance_id,
|
|
469
|
-
event,
|
|
470
|
-
)
|
|
471
|
-
if verbose:
|
|
472
|
-
print(f"Closed existing unclosed event: {event.event_type}")
|
|
473
|
-
|
|
474
|
-
try:
|
|
475
|
-
# Get traces and convert to dict format
|
|
476
|
-
if len(traces) == 0:
|
|
477
|
-
raise ValueError("No system traces found")
|
|
478
|
-
traces_dict = [trace.to_dict() for trace in traces]
|
|
479
|
-
dataset_dict = dataset.to_dict()
|
|
480
|
-
|
|
481
|
-
# Validate upload format
|
|
482
|
-
if verbose:
|
|
483
|
-
print("Validating upload format...")
|
|
484
|
-
validate_upload(traces_dict, dataset_dict)
|
|
485
|
-
if verbose:
|
|
486
|
-
print("Upload format validation successful")
|
|
487
|
-
|
|
488
|
-
# Send to server
|
|
489
|
-
upload_id, signed_url = send_system_traces_s3(
|
|
490
|
-
dataset=dataset,
|
|
491
|
-
traces=traces,
|
|
492
|
-
base_url=base_url,
|
|
493
|
-
api_key=api_key,
|
|
494
|
-
system_id=traces[0].system_id,
|
|
495
|
-
system_name=traces[0].system_name,
|
|
496
|
-
verbose=verbose,
|
|
497
|
-
)
|
|
498
|
-
|
|
499
|
-
questions_json, reward_signals_json, traces_json = format_upload_output(dataset, traces)
|
|
500
|
-
return (
|
|
501
|
-
{
|
|
502
|
-
"status": "success",
|
|
503
|
-
"upload_id": upload_id,
|
|
504
|
-
"signed_url": signed_url,
|
|
505
|
-
},
|
|
506
|
-
questions_json,
|
|
507
|
-
reward_signals_json,
|
|
508
|
-
traces_json,
|
|
509
|
-
)
|
|
510
|
-
|
|
511
|
-
except ValueError as e:
|
|
512
|
-
if verbose:
|
|
513
|
-
print("Validation error:", str(e))
|
|
514
|
-
print("\nTraces:")
|
|
515
|
-
print(json.dumps(traces_dict, indent=2))
|
|
516
|
-
print("\nDataset:")
|
|
517
|
-
print(json.dumps(dataset_dict, indent=2))
|
|
518
|
-
raise
|
|
519
|
-
except requests.exceptions.HTTPError as e:
|
|
520
|
-
if verbose:
|
|
521
|
-
print("HTTP error occurred:", e)
|
|
522
|
-
print("\nTraces:")
|
|
523
|
-
print(json.dumps(traces_dict, indent=2))
|
|
524
|
-
print("\nDataset:")
|
|
525
|
-
print(json.dumps(dataset_dict, indent=2))
|
|
526
|
-
raise
|
|
527
|
-
# ruff: noqa
|
synth_ai/v0/tracing_v1/utils.py
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import uuid
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
def get_system_id(system_name: str) -> str:
|
|
5
|
-
"""Create a deterministic system_instance_id from system_name using UUID5."""
|
|
6
|
-
if not system_name:
|
|
7
|
-
raise ValueError("system_name cannot be empty")
|
|
8
|
-
system_id = uuid.uuid5(uuid.NAMESPACE_DNS, system_name)
|
|
9
|
-
return str(system_id)
|
synth_ai/zyk/__init__.py
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
DEPRECATED: This module has been moved to synth_ai.lm
|
|
3
|
-
|
|
4
|
-
The synth_ai.zyk module is deprecated and will be removed in a future version.
|
|
5
|
-
Please update your imports:
|
|
6
|
-
|
|
7
|
-
OLD: from synth_ai.zyk import LM
|
|
8
|
-
NEW: from synth_ai.lm.core.main import LM
|
|
9
|
-
|
|
10
|
-
or
|
|
11
|
-
|
|
12
|
-
NEW: from synth_ai import LM # (recommended)
|
|
13
|
-
"""
|
|
14
|
-
|
|
15
|
-
# ruff: noqa: E402
|
|
16
|
-
import warnings
|
|
17
|
-
|
|
18
|
-
# Issue deprecation warning
|
|
19
|
-
warnings.warn(
|
|
20
|
-
"synth_ai.zyk is deprecated and will be removed in a future version. "
|
|
21
|
-
"Please use 'from synth_ai import LM' or 'from synth_ai.lm.core.main import LM' instead.",
|
|
22
|
-
DeprecationWarning,
|
|
23
|
-
stacklevel=2,
|
|
24
|
-
)
|
|
25
|
-
|
|
26
|
-
# Import from new location for backward compatibility
|
|
27
|
-
from synth_ai.lm.core.main import LM
|
|
28
|
-
from synth_ai.lm.vendors.base import BaseLMResponse
|
|
29
|
-
|
|
30
|
-
__all__ = ["LM", "BaseLMResponse"]
|
|
@@ -1,131 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: synth-ai
|
|
3
|
-
Version: 0.2.9.dev0
|
|
4
|
-
Summary: RL as a service SDK - Core AI functionality and tracing
|
|
5
|
-
Author-email: Synth AI <josh@usesynth.ai>
|
|
6
|
-
License-Expression: MIT
|
|
7
|
-
Project-URL: Homepage, https://github.com/synth-laboratories/synth-ai
|
|
8
|
-
Project-URL: Repository, https://github.com/synth-laboratories/synth-ai
|
|
9
|
-
Project-URL: Issues, https://github.com/synth-laboratories/synth-ai/issues
|
|
10
|
-
Requires-Python: >=3.11
|
|
11
|
-
Description-Content-Type: text/markdown
|
|
12
|
-
License-File: LICENSE
|
|
13
|
-
Requires-Dist: pydantic>=2.0.0
|
|
14
|
-
Requires-Dist: python-dotenv>=1.0.1
|
|
15
|
-
Requires-Dist: requests>=2.32.3
|
|
16
|
-
Requires-Dist: urllib3>=2.3.0
|
|
17
|
-
Requires-Dist: certifi>=2024.8.30
|
|
18
|
-
Requires-Dist: tqdm>=4.66.4
|
|
19
|
-
Requires-Dist: jsonschema>=4.23.0
|
|
20
|
-
Requires-Dist: backoff>=2.0.0
|
|
21
|
-
Requires-Dist: typing_extensions>=4.0.0
|
|
22
|
-
Requires-Dist: openai>=1.99.0
|
|
23
|
-
Requires-Dist: anthropic>=0.42.0
|
|
24
|
-
Requires-Dist: langfuse<3.0.0,>=2.53.9
|
|
25
|
-
Requires-Dist: opentelemetry-api<1.27.0,>=1.26.0
|
|
26
|
-
Requires-Dist: opentelemetry-sdk<1.27.0,>=1.26.0
|
|
27
|
-
Requires-Dist: diskcache>=5.6.3
|
|
28
|
-
Requires-Dist: groq>=0.30.0
|
|
29
|
-
Requires-Dist: google-genai>=1.26.0
|
|
30
|
-
Requires-Dist: together>=1.5.21
|
|
31
|
-
Requires-Dist: mistralai>=1.9.2
|
|
32
|
-
Requires-Dist: fastapi>=0.115.12
|
|
33
|
-
Requires-Dist: uvicorn>=0.34.2
|
|
34
|
-
Requires-Dist: numpy>=2.2.3
|
|
35
|
-
Requires-Dist: networkx>=3.4.2
|
|
36
|
-
Requires-Dist: redis>=6.2.0
|
|
37
|
-
Requires-Dist: duckdb>=1.0.0
|
|
38
|
-
Requires-Dist: ty>=0.0.1a5
|
|
39
|
-
Requires-Dist: toml>=0.10.2
|
|
40
|
-
Requires-Dist: sqlalchemy>=2.0.42
|
|
41
|
-
Requires-Dist: aiosqlite>=0.21.0
|
|
42
|
-
Requires-Dist: greenlet>=3.2.3
|
|
43
|
-
Requires-Dist: libsql>=0.1.8
|
|
44
|
-
Requires-Dist: pynacl>=1.5.0
|
|
45
|
-
Requires-Dist: google-api-core>=2.25.1
|
|
46
|
-
Requires-Dist: google-generativeai>=0.8.5
|
|
47
|
-
Requires-Dist: crafter>=1.8.3
|
|
48
|
-
Requires-Dist: click>=8.1.0
|
|
49
|
-
Requires-Dist: textual>=1.1.0
|
|
50
|
-
Requires-Dist: openai-harmony>=0.0.1
|
|
51
|
-
Requires-Dist: asyncpg>=0.30.0
|
|
52
|
-
Requires-Dist: aiohttp>=3.8.0
|
|
53
|
-
Requires-Dist: datasets>=4.0.0
|
|
54
|
-
Requires-Dist: transformers>=4.56.1
|
|
55
|
-
Requires-Dist: modal>=1.1.0
|
|
56
|
-
Provides-Extra: dev
|
|
57
|
-
Requires-Dist: build>=1.2.2.post1; extra == "dev"
|
|
58
|
-
Requires-Dist: twine>=4.0.0; extra == "dev"
|
|
59
|
-
Requires-Dist: keyring>=24.0.0; extra == "dev"
|
|
60
|
-
Requires-Dist: pytest>=8.3.3; extra == "dev"
|
|
61
|
-
Requires-Dist: pytest-asyncio>=0.24.0; extra == "dev"
|
|
62
|
-
Requires-Dist: pytest-cov>=4.1.0; extra == "dev"
|
|
63
|
-
Requires-Dist: pyright>=1.1.350; extra == "dev"
|
|
64
|
-
Requires-Dist: coverage[toml]>=7.3.0; extra == "dev"
|
|
65
|
-
Requires-Dist: ruff>=0.1.0; extra == "dev"
|
|
66
|
-
Provides-Extra: research
|
|
67
|
-
Requires-Dist: crafter>=1.8.3; extra == "research"
|
|
68
|
-
Requires-Dist: datasets>=4.0.0; extra == "research"
|
|
69
|
-
Provides-Extra: all
|
|
70
|
-
Requires-Dist: crafter>=1.8.3; extra == "all"
|
|
71
|
-
Requires-Dist: datasets>=4.0.0; extra == "all"
|
|
72
|
-
Provides-Extra: analytics
|
|
73
|
-
Requires-Dist: pandas>=2.2.3; extra == "analytics"
|
|
74
|
-
Dynamic: license-file
|
|
75
|
-
|
|
76
|
-
# Synth-AI
|
|
77
|
-
|
|
78
|
-
[](https://www.python.org/)
|
|
79
|
-
[](LICENSE)
|
|
80
|
-
[](https://pypi.org/project/synth-ai/)
|
|
81
|
-

|
|
82
|
-

|
|
83
|
-
|
|
84
|
-
Docs: [Synth‑AI Documentation](https://docs.usesynth.ai/synth-ai/introduction)
|
|
85
|
-
|
|
86
|
-
Fast and effective reinforcement learning for agents, via an API
|
|
87
|
-
|
|
88
|
-
## Highlights
|
|
89
|
-
|
|
90
|
-
- Easily scale gpu topologies - train on 3 a10gs or 8 H100s (multi-node available upon request)
|
|
91
|
-
- Requires only a thin fastapi wrapper to integrate with existing agent software.
|
|
92
|
-
- Supports the best OSS models like Qwen3. (gpt-oss available upon request, GA soon)
|
|
93
|
-
- Own your trained models
|
|
94
|
-
|
|
95
|
-
## Getting Started
|
|
96
|
-
|
|
97
|
-
synth-ai comes with a built-in RL example tailored for training Qwen/Qwen3-0.6B to succeed at Math.
|
|
98
|
-
|
|
99
|
-
Please create an account at [Synth](https://usesynth.ai) and [Modal](https://modal.com) for the Math hello‑world test run. Then run:
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
uvx synth-ai demo
|
|
103
|
-
uvx synth-ai setup
|
|
104
|
-
uvx synth-ai deploy
|
|
105
|
-
uvx synth-ai run
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
To walk through kicking off your first RL run, see the [Synth‑AI Documentation](https://docs.usesynth.ai/synth-ai/introduction).
|
|
109
|
-
|
|
110
|
-
### What `setup` does now
|
|
111
|
-
|
|
112
|
-
When you run `uvx synth-ai setup` (or the legacy `uvx synth-ai rl_demo setup`), the SDK opens your browser to the Synth dashboard for a one‑time pairing (handshake) with your signed‑in session. The SDK will automatically:
|
|
113
|
-
|
|
114
|
-
- Detect your current user and organization
|
|
115
|
-
- Ensure both API keys exist for that user+org
|
|
116
|
-
- Write the keys to your project’s `.env` file as `SYNTH_API_KEY` and `ENVIRONMENT_API_KEY`
|
|
117
|
-
|
|
118
|
-
No keys are printed or requested interactively. You’ll see a confirmation like:
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
Connecting SDK to your browser session…
|
|
122
|
-
Connected to Acme Labs via browser.
|
|
123
|
-
```
|
|
124
|
-
|
|
125
|
-
If your browser isn’t already signed in, sign in when prompted and the pairing completes automatically. The dashboard’s welcome modal will reflect a successful pairing.
|
|
126
|
-
|
|
127
|
-
Environment variables:
|
|
128
|
-
|
|
129
|
-
- `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `https://www.usesynth.ai/dashboard`).
|
|
130
|
-
- `SYNTH_CANONICAL_DEV` (optional): set to `1`, `true`, `yes`, or `on` to target the local dashboard at `http://localhost:3000`.
|
|
131
|
-
- Keys are stored only in your project’s `.env` file, not exported to your shell.
|