synth-ai 0.2.9.dev5__py3-none-any.whl → 0.2.10__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synth-ai might be problematic. Click here for more details.
- examples/__init__.py +16 -0
- examples/crafter_debug_render.py +23 -17
- examples/dev/qwen3_32b_qlora_4xh100.toml +40 -0
- examples/multi_step/crafter_rl_lora.md +29 -0
- examples/qwen_coder/README.md +102 -0
- examples/qwen_coder/_shared.py +113 -0
- examples/qwen_coder/configs/coder_lora_30b.toml +61 -0
- examples/qwen_coder/configs/coder_lora_4b.toml +57 -0
- examples/qwen_coder/configs/coder_lora_small.toml +58 -0
- examples/qwen_coder/generate_dataset.py +98 -0
- examples/qwen_coder/infer_ft_smoke.py +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/rl/configs/eval_base_qwen.toml +1 -1
- examples/rl/configs/rl_from_base_qwen17.toml +1 -1
- examples/rl/download_dataset.py +26 -10
- examples/rl/run_eval.py +53 -52
- examples/rl/run_rl_and_save.py +29 -12
- examples/rl/task_app/math_single_step.py +180 -41
- examples/rl/task_app/math_task_app.py +14 -6
- examples/sft/README.md +139 -0
- examples/sft/configs/crafter_fft_qwen0p6b.toml +44 -0
- examples/sft/configs/crafter_lora_qwen0p6b.toml +45 -0
- examples/sft/evaluate.py +117 -0
- examples/sft/export_dataset.py +117 -0
- examples/sft/generate_traces.py +162 -0
- examples/swe/__init__.py +12 -0
- examples/swe/task_app/README.md +105 -0
- examples/swe/task_app/__init__.py +2 -0
- examples/swe/task_app/grpo_swe_mini.py +571 -0
- examples/swe/task_app/grpo_swe_mini_task_app.py +136 -0
- examples/swe/task_app/hosted/README.md +173 -0
- examples/swe/task_app/hosted/__init__.py +5 -0
- examples/swe/task_app/hosted/branching.py +143 -0
- examples/swe/task_app/hosted/environment_routes.py +1289 -0
- examples/swe/task_app/hosted/envs/__init__.py +1 -0
- examples/swe/task_app/hosted/envs/crafter/__init__.py +6 -0
- examples/swe/task_app/hosted/envs/crafter/app.py +1 -0
- examples/swe/task_app/hosted/envs/crafter/environment.py +522 -0
- examples/swe/task_app/hosted/envs/crafter/policy.py +478 -0
- examples/swe/task_app/hosted/envs/crafter/react_agent.py +108 -0
- examples/swe/task_app/hosted/envs/crafter/shared.py +305 -0
- examples/swe/task_app/hosted/envs/crafter/tools.py +47 -0
- examples/swe/task_app/hosted/envs/mini_swe/__init__.py +8 -0
- examples/swe/task_app/hosted/envs/mini_swe/environment.py +1164 -0
- examples/swe/task_app/hosted/envs/mini_swe/policy.py +355 -0
- examples/swe/task_app/hosted/envs/mini_swe/shared.py +83 -0
- examples/swe/task_app/hosted/envs/mini_swe/tools.py +96 -0
- examples/swe/task_app/hosted/hosted_app.py +204 -0
- examples/swe/task_app/hosted/inference/__init__.py +5 -0
- examples/swe/task_app/hosted/inference/openai_client.py +618 -0
- examples/swe/task_app/hosted/main.py +100 -0
- examples/swe/task_app/hosted/policy_routes.py +1079 -0
- examples/swe/task_app/hosted/registry.py +195 -0
- examples/swe/task_app/hosted/rollout.py +1869 -0
- examples/swe/task_app/hosted/storage/__init__.py +5 -0
- examples/swe/task_app/hosted/storage/volume.py +211 -0
- examples/swe/task_app/hosted/test_agents.py +161 -0
- examples/swe/task_app/hosted/test_service.py +137 -0
- examples/swe/task_app/hosted/utils.py +62 -0
- examples/vlm/PROPOSAL.md +53 -0
- examples/vlm/README.md +68 -0
- examples/vlm/configs/crafter_vlm_gpt4o.toml +44 -0
- examples/vlm/crafter_image_only_agent.py +207 -0
- examples/vlm/crafter_openai_vlm_agent.py +277 -0
- examples/vlm/filter_image_rows.py +63 -0
- examples/vlm/run_crafter_vlm_benchmark.py +316 -0
- examples/warming_up_to_rl/analyze_trace_db.py +12 -10
- examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +11 -1
- examples/warming_up_to_rl/export_trace_sft.py +218 -36
- examples/warming_up_to_rl/groq_test.py +15 -8
- examples/warming_up_to_rl/manage_secrets.py +29 -25
- examples/warming_up_to_rl/readme.md +9 -2
- examples/warming_up_to_rl/run_eval.py +137 -61
- examples/warming_up_to_rl/run_fft_and_save.py +131 -60
- examples/warming_up_to_rl/run_local_rollout.py +88 -39
- examples/warming_up_to_rl/run_local_rollout_modal.py +114 -28
- examples/warming_up_to_rl/run_local_rollout_parallel.py +81 -20
- examples/warming_up_to_rl/run_local_rollout_traced.py +126 -23
- examples/warming_up_to_rl/run_rl_and_save.py +35 -12
- examples/warming_up_to_rl/run_rollout_remote.py +44 -19
- examples/warming_up_to_rl/task_app/README.md +6 -2
- examples/warming_up_to_rl/task_app/grpo_crafter.py +319 -57
- examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py +11 -30
- examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py +9 -11
- examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py +137 -182
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/app.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/environment.py +150 -57
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/policy.py +105 -69
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py +19 -7
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py +45 -42
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py +47 -45
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +198 -92
- examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py +0 -2
- examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +361 -263
- examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py +21 -23
- examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +394 -274
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py +1 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py +56 -62
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py +1 -0
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py +6 -15
- examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py +4 -3
- synth_ai/__init__.py +1 -0
- synth_ai/api/models/supported.py +376 -0
- synth_ai/api/train/builders.py +157 -26
- synth_ai/api/train/cli.py +213 -57
- synth_ai/api/train/config_finder.py +65 -5
- synth_ai/api/train/env_resolver.py +33 -15
- synth_ai/api/train/pollers.py +13 -4
- synth_ai/api/train/supported_algos.py +139 -0
- synth_ai/api/train/task_app.py +5 -3
- synth_ai/api/train/utils.py +33 -48
- synth_ai/cli/__init__.py +19 -4
- synth_ai/cli/_modal_wrapper.py +28 -0
- synth_ai/cli/_typer_patch.py +49 -0
- synth_ai/cli/balance.py +2 -3
- synth_ai/cli/calc.py +1 -1
- synth_ai/cli/demo.py +21 -6
- synth_ai/cli/recent.py +2 -2
- synth_ai/cli/rl_demo.py +77 -17
- synth_ai/cli/root.py +116 -39
- synth_ai/cli/status.py +2 -2
- synth_ai/cli/task_apps.py +1699 -259
- synth_ai/cli/traces.py +7 -4
- synth_ai/cli/turso.py +73 -0
- synth_ai/cli/watch.py +12 -18
- synth_ai/core/experiment.py +0 -2
- synth_ai/demo_registry.py +68 -31
- synth_ai/demos/core/cli.py +516 -194
- synth_ai/demos/demo_task_apps/__init__.py +3 -3
- synth_ai/demos/demo_task_apps/core.py +64 -28
- synth_ai/demos/demo_task_apps/crafter/configs/crafter_fft_4b.toml +2 -3
- synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +37 -30
- synth_ai/demos/demo_task_apps/math/_common.py +1 -2
- synth_ai/demos/demo_task_apps/math/app.py +2 -1
- synth_ai/demos/demo_task_apps/math/deploy_modal.py +3 -6
- synth_ai/demos/demo_task_apps/math/modal_task_app.py +183 -82
- synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -2
- synth_ai/environments/examples/bandit/engine.py +12 -4
- synth_ai/environments/examples/bandit/taskset.py +4 -4
- synth_ai/environments/examples/crafter_classic/environment.py +76 -1
- synth_ai/environments/reproducibility/tree.py +5 -6
- synth_ai/environments/service/app.py +11 -12
- synth_ai/environments/service/core_routes.py +10 -9
- synth_ai/environments/stateful/engine.py +1 -1
- synth_ai/environments/tasks/core.py +1 -0
- synth_ai/environments/tasks/filters.py +5 -6
- synth_ai/environments/tasks/utils.py +4 -5
- synth_ai/evals/base.py +0 -2
- synth_ai/handshake.py +11 -9
- synth_ai/http.py +1 -1
- synth_ai/http_client.py +43 -11
- synth_ai/inference/__init__.py +0 -2
- synth_ai/inference/client.py +20 -6
- synth_ai/jobs/client.py +103 -78
- synth_ai/learning/__init__.py +41 -6
- synth_ai/learning/algorithms.py +14 -0
- synth_ai/learning/client.py +121 -29
- synth_ai/learning/config.py +2 -40
- synth_ai/learning/constants.py +0 -2
- synth_ai/learning/ft_client.py +4 -56
- synth_ai/learning/health.py +13 -7
- synth_ai/learning/jobs.py +43 -47
- synth_ai/{rl → learning/rl}/__init__.py +14 -5
- synth_ai/learning/rl/client.py +267 -0
- synth_ai/learning/rl/config.py +31 -0
- synth_ai/{rl → learning/rl}/contracts.py +5 -10
- synth_ai/{rl → learning/rl}/env_keys.py +45 -16
- synth_ai/learning/rl/secrets.py +13 -0
- synth_ai/learning/rl_client.py +2 -253
- synth_ai/learning/sft/__init__.py +29 -0
- synth_ai/learning/sft/client.py +68 -0
- synth_ai/learning/sft/config.py +270 -0
- synth_ai/learning/sft/data.py +295 -0
- synth_ai/learning/sse.py +25 -26
- synth_ai/learning/validators.py +25 -24
- synth_ai/lm/__init__.py +21 -47
- synth_ai/task/__init__.py +26 -27
- synth_ai/task/apps/__init__.py +18 -19
- synth_ai/task/auth.py +35 -23
- synth_ai/task/client.py +15 -13
- synth_ai/task/contracts.py +37 -35
- synth_ai/task/datasets.py +9 -6
- synth_ai/task/errors.py +11 -10
- synth_ai/task/health.py +17 -11
- synth_ai/task/json.py +58 -24
- synth_ai/task/proxy.py +15 -14
- synth_ai/task/rubrics.py +22 -15
- synth_ai/task/server.py +43 -17
- synth_ai/task/tracing_utils.py +12 -7
- synth_ai/task/validators.py +0 -1
- synth_ai/task/vendors.py +5 -7
- synth_ai/tracing_v3/__init__.py +2 -0
- synth_ai/tracing_v3/abstractions.py +21 -4
- synth_ai/tracing_v3/db_config.py +26 -1
- synth_ai/tracing_v3/decorators.py +18 -15
- synth_ai/tracing_v3/examples/basic_usage.py +3 -2
- synth_ai/tracing_v3/hooks.py +6 -4
- synth_ai/tracing_v3/llm_call_record_helpers.py +6 -6
- synth_ai/tracing_v3/replica_sync.py +1 -0
- synth_ai/tracing_v3/session_tracer.py +63 -16
- synth_ai/tracing_v3/storage/base.py +89 -1
- synth_ai/tracing_v3/storage/config.py +21 -8
- synth_ai/tracing_v3/storage/factory.py +10 -8
- synth_ai/tracing_v3/storage/utils.py +4 -2
- synth_ai/tracing_v3/turso/daemon.py +7 -2
- synth_ai/tracing_v3/turso/models.py +5 -2
- synth_ai/tracing_v3/turso/native_manager.py +1173 -0
- synth_ai/tracing_v3/utils.py +4 -3
- synth_ai/v0/api/__init__.py +8 -0
- synth_ai/v0/api/models/__init__.py +8 -0
- synth_ai/v0/api/models/supported.py +8 -0
- synth_ai/v0/config/__init__.py +15 -0
- synth_ai/v0/config/base_url.py +12 -0
- synth_ai/v0/lm/__init__.py +51 -0
- synth_ai/{lm → v0/lm}/caching/ephemeral.py +3 -5
- synth_ai/{lm → v0/lm}/caching/handler.py +4 -4
- synth_ai/{lm → v0/lm}/caching/initialize.py +1 -1
- synth_ai/{lm → v0/lm}/caching/persistent.py +1 -1
- synth_ai/{lm → v0/lm}/config.py +6 -1
- synth_ai/{lm → v0/lm}/core/all.py +9 -9
- synth_ai/{lm → v0/lm}/core/exceptions.py +0 -2
- synth_ai/{lm → v0/lm}/core/main.py +19 -7
- synth_ai/{lm → v0/lm}/core/main_v3.py +10 -10
- synth_ai/{lm → v0/lm}/core/synth_models.py +2 -15
- synth_ai/{lm → v0/lm}/core/vendor_clients.py +6 -4
- synth_ai/{lm → v0/lm}/overrides.py +4 -4
- synth_ai/{lm → v0/lm}/provider_support/anthropic.py +4 -4
- synth_ai/{lm → v0/lm}/provider_support/openai.py +5 -5
- synth_ai/{lm → v0/lm}/structured_outputs/handler.py +5 -5
- synth_ai/{lm → v0/lm}/structured_outputs/rehabilitate.py +1 -1
- synth_ai/{lm → v0/lm}/vendors/core/anthropic_api.py +16 -16
- synth_ai/{lm → v0/lm}/vendors/core/gemini_api.py +5 -5
- synth_ai/{lm → v0/lm}/vendors/core/mistral_api.py +5 -5
- synth_ai/{lm → v0/lm}/vendors/core/openai_api.py +12 -10
- synth_ai/{lm → v0/lm}/vendors/openai_standard.py +11 -9
- synth_ai/{lm → v0/lm}/vendors/openai_standard_responses.py +8 -5
- synth_ai/{lm → v0/lm}/vendors/supported/custom_endpoint.py +4 -6
- synth_ai/{lm → v0/lm}/vendors/supported/deepseek.py +2 -2
- synth_ai/{lm → v0/lm}/vendors/supported/grok.py +2 -2
- synth_ai/{lm → v0/lm}/vendors/supported/groq.py +1 -1
- synth_ai/{lm → v0/lm}/vendors/supported/ollama.py +1 -1
- synth_ai/{lm → v0/lm}/vendors/supported/openrouter.py +3 -3
- synth_ai/{lm → v0/lm}/vendors/supported/together.py +1 -1
- synth_ai/{lm → v0/lm}/vendors/synth_client.py +38 -11
- synth_ai/v0/tracing/upload.py +32 -135
- synth_ai/v0/tracing_v3/__init__.py +10 -0
- synth_ai/v0/tracing_v3/abstractions.py +3 -0
- synth_ai/v0/tracing_v3/decorators.py +3 -0
- synth_ai/v0/tracing_v3/llm_call_record_helpers.py +3 -0
- synth_ai/v0/tracing_v3/session_tracer.py +3 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/METADATA +10 -7
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/RECORD +294 -258
- examples/common_old/backend.py +0 -21
- examples/evals_old/README.md +0 -98
- examples/evals_old/__init__.py +0 -6
- examples/evals_old/compare_models.py +0 -1037
- examples/evals_old/example_log.md +0 -145
- examples/evals_old/run_demo.sh +0 -126
- examples/evals_old/trace_analysis.py +0 -270
- examples/finetuning_old/_backup_synth_qwen/config.toml +0 -29
- examples/finetuning_old/_backup_synth_qwen/example_log.md +0 -324
- examples/finetuning_old/_backup_synth_qwen/filter_traces.py +0 -60
- examples/finetuning_old/_backup_synth_qwen/filter_traces_achievements.py +0 -239
- examples/finetuning_old/_backup_synth_qwen/purge_v3_traces.py +0 -109
- examples/finetuning_old/_backup_synth_qwen/react_agent_lm.py +0 -1924
- examples/finetuning_old/_backup_synth_qwen/readme.md +0 -49
- examples/finetuning_old/_backup_synth_qwen/run_crafter_qwen4b.py +0 -114
- examples/finetuning_old/_backup_synth_qwen/run_demo.sh +0 -195
- examples/finetuning_old/_backup_synth_qwen/sft_kickoff.py +0 -118
- examples/finetuning_old/synth_qwen_v1/README.md +0 -68
- examples/finetuning_old/synth_qwen_v1/filter_traces.py +0 -60
- examples/finetuning_old/synth_qwen_v1/filter_traces_achievements.py +0 -239
- examples/finetuning_old/synth_qwen_v1/finetune.py +0 -46
- examples/finetuning_old/synth_qwen_v1/hello_ft_model.py +0 -71
- examples/finetuning_old/synth_qwen_v1/infer.py +0 -37
- examples/finetuning_old/synth_qwen_v1/poll.py +0 -44
- examples/finetuning_old/synth_qwen_v1/prepare_data.py +0 -35
- examples/finetuning_old/synth_qwen_v1/purge_v3_traces.py +0 -109
- examples/finetuning_old/synth_qwen_v1/react_agent_lm.py +0 -1932
- examples/finetuning_old/synth_qwen_v1/run_crafter_sft_job.py +0 -207
- examples/finetuning_old/synth_qwen_v1/run_ft_job.py +0 -232
- examples/finetuning_old/synth_qwen_v1/upload_data.py +0 -34
- examples/finetuning_old/synth_qwen_v1/util.py +0 -147
- examples/rl_old/task_app.py +0 -962
- synth_ai/experimental/synth_oss.py +0 -446
- synth_ai/install_sqld.sh +0 -40
- synth_ai/learning/filtering.py +0 -0
- synth_ai/learning/offline/dpo.py +0 -0
- synth_ai/learning/offline/providers.py +0 -7
- synth_ai/learning/offline/sft.py +0 -0
- synth_ai/learning/offline/shared.py +0 -0
- synth_ai/learning/online/grpo.py +0 -0
- synth_ai/learning/online/irft.py +0 -0
- synth_ai/learning/prompts/banking77_injection_eval.py +0 -168
- synth_ai/learning/prompts/gepa.py +0 -0
- synth_ai/learning/prompts/hello_world_in_context_injection_ex.py +0 -213
- synth_ai/learning/prompts/mipro.py +0 -289
- synth_ai/learning/prompts/random_search.py +0 -246
- synth_ai/learning/prompts/run_mipro_banking77.py +0 -172
- synth_ai/learning/prompts/run_random_search_banking77.py +0 -324
- synth_ai/rl/secrets.py +0 -19
- synth_ai/scripts/verify_rewards.py +0 -100
- synth_ai/tracing/__init__.py +0 -30
- synth_ai/tracing_v1/__init__.py +0 -33
- synth_ai/tracing_v3/turso/__init__.py +0 -25
- synth_ai/tracing_v3/turso/manager.py +0 -774
- synth_ai/zyk/__init__.py +0 -30
- /synth_ai/{lm → v0/lm}/caching/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/caching/constants.py +0 -0
- /synth_ai/{lm → v0/lm}/caching/dbs.py +0 -0
- /synth_ai/{lm → v0/lm}/constants.py +0 -0
- /synth_ai/{lm → v0/lm}/core/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/cost/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/cost/monitor.py +0 -0
- /synth_ai/{lm → v0/lm}/cost/statefulness.py +0 -0
- /synth_ai/{lm → v0/lm}/injection.py +0 -0
- /synth_ai/{lm → v0/lm}/provider_support/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/provider_support/suppress_logging.py +0 -0
- /synth_ai/{lm → v0/lm}/structured_outputs/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/structured_outputs/inject.py +0 -0
- /synth_ai/{lm → v0/lm}/tools/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/tools/base.py +0 -0
- /synth_ai/{lm → v0/lm}/unified_interface.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/base.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/core/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/core/synth_dev_api.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/local/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/local/ollama.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/retries.py +0 -0
- /synth_ai/{lm → v0/lm}/vendors/supported/__init__.py +0 -0
- /synth_ai/{lm → v0/lm}/warmup.py +0 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/entry_points.txt +0 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/licenses/LICENSE +0 -0
- {synth_ai-0.2.9.dev5.dist-info → synth_ai-0.2.10.dist-info}/top_level.txt +0 -0
synth_ai/tracing_v3/utils.py
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
from __future__ import annotations
|
|
2
1
|
"""Utility functions for tracing v3."""
|
|
3
2
|
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
4
5
|
import hashlib
|
|
5
6
|
import json
|
|
6
7
|
import uuid
|
|
7
|
-
from datetime import datetime
|
|
8
|
+
from datetime import UTC, datetime
|
|
8
9
|
from typing import Any
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
def iso_now() -> str:
|
|
12
13
|
"""Get current UTC time as ISO format string."""
|
|
13
|
-
return datetime.
|
|
14
|
+
return datetime.now(UTC).isoformat()
|
|
14
15
|
|
|
15
16
|
|
|
16
17
|
def json_dumps(obj: Any) -> str:
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
# Compatibility package to mirror historical import paths.
|
|
4
|
+
# Re-export constants from the modern location under synth_ai.config.
|
|
5
|
+
|
|
6
|
+
try:
|
|
7
|
+
from synth_ai.config.base_url import PROD_BASE_URL_DEFAULT as _PROD
|
|
8
|
+
except Exception: # pragma: no cover
|
|
9
|
+
_PROD = None
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"_PROD",
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
try:
|
|
4
|
+
# Prefer the modern constant
|
|
5
|
+
from synth_ai.config.base_url import PROD_BASE_URL_DEFAULT as PROD_BASE_URL_DEFAULT # type: ignore
|
|
6
|
+
except Exception: # pragma: no cover
|
|
7
|
+
# Fallback if the modern module moves; provide a safe default
|
|
8
|
+
PROD_BASE_URL_DEFAULT = "https://agent-learning.onrender.com"
|
|
9
|
+
|
|
10
|
+
__all__ = ["PROD_BASE_URL_DEFAULT"]
|
|
11
|
+
|
|
12
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"""Synth AI Language Model Interface (legacy)."""
|
|
2
|
+
|
|
3
|
+
import sys as _sys
|
|
4
|
+
|
|
5
|
+
_sys.modules.setdefault("synth_ai.v0.lm", _sys.modules.get(__name__))
|
|
6
|
+
|
|
7
|
+
from .config import OpenAIConfig, SynthConfig
|
|
8
|
+
from .core.main_v3 import LM
|
|
9
|
+
from .unified_interface import (
|
|
10
|
+
OpenAIProvider,
|
|
11
|
+
SynthProvider,
|
|
12
|
+
UnifiedLMClient,
|
|
13
|
+
UnifiedLMProvider,
|
|
14
|
+
create_provider,
|
|
15
|
+
)
|
|
16
|
+
from .vendors.synth_client import (
|
|
17
|
+
AsyncSynthClient,
|
|
18
|
+
SyncSynthClient,
|
|
19
|
+
create_async_client,
|
|
20
|
+
create_chat_completion_async,
|
|
21
|
+
create_chat_completion_sync,
|
|
22
|
+
create_sync_client,
|
|
23
|
+
)
|
|
24
|
+
from .warmup import get_warmup_status, warmup_synth_model
|
|
25
|
+
|
|
26
|
+
__all__ = [
|
|
27
|
+
# Configuration
|
|
28
|
+
"SynthConfig",
|
|
29
|
+
"OpenAIConfig",
|
|
30
|
+
# Warmup utilities
|
|
31
|
+
"warmup_synth_model",
|
|
32
|
+
"get_warmup_status",
|
|
33
|
+
# Unified interface
|
|
34
|
+
"UnifiedLMProvider",
|
|
35
|
+
"OpenAIProvider",
|
|
36
|
+
"SynthProvider",
|
|
37
|
+
"UnifiedLMClient",
|
|
38
|
+
"create_provider",
|
|
39
|
+
# Synth client
|
|
40
|
+
"AsyncSynthClient",
|
|
41
|
+
"SyncSynthClient",
|
|
42
|
+
"create_async_client",
|
|
43
|
+
"create_sync_client",
|
|
44
|
+
"create_chat_completion_async",
|
|
45
|
+
"create_chat_completion_sync",
|
|
46
|
+
# Core LM class
|
|
47
|
+
"LM",
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
# Version info
|
|
51
|
+
__version__ = "0.1.0"
|
|
@@ -11,8 +11,8 @@ from dataclasses import dataclass
|
|
|
11
11
|
from diskcache import Cache
|
|
12
12
|
from pydantic import BaseModel
|
|
13
13
|
|
|
14
|
-
from synth_ai.lm.caching.constants import DISKCACHE_SIZE_LIMIT
|
|
15
|
-
from synth_ai.lm.vendors.base import BaseLMResponse
|
|
14
|
+
from synth_ai.v0.lm.caching.constants import DISKCACHE_SIZE_LIMIT
|
|
15
|
+
from synth_ai.v0.lm.vendors.base import BaseLMResponse
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
@dataclass
|
|
@@ -28,9 +28,7 @@ class EphemeralCache:
|
|
|
28
28
|
os.makedirs(fast_cache_dir, exist_ok=True)
|
|
29
29
|
self.fast_cache = Cache(fast_cache_dir, size_limit=DISKCACHE_SIZE_LIMIT)
|
|
30
30
|
|
|
31
|
-
def hit_cache(
|
|
32
|
-
self, key: str, response_model: BaseModel | None = None
|
|
33
|
-
) -> BaseLMResponse | None:
|
|
31
|
+
def hit_cache(self, key: str, response_model: BaseModel | None = None) -> BaseLMResponse | None:
|
|
34
32
|
"""
|
|
35
33
|
Check if a response exists in cache for the given key.
|
|
36
34
|
|
|
@@ -3,10 +3,10 @@ from typing import Any
|
|
|
3
3
|
|
|
4
4
|
from pydantic import BaseModel
|
|
5
5
|
|
|
6
|
-
from synth_ai.lm.caching.ephemeral import EphemeralCache
|
|
7
|
-
from synth_ai.lm.caching.persistent import PersistentCache
|
|
8
|
-
from synth_ai.lm.tools.base import BaseTool
|
|
9
|
-
from synth_ai.lm.vendors.base import BaseLMResponse
|
|
6
|
+
from synth_ai.v0.lm.caching.ephemeral import EphemeralCache
|
|
7
|
+
from synth_ai.v0.lm.caching.persistent import PersistentCache
|
|
8
|
+
from synth_ai.v0.lm.tools.base import BaseTool
|
|
9
|
+
from synth_ai.v0.lm.vendors.base import BaseLMResponse
|
|
10
10
|
|
|
11
11
|
persistent_cache = PersistentCache()
|
|
12
12
|
ephemeral_cache = EphemeralCache()
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
from synth_ai.lm.caching.handler import CacheHandler
|
|
1
|
+
from synth_ai.v0.lm.caching.handler import CacheHandler
|
|
2
2
|
|
|
3
3
|
cache_handler = CacheHandler(use_ephemeral_store=True, use_persistent_store=True)
|
|
4
4
|
ephemeral_cache_handler = CacheHandler(use_ephemeral_store=True, use_persistent_store=False)
|
synth_ai/{lm → v0/lm}/config.py
RENAMED
|
@@ -6,7 +6,12 @@ Loads sensitive configuration from environment variables.
|
|
|
6
6
|
import os
|
|
7
7
|
from dataclasses import dataclass
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
try:
|
|
10
|
+
# Optional dependency during tests; fallback to no-op if missing
|
|
11
|
+
from dotenv import load_dotenv # type: ignore
|
|
12
|
+
except Exception: # pragma: no cover - best-effort fallback
|
|
13
|
+
def load_dotenv(*args, **kwargs): # type: ignore
|
|
14
|
+
return False
|
|
10
15
|
|
|
11
16
|
# Load environment variables from .env file
|
|
12
17
|
load_dotenv()
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
from synth_ai.lm.vendors.core.anthropic_api import AnthropicAPI
|
|
2
|
-
from synth_ai.lm.vendors.core.gemini_api import GeminiAPI
|
|
3
|
-
from synth_ai.lm.vendors.core.openai_api import (
|
|
1
|
+
from synth_ai.v0.lm.vendors.core.anthropic_api import AnthropicAPI
|
|
2
|
+
from synth_ai.v0.lm.vendors.core.gemini_api import GeminiAPI
|
|
3
|
+
from synth_ai.v0.lm.vendors.core.openai_api import (
|
|
4
4
|
OpenAIPrivate,
|
|
5
5
|
OpenAIStructuredOutputClient,
|
|
6
6
|
)
|
|
7
|
-
from synth_ai.lm.vendors.supported.custom_endpoint import CustomEndpointAPI
|
|
8
|
-
from synth_ai.lm.vendors.supported.deepseek import DeepSeekAPI
|
|
9
|
-
from synth_ai.lm.vendors.supported.grok import GrokAPI
|
|
10
|
-
from synth_ai.lm.vendors.supported.groq import GroqAPI
|
|
11
|
-
from synth_ai.lm.vendors.supported.openrouter import OpenRouterAPI
|
|
12
|
-
from synth_ai.lm.vendors.supported.together import TogetherAPI
|
|
7
|
+
from synth_ai.v0.lm.vendors.supported.custom_endpoint import CustomEndpointAPI
|
|
8
|
+
from synth_ai.v0.lm.vendors.supported.deepseek import DeepSeekAPI
|
|
9
|
+
from synth_ai.v0.lm.vendors.supported.grok import GrokAPI
|
|
10
|
+
from synth_ai.v0.lm.vendors.supported.groq import GroqAPI
|
|
11
|
+
from synth_ai.v0.lm.vendors.supported.openrouter import OpenRouterAPI
|
|
12
|
+
from synth_ai.v0.lm.vendors.supported.together import TogetherAPI
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
class OpenAIClient(OpenAIPrivate):
|
|
@@ -3,16 +3,16 @@ from typing import Any, Literal
|
|
|
3
3
|
|
|
4
4
|
from pydantic import BaseModel, Field
|
|
5
5
|
|
|
6
|
-
from synth_ai.lm.config import reasoning_models
|
|
7
|
-
from synth_ai.lm.core.exceptions import StructuredOutputCoercionFailureException
|
|
8
|
-
from synth_ai.lm.core.vendor_clients import (
|
|
6
|
+
from synth_ai.v0.lm.config import reasoning_models
|
|
7
|
+
from synth_ai.v0.lm.core.exceptions import StructuredOutputCoercionFailureException
|
|
8
|
+
from synth_ai.v0.lm.core.vendor_clients import (
|
|
9
9
|
anthropic_naming_regexes,
|
|
10
10
|
get_client,
|
|
11
11
|
openai_naming_regexes,
|
|
12
12
|
)
|
|
13
|
-
from synth_ai.lm.structured_outputs.handler import StructuredOutputHandler
|
|
14
|
-
from synth_ai.lm.tools.base import BaseTool
|
|
15
|
-
from synth_ai.lm.vendors.base import VendorBase
|
|
13
|
+
from synth_ai.v0.lm.structured_outputs.handler import StructuredOutputHandler
|
|
14
|
+
from synth_ai.v0.lm.tools.base import BaseTool
|
|
15
|
+
from synth_ai.v0.lm.vendors.base import VendorBase
|
|
16
16
|
|
|
17
17
|
|
|
18
18
|
def build_messages(
|
|
@@ -113,7 +113,19 @@ class LM:
|
|
|
113
113
|
max_retries: Literal["None", "Few", "Many"] = "Few",
|
|
114
114
|
structured_output_mode: Literal["stringified_json", "forced_json"] = "stringified_json",
|
|
115
115
|
synth_logging: bool = True,
|
|
116
|
-
provider: Literal[
|
|
116
|
+
provider: Literal[
|
|
117
|
+
"openai",
|
|
118
|
+
"anthropic",
|
|
119
|
+
"groq",
|
|
120
|
+
"gemini",
|
|
121
|
+
"deepseek",
|
|
122
|
+
"grok",
|
|
123
|
+
"mistral",
|
|
124
|
+
"openrouter",
|
|
125
|
+
"together",
|
|
126
|
+
]
|
|
127
|
+
| str
|
|
128
|
+
| None = None,
|
|
117
129
|
enable_thinking: bool | None = None,
|
|
118
130
|
):
|
|
119
131
|
# print("Structured output mode", structured_output_mode)
|
|
@@ -11,24 +11,24 @@ from typing import Any, Literal
|
|
|
11
11
|
|
|
12
12
|
from pydantic import BaseModel
|
|
13
13
|
|
|
14
|
-
from synth_ai.lm.config import reasoning_models
|
|
15
|
-
from synth_ai.lm.core.vendor_clients import (
|
|
14
|
+
from synth_ai.v0.lm.config import reasoning_models
|
|
15
|
+
from synth_ai.v0.lm.core.vendor_clients import (
|
|
16
16
|
anthropic_naming_regexes,
|
|
17
17
|
get_client,
|
|
18
18
|
openai_naming_regexes,
|
|
19
19
|
)
|
|
20
|
-
from synth_ai.lm.structured_outputs.handler import StructuredOutputHandler
|
|
21
|
-
from synth_ai.lm.tools.base import BaseTool
|
|
22
|
-
from synth_ai.lm.vendors.base import BaseLMResponse, VendorBase
|
|
20
|
+
from synth_ai.v0.lm.structured_outputs.handler import StructuredOutputHandler
|
|
21
|
+
from synth_ai.v0.lm.tools.base import BaseTool
|
|
22
|
+
from synth_ai.v0.lm.vendors.base import BaseLMResponse, VendorBase
|
|
23
23
|
|
|
24
24
|
# V3 tracing imports
|
|
25
|
-
from synth_ai.tracing_v3.abstractions import LMCAISEvent, TimeRecord
|
|
26
|
-
from synth_ai.tracing_v3.decorators import set_turn_number
|
|
27
|
-
from synth_ai.tracing_v3.llm_call_record_helpers import (
|
|
25
|
+
from synth_ai.v0.tracing_v3.abstractions import LMCAISEvent, TimeRecord
|
|
26
|
+
from synth_ai.v0.tracing_v3.decorators import set_turn_number
|
|
27
|
+
from synth_ai.v0.tracing_v3.llm_call_record_helpers import (
|
|
28
28
|
compute_aggregates_from_call_records,
|
|
29
29
|
create_llm_call_record_from_response,
|
|
30
30
|
)
|
|
31
|
-
from synth_ai.tracing_v3.session_tracer import SessionTracer
|
|
31
|
+
from synth_ai.v0.tracing_v3.session_tracer import SessionTracer
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
def build_messages(
|
|
@@ -124,7 +124,7 @@ class LM:
|
|
|
124
124
|
# But only if no explicit provider was given
|
|
125
125
|
if vendor is None and model is not None:
|
|
126
126
|
# Import vendor detection logic
|
|
127
|
-
from synth_ai.lm.core.vendor_clients import (
|
|
127
|
+
from synth_ai.v0.lm.core.vendor_clients import (
|
|
128
128
|
anthropic_naming_regexes,
|
|
129
129
|
custom_endpoint_naming_regexes,
|
|
130
130
|
deepseek_naming_regexes,
|
|
@@ -5,7 +5,7 @@ This module defines the specific models that are supported by Synth's infrastruc
|
|
|
5
5
|
Models are organized by family and size for easy maintenance and extension.
|
|
6
6
|
|
|
7
7
|
MAINTENANCE GUIDE:
|
|
8
|
-
1. Add new
|
|
8
|
+
1. Add new base models to synth_ai.v0.api.models.supported.QWEN3_MODELS
|
|
9
9
|
2. Fine-tuned models (ft:) are automatically detected by regex
|
|
10
10
|
3. Update SYNTH_SUPPORTED_MODELS set when adding new models
|
|
11
11
|
4. Test changes with: pytest tests/lms/test_qwen_chat_completions.py
|
|
@@ -18,20 +18,7 @@ WHY THIS EXISTS:
|
|
|
18
18
|
|
|
19
19
|
from typing import List, Set
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
QWEN3_MODELS: List[str] = [
|
|
23
|
-
# Qwen3 base models
|
|
24
|
-
"Qwen/Qwen3-0.6B",
|
|
25
|
-
"Qwen/Qwen3-1.7B",
|
|
26
|
-
"Qwen/Qwen3-4B",
|
|
27
|
-
"Qwen/Qwen3-8B",
|
|
28
|
-
"Qwen/Qwen3-14B",
|
|
29
|
-
"Qwen/Qwen3-32B",
|
|
30
|
-
|
|
31
|
-
# Qwen3 specialized variants
|
|
32
|
-
"Qwen/Qwen3-4B-2507",
|
|
33
|
-
"Qwen/Qwen3-4B-Thinking-2507",
|
|
34
|
-
]
|
|
21
|
+
from synth_ai.v0.api.models.supported import QWEN3_MODELS
|
|
35
22
|
|
|
36
23
|
# Fine-tuned models pattern - any model starting with "ft:" is considered Synth-compatible
|
|
37
24
|
# These are dynamically detected, but we can add specific known ones here
|
|
@@ -9,7 +9,7 @@ import re
|
|
|
9
9
|
from re import Pattern
|
|
10
10
|
from typing import Any
|
|
11
11
|
|
|
12
|
-
from synth_ai.lm.core.all import (
|
|
12
|
+
from synth_ai.v0.lm.core.all import (
|
|
13
13
|
AnthropicClient,
|
|
14
14
|
CustomEndpointClient,
|
|
15
15
|
DeepSeekClient,
|
|
@@ -21,7 +21,7 @@ from synth_ai.lm.core.all import (
|
|
|
21
21
|
OpenRouterClient,
|
|
22
22
|
TogetherClient,
|
|
23
23
|
)
|
|
24
|
-
from synth_ai.lm.core.synth_models import SYNTH_SUPPORTED_MODELS
|
|
24
|
+
from synth_ai.v0.lm.core.synth_models import SYNTH_SUPPORTED_MODELS
|
|
25
25
|
|
|
26
26
|
# Regular expressions to match model names to their respective providers
|
|
27
27
|
openai_naming_regexes: list[Pattern] = [
|
|
@@ -180,8 +180,10 @@ def get_client(
|
|
|
180
180
|
elif any(regex.match(model_name) for regex in custom_endpoint_naming_regexes):
|
|
181
181
|
# Custom endpoints are passed as the endpoint URL
|
|
182
182
|
return CustomEndpointClient(endpoint_url=model_name)
|
|
183
|
-
elif (
|
|
184
|
-
|
|
183
|
+
elif (
|
|
184
|
+
any(regex.match(model_name) for regex in synth_naming_regexes)
|
|
185
|
+
or model_name in SYNTH_SUPPORTED_MODELS
|
|
186
|
+
):
|
|
185
187
|
# Synth models use OpenAI-compatible client with custom endpoint
|
|
186
188
|
return OpenAIStructuredOutputClient(synth_logging=synth_logging)
|
|
187
189
|
else:
|
|
@@ -4,10 +4,10 @@ import contextvars
|
|
|
4
4
|
from contextlib import contextmanager
|
|
5
5
|
from typing import Any
|
|
6
6
|
|
|
7
|
-
from synth_ai.lm.injection import (
|
|
7
|
+
from synth_ai.v0.lm.injection import (
|
|
8
8
|
apply_injection as _apply_injection,
|
|
9
9
|
)
|
|
10
|
-
from synth_ai.lm.injection import (
|
|
10
|
+
from synth_ai.v0.lm.injection import (
|
|
11
11
|
clear_injection_rules,
|
|
12
12
|
set_injection_rules,
|
|
13
13
|
)
|
|
@@ -20,8 +20,8 @@ from synth_ai.lm.injection import (
|
|
|
20
20
|
# "params": { ... api params to override ... },
|
|
21
21
|
# "tools": { ... optional tools overrides ... },
|
|
22
22
|
# }
|
|
23
|
-
_override_specs_ctx: contextvars.ContextVar[list[dict[str, Any]] | None] = (
|
|
24
|
-
|
|
23
|
+
_override_specs_ctx: contextvars.ContextVar[list[dict[str, Any]] | None] = contextvars.ContextVar(
|
|
24
|
+
"override_specs", default=None
|
|
25
25
|
)
|
|
26
26
|
|
|
27
27
|
# ContextVars actually applied for the specific call once matched
|
|
@@ -27,16 +27,16 @@ from langfuse.utils import _get_timestamp
|
|
|
27
27
|
from langfuse.utils.langfuse_singleton import LangfuseSingleton
|
|
28
28
|
from wrapt import wrap_function_wrapper
|
|
29
29
|
|
|
30
|
-
from synth_ai.lm.overrides import (
|
|
30
|
+
from synth_ai.v0.lm.overrides import (
|
|
31
31
|
apply_injection as apply_injection_overrides,
|
|
32
32
|
)
|
|
33
|
-
from synth_ai.lm.overrides import (
|
|
33
|
+
from synth_ai.v0.lm.overrides import (
|
|
34
34
|
apply_param_overrides,
|
|
35
35
|
apply_tool_overrides,
|
|
36
36
|
use_overrides_for_messages,
|
|
37
37
|
)
|
|
38
|
-
from synth_ai.lm.provider_support.suppress_logging import *
|
|
39
|
-
from synth_ai.tracing_v1.trackers import (
|
|
38
|
+
from synth_ai.v0.lm.provider_support.suppress_logging import *
|
|
39
|
+
from synth_ai.v0.v0.tracing_v1.trackers import (
|
|
40
40
|
synth_tracker_async,
|
|
41
41
|
synth_tracker_sync,
|
|
42
42
|
)
|
|
@@ -15,17 +15,17 @@ from packaging.version import Version
|
|
|
15
15
|
from pydantic import BaseModel
|
|
16
16
|
from wrapt import wrap_function_wrapper
|
|
17
17
|
|
|
18
|
-
from synth_ai.lm.overrides import (
|
|
18
|
+
from synth_ai.v0.lm.overrides import (
|
|
19
19
|
apply_injection as apply_injection_overrides,
|
|
20
20
|
)
|
|
21
|
-
from synth_ai.lm.overrides import (
|
|
21
|
+
from synth_ai.v0.lm.overrides import (
|
|
22
22
|
apply_param_overrides,
|
|
23
23
|
apply_tool_overrides,
|
|
24
24
|
use_overrides_for_messages,
|
|
25
25
|
)
|
|
26
|
-
from synth_ai.lm.provider_support.suppress_logging import *
|
|
27
|
-
from synth_ai.tracing_v1.abstractions import MessageInputs
|
|
28
|
-
from synth_ai.tracing_v1.trackers import synth_tracker_async, synth_tracker_sync
|
|
26
|
+
from synth_ai.v0.lm.provider_support.suppress_logging import *
|
|
27
|
+
from synth_ai.v0.v0.tracing_v1.abstractions import MessageInputs
|
|
28
|
+
from synth_ai.v0.v0.tracing_v1.trackers import synth_tracker_async, synth_tracker_sync
|
|
29
29
|
|
|
30
30
|
try:
|
|
31
31
|
import openai
|
|
@@ -13,17 +13,17 @@ from typing import Any, Literal
|
|
|
13
13
|
|
|
14
14
|
from pydantic import BaseModel
|
|
15
15
|
|
|
16
|
-
from synth_ai.lm.constants import SPECIAL_BASE_TEMPS
|
|
17
|
-
from synth_ai.lm.core.exceptions import StructuredOutputCoercionFailureException
|
|
18
|
-
from synth_ai.lm.structured_outputs.inject import (
|
|
16
|
+
from synth_ai.v0.lm.constants import SPECIAL_BASE_TEMPS
|
|
17
|
+
from synth_ai.v0.lm.core.exceptions import StructuredOutputCoercionFailureException
|
|
18
|
+
from synth_ai.v0.lm.structured_outputs.inject import (
|
|
19
19
|
inject_structured_output_instructions,
|
|
20
20
|
)
|
|
21
|
-
from synth_ai.lm.structured_outputs.rehabilitate import (
|
|
21
|
+
from synth_ai.v0.lm.structured_outputs.rehabilitate import (
|
|
22
22
|
fix_errant_forced_async,
|
|
23
23
|
fix_errant_forced_sync,
|
|
24
24
|
pull_out_structured_output,
|
|
25
25
|
)
|
|
26
|
-
from synth_ai.lm.vendors.base import BaseLMResponse, VendorBase
|
|
26
|
+
from synth_ai.v0.lm.vendors.base import BaseLMResponse, VendorBase
|
|
27
27
|
|
|
28
28
|
logger = logging.getLogger(__name__)
|
|
29
29
|
|
|
@@ -5,7 +5,7 @@ import re
|
|
|
5
5
|
|
|
6
6
|
from pydantic import BaseModel
|
|
7
7
|
|
|
8
|
-
from synth_ai.lm.vendors.core.openai_api import OpenAIStructuredOutputClient
|
|
8
|
+
from synth_ai.v0.lm.vendors.core.openai_api import OpenAIStructuredOutputClient
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
def pull_out_structured_output(response_raw: str, response_model: type[BaseModel]) -> BaseModel:
|
|
@@ -5,20 +5,20 @@ import anthropic
|
|
|
5
5
|
import pydantic
|
|
6
6
|
from pydantic import BaseModel
|
|
7
7
|
|
|
8
|
-
from synth_ai.lm.caching.initialize import (
|
|
8
|
+
from synth_ai.v0.lm.caching.initialize import (
|
|
9
9
|
get_cache_handler,
|
|
10
10
|
)
|
|
11
|
-
from synth_ai.lm.constants import CLAUDE_REASONING_MODELS, SONNET_37_BUDGETS, SPECIAL_BASE_TEMPS
|
|
12
|
-
from synth_ai.lm.overrides import (
|
|
11
|
+
from synth_ai.v0.lm.constants import CLAUDE_REASONING_MODELS, SONNET_37_BUDGETS, SPECIAL_BASE_TEMPS
|
|
12
|
+
from synth_ai.v0.lm.overrides import (
|
|
13
13
|
apply_injection as apply_injection_overrides,
|
|
14
14
|
)
|
|
15
|
-
from synth_ai.lm.overrides import (
|
|
15
|
+
from synth_ai.v0.lm.overrides import (
|
|
16
16
|
apply_param_overrides,
|
|
17
17
|
use_overrides_for_messages,
|
|
18
18
|
)
|
|
19
|
-
from synth_ai.lm.tools.base import BaseTool
|
|
20
|
-
from synth_ai.lm.vendors.base import BaseLMResponse, VendorBase
|
|
21
|
-
from synth_ai.lm.vendors.core.openai_api import OpenAIStructuredOutputClient
|
|
19
|
+
from synth_ai.v0.lm.tools.base import BaseTool
|
|
20
|
+
from synth_ai.v0.lm.vendors.base import BaseLMResponse, VendorBase
|
|
21
|
+
from synth_ai.v0.lm.vendors.core.openai_api import OpenAIStructuredOutputClient
|
|
22
22
|
|
|
23
23
|
ANTHROPIC_EXCEPTIONS_TO_RETRY: tuple[type[Exception], ...] = (anthropic.APIError,)
|
|
24
24
|
|
|
@@ -81,7 +81,7 @@ class AnthropicAPI(VendorBase):
|
|
|
81
81
|
"temperature": lm_config.get("temperature", SPECIAL_BASE_TEMPS.get(model, 0)),
|
|
82
82
|
}
|
|
83
83
|
with use_overrides_for_messages(messages):
|
|
84
|
-
from synth_ai.lm.overrides import apply_tool_overrides
|
|
84
|
+
from synth_ai.v0.lm.overrides import apply_tool_overrides
|
|
85
85
|
|
|
86
86
|
api_params = apply_tool_overrides(api_params)
|
|
87
87
|
api_params = apply_param_overrides(api_params)
|
|
@@ -100,13 +100,13 @@ class AnthropicAPI(VendorBase):
|
|
|
100
100
|
and model in CLAUDE_REASONING_MODELS
|
|
101
101
|
and reasoning_effort in ["high", "medium"]
|
|
102
102
|
):
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
103
|
+
budget = SONNET_37_BUDGETS[reasoning_effort]
|
|
104
|
+
api_params["thinking"] = {
|
|
105
|
+
"type": "enabled",
|
|
106
|
+
"budget_tokens": budget,
|
|
107
|
+
}
|
|
108
|
+
api_params["max_tokens"] = budget + 4096
|
|
109
|
+
api_params["temperature"] = 1
|
|
110
110
|
except (ImportError, AttributeError, TypeError):
|
|
111
111
|
pass
|
|
112
112
|
|
|
@@ -183,7 +183,7 @@ class AnthropicAPI(VendorBase):
|
|
|
183
183
|
"temperature": lm_config.get("temperature", SPECIAL_BASE_TEMPS.get(model, 0)),
|
|
184
184
|
}
|
|
185
185
|
with use_overrides_for_messages(messages):
|
|
186
|
-
from synth_ai.lm.overrides import apply_tool_overrides
|
|
186
|
+
from synth_ai.v0.lm.overrides import apply_tool_overrides
|
|
187
187
|
|
|
188
188
|
api_params = apply_tool_overrides(api_params)
|
|
189
189
|
api_params = apply_param_overrides(api_params)
|
|
@@ -8,15 +8,15 @@ import google.genai as genai
|
|
|
8
8
|
from google.api_core.exceptions import ResourceExhausted
|
|
9
9
|
from google.genai import types
|
|
10
10
|
|
|
11
|
-
from synth_ai.lm.caching.initialize import get_cache_handler
|
|
12
|
-
from synth_ai.lm.constants import (
|
|
11
|
+
from synth_ai.v0.lm.caching.initialize import get_cache_handler
|
|
12
|
+
from synth_ai.v0.lm.constants import (
|
|
13
13
|
GEMINI_REASONING_MODELS,
|
|
14
14
|
GEMINI_THINKING_BUDGETS,
|
|
15
15
|
SPECIAL_BASE_TEMPS,
|
|
16
16
|
)
|
|
17
|
-
from synth_ai.lm.tools.base import BaseTool
|
|
18
|
-
from synth_ai.lm.vendors.base import BaseLMResponse, VendorBase
|
|
19
|
-
from synth_ai.lm.vendors.retries import BACKOFF_TOLERANCE, MAX_BACKOFF, backoff
|
|
17
|
+
from synth_ai.v0.lm.tools.base import BaseTool
|
|
18
|
+
from synth_ai.v0.lm.vendors.base import BaseLMResponse, VendorBase
|
|
19
|
+
from synth_ai.v0.lm.vendors.retries import BACKOFF_TOLERANCE, MAX_BACKOFF, backoff
|
|
20
20
|
|
|
21
21
|
ALIASES = {
|
|
22
22
|
"gemini-2.5-flash": "gemini-2.5-flash-preview-04-17",
|
|
@@ -6,11 +6,11 @@ import pydantic
|
|
|
6
6
|
from mistralai import Mistral # use Mistral as both sync and async client
|
|
7
7
|
from pydantic import BaseModel
|
|
8
8
|
|
|
9
|
-
from synth_ai.lm.caching.initialize import get_cache_handler
|
|
10
|
-
from synth_ai.lm.constants import SPECIAL_BASE_TEMPS
|
|
11
|
-
from synth_ai.lm.tools.base import BaseTool
|
|
12
|
-
from synth_ai.lm.vendors.base import BaseLMResponse, VendorBase
|
|
13
|
-
from synth_ai.lm.vendors.core.openai_api import OpenAIStructuredOutputClient
|
|
9
|
+
from synth_ai.v0.lm.caching.initialize import get_cache_handler
|
|
10
|
+
from synth_ai.v0.lm.constants import SPECIAL_BASE_TEMPS
|
|
11
|
+
from synth_ai.v0.lm.tools.base import BaseTool
|
|
12
|
+
from synth_ai.v0.lm.vendors.base import BaseLMResponse, VendorBase
|
|
13
|
+
from synth_ai.v0.lm.vendors.core.openai_api import OpenAIStructuredOutputClient
|
|
14
14
|
|
|
15
15
|
# Since the mistralai package doesn't expose an exceptions module,
|
|
16
16
|
# we fallback to catching all Exceptions for retry.
|
|
@@ -15,12 +15,12 @@ import pydantic_core
|
|
|
15
15
|
# from openai import AsyncOpenAI, OpenAI
|
|
16
16
|
from pydantic import BaseModel
|
|
17
17
|
|
|
18
|
-
from synth_ai.config.base_url import PROD_BASE_URL_DEFAULT
|
|
19
|
-
from synth_ai.lm.caching.initialize import get_cache_handler
|
|
20
|
-
from synth_ai.lm.constants import OPENAI_REASONING_MODELS, SPECIAL_BASE_TEMPS
|
|
21
|
-
from synth_ai.lm.tools.base import BaseTool
|
|
22
|
-
from synth_ai.lm.vendors.base import BaseLMResponse
|
|
23
|
-
from synth_ai.lm.vendors.openai_standard import OpenAIStandard
|
|
18
|
+
from synth_ai.v0.config.base_url import PROD_BASE_URL_DEFAULT
|
|
19
|
+
from synth_ai.v0.lm.caching.initialize import get_cache_handler
|
|
20
|
+
from synth_ai.v0.lm.constants import OPENAI_REASONING_MODELS, SPECIAL_BASE_TEMPS
|
|
21
|
+
from synth_ai.v0.lm.tools.base import BaseTool
|
|
22
|
+
from synth_ai.v0.lm.vendors.base import BaseLMResponse
|
|
23
|
+
from synth_ai.v0.lm.vendors.openai_standard import OpenAIStandard
|
|
24
24
|
|
|
25
25
|
# Exceptions that should trigger retry logic for OpenAI API calls
|
|
26
26
|
OPENAI_EXCEPTIONS_TO_RETRY: tuple[type[Exception], ...] = (
|
|
@@ -56,8 +56,8 @@ class OpenAIStructuredOutputClient(OpenAIStandard):
|
|
|
56
56
|
|
|
57
57
|
if use_synth:
|
|
58
58
|
# Use Synth clients for Synth endpoints
|
|
59
|
-
from synth_ai.lm.vendors.synth_client import AsyncSynthClient, SyncSynthClient
|
|
60
|
-
from synth_ai.lm.config import SynthConfig
|
|
59
|
+
from synth_ai.v0.lm.vendors.synth_client import AsyncSynthClient, SyncSynthClient
|
|
60
|
+
from synth_ai.v0.lm.config import SynthConfig
|
|
61
61
|
|
|
62
62
|
# Create config from OPENAI_* environment variables if available
|
|
63
63
|
openai_base = os.getenv("OPENAI_API_BASE")
|
|
@@ -73,12 +73,14 @@ class OpenAIStructuredOutputClient(OpenAIStandard):
|
|
|
73
73
|
async_client = AsyncSynthClient()
|
|
74
74
|
elif synth_logging:
|
|
75
75
|
# print("Using synth logging - OpenAIStructuredOutputClient")
|
|
76
|
-
from synth_ai.lm.provider_support.openai import AsyncOpenAI, OpenAI
|
|
76
|
+
from synth_ai.v0.lm.provider_support.openai import AsyncOpenAI, OpenAI
|
|
77
|
+
|
|
77
78
|
sync_client = OpenAI()
|
|
78
79
|
async_client = AsyncOpenAI()
|
|
79
80
|
else:
|
|
80
81
|
# print("Not using synth logging - OpenAIStructuredOutputClient")
|
|
81
82
|
from openai import AsyncOpenAI, OpenAI
|
|
83
|
+
|
|
82
84
|
sync_client = OpenAI()
|
|
83
85
|
async_client = AsyncOpenAI()
|
|
84
86
|
|
|
@@ -196,7 +198,7 @@ class OpenAIPrivate(OpenAIStandard):
|
|
|
196
198
|
def __init__(self, synth_logging: bool = True):
|
|
197
199
|
if synth_logging:
|
|
198
200
|
# print("Using synth logging - OpenAIPrivate")
|
|
199
|
-
from synth_ai.lm.provider_support.openai import AsyncOpenAI, OpenAI
|
|
201
|
+
from synth_ai.v0.lm.provider_support.openai import AsyncOpenAI, OpenAI
|
|
200
202
|
else:
|
|
201
203
|
# print("Not using synth logging - OpenAIPrivate")
|
|
202
204
|
from openai import AsyncOpenAI, OpenAI
|