synth-ai 0.2.7__tar.gz → 0.2.8__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synth-ai might be problematic. Click here for more details.
- {synth_ai-0.2.7/synth_ai.egg-info → synth_ai-0.2.8}/PKG-INFO +9 -7
- {synth_ai-0.2.7 → synth_ai-0.2.8}/README.md +7 -5
- {synth_ai-0.2.7 → synth_ai-0.2.8}/pyproject.toml +2 -2
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/demo.py +44 -39
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/root.py +6 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/core/cli.py +19 -25
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/modal_task_app.py +9 -3
- synth_ai-0.2.8/synth_ai/handshake.py +107 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8/synth_ai.egg-info}/PKG-INFO +9 -7
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/requires.txt +1 -1
- synth_ai-0.2.7/synth_ai/handshake.py +0 -63
- {synth_ai-0.2.7 → synth_ai-0.2.8}/LICENSE +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/MANIFEST.in +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/setup.cfg +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/__main__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/balance.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/calc.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/legacy_root_backup.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/man.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/recent.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/rl_demo.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/status.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/traces.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/cli/watch.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/compound/cais.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/config/base_url.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/core/experiment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/core/system.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/core/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/core.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/_common.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/app.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/config.toml +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/deploy_modal.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/artifacts/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/artifacts/base.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/core.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/db/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/db/sqlite.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/registry.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/resources/sqlite.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/results.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/rewards/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/rewards/core.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/shared_engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/environment/tools/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/bandit/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/bandit/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/bandit/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/bandit/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/config_logging.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/enron/units/keyword_stats.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/environment_mapping.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/minigrid/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/achievements.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/nethack/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/agent_demos/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/config_logging.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/red/units/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/sokoban/units/astar_common.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/tictactoe/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/tictactoe/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/tictactoe/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/tictactoe/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/verilog/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/verilog/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/verilog/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/verilog/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/environment.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/examples/wordle/taskset.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/reproducibility/core.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/reproducibility/helpers.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/reproducibility/tree.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/service/app.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/service/core_routes.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/service/external_registry.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/service/registry.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/stateful/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/stateful/core.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/stateful/engine.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/stateful/state.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/tasks/api.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/tasks/core.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/tasks/filters.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/tasks/utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/v0_observability/history.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/environments/v0_observability/log.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/evals/base.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/experimental/synth_oss.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/http.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/http_client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/inference/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/inference/client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/install_sqld.sh +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/jobs/client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/config.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/constants.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/core.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/filtering.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/ft_client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/gateway.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/health.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/jobs.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/offline/dpo.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/offline/providers.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/offline/sft.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/offline/shared.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/online/grpo.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/online/irft.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/banking77_injection_eval.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/gepa.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/mipro.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/random_search.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/run_mipro_banking77.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/prompts/run_random_search_banking77.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/rl_client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/sse.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/learning/validators.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/constants.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/dbs.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/ephemeral.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/handler.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/initialize.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/caching/persistent.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/config.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/constants.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/all.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/exceptions.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/main.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/main_v3.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/synth_models.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/core/vendor_clients.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/cost/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/cost/monitor.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/cost/statefulness.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/injection.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/overrides.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/provider_support/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/provider_support/anthropic.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/provider_support/openai.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/provider_support/suppress_logging.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/structured_outputs/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/structured_outputs/handler.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/structured_outputs/inject.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/structured_outputs/rehabilitate.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/tools/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/tools/base.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/unified_interface.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/base.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/anthropic_api.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/gemini_api.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/mistral_api.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/openai_api.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/local/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/local/ollama.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/openai_standard.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/openai_standard_responses.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/retries.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/custom_endpoint.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/deepseek.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/grok.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/groq.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/ollama.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/openrouter.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/supported/together.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/vendors/synth_client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/lm/warmup.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/rl/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/rl/contracts.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/rl/env_keys.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/rl/secrets.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/scripts/verify_rewards.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/task/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/task/contracts.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/task/health.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/task/validators.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v1/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/abstractions.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/config.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/db_config.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/decorators.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/examples/basic_usage.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/hooks.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/llm_call_record_helpers.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/lm_call_record_abstractions.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/migration_helper.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/replica_sync.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/session_tracer.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/base.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/config.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/exceptions.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/factory.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/types.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/storage/utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/turso/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/turso/daemon.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/turso/manager.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/turso/models.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/tracing_v3/utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/abstractions.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/base_client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/client_manager.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/config.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/context.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/decorators.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/events/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/events/manage.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/events/scope.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/events/store.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/immediate_client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/local.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/log_client_base.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/retry_queue.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/trackers.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/upload.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing/utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/abstractions.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/base_client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/client_manager.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/config.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/context.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/decorators.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/events/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/events/manage.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/events/scope.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/events/store.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/immediate_client.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/local.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/log_client_base.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/retry_queue.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/trackers.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/upload.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/v0/tracing_v1/utils.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai/zyk/__init__.py +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/SOURCES.txt +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/dependency_links.txt +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/entry_points.txt +0 -0
- {synth_ai-0.2.7 → synth_ai-0.2.8}/synth_ai.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synth-ai
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.8
|
|
4
4
|
Summary: RL as a service SDK - Core AI functionality and tracing
|
|
5
5
|
Author-email: Synth AI <josh@usesynth.ai>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -53,7 +53,7 @@ Requires-Dist: asyncpg>=0.30.0
|
|
|
53
53
|
Requires-Dist: aiohttp>=3.8.0
|
|
54
54
|
Requires-Dist: datasets>=4.0.0
|
|
55
55
|
Requires-Dist: transformers>=4.56.1
|
|
56
|
-
Requires-Dist: modal>=1.1.
|
|
56
|
+
Requires-Dist: modal>=1.1.0
|
|
57
57
|
Provides-Extra: dev
|
|
58
58
|
Requires-Dist: build>=1.2.2.post1; extra == "dev"
|
|
59
59
|
Requires-Dist: twine>=4.0.0; extra == "dev"
|
|
@@ -98,16 +98,17 @@ synth-ai comes with a built-in RL example tailored for training Qwen/Qwen3-0.6B
|
|
|
98
98
|
Please create an account at [Synth](https://usesynth.ai) and [Modal](https://modal.com) for the Math hello‑world test run. Then run:
|
|
99
99
|
|
|
100
100
|
```bash
|
|
101
|
-
uvx synth-ai
|
|
102
|
-
uvx synth-ai
|
|
101
|
+
uvx synth-ai demo
|
|
102
|
+
uvx synth-ai setup
|
|
103
|
+
uvx synth-ai deploy
|
|
103
104
|
uvx synth-ai run
|
|
104
105
|
```
|
|
105
106
|
|
|
106
107
|
To walk through kicking off your first RL run, see the [Synth‑AI Documentation](https://docs.usesynth.ai/synth-ai/introduction).
|
|
107
108
|
|
|
108
|
-
### What `
|
|
109
|
+
### What `setup` does now
|
|
109
110
|
|
|
110
|
-
When you run `uvx synth-ai rl_demo setup
|
|
111
|
+
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:
|
|
111
112
|
|
|
112
113
|
- Detect your current user and organization
|
|
113
114
|
- Ensure both API keys exist for that user+org
|
|
@@ -124,5 +125,6 @@ If your browser isn’t already signed in, sign in when prompted and the pairing
|
|
|
124
125
|
|
|
125
126
|
Environment variables:
|
|
126
127
|
|
|
127
|
-
- `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `
|
|
128
|
+
- `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `https://www.usesynth.ai/dashboard`).
|
|
129
|
+
- `SYNTH_CANONICAL_DEV` (optional): set to `1`, `true`, `yes`, or `on` to target the local dashboard at `http://localhost:3000`.
|
|
128
130
|
- Keys are stored only in your project’s `.env` file, not exported to your shell.
|
|
@@ -24,16 +24,17 @@ synth-ai comes with a built-in RL example tailored for training Qwen/Qwen3-0.6B
|
|
|
24
24
|
Please create an account at [Synth](https://usesynth.ai) and [Modal](https://modal.com) for the Math hello‑world test run. Then run:
|
|
25
25
|
|
|
26
26
|
```bash
|
|
27
|
-
uvx synth-ai
|
|
28
|
-
uvx synth-ai
|
|
27
|
+
uvx synth-ai demo
|
|
28
|
+
uvx synth-ai setup
|
|
29
|
+
uvx synth-ai deploy
|
|
29
30
|
uvx synth-ai run
|
|
30
31
|
```
|
|
31
32
|
|
|
32
33
|
To walk through kicking off your first RL run, see the [Synth‑AI Documentation](https://docs.usesynth.ai/synth-ai/introduction).
|
|
33
34
|
|
|
34
|
-
### What `
|
|
35
|
+
### What `setup` does now
|
|
35
36
|
|
|
36
|
-
When you run `uvx synth-ai rl_demo setup
|
|
37
|
+
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:
|
|
37
38
|
|
|
38
39
|
- Detect your current user and organization
|
|
39
40
|
- Ensure both API keys exist for that user+org
|
|
@@ -50,5 +51,6 @@ If your browser isn’t already signed in, sign in when prompted and the pairing
|
|
|
50
51
|
|
|
51
52
|
Environment variables:
|
|
52
53
|
|
|
53
|
-
- `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `
|
|
54
|
+
- `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `https://www.usesynth.ai/dashboard`).
|
|
55
|
+
- `SYNTH_CANONICAL_DEV` (optional): set to `1`, `true`, `yes`, or `on` to target the local dashboard at `http://localhost:3000`.
|
|
54
56
|
- Keys are stored only in your project’s `.env` file, not exported to your shell.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "synth-ai"
|
|
3
|
-
version = "0.2.
|
|
3
|
+
version = "0.2.8"
|
|
4
4
|
description = "RL as a service SDK - Core AI functionality and tracing"
|
|
5
5
|
authors = [{name = "Synth AI", email = "josh@usesynth.ai"}]
|
|
6
6
|
license = "MIT"
|
|
@@ -55,7 +55,7 @@ dependencies = [
|
|
|
55
55
|
"aiohttp>=3.8.0", # For async HTTP requests in Harmony integration
|
|
56
56
|
"datasets>=4.0.0",
|
|
57
57
|
"transformers>=4.56.1",
|
|
58
|
-
"modal>=1.1.
|
|
58
|
+
"modal>=1.1.0",
|
|
59
59
|
]
|
|
60
60
|
|
|
61
61
|
[project.scripts]
|
|
@@ -35,60 +35,65 @@ def _forward_to_new(args: list[str]) -> None:
|
|
|
35
35
|
|
|
36
36
|
def register(cli):
|
|
37
37
|
@cli.group("demo", invoke_without_command=True)
|
|
38
|
+
@click.option("--force", is_flag=True, help="Overwrite existing files in CWD when initializing demo")
|
|
38
39
|
@click.option("--list", "list_only", is_flag=True, help="List available legacy demos and exit")
|
|
39
40
|
@click.option("-f", "filter_term", default="", help="Filter legacy demos by substring")
|
|
40
41
|
@click.pass_context
|
|
41
|
-
def demo(ctx: click.Context, list_only: bool, filter_term: str):
|
|
42
|
+
def demo(ctx: click.Context, force: bool, list_only: bool, filter_term: str):
|
|
42
43
|
"""Demo helpers.
|
|
43
44
|
|
|
44
|
-
-
|
|
45
|
+
- Default (no subcommand): initialize RL demo files into ./synth_demo/ (alias of rl_demo init)
|
|
46
|
+
- Legacy mode: with --list, find and run examples/*/run_demo.sh
|
|
45
47
|
- New RL demo subcommands: deploy, configure, run
|
|
46
48
|
"""
|
|
47
49
|
if ctx.invoked_subcommand is not None:
|
|
48
50
|
return
|
|
49
|
-
# Legacy behavior: interactive examples runner
|
|
50
|
-
repo_root = Path(os.getcwd())
|
|
51
|
-
examples_dir = repo_root / "examples"
|
|
52
|
-
demos = _find_demo_scripts(examples_dir)
|
|
53
|
-
if filter_term:
|
|
54
|
-
demos = [p for p in demos if filter_term.lower() in str(p).lower()]
|
|
55
|
-
|
|
56
|
-
if not demos:
|
|
57
|
-
click.echo("No run_demo.sh scripts found under examples/.")
|
|
58
|
-
return
|
|
59
51
|
|
|
52
|
+
# If explicitly asked to list legacy demos, show interactive picker
|
|
60
53
|
if list_only:
|
|
54
|
+
repo_root = Path(os.getcwd())
|
|
55
|
+
examples_dir = repo_root / "examples"
|
|
56
|
+
demos = _find_demo_scripts(examples_dir)
|
|
57
|
+
if filter_term:
|
|
58
|
+
demos = [p for p in demos if filter_term.lower() in str(p).lower()]
|
|
59
|
+
|
|
60
|
+
if not demos:
|
|
61
|
+
click.echo("No run_demo.sh scripts found under examples/.")
|
|
62
|
+
return
|
|
63
|
+
|
|
61
64
|
click.echo("Available demos:")
|
|
62
|
-
for p in demos:
|
|
63
|
-
click.echo(f"
|
|
64
|
-
|
|
65
|
+
for idx, p in enumerate(demos, start=1):
|
|
66
|
+
click.echo(f" {idx}. {p.relative_to(repo_root)}")
|
|
67
|
+
click.echo("")
|
|
68
|
+
|
|
69
|
+
def _validate_choice(val: str) -> int:
|
|
70
|
+
try:
|
|
71
|
+
i = int(val)
|
|
72
|
+
except Exception as err:
|
|
73
|
+
raise click.BadParameter("Enter a number from the list") from err
|
|
74
|
+
if i < 1 or i > len(demos):
|
|
75
|
+
raise click.BadParameter(f"Choose a number between 1 and {len(demos)}")
|
|
76
|
+
return i
|
|
65
77
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
78
|
+
choice = click.prompt("Select a demo to run", value_proc=_validate_choice)
|
|
79
|
+
script = demos[choice - 1]
|
|
80
|
+
|
|
81
|
+
click.echo("")
|
|
82
|
+
click.echo(f"🚀 Running {script.relative_to(repo_root)}\n")
|
|
70
83
|
|
|
71
|
-
def _validate_choice(val: str) -> int:
|
|
72
84
|
try:
|
|
73
|
-
|
|
74
|
-
except
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
return
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
try:
|
|
87
|
-
subprocess.run(["bash", str(script)], check=True)
|
|
88
|
-
except subprocess.CalledProcessError as e:
|
|
89
|
-
click.echo(f"❌ Demo exited with non-zero status: {e.returncode}")
|
|
90
|
-
except KeyboardInterrupt:
|
|
91
|
-
click.echo("\n🛑 Demo interrupted by user")
|
|
85
|
+
subprocess.run(["bash", str(script)], check=True)
|
|
86
|
+
except subprocess.CalledProcessError as e:
|
|
87
|
+
click.echo(f"❌ Demo exited with non-zero status: {e.returncode}")
|
|
88
|
+
except KeyboardInterrupt:
|
|
89
|
+
click.echo("\n🛑 Demo interrupted by user")
|
|
90
|
+
return
|
|
91
|
+
|
|
92
|
+
# Default: forward to RL demo init behavior, optionally with --force
|
|
93
|
+
args: list[str] = ["rl_demo.init"]
|
|
94
|
+
if force:
|
|
95
|
+
args.append("--force")
|
|
96
|
+
_forward_to_new(args)
|
|
92
97
|
|
|
93
98
|
# (prepare command removed; configure now prepares baseline TOML)
|
|
94
99
|
|
|
@@ -142,6 +142,12 @@ def run(batch_size: int | None, group_size: int | None, model: str | None, timeo
|
|
|
142
142
|
_forward_to_demo(args)
|
|
143
143
|
|
|
144
144
|
|
|
145
|
+
@cli.command()
|
|
146
|
+
def setup():
|
|
147
|
+
"""Perform SDK handshake and write keys to .env."""
|
|
148
|
+
_forward_to_demo(["rl_demo.setup"])
|
|
149
|
+
|
|
150
|
+
|
|
145
151
|
@cli.command()
|
|
146
152
|
@click.option("--db-file", default="traces/v3/synth_ai.db", help="Database file path")
|
|
147
153
|
@click.option("--sqld-port", default=8080, type=int, help="Port for sqld HTTP interface")
|
|
@@ -66,15 +66,6 @@ def cmd_setup(_args: argparse.Namespace) -> int:
|
|
|
66
66
|
env = demo_core.load_env()
|
|
67
67
|
local_env = demo_core.load_dotenv_file(cwd_env_path)
|
|
68
68
|
|
|
69
|
-
def _is_modal_public_url(u: str) -> bool:
|
|
70
|
-
try:
|
|
71
|
-
s = (u or "").strip().lower()
|
|
72
|
-
if not (s.startswith("http://") or s.startswith("https://")):
|
|
73
|
-
return False
|
|
74
|
-
return (".modal.run" in s) and ("modal.local" not in s) and ("pypi-mirror" not in s)
|
|
75
|
-
except Exception:
|
|
76
|
-
return False
|
|
77
|
-
|
|
78
69
|
def _maybe_fix_task_url() -> None:
|
|
79
70
|
if not env.task_app_name:
|
|
80
71
|
return
|
|
@@ -772,7 +763,10 @@ def cmd_deploy(args: argparse.Namespace) -> int:
|
|
|
772
763
|
raise FileNotFoundError(f"App file not found: {app_path}")
|
|
773
764
|
# Surface the app path before asking for the name
|
|
774
765
|
print(f"Using task app: {app_path}")
|
|
775
|
-
|
|
766
|
+
existing_name = (args.name or env.task_app_name or "").strip()
|
|
767
|
+
if not existing_name:
|
|
768
|
+
existing_name = f"synth-{os.path.splitext(os.path.basename(app_path))[0]}"
|
|
769
|
+
suggested_name = existing_name
|
|
776
770
|
name_in = input(f"Modal app name [{suggested_name}]: ").strip() or suggested_name
|
|
777
771
|
app_name = name_in
|
|
778
772
|
print("\nAbout to deploy with:")
|
|
@@ -783,7 +777,11 @@ def cmd_deploy(args: argparse.Namespace) -> int:
|
|
|
783
777
|
print("Aborted by user.")
|
|
784
778
|
return 1
|
|
785
779
|
|
|
786
|
-
|
|
780
|
+
prev_secret = (env.task_app_secret_name or "").strip()
|
|
781
|
+
default_secret = f"{name_in}-secret"
|
|
782
|
+
secret_name = default_secret if not prev_secret else prev_secret
|
|
783
|
+
if prev_secret and prev_secret != default_secret:
|
|
784
|
+
secret_name = default_secret
|
|
787
785
|
existing_env_key = (env.env_api_key or "").strip()
|
|
788
786
|
env_key: str | None = existing_env_key or None
|
|
789
787
|
if existing_env_key:
|
|
@@ -808,24 +806,24 @@ def cmd_deploy(args: argparse.Namespace) -> int:
|
|
|
808
806
|
print("[deploy] Minted new ENVIRONMENT_API_KEY")
|
|
809
807
|
|
|
810
808
|
# Optionally upload the new key to the backend using sealed box helper
|
|
811
|
-
backend_base = env.dev_backend_url or ""
|
|
809
|
+
backend_base = (env.dev_backend_url or "").rstrip("/")
|
|
812
810
|
synth_key = (env.synth_api_key or os.environ.get("SYNTH_API_KEY") or local_env.get("SYNTH_API_KEY") or "").strip()
|
|
813
811
|
if backend_base and synth_key:
|
|
814
|
-
|
|
815
|
-
|
|
816
|
-
|
|
812
|
+
# Pass a base WITHOUT trailing /api to setup_environment_api_key,
|
|
813
|
+
# since it appends /api/v1/... internally.
|
|
814
|
+
non_api_base = backend_base[:-4] if backend_base.endswith("/api") else backend_base
|
|
817
815
|
try:
|
|
818
816
|
choice = input(
|
|
819
|
-
f"Upload ENVIRONMENT_API_KEY to backend {
|
|
817
|
+
f"Upload ENVIRONMENT_API_KEY to backend {non_api_base}? [Y/n]: "
|
|
820
818
|
).strip().lower() or "y"
|
|
821
819
|
except Exception:
|
|
822
820
|
choice = "y"
|
|
823
821
|
if choice.startswith("y"):
|
|
824
822
|
try:
|
|
825
|
-
print(f"[deploy] Uploading ENVIRONMENT_API_KEY to {
|
|
823
|
+
print(f"[deploy] Uploading ENVIRONMENT_API_KEY to {non_api_base} …")
|
|
826
824
|
from synth_ai.rl.env_keys import setup_environment_api_key
|
|
827
825
|
|
|
828
|
-
setup_environment_api_key(
|
|
826
|
+
setup_environment_api_key(non_api_base, synth_key, token=env_key)
|
|
829
827
|
print("[deploy] Backend sealed-box upload complete.")
|
|
830
828
|
except Exception as upload_err:
|
|
831
829
|
print(f"[deploy] Failed to upload ENVIRONMENT_API_KEY: {upload_err}")
|
|
@@ -926,7 +924,7 @@ def cmd_deploy(args: argparse.Namespace) -> int:
|
|
|
926
924
|
print(f" export TASK_APP_NAME={app_name}")
|
|
927
925
|
print(f" export TASK_APP_SECRET_NAME={app_name}-secret")
|
|
928
926
|
print(f"Persisted to {dotenv_path}")
|
|
929
|
-
print("
|
|
927
|
+
print("\nNext step:\n$ uvx synth-ai run")
|
|
930
928
|
return 0
|
|
931
929
|
except Exception as e:
|
|
932
930
|
print(f"Deploy error: {e}")
|
|
@@ -1079,11 +1077,7 @@ fi
|
|
|
1079
1077
|
if os.path.exists(dst_cfg):
|
|
1080
1078
|
print(f" - {dst_cfg} (seeded)")
|
|
1081
1079
|
print("")
|
|
1082
|
-
print("
|
|
1083
|
-
print(" 1) cd synth_demo && put your ENVIRONMENT_API_KEY in ./.env")
|
|
1084
|
-
print(" 2) Deploy to Modal:")
|
|
1085
|
-
print(" uvx bash ./deploy_task_app.sh")
|
|
1086
|
-
print(" 3) From project root, run: uvx synth-ai run")
|
|
1080
|
+
print("\nNext step:\n$ uvx synth-ai setup")
|
|
1087
1081
|
return 0
|
|
1088
1082
|
except Exception as e:
|
|
1089
1083
|
print(f"Init error: {e}")
|
|
@@ -1372,7 +1366,7 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
1372
1366
|
def _deploy_opts(parser):
|
|
1373
1367
|
parser.add_argument("--local", action="store_true", help="Run local FastAPI instead of Modal deploy")
|
|
1374
1368
|
parser.add_argument("--app", type=str, default=None, help="Path to Modal app.py for uv run modal deploy")
|
|
1375
|
-
parser.add_argument("--name", type=str, default=
|
|
1369
|
+
parser.add_argument("--name", type=str, default=None, help="Modal app name")
|
|
1376
1370
|
parser.add_argument("--script", type=str, default=None, help="Path to deploy_task_app.sh (optional legacy)")
|
|
1377
1371
|
parser.set_defaults(func=cmd_deploy)
|
|
1378
1372
|
|
|
@@ -43,7 +43,15 @@ if _SYNTH_HOSTED is not None:
|
|
|
43
43
|
# No extra local dirs required; app is self-contained
|
|
44
44
|
|
|
45
45
|
app = App("hendrycks-math-task-app")
|
|
46
|
-
_SECRET_NAME =
|
|
46
|
+
_SECRET_NAME = (
|
|
47
|
+
os.getenv("TASK_APP_SECRET_NAME")
|
|
48
|
+
or os.getenv("MATH_TASK_APP_SECRET")
|
|
49
|
+
or os.getenv("TASK_APP_NAME", "").strip()
|
|
50
|
+
)
|
|
51
|
+
if not _SECRET_NAME:
|
|
52
|
+
_SECRET_NAME = "synth-math-demo-secret"
|
|
53
|
+
elif not _SECRET_NAME.endswith("-secret"):
|
|
54
|
+
_SECRET_NAME = f"{_SECRET_NAME}-secret"
|
|
47
55
|
|
|
48
56
|
|
|
49
57
|
@app.function(
|
|
@@ -411,5 +419,3 @@ def fastapi_app():
|
|
|
411
419
|
}
|
|
412
420
|
|
|
413
421
|
return api
|
|
414
|
-
|
|
415
|
-
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
import os
|
|
3
|
+
import time
|
|
4
|
+
import webbrowser
|
|
5
|
+
from typing import Any, Dict, Tuple
|
|
6
|
+
from urllib.parse import urljoin, urlsplit, urlunsplit
|
|
7
|
+
|
|
8
|
+
import requests
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class HandshakeError(Exception):
|
|
12
|
+
pass
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
_TRUTHY = {"1", "true", "yes", "on"}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def _origin() -> str:
|
|
19
|
+
"""Resolve the dashboard origin for the browser handshake.
|
|
20
|
+
|
|
21
|
+
Priority order:
|
|
22
|
+
1. Explicit ``SYNTH_CANONICAL_ORIGIN`` override.
|
|
23
|
+
2. Development flag ``SYNTH_CANONICAL_DEV`` (case-insensitive truthy) → localhost.
|
|
24
|
+
3. Production dashboard at ``https://www.usesynth.ai/dashboard``.
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
override = (os.getenv("SYNTH_CANONICAL_ORIGIN") or "").strip()
|
|
28
|
+
if override:
|
|
29
|
+
return override.rstrip("/")
|
|
30
|
+
|
|
31
|
+
dev_flag = (os.getenv("SYNTH_CANONICAL_DEV") or "").strip().lower()
|
|
32
|
+
if dev_flag in _TRUTHY:
|
|
33
|
+
print("USING DEV ORIGIN")
|
|
34
|
+
return "http://localhost:3000"
|
|
35
|
+
|
|
36
|
+
return "https://www.usesynth.ai/dashboard"
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def _split_origin(origin: str) -> tuple[str, str]:
|
|
40
|
+
parsed = urlsplit(origin)
|
|
41
|
+
bare = urlunsplit((parsed.scheme, parsed.netloc, "", "", ""))
|
|
42
|
+
path = parsed.path.rstrip("/")
|
|
43
|
+
return bare, path
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _ensure_verification_uri(data: Dict[str, Any], base_with_path: str) -> None:
|
|
47
|
+
uri = data.get("verification_uri")
|
|
48
|
+
if not isinstance(uri, str) or not uri:
|
|
49
|
+
return
|
|
50
|
+
if uri.startswith("http://") or uri.startswith("https://"):
|
|
51
|
+
return
|
|
52
|
+
data["verification_uri"] = urljoin(base_with_path.rstrip("/") + "/", uri.lstrip("/"))
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def start_handshake_session(origin: str | None = None) -> Tuple[str, str, int, int]:
|
|
56
|
+
base = (origin or _origin()).rstrip("/")
|
|
57
|
+
api_origin, _ = _split_origin(base)
|
|
58
|
+
url = urljoin(api_origin.rstrip("/") + "/", "api/sdk/handshake/init")
|
|
59
|
+
r = requests.post(url, timeout=10)
|
|
60
|
+
if r.status_code != 200:
|
|
61
|
+
raise HandshakeError(f"init failed: {r.status_code} {r.text}")
|
|
62
|
+
try:
|
|
63
|
+
data = r.json()
|
|
64
|
+
except ValueError as exc: # pragma: no cover - network dependent
|
|
65
|
+
raise HandshakeError(f"init returned malformed JSON: {exc}") from exc
|
|
66
|
+
_ensure_verification_uri(data, base)
|
|
67
|
+
return (
|
|
68
|
+
str(data.get("device_code")),
|
|
69
|
+
str(data.get("verification_uri")),
|
|
70
|
+
int(data.get("expires_in", 600)),
|
|
71
|
+
int(data.get("interval", 3)),
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
def poll_handshake_token(device_code: str, origin: str | None = None, *, timeout_s: int | None = None) -> Dict[str, Any]:
|
|
76
|
+
base = (origin or _origin()).rstrip("/")
|
|
77
|
+
api_origin, _ = _split_origin(base)
|
|
78
|
+
url = urljoin(api_origin.rstrip("/") + "/", "api/sdk/handshake/token")
|
|
79
|
+
deadline = time.time() + (timeout_s or 600)
|
|
80
|
+
while True:
|
|
81
|
+
if time.time() > deadline:
|
|
82
|
+
raise HandshakeError("handshake timed out")
|
|
83
|
+
try:
|
|
84
|
+
r = requests.post(url, json={"device_code": device_code}, timeout=10)
|
|
85
|
+
except Exception as e:
|
|
86
|
+
time.sleep(2)
|
|
87
|
+
continue
|
|
88
|
+
if r.status_code == 200:
|
|
89
|
+
try:
|
|
90
|
+
data = r.json()
|
|
91
|
+
except ValueError as exc: # pragma: no cover - network dependent
|
|
92
|
+
raise HandshakeError(f"token returned malformed JSON: {exc}") from exc
|
|
93
|
+
_ensure_verification_uri(data, base)
|
|
94
|
+
return data
|
|
95
|
+
elif r.status_code in (404, 410):
|
|
96
|
+
raise HandshakeError(f"handshake failed: {r.status_code}")
|
|
97
|
+
# 428 authorization_pending or others → wait and retry
|
|
98
|
+
time.sleep(2)
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
def run_handshake(origin: str | None = None) -> Dict[str, Any]:
|
|
102
|
+
device_code, verification_uri, expires_in, interval = start_handshake_session(origin)
|
|
103
|
+
try:
|
|
104
|
+
webbrowser.open(verification_uri)
|
|
105
|
+
except Exception:
|
|
106
|
+
pass
|
|
107
|
+
return poll_handshake_token(device_code, origin, timeout_s=expires_in)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: synth-ai
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.8
|
|
4
4
|
Summary: RL as a service SDK - Core AI functionality and tracing
|
|
5
5
|
Author-email: Synth AI <josh@usesynth.ai>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -53,7 +53,7 @@ Requires-Dist: asyncpg>=0.30.0
|
|
|
53
53
|
Requires-Dist: aiohttp>=3.8.0
|
|
54
54
|
Requires-Dist: datasets>=4.0.0
|
|
55
55
|
Requires-Dist: transformers>=4.56.1
|
|
56
|
-
Requires-Dist: modal>=1.1.
|
|
56
|
+
Requires-Dist: modal>=1.1.0
|
|
57
57
|
Provides-Extra: dev
|
|
58
58
|
Requires-Dist: build>=1.2.2.post1; extra == "dev"
|
|
59
59
|
Requires-Dist: twine>=4.0.0; extra == "dev"
|
|
@@ -98,16 +98,17 @@ synth-ai comes with a built-in RL example tailored for training Qwen/Qwen3-0.6B
|
|
|
98
98
|
Please create an account at [Synth](https://usesynth.ai) and [Modal](https://modal.com) for the Math hello‑world test run. Then run:
|
|
99
99
|
|
|
100
100
|
```bash
|
|
101
|
-
uvx synth-ai
|
|
102
|
-
uvx synth-ai
|
|
101
|
+
uvx synth-ai demo
|
|
102
|
+
uvx synth-ai setup
|
|
103
|
+
uvx synth-ai deploy
|
|
103
104
|
uvx synth-ai run
|
|
104
105
|
```
|
|
105
106
|
|
|
106
107
|
To walk through kicking off your first RL run, see the [Synth‑AI Documentation](https://docs.usesynth.ai/synth-ai/introduction).
|
|
107
108
|
|
|
108
|
-
### What `
|
|
109
|
+
### What `setup` does now
|
|
109
110
|
|
|
110
|
-
When you run `uvx synth-ai rl_demo setup
|
|
111
|
+
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:
|
|
111
112
|
|
|
112
113
|
- Detect your current user and organization
|
|
113
114
|
- Ensure both API keys exist for that user+org
|
|
@@ -124,5 +125,6 @@ If your browser isn’t already signed in, sign in when prompted and the pairing
|
|
|
124
125
|
|
|
125
126
|
Environment variables:
|
|
126
127
|
|
|
127
|
-
- `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `
|
|
128
|
+
- `SYNTH_CANONICAL_ORIGIN` (optional): override the dashboard base URL the SDK uses for the handshake (defaults to `https://www.usesynth.ai/dashboard`).
|
|
129
|
+
- `SYNTH_CANONICAL_DEV` (optional): set to `1`, `true`, `yes`, or `on` to target the local dashboard at `http://localhost:3000`.
|
|
128
130
|
- Keys are stored only in your project’s `.env` file, not exported to your shell.
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
|
-
|
|
3
|
-
import json
|
|
4
|
-
import os
|
|
5
|
-
import time
|
|
6
|
-
import webbrowser
|
|
7
|
-
from typing import Any, Dict, Tuple
|
|
8
|
-
|
|
9
|
-
import requests
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class HandshakeError(Exception):
|
|
13
|
-
pass
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def _origin() -> str:
|
|
17
|
-
# Prefer explicit env; fallback to localhost dashboard
|
|
18
|
-
return (os.getenv("SYNTH_CANONICAL_ORIGIN", "") or "http://localhost:3000").rstrip("/")
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
def start_handshake_session(origin: str | None = None) -> Tuple[str, str, int, int]:
|
|
22
|
-
base = (origin or _origin()).rstrip("/")
|
|
23
|
-
url = f"{base}/api/sdk/handshake/init"
|
|
24
|
-
r = requests.post(url, timeout=10)
|
|
25
|
-
if r.status_code != 200:
|
|
26
|
-
raise HandshakeError(f"init failed: {r.status_code} {r.text}")
|
|
27
|
-
data = r.json()
|
|
28
|
-
return (
|
|
29
|
-
str(data.get("device_code")),
|
|
30
|
-
str(data.get("verification_uri")),
|
|
31
|
-
int(data.get("expires_in", 600)),
|
|
32
|
-
int(data.get("interval", 3)),
|
|
33
|
-
)
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def poll_handshake_token(device_code: str, origin: str | None = None, *, timeout_s: int | None = None) -> Dict[str, Any]:
|
|
37
|
-
base = (origin or _origin()).rstrip("/")
|
|
38
|
-
url = f"{base}/api/sdk/handshake/token"
|
|
39
|
-
deadline = time.time() + (timeout_s or 600)
|
|
40
|
-
while True:
|
|
41
|
-
if time.time() > deadline:
|
|
42
|
-
raise HandshakeError("handshake timed out")
|
|
43
|
-
try:
|
|
44
|
-
r = requests.post(url, json={"device_code": device_code}, timeout=10)
|
|
45
|
-
except Exception as e:
|
|
46
|
-
time.sleep(2)
|
|
47
|
-
continue
|
|
48
|
-
if r.status_code == 200:
|
|
49
|
-
return r.json()
|
|
50
|
-
elif r.status_code in (404, 410):
|
|
51
|
-
raise HandshakeError(f"handshake failed: {r.status_code}")
|
|
52
|
-
# 428 authorization_pending or others → wait and retry
|
|
53
|
-
time.sleep(2)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def run_handshake(origin: str | None = None) -> Dict[str, Any]:
|
|
57
|
-
device_code, verification_uri, expires_in, interval = start_handshake_session(origin)
|
|
58
|
-
try:
|
|
59
|
-
webbrowser.open(verification_uri)
|
|
60
|
-
except Exception:
|
|
61
|
-
pass
|
|
62
|
-
return poll_handshake_token(device_code, origin, timeout_s=expires_in)
|
|
63
|
-
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|