synth-ai 0.2.8.dev2__py3-none-any.whl → 0.4.3__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.
- synth_ai/__init__.py +44 -24
- synth_ai/__main__.py +30 -3
- synth_ai/cli/__init__.py +103 -48
- synth_ai/cli/__main__.py +42 -0
- synth_ai/cli/_internal/__init__.py +5 -0
- synth_ai/cli/_internal/modal_wrapper.py +31 -0
- synth_ai/cli/_internal/storage.py +20 -0
- synth_ai/cli/_internal/typer_patch.py +47 -0
- synth_ai/cli/_internal/validate_task_app.py +29 -0
- synth_ai/cli/agents/__init__.py +17 -0
- synth_ai/cli/agents/claude.py +77 -0
- synth_ai/cli/agents/codex.py +265 -0
- synth_ai/cli/agents/opencode.py +253 -0
- synth_ai/cli/commands/__init__.py +18 -0
- synth_ai/cli/commands/artifacts/__init__.py +13 -0
- synth_ai/cli/commands/artifacts/client.py +119 -0
- synth_ai/cli/commands/artifacts/config.py +57 -0
- synth_ai/cli/commands/artifacts/core.py +24 -0
- synth_ai/cli/commands/artifacts/download.py +188 -0
- synth_ai/cli/commands/artifacts/export.py +186 -0
- synth_ai/cli/commands/artifacts/list.py +156 -0
- synth_ai/cli/commands/artifacts/parsing.py +250 -0
- synth_ai/cli/commands/artifacts/show.py +336 -0
- synth_ai/cli/commands/demo/__init__.py +3 -0
- synth_ai/cli/commands/demo/core.py +153 -0
- synth_ai/cli/commands/eval/__init__.py +10 -0
- synth_ai/cli/commands/eval/config.py +338 -0
- synth_ai/cli/commands/eval/core.py +256 -0
- synth_ai/cli/commands/eval/runner.py +704 -0
- synth_ai/cli/commands/eval/validation.py +60 -0
- synth_ai/cli/commands/filter/__init__.py +12 -0
- synth_ai/cli/commands/filter/core.py +424 -0
- synth_ai/cli/commands/filter/errors.py +55 -0
- synth_ai/cli/commands/filter/validation.py +77 -0
- synth_ai/cli/commands/help/__init__.py +185 -0
- synth_ai/cli/commands/help/core.py +72 -0
- synth_ai/cli/commands/scan/__init__.py +19 -0
- synth_ai/cli/commands/scan/cloudflare_scanner.py +403 -0
- synth_ai/cli/commands/scan/core.py +344 -0
- synth_ai/cli/commands/scan/health_checker.py +242 -0
- synth_ai/cli/commands/scan/local_scanner.py +278 -0
- synth_ai/cli/commands/scan/models.py +83 -0
- synth_ai/cli/commands/smoke/__init__.py +7 -0
- synth_ai/cli/commands/smoke/core.py +1428 -0
- synth_ai/cli/commands/status/__init__.py +3 -0
- synth_ai/cli/commands/status/client.py +91 -0
- synth_ai/cli/commands/status/config.py +12 -0
- synth_ai/cli/commands/status/errors.py +11 -0
- synth_ai/cli/commands/status/subcommands/__init__.py +3 -0
- synth_ai/cli/commands/status/subcommands/config.py +13 -0
- synth_ai/cli/commands/status/subcommands/files.py +34 -0
- synth_ai/cli/commands/status/subcommands/jobs.py +51 -0
- synth_ai/cli/commands/status/subcommands/models.py +35 -0
- synth_ai/cli/commands/status/subcommands/runs.py +34 -0
- synth_ai/cli/commands/status/subcommands/session.py +77 -0
- synth_ai/cli/commands/status/subcommands/summary.py +39 -0
- synth_ai/cli/commands/status/subcommands/utils.py +41 -0
- synth_ai/cli/commands/status/utils.py +23 -0
- synth_ai/cli/commands/train/__init__.py +53 -0
- synth_ai/cli/commands/train/core.py +22 -0
- synth_ai/cli/commands/train/errors.py +117 -0
- synth_ai/cli/commands/train/judge_schemas.py +201 -0
- synth_ai/cli/commands/train/judge_validation.py +305 -0
- synth_ai/cli/commands/train/prompt_learning_validation.py +633 -0
- synth_ai/cli/commands/train/validation.py +392 -0
- synth_ai/cli/demo_apps/__init__.py +10 -0
- synth_ai/cli/demo_apps/core/__init__.py +28 -0
- synth_ai/{demos → cli/demo_apps}/core/cli.py +783 -441
- synth_ai/cli/demo_apps/crafter/__init__.py +1 -0
- synth_ai/cli/demo_apps/crafter/crafter_fft_4b.toml +55 -0
- synth_ai/cli/demo_apps/crafter/grpo_crafter_task_app.py +186 -0
- synth_ai/cli/demo_apps/crafter/rl_from_base_qwen4b.toml +74 -0
- synth_ai/cli/demo_apps/demo_registry.py +176 -0
- synth_ai/cli/demo_apps/demo_task_apps/__init__.py +7 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/core.py +75 -37
- synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/crafter_fft_4b.toml +53 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +73 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/grpo_crafter_task_app.py +185 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/_common.py +1 -2
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +2 -1
- synth_ai/cli/demo_apps/demo_task_apps/math/config.toml +73 -0
- synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +3 -6
- synth_ai/cli/demo_apps/demo_task_apps/math/modal_task_app.py +738 -0
- synth_ai/cli/demo_apps/demo_task_apps/math/task_app_entry.py +39 -0
- synth_ai/cli/demo_apps/math/__init__.py +1 -0
- synth_ai/cli/demo_apps/math/_common.py +16 -0
- synth_ai/cli/demo_apps/math/app.py +38 -0
- synth_ai/cli/demo_apps/math/config.toml +75 -0
- synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
- synth_ai/cli/demo_apps/math/modal_task_app.py +698 -0
- synth_ai/cli/demo_apps/math/task_app_entry.py +53 -0
- synth_ai/cli/demo_apps/mipro/main.py +271 -0
- synth_ai/cli/demo_apps/mipro/task_app.py +922 -0
- synth_ai/cli/demo_apps/mipro/train_cfg.toml +92 -0
- synth_ai/cli/demos/__init__.py +12 -0
- synth_ai/cli/demos/demo.py +32 -0
- synth_ai/cli/demos/rl_demo.py +254 -0
- synth_ai/cli/deploy.py +216 -0
- synth_ai/cli/infra/__init__.py +14 -0
- synth_ai/cli/{balance.py → infra/balance.py} +16 -4
- synth_ai/cli/infra/mcp.py +35 -0
- synth_ai/cli/infra/modal_app.py +36 -0
- synth_ai/cli/infra/setup.py +69 -0
- synth_ai/cli/infra/status.py +16 -0
- synth_ai/cli/infra/turso.py +77 -0
- synth_ai/cli/lib/__init__.py +10 -0
- synth_ai/cli/lib/agents.py +76 -0
- synth_ai/cli/lib/apps/modal_app.py +101 -0
- synth_ai/cli/lib/apps/task_app.py +642 -0
- synth_ai/cli/lib/bin.py +39 -0
- synth_ai/cli/lib/env.py +375 -0
- synth_ai/cli/lib/errors.py +85 -0
- synth_ai/cli/lib/modal.py +315 -0
- synth_ai/cli/lib/plotting.py +126 -0
- synth_ai/cli/lib/prompt_args.py +39 -0
- synth_ai/cli/lib/prompts.py +284 -0
- synth_ai/cli/lib/sqld.py +122 -0
- synth_ai/cli/lib/task_app_discovery.py +884 -0
- synth_ai/cli/lib/task_app_env.py +295 -0
- synth_ai/cli/lib/train_cfgs.py +300 -0
- synth_ai/cli/lib/tunnel_records.py +207 -0
- synth_ai/cli/local/__init__.py +14 -0
- synth_ai/cli/local/experiment_queue/__init__.py +72 -0
- synth_ai/cli/local/experiment_queue/api_schemas.py +221 -0
- synth_ai/cli/local/experiment_queue/celery_app.py +208 -0
- synth_ai/cli/local/experiment_queue/config.py +128 -0
- synth_ai/cli/local/experiment_queue/config_utils.py +272 -0
- synth_ai/cli/local/experiment_queue/database.py +175 -0
- synth_ai/cli/local/experiment_queue/dispatcher.py +119 -0
- synth_ai/cli/local/experiment_queue/models.py +231 -0
- synth_ai/cli/local/experiment_queue/progress_info.py +160 -0
- synth_ai/cli/local/experiment_queue/results.py +373 -0
- synth_ai/cli/local/experiment_queue/schemas.py +131 -0
- synth_ai/cli/local/experiment_queue/service.py +344 -0
- synth_ai/cli/local/experiment_queue/status.py +372 -0
- synth_ai/cli/local/experiment_queue/status_tracker.py +360 -0
- synth_ai/cli/local/experiment_queue/tasks.py +1984 -0
- synth_ai/cli/local/experiment_queue/trace_storage.py +65 -0
- synth_ai/cli/local/experiment_queue/validation.py +157 -0
- synth_ai/cli/local/session/__init__.py +92 -0
- synth_ai/cli/local/session/client.py +383 -0
- synth_ai/cli/local/session/constants.py +63 -0
- synth_ai/cli/local/session/exceptions.py +105 -0
- synth_ai/cli/local/session/manager.py +139 -0
- synth_ai/cli/local/session/models.py +89 -0
- synth_ai/cli/local/session/query.py +110 -0
- synth_ai/cli/root.py +150 -108
- synth_ai/cli/task_apps/__init__.py +37 -0
- synth_ai/cli/task_apps/commands.py +3145 -0
- synth_ai/cli/task_apps/deploy.py +7 -0
- synth_ai/cli/task_apps/list.py +26 -0
- synth_ai/cli/task_apps/main.py +36 -0
- synth_ai/cli/task_apps/modal_serve.py +11 -0
- synth_ai/cli/task_apps/serve.py +11 -0
- synth_ai/cli/training/__init__.py +8 -0
- synth_ai/cli/training/train.py +5 -0
- synth_ai/cli/training/train_cfg.py +34 -0
- synth_ai/cli/{watch.py → training/watch.py} +13 -18
- synth_ai/cli/turso.py +52 -0
- synth_ai/cli/utils/__init__.py +8 -0
- synth_ai/cli/utils/experiments.py +235 -0
- synth_ai/cli/utils/queue.py +504 -0
- synth_ai/cli/{recent.py → utils/recent.py} +13 -7
- synth_ai/cli/{traces.py → utils/traces.py} +9 -5
- synth_ai/contracts/__init__.py +67 -0
- synth_ai/core/__init__.py +100 -0
- synth_ai/core/_utils/__init__.py +54 -0
- synth_ai/core/_utils/base_url.py +10 -0
- synth_ai/core/_utils/http.py +10 -0
- synth_ai/core/_utils/prompts.py +14 -0
- synth_ai/core/_utils/task_app_state.py +12 -0
- synth_ai/core/_utils/user_config.py +10 -0
- synth_ai/core/apps/common.py +116 -0
- synth_ai/core/auth.py +95 -0
- synth_ai/core/cfgs.py +240 -0
- synth_ai/core/config/__init__.py +16 -0
- synth_ai/core/config/base.py +168 -0
- synth_ai/core/config/resolver.py +89 -0
- synth_ai/core/env.py +231 -0
- synth_ai/core/errors.py +126 -0
- synth_ai/core/http.py +230 -0
- synth_ai/core/integrations/__init__.py +11 -0
- synth_ai/core/integrations/cloudflare.py +1710 -0
- synth_ai/core/integrations/mcp/__init__.py +6 -0
- synth_ai/core/integrations/mcp/__main__.py +8 -0
- synth_ai/core/integrations/mcp/claude.py +36 -0
- synth_ai/core/integrations/mcp/main.py +254 -0
- synth_ai/core/integrations/mcp/setup.py +100 -0
- synth_ai/core/integrations/modal.py +277 -0
- synth_ai/core/json.py +72 -0
- synth_ai/core/log_filter.py +99 -0
- synth_ai/core/logging.py +82 -0
- synth_ai/core/paths.py +107 -0
- synth_ai/core/pricing.py +109 -0
- synth_ai/core/process.py +233 -0
- synth_ai/core/ssl.py +25 -0
- synth_ai/core/storage/__init__.py +71 -0
- synth_ai/core/task_app_state.py +318 -0
- synth_ai/core/telemetry.py +282 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/__init__.py +5 -1
- synth_ai/{tracing_v3 → core/tracing_v3}/abstractions.py +21 -4
- synth_ai/core/tracing_v3/config.py +229 -0
- synth_ai/core/tracing_v3/constants.py +21 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/db_config.py +42 -29
- synth_ai/{tracing_v3 → core/tracing_v3}/decorators.py +80 -45
- synth_ai/{tracing_v3 → core/tracing_v3}/examples/basic_usage.py +15 -9
- synth_ai/{tracing_v3 → core/tracing_v3}/hooks.py +6 -4
- synth_ai/{tracing_v3 → core/tracing_v3}/llm_call_record_helpers.py +161 -61
- synth_ai/{tracing_v3 → core/tracing_v3}/migration_helper.py +1 -2
- synth_ai/{tracing_v3 → core/tracing_v3}/replica_sync.py +12 -7
- synth_ai/core/tracing_v3/serialization.py +130 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/session_tracer.py +88 -21
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/base.py +99 -12
- synth_ai/core/tracing_v3/storage/config.py +109 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/factory.py +11 -9
- synth_ai/{tracing_v3 → core/tracing_v3}/storage/utils.py +15 -11
- synth_ai/core/tracing_v3/trace_utils.py +326 -0
- synth_ai/core/tracing_v3/turso/__init__.py +12 -0
- synth_ai/core/tracing_v3/turso/daemon.py +278 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/turso/models.py +7 -3
- synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
- synth_ai/{tracing_v3 → core/tracing_v3}/utils.py +5 -4
- synth_ai/core/urls.py +18 -0
- synth_ai/core/user_config.py +137 -0
- synth_ai/core/uvicorn.py +222 -0
- synth_ai/data/__init__.py +83 -0
- synth_ai/data/enums.py +123 -0
- synth_ai/data/rewards.py +152 -0
- synth_ai/data/traces.py +35 -0
- synth_ai/products/__init__.py +6 -0
- synth_ai/products/graph_evolve/__init__.py +46 -0
- synth_ai/products/graph_evolve/client.py +226 -0
- synth_ai/products/graph_evolve/config.py +591 -0
- synth_ai/products/graph_evolve/converters/__init__.py +42 -0
- synth_ai/products/graph_evolve/converters/openai_sft.py +484 -0
- synth_ai/products/graph_evolve/examples/hotpotqa/config.toml +109 -0
- synth_ai/products/graph_evolve/run.py +222 -0
- synth_ai/products/graph_gepa/__init__.py +23 -0
- synth_ai/products/graph_gepa/converters/__init__.py +19 -0
- synth_ai/products/graph_gepa/converters/openai_sft.py +29 -0
- synth_ai/sdk/__init__.py +123 -0
- synth_ai/sdk/api/__init__.py +1 -0
- synth_ai/sdk/api/models/supported.py +514 -0
- synth_ai/sdk/api/research_agent/__init__.py +296 -0
- synth_ai/sdk/api/train/__init__.py +85 -0
- synth_ai/sdk/api/train/builders.py +895 -0
- synth_ai/sdk/api/train/cli.py +2199 -0
- synth_ai/sdk/api/train/config_finder.py +267 -0
- synth_ai/sdk/api/train/configs/__init__.py +65 -0
- synth_ai/sdk/api/train/configs/prompt_learning.py +1706 -0
- synth_ai/sdk/api/train/configs/rl.py +187 -0
- synth_ai/sdk/api/train/configs/sft.py +99 -0
- synth_ai/sdk/api/train/configs/shared.py +81 -0
- synth_ai/sdk/api/train/context_learning.py +312 -0
- synth_ai/sdk/api/train/env_resolver.py +418 -0
- synth_ai/sdk/api/train/graph_validators.py +216 -0
- synth_ai/sdk/api/train/graphgen.py +984 -0
- synth_ai/sdk/api/train/graphgen_models.py +823 -0
- synth_ai/sdk/api/train/graphgen_validators.py +109 -0
- synth_ai/sdk/api/train/local_api.py +10 -0
- synth_ai/sdk/api/train/pollers.py +124 -0
- synth_ai/sdk/api/train/progress/__init__.py +97 -0
- synth_ai/sdk/api/train/progress/dataclasses.py +569 -0
- synth_ai/sdk/api/train/progress/events.py +326 -0
- synth_ai/sdk/api/train/progress/results.py +428 -0
- synth_ai/sdk/api/train/progress/tracker.py +641 -0
- synth_ai/sdk/api/train/prompt_learning.py +469 -0
- synth_ai/sdk/api/train/rl.py +441 -0
- synth_ai/sdk/api/train/sft.py +396 -0
- synth_ai/sdk/api/train/summary.py +522 -0
- synth_ai/sdk/api/train/supported_algos.py +147 -0
- synth_ai/sdk/api/train/task_app.py +351 -0
- synth_ai/sdk/api/train/utils.py +279 -0
- synth_ai/sdk/api/train/validators.py +2424 -0
- synth_ai/sdk/graphs/__init__.py +15 -0
- synth_ai/sdk/graphs/completions.py +570 -0
- synth_ai/{inference → sdk/inference}/__init__.py +0 -1
- synth_ai/sdk/inference/client.py +128 -0
- synth_ai/sdk/jobs/__init__.py +16 -0
- synth_ai/sdk/jobs/client.py +371 -0
- synth_ai/sdk/judging/__init__.py +14 -0
- synth_ai/sdk/judging/base.py +24 -0
- synth_ai/sdk/judging/client.py +40 -0
- synth_ai/sdk/judging/schemas.py +222 -0
- synth_ai/sdk/judging/types.py +42 -0
- synth_ai/sdk/learning/__init__.py +99 -0
- synth_ai/sdk/learning/algorithms.py +14 -0
- synth_ai/{learning → sdk/learning}/client.py +121 -30
- synth_ai/sdk/learning/config.py +5 -0
- synth_ai/{learning → sdk/learning}/constants.py +0 -2
- synth_ai/sdk/learning/context_learning_client.py +531 -0
- synth_ai/sdk/learning/context_learning_types.py +292 -0
- synth_ai/sdk/learning/ft_client.py +7 -0
- synth_ai/{learning → sdk/learning}/health.py +15 -9
- synth_ai/{learning → sdk/learning}/jobs.py +44 -47
- synth_ai/sdk/learning/prompt_extraction.py +334 -0
- synth_ai/sdk/learning/prompt_learning_client.py +455 -0
- synth_ai/sdk/learning/prompt_learning_types.py +186 -0
- synth_ai/{rl → sdk/learning/rl}/__init__.py +13 -8
- synth_ai/{learning/rl_client.py → sdk/learning/rl/client.py} +89 -77
- synth_ai/sdk/learning/rl/config.py +31 -0
- synth_ai/{rl → sdk/learning/rl}/contracts.py +5 -14
- synth_ai/{rl → sdk/learning/rl}/env_keys.py +45 -16
- synth_ai/sdk/learning/rl/secrets.py +13 -0
- synth_ai/sdk/learning/rl_client.py +5 -0
- synth_ai/sdk/learning/sft/__init__.py +29 -0
- synth_ai/sdk/learning/sft/client.py +95 -0
- synth_ai/sdk/learning/sft/config.py +270 -0
- synth_ai/sdk/learning/sft/data.py +698 -0
- synth_ai/sdk/learning/sse.py +57 -0
- synth_ai/sdk/learning/validators.py +52 -0
- synth_ai/sdk/localapi/__init__.py +40 -0
- synth_ai/sdk/localapi/apps/__init__.py +28 -0
- synth_ai/sdk/localapi/client.py +10 -0
- synth_ai/sdk/localapi/contracts.py +10 -0
- synth_ai/sdk/localapi/helpers.py +519 -0
- synth_ai/sdk/localapi/rollouts.py +87 -0
- synth_ai/sdk/localapi/server.py +29 -0
- synth_ai/sdk/localapi/template.py +70 -0
- synth_ai/sdk/streaming/__init__.py +35 -0
- synth_ai/sdk/streaming/config.py +94 -0
- synth_ai/sdk/streaming/handlers.py +1997 -0
- synth_ai/sdk/streaming/streamer.py +713 -0
- synth_ai/sdk/streaming/types.py +112 -0
- synth_ai/sdk/task/__init__.py +164 -0
- synth_ai/sdk/task/apps/__init__.py +169 -0
- synth_ai/sdk/task/auth.py +165 -0
- synth_ai/sdk/task/client.py +175 -0
- synth_ai/sdk/task/config.py +257 -0
- synth_ai/sdk/task/contracts.py +219 -0
- synth_ai/sdk/task/datasets.py +108 -0
- synth_ai/sdk/task/errors.py +50 -0
- synth_ai/sdk/task/health.py +34 -0
- synth_ai/sdk/task/in_process.py +1190 -0
- synth_ai/sdk/task/in_process_runner.py +314 -0
- synth_ai/sdk/task/inference_api.py +299 -0
- synth_ai/sdk/task/json.py +111 -0
- synth_ai/sdk/task/proxy.py +287 -0
- synth_ai/sdk/task/rubrics/__init__.py +55 -0
- synth_ai/sdk/task/rubrics/loaders.py +156 -0
- synth_ai/sdk/task/rubrics/models.py +57 -0
- synth_ai/sdk/task/rubrics/scoring.py +116 -0
- synth_ai/sdk/task/rubrics/strict.py +149 -0
- synth_ai/sdk/task/rubrics.py +219 -0
- synth_ai/sdk/task/server.py +631 -0
- synth_ai/sdk/task/trace_correlation_helpers.py +539 -0
- synth_ai/sdk/task/tracing_utils.py +95 -0
- synth_ai/sdk/task/validators.py +441 -0
- synth_ai/sdk/task/vendors.py +59 -0
- synth_ai/sdk/training/__init__.py +102 -0
- synth_ai/sdk/tunnels/__init__.py +83 -0
- synth_ai/sdk/tunnels/cleanup.py +83 -0
- synth_ai/sdk/tunnels/ports.py +120 -0
- synth_ai/utils/__init__.py +213 -0
- synth_ai-0.4.3.dist-info/METADATA +262 -0
- synth_ai-0.4.3.dist-info/RECORD +370 -0
- {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/entry_points.txt +0 -1
- synth_ai/cli/calc.py +0 -69
- synth_ai/cli/demo.py +0 -144
- synth_ai/cli/legacy_root_backup.py +0 -470
- synth_ai/cli/man.py +0 -106
- synth_ai/cli/rl_demo.py +0 -202
- synth_ai/cli/status.py +0 -133
- synth_ai/config/base_url.py +0 -107
- synth_ai/core/experiment.py +0 -15
- synth_ai/core/system.py +0 -15
- synth_ai/demos/core/__init__.py +0 -1
- synth_ai/demos/demo_task_apps/__init__.py +0 -1
- synth_ai/demos/demo_task_apps/math/config.toml +0 -129
- synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
- synth_ai/demos/demo_task_apps/math/modal_task_app.py +0 -415
- synth_ai/environments/__init__.py +0 -31
- synth_ai/environments/environment/__init__.py +0 -1
- synth_ai/environments/environment/artifacts/__init__.py +0 -1
- synth_ai/environments/environment/artifacts/base.py +0 -52
- synth_ai/environments/environment/core.py +0 -67
- synth_ai/environments/environment/db/__init__.py +0 -1
- synth_ai/environments/environment/db/sqlite.py +0 -45
- synth_ai/environments/environment/registry.py +0 -233
- synth_ai/environments/environment/resources/sqlite.py +0 -45
- synth_ai/environments/environment/results.py +0 -1
- synth_ai/environments/environment/rewards/__init__.py +0 -1
- synth_ai/environments/environment/rewards/core.py +0 -29
- synth_ai/environments/environment/shared_engine.py +0 -26
- synth_ai/environments/environment/tools/__init__.py +0 -200
- synth_ai/environments/examples/__init__.py +0 -1
- synth_ai/environments/examples/bandit/__init__.py +0 -33
- synth_ai/environments/examples/bandit/engine.py +0 -294
- synth_ai/environments/examples/bandit/environment.py +0 -194
- synth_ai/environments/examples/bandit/taskset.py +0 -200
- synth_ai/environments/examples/crafter_classic/__init__.py +0 -8
- synth_ai/environments/examples/crafter_classic/agent_demos/analyze_semantic_words_markdown.py +0 -250
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_comprehensive_evaluation.py +0 -59
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_browser.py +0 -152
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_config.toml +0 -24
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_evaluation_framework.py +0 -1194
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/crafter_synth_config.toml +0 -56
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_config_modal.toml +0 -32
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/filter_traces_sft_turso.py +0 -738
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/kick_off_ft_modal.py +0 -384
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_action_results.py +0 -53
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_agent_actions.py +0 -178
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_latest_run.py +0 -222
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_lm_traces.py +0 -183
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_no_rewards.py +0 -210
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/analyze_trace_issue.py +0 -206
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_db_schema.py +0 -49
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/check_latest_results.py +0 -64
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/debug_agent_responses.py +0 -88
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_modal_ft/old/quick_trace_check.py +0 -77
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/compare_experiments.py +0 -324
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/filter_traces_sft_turso.py +0 -580
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/kick_off_ft_oai.py +0 -362
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/multi_model_config.toml +0 -49
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_enhanced_hooks.py +0 -332
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_events.py +0 -97
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/analyze_hook_results.py +0 -217
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_hook_storage.py +0 -87
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/check_seeds.py +0 -88
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/compare_seed_performance.py +0 -195
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/custom_eval_pipelines.py +0 -400
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/plot_hook_frequency.py +0 -195
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/old/seed_analysis_summary.py +0 -56
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_openai_ft/run_rollouts_for_models_and_compare_v3.py +0 -858
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_quick_evaluation.py +0 -52
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_react_agent.py +0 -874
- synth_ai/environments/examples/crafter_classic/agent_demos/crafter_trace_evaluation.py +0 -1412
- synth_ai/environments/examples/crafter_classic/agent_demos/example_v3_usage.py +0 -216
- synth_ai/environments/examples/crafter_classic/agent_demos/old/compare_traces.py +0 -296
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_comprehensive_evaluation.py +0 -58
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_env_serialization.py +0 -464
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_evaluation_browser.py +0 -152
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_quick_evaluation.py +0 -51
- synth_ai/environments/examples/crafter_classic/agent_demos/old/crafter_trace_evaluation.py +0 -1412
- synth_ai/environments/examples/crafter_classic/agent_demos/old/debug_player_loss.py +0 -112
- synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_service.py +0 -203
- synth_ai/environments/examples/crafter_classic/agent_demos/old/diagnose_slowness.py +0 -305
- synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_by_difficulty.py +0 -126
- synth_ai/environments/examples/crafter_classic/agent_demos/old/eval_example.py +0 -94
- synth_ai/environments/examples/crafter_classic/agent_demos/old/explore_saved_states.py +0 -142
- synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft.py +0 -26
- synth_ai/environments/examples/crafter_classic/agent_demos/old/filter_traces_sft_OLD.py +0 -984
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_gemini.py +0 -724
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_data_modal.py +0 -386
- synth_ai/environments/examples/crafter_classic/agent_demos/old/generate_ft_metadata.py +0 -205
- synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_gemini.py +0 -150
- synth_ai/environments/examples/crafter_classic/agent_demos/old/kick_off_ft_modal.py +0 -283
- synth_ai/environments/examples/crafter_classic/agent_demos/old/prepare_vertex_ft.py +0 -280
- synth_ai/environments/examples/crafter_classic/agent_demos/old/profile_env_slowness.py +0 -456
- synth_ai/environments/examples/crafter_classic/agent_demos/old/replicate_issue.py +0 -166
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_and_eval.py +0 -102
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_comparison.py +0 -128
- synth_ai/environments/examples/crafter_classic/agent_demos/old/run_qwen_rollouts.py +0 -655
- synth_ai/environments/examples/crafter_classic/agent_demos/old/trace_eval_OLD.py +0 -202
- synth_ai/environments/examples/crafter_classic/agent_demos/old/validate_openai_format.py +0 -166
- synth_ai/environments/examples/crafter_classic/config_logging.py +0 -111
- synth_ai/environments/examples/crafter_classic/debug_translation.py +0 -0
- synth_ai/environments/examples/crafter_classic/engine.py +0 -579
- synth_ai/environments/examples/crafter_classic/engine_deterministic_patch.py +0 -64
- synth_ai/environments/examples/crafter_classic/engine_helpers/action_map.py +0 -6
- synth_ai/environments/examples/crafter_classic/engine_helpers/serialization.py +0 -75
- synth_ai/environments/examples/crafter_classic/engine_serialization_patch_v3.py +0 -267
- synth_ai/environments/examples/crafter_classic/environment.py +0 -404
- synth_ai/environments/examples/crafter_classic/taskset.py +0 -233
- synth_ai/environments/examples/crafter_classic/trace_hooks_v3.py +0 -228
- synth_ai/environments/examples/crafter_classic/world_config_patch_simple.py +0 -299
- synth_ai/environments/examples/crafter_custom/__init__.py +0 -4
- synth_ai/environments/examples/crafter_custom/agent_demos/__init__.py +0 -1
- synth_ai/environments/examples/crafter_custom/agent_demos/trace_eval.py +0 -202
- synth_ai/environments/examples/crafter_custom/crafter/__init__.py +0 -7
- synth_ai/environments/examples/crafter_custom/crafter/config.py +0 -182
- synth_ai/environments/examples/crafter_custom/crafter/constants.py +0 -8
- synth_ai/environments/examples/crafter_custom/crafter/engine.py +0 -269
- synth_ai/environments/examples/crafter_custom/crafter/env.py +0 -262
- synth_ai/environments/examples/crafter_custom/crafter/objects.py +0 -417
- synth_ai/environments/examples/crafter_custom/crafter/recorder.py +0 -187
- synth_ai/environments/examples/crafter_custom/crafter/worldgen.py +0 -118
- synth_ai/environments/examples/crafter_custom/dataset_builder.py +0 -373
- synth_ai/environments/examples/crafter_custom/environment.py +0 -312
- synth_ai/environments/examples/crafter_custom/old/analyze_diamond_issue.py +0 -159
- synth_ai/environments/examples/crafter_custom/old/analyze_diamond_spawning.py +0 -158
- synth_ai/environments/examples/crafter_custom/old/compare_worlds.py +0 -71
- synth_ai/environments/examples/crafter_custom/old/dataset_stats.py +0 -105
- synth_ai/environments/examples/crafter_custom/old/diamond_spawning_summary.py +0 -119
- synth_ai/environments/examples/crafter_custom/old/example_dataset_usage.py +0 -52
- synth_ai/environments/examples/crafter_custom/run_dataset.py +0 -305
- synth_ai/environments/examples/enron/art_helpers/email_search_tools.py +0 -156
- synth_ai/environments/examples/enron/art_helpers/local_email_db.py +0 -281
- synth_ai/environments/examples/enron/art_helpers/types_enron.py +0 -25
- synth_ai/environments/examples/enron/engine.py +0 -295
- synth_ai/environments/examples/enron/environment.py +0 -166
- synth_ai/environments/examples/enron/taskset.py +0 -112
- synth_ai/environments/examples/enron/units/keyword_stats.py +0 -112
- synth_ai/environments/examples/minigrid/__init__.py +0 -48
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_evaluation_framework.py +0 -1188
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_quick_evaluation.py +0 -48
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_react_agent.py +0 -562
- synth_ai/environments/examples/minigrid/agent_demos/minigrid_trace_evaluation.py +0 -221
- synth_ai/environments/examples/minigrid/engine.py +0 -589
- synth_ai/environments/examples/minigrid/environment.py +0 -274
- synth_ai/environments/examples/minigrid/environment_mapping.py +0 -242
- synth_ai/environments/examples/minigrid/puzzle_loader.py +0 -417
- synth_ai/environments/examples/minigrid/taskset.py +0 -583
- synth_ai/environments/examples/nethack/__init__.py +0 -7
- synth_ai/environments/examples/nethack/achievements.py +0 -337
- synth_ai/environments/examples/nethack/agent_demos/nethack_evaluation_framework.py +0 -981
- synth_ai/environments/examples/nethack/agent_demos/nethack_quick_evaluation.py +0 -74
- synth_ai/environments/examples/nethack/agent_demos/nethack_react_agent.py +0 -831
- synth_ai/environments/examples/nethack/engine.py +0 -739
- synth_ai/environments/examples/nethack/environment.py +0 -256
- synth_ai/environments/examples/nethack/helpers/__init__.py +0 -41
- synth_ai/environments/examples/nethack/helpers/action_mapping.py +0 -301
- synth_ai/environments/examples/nethack/helpers/nle_wrapper.py +0 -402
- synth_ai/environments/examples/nethack/helpers/observation_utils.py +0 -433
- synth_ai/environments/examples/nethack/helpers/recording_wrapper.py +0 -200
- synth_ai/environments/examples/nethack/helpers/trajectory_recorder.py +0 -269
- synth_ai/environments/examples/nethack/helpers/visualization/replay_viewer.py +0 -308
- synth_ai/environments/examples/nethack/helpers/visualization/visualizer.py +0 -431
- synth_ai/environments/examples/nethack/taskset.py +0 -323
- synth_ai/environments/examples/red/__init__.py +0 -7
- synth_ai/environments/examples/red/agent_demos/__init__.py +0 -1
- synth_ai/environments/examples/red/config_logging.py +0 -110
- synth_ai/environments/examples/red/engine.py +0 -694
- synth_ai/environments/examples/red/engine_helpers/__init__.py +0 -1
- synth_ai/environments/examples/red/engine_helpers/memory_map.py +0 -28
- synth_ai/environments/examples/red/engine_helpers/reward_components.py +0 -276
- synth_ai/environments/examples/red/engine_helpers/reward_library/__init__.py +0 -142
- synth_ai/environments/examples/red/engine_helpers/reward_library/adaptive_rewards.py +0 -57
- synth_ai/environments/examples/red/engine_helpers/reward_library/battle_rewards.py +0 -284
- synth_ai/environments/examples/red/engine_helpers/reward_library/composite_rewards.py +0 -150
- synth_ai/environments/examples/red/engine_helpers/reward_library/economy_rewards.py +0 -138
- synth_ai/environments/examples/red/engine_helpers/reward_library/efficiency_rewards.py +0 -57
- synth_ai/environments/examples/red/engine_helpers/reward_library/exploration_rewards.py +0 -331
- synth_ai/environments/examples/red/engine_helpers/reward_library/novelty_rewards.py +0 -121
- synth_ai/environments/examples/red/engine_helpers/reward_library/pallet_town_rewards.py +0 -559
- synth_ai/environments/examples/red/engine_helpers/reward_library/pokemon_rewards.py +0 -313
- synth_ai/environments/examples/red/engine_helpers/reward_library/social_rewards.py +0 -148
- synth_ai/environments/examples/red/engine_helpers/reward_library/story_rewards.py +0 -247
- synth_ai/environments/examples/red/engine_helpers/screen_analysis.py +0 -368
- synth_ai/environments/examples/red/engine_helpers/state_extraction.py +0 -140
- synth_ai/environments/examples/red/environment.py +0 -238
- synth_ai/environments/examples/red/taskset.py +0 -79
- synth_ai/environments/examples/red/units/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/agent_demos/sokoban_full_eval.py +0 -899
- synth_ai/environments/examples/sokoban/engine.py +0 -678
- synth_ai/environments/examples/sokoban/engine_helpers/__init__.py +0 -1
- synth_ai/environments/examples/sokoban/engine_helpers/room_utils.py +0 -657
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/__init__.py +0 -18
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/__init__.py +0 -3
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/boxoban_env.py +0 -131
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/render_utils.py +0 -370
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/room_utils.py +0 -332
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env.py +0 -306
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_fixed_targets.py +0 -67
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_pull.py +0 -115
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_two_player.py +0 -123
- synth_ai/environments/examples/sokoban/engine_helpers/vendored/envs/sokoban_env_variations.py +0 -394
- synth_ai/environments/examples/sokoban/environment.py +0 -229
- synth_ai/environments/examples/sokoban/generate_verified_puzzles.py +0 -440
- synth_ai/environments/examples/sokoban/puzzle_loader.py +0 -312
- synth_ai/environments/examples/sokoban/taskset.py +0 -428
- synth_ai/environments/examples/sokoban/units/astar_common.py +0 -95
- synth_ai/environments/examples/tictactoe/__init__.py +0 -1
- synth_ai/environments/examples/tictactoe/engine.py +0 -368
- synth_ai/environments/examples/tictactoe/environment.py +0 -240
- synth_ai/environments/examples/tictactoe/taskset.py +0 -215
- synth_ai/environments/examples/verilog/__init__.py +0 -10
- synth_ai/environments/examples/verilog/engine.py +0 -329
- synth_ai/environments/examples/verilog/environment.py +0 -350
- synth_ai/environments/examples/verilog/taskset.py +0 -420
- synth_ai/environments/examples/wordle/__init__.py +0 -29
- synth_ai/environments/examples/wordle/engine.py +0 -398
- synth_ai/environments/examples/wordle/environment.py +0 -159
- synth_ai/environments/examples/wordle/helpers/generate_instances_wordfreq.py +0 -75
- synth_ai/environments/examples/wordle/taskset.py +0 -230
- synth_ai/environments/reproducibility/core.py +0 -42
- synth_ai/environments/reproducibility/helpers.py +0 -0
- synth_ai/environments/reproducibility/tree.py +0 -364
- synth_ai/environments/service/app.py +0 -98
- synth_ai/environments/service/core_routes.py +0 -1020
- synth_ai/environments/service/external_registry.py +0 -56
- synth_ai/environments/service/registry.py +0 -9
- synth_ai/environments/stateful/__init__.py +0 -1
- synth_ai/environments/stateful/core.py +0 -163
- synth_ai/environments/stateful/engine.py +0 -21
- synth_ai/environments/stateful/state.py +0 -7
- synth_ai/environments/tasks/api.py +0 -19
- synth_ai/environments/tasks/core.py +0 -80
- synth_ai/environments/tasks/filters.py +0 -41
- synth_ai/environments/tasks/utils.py +0 -91
- synth_ai/environments/v0_observability/history.py +0 -3
- synth_ai/environments/v0_observability/log.py +0 -2
- synth_ai/evals/base.py +0 -15
- synth_ai/experimental/synth_oss.py +0 -446
- synth_ai/handshake.py +0 -63
- synth_ai/http.py +0 -26
- synth_ai/http_client.py +0 -104
- synth_ai/inference/client.py +0 -20
- synth_ai/install_sqld.sh +0 -40
- synth_ai/jobs/client.py +0 -246
- synth_ai/learning/__init__.py +0 -24
- synth_ai/learning/config.py +0 -43
- synth_ai/learning/filtering.py +0 -0
- synth_ai/learning/ft_client.py +0 -59
- 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/learning/sse.py +0 -58
- synth_ai/learning/validators.py +0 -48
- synth_ai/lm/__init__.py +0 -51
- synth_ai/lm/caching/constants.py +0 -6
- synth_ai/lm/caching/dbs.py +0 -0
- synth_ai/lm/caching/ephemeral.py +0 -102
- synth_ai/lm/caching/handler.py +0 -137
- synth_ai/lm/caching/initialize.py +0 -11
- synth_ai/lm/caching/persistent.py +0 -114
- synth_ai/lm/config.py +0 -110
- synth_ai/lm/constants.py +0 -32
- synth_ai/lm/core/__init__.py +0 -8
- synth_ai/lm/core/all.py +0 -73
- synth_ai/lm/core/exceptions.py +0 -7
- synth_ai/lm/core/main.py +0 -319
- synth_ai/lm/core/main_v3.py +0 -594
- synth_ai/lm/core/synth_models.py +0 -48
- synth_ai/lm/core/vendor_clients.py +0 -188
- synth_ai/lm/cost/__init__.py +0 -0
- synth_ai/lm/cost/monitor.py +0 -1
- synth_ai/lm/cost/statefulness.py +0 -1
- synth_ai/lm/injection.py +0 -80
- synth_ai/lm/overrides.py +0 -206
- synth_ai/lm/provider_support/__init__.py +0 -8
- synth_ai/lm/provider_support/anthropic.py +0 -972
- synth_ai/lm/provider_support/openai.py +0 -1139
- synth_ai/lm/provider_support/suppress_logging.py +0 -31
- synth_ai/lm/structured_outputs/__init__.py +0 -0
- synth_ai/lm/structured_outputs/handler.py +0 -440
- synth_ai/lm/structured_outputs/inject.py +0 -297
- synth_ai/lm/structured_outputs/rehabilitate.py +0 -185
- synth_ai/lm/tools/__init__.py +0 -3
- synth_ai/lm/tools/base.py +0 -172
- synth_ai/lm/unified_interface.py +0 -202
- synth_ai/lm/vendors/__init__.py +0 -0
- synth_ai/lm/vendors/base.py +0 -81
- synth_ai/lm/vendors/core/__init__.py +0 -0
- synth_ai/lm/vendors/core/anthropic_api.py +0 -387
- synth_ai/lm/vendors/core/gemini_api.py +0 -292
- synth_ai/lm/vendors/core/mistral_api.py +0 -322
- synth_ai/lm/vendors/core/openai_api.py +0 -225
- synth_ai/lm/vendors/core/synth_dev_api.py +0 -0
- synth_ai/lm/vendors/local/__init__.py +0 -0
- synth_ai/lm/vendors/local/ollama.py +0 -0
- synth_ai/lm/vendors/openai_standard.py +0 -780
- synth_ai/lm/vendors/openai_standard_responses.py +0 -256
- synth_ai/lm/vendors/retries.py +0 -22
- synth_ai/lm/vendors/supported/__init__.py +0 -0
- synth_ai/lm/vendors/supported/custom_endpoint.py +0 -417
- synth_ai/lm/vendors/supported/deepseek.py +0 -69
- synth_ai/lm/vendors/supported/grok.py +0 -75
- synth_ai/lm/vendors/supported/groq.py +0 -16
- synth_ai/lm/vendors/supported/ollama.py +0 -15
- synth_ai/lm/vendors/supported/openrouter.py +0 -74
- synth_ai/lm/vendors/supported/together.py +0 -11
- synth_ai/lm/vendors/synth_client.py +0 -808
- synth_ai/lm/warmup.py +0 -186
- synth_ai/rl/secrets.py +0 -19
- synth_ai/scripts/verify_rewards.py +0 -100
- synth_ai/task/__init__.py +0 -10
- synth_ai/task/contracts.py +0 -120
- synth_ai/task/health.py +0 -28
- synth_ai/task/validators.py +0 -12
- synth_ai/tracing/__init__.py +0 -30
- synth_ai/tracing_v1/__init__.py +0 -33
- synth_ai/tracing_v3/config.py +0 -84
- synth_ai/tracing_v3/storage/config.py +0 -62
- synth_ai/tracing_v3/turso/__init__.py +0 -25
- synth_ai/tracing_v3/turso/daemon.py +0 -144
- synth_ai/tracing_v3/turso/manager.py +0 -760
- synth_ai/v0/tracing/__init__.py +0 -0
- synth_ai/v0/tracing/abstractions.py +0 -224
- synth_ai/v0/tracing/base_client.py +0 -91
- synth_ai/v0/tracing/client_manager.py +0 -131
- synth_ai/v0/tracing/config.py +0 -142
- synth_ai/v0/tracing/context.py +0 -146
- synth_ai/v0/tracing/decorators.py +0 -682
- synth_ai/v0/tracing/events/__init__.py +0 -0
- synth_ai/v0/tracing/events/manage.py +0 -147
- synth_ai/v0/tracing/events/scope.py +0 -86
- synth_ai/v0/tracing/events/store.py +0 -228
- synth_ai/v0/tracing/immediate_client.py +0 -151
- synth_ai/v0/tracing/local.py +0 -18
- synth_ai/v0/tracing/log_client_base.py +0 -73
- synth_ai/v0/tracing/retry_queue.py +0 -186
- synth_ai/v0/tracing/trackers.py +0 -515
- synth_ai/v0/tracing/upload.py +0 -512
- synth_ai/v0/tracing/utils.py +0 -9
- synth_ai/v0/tracing_v1/__init__.py +0 -16
- synth_ai/v0/tracing_v1/abstractions.py +0 -224
- synth_ai/v0/tracing_v1/base_client.py +0 -91
- synth_ai/v0/tracing_v1/client_manager.py +0 -131
- synth_ai/v0/tracing_v1/config.py +0 -142
- synth_ai/v0/tracing_v1/context.py +0 -146
- synth_ai/v0/tracing_v1/decorators.py +0 -703
- synth_ai/v0/tracing_v1/events/__init__.py +0 -0
- synth_ai/v0/tracing_v1/events/manage.py +0 -147
- synth_ai/v0/tracing_v1/events/scope.py +0 -86
- synth_ai/v0/tracing_v1/events/store.py +0 -228
- synth_ai/v0/tracing_v1/immediate_client.py +0 -151
- synth_ai/v0/tracing_v1/local.py +0 -18
- synth_ai/v0/tracing_v1/log_client_base.py +0 -73
- synth_ai/v0/tracing_v1/retry_queue.py +0 -186
- synth_ai/v0/tracing_v1/trackers.py +0 -515
- synth_ai/v0/tracing_v1/upload.py +0 -527
- synth_ai/v0/tracing_v1/utils.py +0 -9
- synth_ai/zyk/__init__.py +0 -30
- synth_ai-0.2.8.dev2.dist-info/METADATA +0 -129
- synth_ai-0.2.8.dev2.dist-info/RECORD +0 -420
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
- /synth_ai/{lm/caching → core/apps}/__init__.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/lm_call_record_abstractions.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/__init__.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/exceptions.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/storage/types.py +0 -0
- /synth_ai/{compound/cais.py → py.typed} +0 -0
- /synth_ai/{learning → sdk/learning}/core.py +0 -0
- /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
- {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/licenses/LICENSE +0 -0
- {synth_ai-0.2.8.dev2.dist-info → synth_ai-0.4.3.dist-info}/top_level.txt +0 -0
synth_ai/lm/core/main_v3.py
DELETED
|
@@ -1,594 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Enhanced LM class with native v3 tracing support.
|
|
3
|
-
|
|
4
|
-
This module provides the LM class with async v3 tracing support,
|
|
5
|
-
replacing the v2 DuckDB-based implementation.
|
|
6
|
-
"""
|
|
7
|
-
|
|
8
|
-
import asyncio
|
|
9
|
-
import time
|
|
10
|
-
from typing import Any, Literal
|
|
11
|
-
|
|
12
|
-
from pydantic import BaseModel
|
|
13
|
-
|
|
14
|
-
from synth_ai.lm.config import reasoning_models
|
|
15
|
-
from synth_ai.lm.core.vendor_clients import (
|
|
16
|
-
anthropic_naming_regexes,
|
|
17
|
-
get_client,
|
|
18
|
-
openai_naming_regexes,
|
|
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
|
|
23
|
-
|
|
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 (
|
|
28
|
-
compute_aggregates_from_call_records,
|
|
29
|
-
create_llm_call_record_from_response,
|
|
30
|
-
)
|
|
31
|
-
from synth_ai.tracing_v3.session_tracer import SessionTracer
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def build_messages(
|
|
35
|
-
sys_msg: str,
|
|
36
|
-
user_msg: str,
|
|
37
|
-
images_bytes: list | None = None,
|
|
38
|
-
model_name: str | None = None,
|
|
39
|
-
) -> list[dict]:
|
|
40
|
-
images_bytes = images_bytes or []
|
|
41
|
-
if len(images_bytes) > 0 and any(regex.match(model_name) for regex in openai_naming_regexes):
|
|
42
|
-
return [
|
|
43
|
-
{"role": "system", "content": sys_msg},
|
|
44
|
-
{
|
|
45
|
-
"role": "user",
|
|
46
|
-
"content": [{"type": "text", "text": user_msg}]
|
|
47
|
-
+ [
|
|
48
|
-
{
|
|
49
|
-
"type": "image_url",
|
|
50
|
-
"image_url": {"url": f"data:image/jpeg;base64,{image_bytes}"},
|
|
51
|
-
}
|
|
52
|
-
for image_bytes in images_bytes
|
|
53
|
-
],
|
|
54
|
-
},
|
|
55
|
-
]
|
|
56
|
-
elif len(images_bytes) > 0 and any(
|
|
57
|
-
regex.match(model_name) for regex in anthropic_naming_regexes
|
|
58
|
-
):
|
|
59
|
-
return [
|
|
60
|
-
{"role": "system", "content": sys_msg},
|
|
61
|
-
{
|
|
62
|
-
"role": "user",
|
|
63
|
-
"content": [{"type": "text", "text": user_msg}]
|
|
64
|
-
+ [
|
|
65
|
-
{
|
|
66
|
-
"type": "image",
|
|
67
|
-
"source": {
|
|
68
|
-
"type": "base64",
|
|
69
|
-
"media_type": "image/jpeg",
|
|
70
|
-
"data": image_bytes,
|
|
71
|
-
},
|
|
72
|
-
}
|
|
73
|
-
for image_bytes in images_bytes
|
|
74
|
-
],
|
|
75
|
-
},
|
|
76
|
-
]
|
|
77
|
-
else:
|
|
78
|
-
return [
|
|
79
|
-
{"role": "system", "content": sys_msg},
|
|
80
|
-
{"role": "user", "content": user_msg},
|
|
81
|
-
]
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
class LM:
|
|
85
|
-
"""Language Model interface with v3 tracing support."""
|
|
86
|
-
|
|
87
|
-
def __init__(
|
|
88
|
-
self,
|
|
89
|
-
vendor: str | None = None,
|
|
90
|
-
model: str | None = None,
|
|
91
|
-
# v2 compatibility parameters
|
|
92
|
-
model_name: str | None = None, # Alias for model
|
|
93
|
-
formatting_model_name: str | None = None, # For structured outputs
|
|
94
|
-
provider: str | None = None, # Alias for vendor
|
|
95
|
-
synth_logging: bool = True, # v2 compatibility
|
|
96
|
-
max_retries: Literal["None", "Few", "Many"] = "Few", # v2 compatibility
|
|
97
|
-
# v3 parameters
|
|
98
|
-
is_structured: bool | None = None,
|
|
99
|
-
structured_outputs_vendor: str | None = None,
|
|
100
|
-
response_format: type[BaseModel] | dict[str, Any] | None = None,
|
|
101
|
-
json_mode: bool = False,
|
|
102
|
-
temperature: float = 0.8,
|
|
103
|
-
session_tracer: SessionTracer | None = None,
|
|
104
|
-
system_id: str | None = None,
|
|
105
|
-
enable_v3_tracing: bool = True,
|
|
106
|
-
enable_v2_tracing: bool | None = None, # v2 compatibility
|
|
107
|
-
# Responses API parameters
|
|
108
|
-
auto_store_responses: bool = True,
|
|
109
|
-
use_responses_api: bool | None = None,
|
|
110
|
-
**additional_params,
|
|
111
|
-
):
|
|
112
|
-
# Handle v2 compatibility parameters
|
|
113
|
-
if model_name and not model:
|
|
114
|
-
model = model_name
|
|
115
|
-
if provider and not vendor:
|
|
116
|
-
vendor = provider
|
|
117
|
-
if enable_v2_tracing is not None:
|
|
118
|
-
enable_v3_tracing = enable_v2_tracing
|
|
119
|
-
|
|
120
|
-
# Debug logging
|
|
121
|
-
print(f"🔍 LM __init__: provider={provider}, vendor={vendor}, model={model}")
|
|
122
|
-
|
|
123
|
-
# If vendor not provided, infer from model name
|
|
124
|
-
# But only if no explicit provider was given
|
|
125
|
-
if vendor is None and model is not None:
|
|
126
|
-
# Import vendor detection logic
|
|
127
|
-
from synth_ai.lm.core.vendor_clients import (
|
|
128
|
-
anthropic_naming_regexes,
|
|
129
|
-
custom_endpoint_naming_regexes,
|
|
130
|
-
deepseek_naming_regexes,
|
|
131
|
-
gemini_naming_regexes,
|
|
132
|
-
grok_naming_regexes,
|
|
133
|
-
groq_naming_regexes,
|
|
134
|
-
openai_naming_regexes,
|
|
135
|
-
openrouter_naming_regexes,
|
|
136
|
-
together_naming_regexes,
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
# Check model name against patterns
|
|
140
|
-
if any(regex.match(model) for regex in openai_naming_regexes):
|
|
141
|
-
vendor = "openai"
|
|
142
|
-
elif any(regex.match(model) for regex in anthropic_naming_regexes):
|
|
143
|
-
vendor = "anthropic"
|
|
144
|
-
elif any(regex.match(model) for regex in gemini_naming_regexes):
|
|
145
|
-
vendor = "gemini"
|
|
146
|
-
elif any(regex.match(model) for regex in deepseek_naming_regexes):
|
|
147
|
-
vendor = "deepseek"
|
|
148
|
-
elif any(regex.match(model) for regex in groq_naming_regexes):
|
|
149
|
-
vendor = "groq"
|
|
150
|
-
elif any(regex.match(model) for regex in grok_naming_regexes):
|
|
151
|
-
vendor = "grok"
|
|
152
|
-
elif any(regex.match(model) for regex in openrouter_naming_regexes):
|
|
153
|
-
vendor = "openrouter"
|
|
154
|
-
elif any(regex.match(model) for regex in custom_endpoint_naming_regexes):
|
|
155
|
-
vendor = "custom_endpoint"
|
|
156
|
-
elif any(regex.match(model) for regex in together_naming_regexes):
|
|
157
|
-
vendor = "together"
|
|
158
|
-
else:
|
|
159
|
-
raise ValueError(f"Could not infer vendor from model name: {model}")
|
|
160
|
-
|
|
161
|
-
self.vendor = vendor
|
|
162
|
-
self.model = model
|
|
163
|
-
print(f"🔍 LM final: vendor={self.vendor}, model={self.model}")
|
|
164
|
-
self.is_structured = is_structured
|
|
165
|
-
self.structured_outputs_vendor = structured_outputs_vendor
|
|
166
|
-
self.response_format = response_format
|
|
167
|
-
self.json_mode = json_mode
|
|
168
|
-
self.temperature = temperature
|
|
169
|
-
self.session_tracer = session_tracer
|
|
170
|
-
self.system_id = system_id or f"lm_{self.vendor or 'unknown'}_{self.model or 'unknown'}"
|
|
171
|
-
self.enable_v3_tracing = enable_v3_tracing
|
|
172
|
-
self.additional_params = additional_params
|
|
173
|
-
|
|
174
|
-
# Initialize vendor wrapper early, before any potential usage
|
|
175
|
-
# (e.g., within StructuredOutputHandler initialization below)
|
|
176
|
-
self._vendor_wrapper = None
|
|
177
|
-
|
|
178
|
-
# Responses API thread management
|
|
179
|
-
self.auto_store_responses = auto_store_responses
|
|
180
|
-
self.use_responses_api = use_responses_api
|
|
181
|
-
self._last_response_id: str | None = None
|
|
182
|
-
|
|
183
|
-
# Set structured output handler if needed
|
|
184
|
-
if self.response_format:
|
|
185
|
-
self.is_structured = True
|
|
186
|
-
# Choose mode automatically: prefer forced_json for OpenAI/reasoning models
|
|
187
|
-
forced_json_preferred = (self.vendor == "openai") or (
|
|
188
|
-
self.model in reasoning_models if self.model else False
|
|
189
|
-
)
|
|
190
|
-
structured_output_mode = "forced_json" if forced_json_preferred else "stringified_json"
|
|
191
|
-
|
|
192
|
-
# Build core and formatting clients
|
|
193
|
-
core_client = get_client(
|
|
194
|
-
self.model,
|
|
195
|
-
with_formatting=(structured_output_mode == "forced_json"),
|
|
196
|
-
provider=self.vendor,
|
|
197
|
-
)
|
|
198
|
-
formatting_model = formatting_model_name or self.model
|
|
199
|
-
formatting_client = get_client(
|
|
200
|
-
formatting_model,
|
|
201
|
-
with_formatting=True,
|
|
202
|
-
provider=self.vendor if self.vendor != "custom_endpoint" else None,
|
|
203
|
-
)
|
|
204
|
-
|
|
205
|
-
# Map retries
|
|
206
|
-
max_retries_dict = {"None": 0, "Few": 2, "Many": 5}
|
|
207
|
-
handler_params = {"max_retries": max_retries_dict.get(max_retries, 2)}
|
|
208
|
-
|
|
209
|
-
self.structured_output_handler = StructuredOutputHandler(
|
|
210
|
-
core_client,
|
|
211
|
-
formatting_client,
|
|
212
|
-
structured_output_mode,
|
|
213
|
-
handler_params,
|
|
214
|
-
)
|
|
215
|
-
else:
|
|
216
|
-
self.structured_output_handler = None
|
|
217
|
-
|
|
218
|
-
# Vendor wrapper lazy-instantiated via get_vendor_wrapper()
|
|
219
|
-
|
|
220
|
-
def get_vendor_wrapper(self) -> VendorBase:
|
|
221
|
-
"""Get or create the vendor wrapper."""
|
|
222
|
-
if self._vendor_wrapper is None:
|
|
223
|
-
# For now, just use the vendor client directly as it implements the needed interface
|
|
224
|
-
self._vendor_wrapper = get_client(self.model, provider=self.vendor)
|
|
225
|
-
return self._vendor_wrapper
|
|
226
|
-
|
|
227
|
-
def _should_use_responses_api(self) -> bool:
|
|
228
|
-
"""Determine if Responses API should be used."""
|
|
229
|
-
if self.use_responses_api is not None:
|
|
230
|
-
return self.use_responses_api
|
|
231
|
-
|
|
232
|
-
# Auto-detect based on model
|
|
233
|
-
responses_models = {
|
|
234
|
-
"o4-mini",
|
|
235
|
-
"o3",
|
|
236
|
-
"o3-mini", # Supported Synth-hosted models
|
|
237
|
-
"gpt-oss-120b",
|
|
238
|
-
"gpt-oss-20b", # OSS models via Synth
|
|
239
|
-
}
|
|
240
|
-
return self.model in responses_models or (self.model and self.model in reasoning_models)
|
|
241
|
-
|
|
242
|
-
def _should_use_harmony(self) -> bool:
|
|
243
|
-
"""Determine if Harmony encoding should be used for OSS models."""
|
|
244
|
-
# Only use Harmony for OSS models when NOT using OpenAI vendor
|
|
245
|
-
# OpenAI hosts these models directly via Responses API
|
|
246
|
-
harmony_models = {"gpt-oss-120b", "gpt-oss-20b"}
|
|
247
|
-
return self.model in harmony_models and self.vendor != "openai"
|
|
248
|
-
|
|
249
|
-
async def respond_async(
|
|
250
|
-
self,
|
|
251
|
-
system_message: str | None = None,
|
|
252
|
-
user_message: str | None = None,
|
|
253
|
-
messages: list[dict] | None = None, # v2 compatibility
|
|
254
|
-
images_bytes: list[bytes] | None = None,
|
|
255
|
-
images_as_bytes: list[bytes] | None = None, # v2 compatibility
|
|
256
|
-
response_model: type[BaseModel] | None = None, # v2 compatibility
|
|
257
|
-
tools: list[BaseTool] | None = None,
|
|
258
|
-
turn_number: int | None = None,
|
|
259
|
-
previous_response_id: str | None = None, # Responses API thread management
|
|
260
|
-
**kwargs,
|
|
261
|
-
) -> BaseLMResponse:
|
|
262
|
-
"""Async method to get LM response with v3 tracing."""
|
|
263
|
-
start_time = time.time()
|
|
264
|
-
|
|
265
|
-
# Handle v2 compatibility
|
|
266
|
-
images_bytes = images_as_bytes if images_as_bytes is not None else (images_bytes or [])
|
|
267
|
-
|
|
268
|
-
# Handle response_model for structured outputs (runtime-provided)
|
|
269
|
-
if response_model and not self.response_format:
|
|
270
|
-
self.response_format = response_model
|
|
271
|
-
self.is_structured = True
|
|
272
|
-
# Mirror initialization logic from __init__
|
|
273
|
-
forced_json_preferred = (self.vendor == "openai") or (
|
|
274
|
-
self.model in reasoning_models if self.model else False
|
|
275
|
-
)
|
|
276
|
-
structured_output_mode = "forced_json" if forced_json_preferred else "stringified_json"
|
|
277
|
-
core_client = get_client(
|
|
278
|
-
self.model,
|
|
279
|
-
with_formatting=(structured_output_mode == "forced_json"),
|
|
280
|
-
provider=self.vendor,
|
|
281
|
-
)
|
|
282
|
-
formatting_client = get_client(
|
|
283
|
-
self.model,
|
|
284
|
-
with_formatting=True,
|
|
285
|
-
provider=self.vendor if self.vendor != "custom_endpoint" else None,
|
|
286
|
-
)
|
|
287
|
-
self.structured_output_handler = StructuredOutputHandler(
|
|
288
|
-
core_client,
|
|
289
|
-
formatting_client,
|
|
290
|
-
structured_output_mode,
|
|
291
|
-
{"max_retries": 2},
|
|
292
|
-
)
|
|
293
|
-
|
|
294
|
-
# Set turn number if provided
|
|
295
|
-
if turn_number is not None:
|
|
296
|
-
set_turn_number(turn_number)
|
|
297
|
-
|
|
298
|
-
# Handle messages parameter (v2 compatibility)
|
|
299
|
-
if messages is not None:
|
|
300
|
-
# Use provided messages directly
|
|
301
|
-
if system_message or user_message:
|
|
302
|
-
raise ValueError(
|
|
303
|
-
"Cannot specify both 'messages' and 'system_message'/'user_message'"
|
|
304
|
-
)
|
|
305
|
-
messages_to_use = messages
|
|
306
|
-
else:
|
|
307
|
-
# Build messages from system and user messages
|
|
308
|
-
if not system_message or not user_message:
|
|
309
|
-
raise ValueError(
|
|
310
|
-
"Must provide either 'messages' or both 'system_message' and 'user_message'"
|
|
311
|
-
)
|
|
312
|
-
messages_to_use = build_messages(system_message, user_message, images_bytes, self.model)
|
|
313
|
-
|
|
314
|
-
# If using structured outputs, route through the handler
|
|
315
|
-
if self.structured_output_handler and self.response_format:
|
|
316
|
-
if tools:
|
|
317
|
-
raise ValueError("Tools are not supported with structured output mode")
|
|
318
|
-
response = await self.structured_output_handler.call_async(
|
|
319
|
-
messages=messages_to_use,
|
|
320
|
-
model=self.model,
|
|
321
|
-
response_model=self.response_format,
|
|
322
|
-
use_ephemeral_cache_only=False,
|
|
323
|
-
lm_config={"temperature": self.temperature, **self.additional_params, **kwargs},
|
|
324
|
-
reasoning_effort="high",
|
|
325
|
-
)
|
|
326
|
-
else:
|
|
327
|
-
# Get vendor wrapper
|
|
328
|
-
vendor_wrapper = self.get_vendor_wrapper()
|
|
329
|
-
|
|
330
|
-
# Determine API type to use
|
|
331
|
-
use_responses = self._should_use_responses_api()
|
|
332
|
-
use_harmony = self._should_use_harmony()
|
|
333
|
-
|
|
334
|
-
# Decide response ID to use for thread management
|
|
335
|
-
response_id_to_use = None
|
|
336
|
-
if previous_response_id:
|
|
337
|
-
response_id_to_use = previous_response_id # Manual override
|
|
338
|
-
elif self.auto_store_responses and self._last_response_id:
|
|
339
|
-
response_id_to_use = self._last_response_id # Auto-chain
|
|
340
|
-
|
|
341
|
-
# Prepare parameters based on vendor type
|
|
342
|
-
if hasattr(vendor_wrapper, "_hit_api_async"):
|
|
343
|
-
# OpenAIStandard expects lm_config
|
|
344
|
-
lm_config = {"temperature": self.temperature, **self.additional_params, **kwargs}
|
|
345
|
-
# Map convenience enable_thinking => thinking_mode unless explicitly set
|
|
346
|
-
if "enable_thinking" in lm_config and "thinking_mode" not in lm_config:
|
|
347
|
-
try:
|
|
348
|
-
et = lm_config.get("enable_thinking")
|
|
349
|
-
if isinstance(et, bool):
|
|
350
|
-
lm_config["thinking_mode"] = "think" if et else "no_think"
|
|
351
|
-
except Exception:
|
|
352
|
-
pass
|
|
353
|
-
if self.json_mode:
|
|
354
|
-
lm_config["response_format"] = {"type": "json_object"}
|
|
355
|
-
|
|
356
|
-
params = {"model": self.model, "messages": messages_to_use, "lm_config": lm_config}
|
|
357
|
-
if tools:
|
|
358
|
-
params["tools"] = tools
|
|
359
|
-
else:
|
|
360
|
-
# Other vendors use flat params
|
|
361
|
-
params = {
|
|
362
|
-
"model": self.model,
|
|
363
|
-
"messages": messages_to_use,
|
|
364
|
-
"temperature": self.temperature,
|
|
365
|
-
**self.additional_params,
|
|
366
|
-
**kwargs,
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
if tools:
|
|
370
|
-
params["tools"] = [tool.to_dict() for tool in tools]
|
|
371
|
-
|
|
372
|
-
if self.json_mode:
|
|
373
|
-
params["response_format"] = {"type": "json_object"}
|
|
374
|
-
|
|
375
|
-
# Call vendor with appropriate API type
|
|
376
|
-
try:
|
|
377
|
-
# Route to appropriate API
|
|
378
|
-
if use_harmony and hasattr(vendor_wrapper, "_hit_api_async_harmony"):
|
|
379
|
-
params["previous_response_id"] = response_id_to_use
|
|
380
|
-
response = await vendor_wrapper._hit_api_async_harmony(**params)
|
|
381
|
-
elif use_responses and hasattr(vendor_wrapper, "_hit_api_async_responses"):
|
|
382
|
-
params["previous_response_id"] = response_id_to_use
|
|
383
|
-
response = await vendor_wrapper._hit_api_async_responses(**params)
|
|
384
|
-
else:
|
|
385
|
-
# Standard chat completions API
|
|
386
|
-
if hasattr(vendor_wrapper, "_hit_api_async"):
|
|
387
|
-
response = await vendor_wrapper._hit_api_async(**params)
|
|
388
|
-
elif hasattr(vendor_wrapper, "respond_async"):
|
|
389
|
-
response = await vendor_wrapper.respond_async(**params)
|
|
390
|
-
elif hasattr(vendor_wrapper, "respond"):
|
|
391
|
-
# Fallback to sync in executor
|
|
392
|
-
loop = asyncio.get_event_loop()
|
|
393
|
-
response = await loop.run_in_executor(None, vendor_wrapper.respond, params)
|
|
394
|
-
else:
|
|
395
|
-
raise AttributeError(
|
|
396
|
-
f"Vendor wrapper {type(vendor_wrapper).__name__} has no suitable response method"
|
|
397
|
-
)
|
|
398
|
-
if not hasattr(response, "api_type"):
|
|
399
|
-
response.api_type = "chat"
|
|
400
|
-
|
|
401
|
-
# Update stored response ID if auto-storing
|
|
402
|
-
if (
|
|
403
|
-
self.auto_store_responses
|
|
404
|
-
and hasattr(response, "response_id")
|
|
405
|
-
and response.response_id
|
|
406
|
-
):
|
|
407
|
-
self._last_response_id = response.response_id
|
|
408
|
-
|
|
409
|
-
except Exception as e:
|
|
410
|
-
print(f"Error calling vendor: {e}")
|
|
411
|
-
raise
|
|
412
|
-
|
|
413
|
-
# No additional post-processing needed for structured outputs here
|
|
414
|
-
|
|
415
|
-
# Record tracing event if enabled
|
|
416
|
-
if (
|
|
417
|
-
self.enable_v3_tracing
|
|
418
|
-
and self.session_tracer
|
|
419
|
-
and hasattr(self.session_tracer, "current_session")
|
|
420
|
-
):
|
|
421
|
-
latency_ms = int((time.time() - start_time) * 1000)
|
|
422
|
-
|
|
423
|
-
# Create LLMCallRecord from the response
|
|
424
|
-
from datetime import datetime
|
|
425
|
-
|
|
426
|
-
started_at = datetime.utcnow()
|
|
427
|
-
completed_at = datetime.utcnow()
|
|
428
|
-
|
|
429
|
-
call_record = create_llm_call_record_from_response(
|
|
430
|
-
response=response,
|
|
431
|
-
model_name=self.model or self.vendor,
|
|
432
|
-
provider=self.vendor,
|
|
433
|
-
messages=messages_to_use,
|
|
434
|
-
temperature=self.temperature,
|
|
435
|
-
request_params={**self.additional_params, **kwargs},
|
|
436
|
-
tools=tools,
|
|
437
|
-
started_at=started_at,
|
|
438
|
-
completed_at=completed_at,
|
|
439
|
-
latency_ms=latency_ms,
|
|
440
|
-
)
|
|
441
|
-
|
|
442
|
-
# Compute aggregates from the call record
|
|
443
|
-
aggregates = compute_aggregates_from_call_records([call_record])
|
|
444
|
-
|
|
445
|
-
# Create LM event with call_records
|
|
446
|
-
lm_event = LMCAISEvent(
|
|
447
|
-
system_instance_id=self.system_id,
|
|
448
|
-
time_record=TimeRecord(event_time=time.time(), message_time=turn_number),
|
|
449
|
-
# Aggregates at event level
|
|
450
|
-
input_tokens=aggregates["input_tokens"],
|
|
451
|
-
output_tokens=aggregates["output_tokens"],
|
|
452
|
-
total_tokens=aggregates["total_tokens"],
|
|
453
|
-
cost_usd=aggregates["cost_usd"],
|
|
454
|
-
latency_ms=aggregates["latency_ms"],
|
|
455
|
-
# Store the call record
|
|
456
|
-
call_records=[call_record],
|
|
457
|
-
metadata={
|
|
458
|
-
"temperature": self.temperature,
|
|
459
|
-
"json_mode": self.json_mode,
|
|
460
|
-
"has_tools": tools is not None,
|
|
461
|
-
"is_structured": self.is_structured,
|
|
462
|
-
},
|
|
463
|
-
)
|
|
464
|
-
|
|
465
|
-
await self.session_tracer.record_event(lm_event)
|
|
466
|
-
|
|
467
|
-
# Also record messages
|
|
468
|
-
if user_message:
|
|
469
|
-
await self.session_tracer.record_message(
|
|
470
|
-
content=user_message,
|
|
471
|
-
message_type="user",
|
|
472
|
-
metadata={"system_id": self.system_id},
|
|
473
|
-
)
|
|
474
|
-
elif messages:
|
|
475
|
-
# Record the last user message from messages array
|
|
476
|
-
for msg in reversed(messages_to_use):
|
|
477
|
-
if msg.get("role") == "user":
|
|
478
|
-
content = msg.get("content", "")
|
|
479
|
-
if isinstance(content, list):
|
|
480
|
-
# Extract text from multi-modal content
|
|
481
|
-
text_parts = [
|
|
482
|
-
part.get("text", "")
|
|
483
|
-
for part in content
|
|
484
|
-
if part.get("type") == "text"
|
|
485
|
-
]
|
|
486
|
-
content = " ".join(text_parts)
|
|
487
|
-
await self.session_tracer.record_message(
|
|
488
|
-
content=content,
|
|
489
|
-
message_type="user",
|
|
490
|
-
metadata={"system_id": self.system_id},
|
|
491
|
-
)
|
|
492
|
-
break
|
|
493
|
-
|
|
494
|
-
await self.session_tracer.record_message(
|
|
495
|
-
content=response.raw_response,
|
|
496
|
-
message_type="assistant",
|
|
497
|
-
metadata={"system_id": self.system_id},
|
|
498
|
-
)
|
|
499
|
-
|
|
500
|
-
return response
|
|
501
|
-
|
|
502
|
-
def respond(
|
|
503
|
-
self,
|
|
504
|
-
system_message: str | None = None,
|
|
505
|
-
user_message: str | None = None,
|
|
506
|
-
messages: list[dict] | None = None, # v2 compatibility
|
|
507
|
-
images_bytes: list[bytes] | None = None,
|
|
508
|
-
images_as_bytes: list[bytes] | None = None, # v2 compatibility
|
|
509
|
-
response_model: type[BaseModel] | None = None, # v2 compatibility
|
|
510
|
-
tools: list[BaseTool] | None = None,
|
|
511
|
-
previous_response_id: str | None = None, # Responses API thread management
|
|
512
|
-
turn_number: int | None = None,
|
|
513
|
-
**kwargs,
|
|
514
|
-
) -> BaseLMResponse:
|
|
515
|
-
"""Synchronous wrapper for respond_async."""
|
|
516
|
-
# For backward compatibility, run async in new event loop
|
|
517
|
-
try:
|
|
518
|
-
loop = asyncio.get_event_loop()
|
|
519
|
-
if loop.is_running():
|
|
520
|
-
# If loop is already running, schedule coroutine
|
|
521
|
-
future = asyncio.ensure_future(
|
|
522
|
-
self.respond_async(
|
|
523
|
-
system_message=system_message,
|
|
524
|
-
user_message=user_message,
|
|
525
|
-
messages=messages,
|
|
526
|
-
images_bytes=images_bytes,
|
|
527
|
-
images_as_bytes=images_as_bytes,
|
|
528
|
-
response_model=response_model,
|
|
529
|
-
tools=tools,
|
|
530
|
-
turn_number=turn_number,
|
|
531
|
-
**kwargs,
|
|
532
|
-
)
|
|
533
|
-
)
|
|
534
|
-
return loop.run_until_complete(future)
|
|
535
|
-
else:
|
|
536
|
-
# Create new loop
|
|
537
|
-
return asyncio.run(
|
|
538
|
-
self.respond_async(
|
|
539
|
-
system_message=system_message,
|
|
540
|
-
user_message=user_message,
|
|
541
|
-
messages=messages,
|
|
542
|
-
images_bytes=images_bytes,
|
|
543
|
-
images_as_bytes=images_as_bytes,
|
|
544
|
-
response_model=response_model,
|
|
545
|
-
tools=tools,
|
|
546
|
-
turn_number=turn_number,
|
|
547
|
-
**kwargs,
|
|
548
|
-
)
|
|
549
|
-
)
|
|
550
|
-
except RuntimeError:
|
|
551
|
-
# Fallback: create new event loop
|
|
552
|
-
loop = asyncio.new_event_loop()
|
|
553
|
-
asyncio.set_event_loop(loop)
|
|
554
|
-
try:
|
|
555
|
-
return loop.run_until_complete(
|
|
556
|
-
self.respond_async(
|
|
557
|
-
system_message=system_message,
|
|
558
|
-
user_message=user_message,
|
|
559
|
-
messages=messages,
|
|
560
|
-
images_bytes=images_bytes,
|
|
561
|
-
images_as_bytes=images_as_bytes,
|
|
562
|
-
response_model=response_model,
|
|
563
|
-
tools=tools,
|
|
564
|
-
turn_number=turn_number,
|
|
565
|
-
**kwargs,
|
|
566
|
-
)
|
|
567
|
-
)
|
|
568
|
-
finally:
|
|
569
|
-
loop.close()
|
|
570
|
-
|
|
571
|
-
async def __aenter__(self):
|
|
572
|
-
"""Async context manager entry."""
|
|
573
|
-
return self
|
|
574
|
-
|
|
575
|
-
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
576
|
-
"""Async context manager exit."""
|
|
577
|
-
pass
|
|
578
|
-
|
|
579
|
-
def __enter__(self):
|
|
580
|
-
"""Sync context manager entry."""
|
|
581
|
-
return self
|
|
582
|
-
|
|
583
|
-
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
584
|
-
"""Sync context manager exit."""
|
|
585
|
-
pass
|
|
586
|
-
|
|
587
|
-
# v2 compatibility methods
|
|
588
|
-
def respond_sync(self, **kwargs) -> BaseLMResponse:
|
|
589
|
-
"""Alias for respond() for v2 compatibility."""
|
|
590
|
-
return self.respond(**kwargs)
|
|
591
|
-
|
|
592
|
-
async def respond_async_v2(self, **kwargs) -> BaseLMResponse:
|
|
593
|
-
"""Alias for respond_async() for v2 compatibility."""
|
|
594
|
-
return await self.respond_async(**kwargs)
|
synth_ai/lm/core/synth_models.py
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Synth-supported models registry.
|
|
3
|
-
|
|
4
|
-
This module defines the specific models that are supported by Synth's infrastructure.
|
|
5
|
-
Models are organized by family and size for easy maintenance and extension.
|
|
6
|
-
|
|
7
|
-
MAINTENANCE GUIDE:
|
|
8
|
-
1. Add new model families to the appropriate lists (QWEN_MODELS, OTHER_SYNTH_MODELS)
|
|
9
|
-
2. Fine-tuned models (ft:) are automatically detected by regex
|
|
10
|
-
3. Update SYNTH_SUPPORTED_MODELS set when adding new models
|
|
11
|
-
4. Test changes with: pytest tests/lms/test_qwen_chat_completions.py
|
|
12
|
-
|
|
13
|
-
WHY THIS EXISTS:
|
|
14
|
-
- The previous regex (^.*\/.*$) was too broad and caught unintended models
|
|
15
|
-
- This provides explicit control over which models use Synth infrastructure
|
|
16
|
-
- Easier to maintain and debug model routing issues
|
|
17
|
-
"""
|
|
18
|
-
|
|
19
|
-
from typing import List, Set
|
|
20
|
-
|
|
21
|
-
# Qwen3 model families supported by Synth
|
|
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
|
-
]
|
|
35
|
-
|
|
36
|
-
# Fine-tuned models pattern - any model starting with "ft:" is considered Synth-compatible
|
|
37
|
-
# These are dynamically detected, but we can add specific known ones here
|
|
38
|
-
FINE_TUNED_MODELS: List[str] = [
|
|
39
|
-
# Add specific fine-tuned models that are known to work with Synth
|
|
40
|
-
# Examples:
|
|
41
|
-
# "ft:Qwen/Qwen3-4B-2507:ftjob-22",
|
|
42
|
-
]
|
|
43
|
-
|
|
44
|
-
# Combine all Synth-supported models
|
|
45
|
-
SYNTH_SUPPORTED_MODELS: Set[str] = set(QWEN3_MODELS + FINE_TUNED_MODELS)
|
|
46
|
-
|
|
47
|
-
# Export the main set for easy import
|
|
48
|
-
__all__ = ["SYNTH_SUPPORTED_MODELS", "QWEN3_MODELS", "FINE_TUNED_MODELS"]
|