synth-ai 0.2.6.dev1__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/cli/demo_apps/core/cli.py +1735 -0
- 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 +117 -51
- 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/cli/demo_apps/demo_task_apps/math/_common.py +16 -0
- 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} +21 -3
- 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 -102
- 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.6.dev1.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 -131
- synth_ai/cli/legacy_root_backup.py +0 -470
- synth_ai/cli/man.py +0 -106
- synth_ai/cli/rl_demo.py +0 -137
- synth_ai/cli/status.py +0 -133
- synth_ai/config/base_url.py +0 -98
- 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/core/cli.py +0 -685
- synth_ai/demos/demo_task_apps/__init__.py +0 -1
- synth_ai/demos/demo_task_apps/math/config.toml +0 -44
- synth_ai/demos/demo_task_apps/math/deploy_task_app.sh +0 -22
- 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 -724
- 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 -91
- 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/http.py +0 -102
- 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 -220
- 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 -140
- synth_ai/v0/tracing/context.py +0 -146
- synth_ai/v0/tracing/decorators.py +0 -680
- 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 -510
- 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 -140
- synth_ai/v0/tracing_v1/context.py +0 -146
- synth_ai/v0/tracing_v1/decorators.py +0 -701
- 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 -525
- synth_ai/v0/tracing_v1/utils.py +0 -9
- synth_ai/zyk/__init__.py +0 -30
- synth_ai-0.2.6.dev1.dist-info/METADATA +0 -106
- synth_ai-0.2.6.dev1.dist-info/RECORD +0 -416
- /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.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/licenses/LICENSE +0 -0
- {synth_ai-0.2.6.dev1.dist-info → synth_ai-0.4.3.dist-info}/top_level.txt +0 -0
|
@@ -1,297 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import warnings
|
|
3
|
-
from typing import (
|
|
4
|
-
Any,
|
|
5
|
-
Literal,
|
|
6
|
-
Optional,
|
|
7
|
-
Union,
|
|
8
|
-
get_args,
|
|
9
|
-
get_origin,
|
|
10
|
-
get_type_hints,
|
|
11
|
-
)
|
|
12
|
-
|
|
13
|
-
from pydantic import BaseModel
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def generate_type_map() -> dict[Any, str]:
|
|
17
|
-
base_types = {
|
|
18
|
-
int: "int",
|
|
19
|
-
float: "float",
|
|
20
|
-
bool: "bool",
|
|
21
|
-
str: "str",
|
|
22
|
-
Any: "Any",
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
collection_types = {
|
|
26
|
-
list: "List",
|
|
27
|
-
dict: "Dict",
|
|
28
|
-
Optional: "Optional",
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
type_map = {}
|
|
32
|
-
for base_type, name in base_types.items():
|
|
33
|
-
type_map[base_type] = name
|
|
34
|
-
for collection, collection_name in collection_types.items():
|
|
35
|
-
if collection is Optional:
|
|
36
|
-
type_map[Optional[base_type]] = name
|
|
37
|
-
elif collection is dict:
|
|
38
|
-
# Handle generic Dict type
|
|
39
|
-
type_map[dict] = "Dict[Any,Any]"
|
|
40
|
-
# Provide both key and value types for Dict
|
|
41
|
-
type_map[dict[base_type, base_type]] = f"{collection_name}[{name},{name}]"
|
|
42
|
-
# Handle Dict[Any, Any] explicitly
|
|
43
|
-
type_map[dict[Any, Any]] = "Dict[Any,Any]"
|
|
44
|
-
else:
|
|
45
|
-
type_map[collection[base_type]] = f"{collection_name}[{name}]"
|
|
46
|
-
return type_map
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
def generate_example_dict() -> dict[str, Any]:
|
|
50
|
-
example_values = {
|
|
51
|
-
"str": "<Your type-str response here>",
|
|
52
|
-
"int": "<Your type-int response here>",
|
|
53
|
-
"float": "<Your type-float response here>",
|
|
54
|
-
"bool": "<Your type-bool response here>",
|
|
55
|
-
"Any": "<Your response here (infer the type from context)>",
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
example_dict = {}
|
|
59
|
-
for key, value in example_values.items():
|
|
60
|
-
example_dict[key] = value
|
|
61
|
-
example_dict[f"List[{key}]"] = [value]
|
|
62
|
-
example_dict[f"List[List[{key}]]"] = [[value]]
|
|
63
|
-
if key == "Dict[str,str]":
|
|
64
|
-
example_dict[f"Dict[str,{key.split('[')[1]}"] = {value: value}
|
|
65
|
-
elif key.startswith("Dict"):
|
|
66
|
-
example_dict[key] = {value: value}
|
|
67
|
-
|
|
68
|
-
# Add example for Dict[Any,Any]
|
|
69
|
-
example_dict["Dict[Any,Any]"] = {"<key>": "<value>"}
|
|
70
|
-
|
|
71
|
-
return example_dict
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
base_type_examples = {
|
|
75
|
-
int: ("int", 42),
|
|
76
|
-
float: ("float", 3.14),
|
|
77
|
-
bool: ("bool", True),
|
|
78
|
-
str: ("str", "example"),
|
|
79
|
-
Any: ("Any", "<Any value>"),
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
def get_type_string(type_hint):
|
|
84
|
-
origin = get_origin(type_hint)
|
|
85
|
-
args = get_args(type_hint)
|
|
86
|
-
|
|
87
|
-
if origin is None:
|
|
88
|
-
if isinstance(type_hint, type) and issubclass(type_hint, BaseModel):
|
|
89
|
-
# For Pydantic models, create a dictionary of field types
|
|
90
|
-
field_types = {}
|
|
91
|
-
for field_name, field_info in type_hint.model_fields.items():
|
|
92
|
-
field_type = get_type_string(field_info.annotation)
|
|
93
|
-
# Check for Literal type by looking at the origin
|
|
94
|
-
if get_origin(field_info.annotation) is Literal:
|
|
95
|
-
literal_args = get_args(field_info.annotation)
|
|
96
|
-
field_type = f"Literal[{repr(literal_args[0])}]"
|
|
97
|
-
field_types[field_name] = field_type
|
|
98
|
-
return f"{type_hint.__name__}({', '.join(f'{k}: {v}' for k, v in field_types.items())})"
|
|
99
|
-
else:
|
|
100
|
-
return base_type_examples.get(type_hint, ("Unknown", "unknown"))[0]
|
|
101
|
-
elif origin in (list, list):
|
|
102
|
-
elem_type = get_type_string(args[0])
|
|
103
|
-
return f"List[{elem_type}]"
|
|
104
|
-
elif origin in (dict, dict):
|
|
105
|
-
key_type = get_type_string(args[0])
|
|
106
|
-
value_type = get_type_string(args[1])
|
|
107
|
-
return f"Dict[{key_type}, {value_type}]"
|
|
108
|
-
elif origin is Union:
|
|
109
|
-
non_none_types = [t for t in args if t is not type(None)]
|
|
110
|
-
if len(non_none_types) == 1:
|
|
111
|
-
return f"Optional[{get_type_string(non_none_types[0])}]"
|
|
112
|
-
else:
|
|
113
|
-
# For unions of Pydantic models (like tool calls), show each variant
|
|
114
|
-
union_types = []
|
|
115
|
-
for t in non_none_types:
|
|
116
|
-
if isinstance(t, type) and issubclass(t, BaseModel):
|
|
117
|
-
# Include discriminator field if present
|
|
118
|
-
discriminator = None
|
|
119
|
-
for field_name, field_info in t.model_fields.items():
|
|
120
|
-
if get_origin(field_info.annotation) is Literal:
|
|
121
|
-
literal_args = get_args(field_info.annotation)
|
|
122
|
-
discriminator = f"{field_name}={repr(literal_args[0])}"
|
|
123
|
-
break
|
|
124
|
-
type_str = t.__name__
|
|
125
|
-
if discriminator:
|
|
126
|
-
type_str += f"({discriminator})"
|
|
127
|
-
union_types.append(type_str)
|
|
128
|
-
else:
|
|
129
|
-
union_types.append(get_type_string(t))
|
|
130
|
-
return f"Union[{', '.join(union_types)}]"
|
|
131
|
-
elif origin is Literal:
|
|
132
|
-
# Handle Literal type directly
|
|
133
|
-
return f"Literal[{repr(args[0])}]"
|
|
134
|
-
else:
|
|
135
|
-
return "Any"
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
def get_example_value(type_hint):
|
|
139
|
-
origin = get_origin(type_hint)
|
|
140
|
-
args = get_args(type_hint)
|
|
141
|
-
|
|
142
|
-
if origin is None:
|
|
143
|
-
if isinstance(type_hint, type) and issubclass(type_hint, BaseModel):
|
|
144
|
-
example = {}
|
|
145
|
-
union_docs = []
|
|
146
|
-
for field_name, field_info in type_hint.model_fields.items():
|
|
147
|
-
field_value, field_docs = get_example_value(field_info.annotation)
|
|
148
|
-
if field_docs:
|
|
149
|
-
union_docs.extend(field_docs)
|
|
150
|
-
|
|
151
|
-
# Handle literal fields by checking origin
|
|
152
|
-
if get_origin(field_info.annotation) is Literal:
|
|
153
|
-
literal_args = get_args(field_info.annotation)
|
|
154
|
-
field_value = literal_args[0]
|
|
155
|
-
|
|
156
|
-
# Include field description if available
|
|
157
|
-
if field_info.description:
|
|
158
|
-
example[field_name] = {
|
|
159
|
-
"value": field_value,
|
|
160
|
-
"description": field_info.description,
|
|
161
|
-
}
|
|
162
|
-
else:
|
|
163
|
-
example[field_name] = field_value
|
|
164
|
-
return example, union_docs
|
|
165
|
-
else:
|
|
166
|
-
return base_type_examples.get(type_hint, ("Unknown", "unknown"))[1], []
|
|
167
|
-
elif origin in (list, list):
|
|
168
|
-
value, docs = get_example_value(args[0])
|
|
169
|
-
return [value], docs
|
|
170
|
-
elif origin in (dict, dict):
|
|
171
|
-
if not args or len(args) < 2:
|
|
172
|
-
warnings.warn(
|
|
173
|
-
f"Dictionary type hint {type_hint} missing type arguments. "
|
|
174
|
-
"Defaulting to Dict[str, Any].",
|
|
175
|
-
UserWarning,
|
|
176
|
-
)
|
|
177
|
-
return {"example_key": "<Any value>"}, [] # Default for Dict[str, Any]
|
|
178
|
-
key_value, key_docs = get_example_value(args[0])
|
|
179
|
-
value_value, value_docs = get_example_value(args[1])
|
|
180
|
-
return {key_value: value_value}, key_docs + value_docs
|
|
181
|
-
elif origin is Union:
|
|
182
|
-
non_none_types = [t for t in args if t is not type(None)]
|
|
183
|
-
# For unions of tool calls, use the first one but preserve the discriminator
|
|
184
|
-
first_type = non_none_types[0]
|
|
185
|
-
union_docs = []
|
|
186
|
-
|
|
187
|
-
if all(isinstance(t, type) and issubclass(t, BaseModel) for t in non_none_types):
|
|
188
|
-
# Generate examples for all union variants
|
|
189
|
-
for t in non_none_types:
|
|
190
|
-
example = {}
|
|
191
|
-
for field_name, field_info in t.model_fields.items():
|
|
192
|
-
field_value, _ = get_example_value(field_info.annotation)
|
|
193
|
-
if get_origin(field_info.annotation) is Literal:
|
|
194
|
-
literal_args = get_args(field_info.annotation)
|
|
195
|
-
field_value = literal_args[0]
|
|
196
|
-
example[field_name] = field_value
|
|
197
|
-
union_docs.append(f"\nExample {t.__name__}:")
|
|
198
|
-
union_docs.append(json.dumps(example, indent=2))
|
|
199
|
-
|
|
200
|
-
# Return first type as main example
|
|
201
|
-
if isinstance(first_type, type) and issubclass(first_type, BaseModel):
|
|
202
|
-
example, _ = get_example_value(first_type)
|
|
203
|
-
# Ensure tool_type or other discriminator is preserved
|
|
204
|
-
for field_name, field_info in first_type.model_fields.items():
|
|
205
|
-
if get_origin(field_info.annotation) is Literal:
|
|
206
|
-
literal_args = get_args(field_info.annotation)
|
|
207
|
-
if isinstance(example[field_name], dict) and "value" in example[field_name]:
|
|
208
|
-
example[field_name]["value"] = literal_args[0]
|
|
209
|
-
else:
|
|
210
|
-
example[field_name] = literal_args[0]
|
|
211
|
-
return example, union_docs
|
|
212
|
-
main_example, docs = get_example_value(first_type)
|
|
213
|
-
return main_example, docs + union_docs
|
|
214
|
-
elif origin is Literal:
|
|
215
|
-
# Handle Literal type directly
|
|
216
|
-
return args[0], []
|
|
217
|
-
else:
|
|
218
|
-
return "<Unknown>", []
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
def add_json_instructions_to_messages(
|
|
222
|
-
system_message,
|
|
223
|
-
user_message,
|
|
224
|
-
response_model: type[BaseModel] | None = None,
|
|
225
|
-
previously_failed_error_messages: list[str] = [],
|
|
226
|
-
) -> tuple[str, str]:
|
|
227
|
-
if response_model:
|
|
228
|
-
type_hints = get_type_hints(response_model)
|
|
229
|
-
# print("Type hints", type_hints)
|
|
230
|
-
stringified_fields = {}
|
|
231
|
-
union_docs = []
|
|
232
|
-
for key, type_hint in type_hints.items():
|
|
233
|
-
# print("Key", key, "Type hint", type_hint)
|
|
234
|
-
example_value, docs = get_example_value(type_hint)
|
|
235
|
-
union_docs.extend(docs)
|
|
236
|
-
field = response_model.model_fields[key] # Updated for Pydantic v2
|
|
237
|
-
|
|
238
|
-
# Adjusted for Pydantic v2
|
|
239
|
-
field_description = field.description if hasattr(field, "description") else None
|
|
240
|
-
|
|
241
|
-
if field_description:
|
|
242
|
-
stringified_fields[key] = (example_value, field_description)
|
|
243
|
-
else:
|
|
244
|
-
stringified_fields[key] = example_value
|
|
245
|
-
example_json = json.dumps(
|
|
246
|
-
{k: v[0] if isinstance(v, tuple) else v for k, v in stringified_fields.items()},
|
|
247
|
-
indent=4,
|
|
248
|
-
)
|
|
249
|
-
description_comments = "\n".join(
|
|
250
|
-
f"// {k}: {v[1]}" for k, v in stringified_fields.items() if isinstance(v, tuple)
|
|
251
|
-
)
|
|
252
|
-
|
|
253
|
-
# print("Example JSON", example_json)
|
|
254
|
-
# print("Description comments", description_comments)
|
|
255
|
-
# print("Union documentation", "\n".join(union_docs))
|
|
256
|
-
# raise Exception("Stop here")
|
|
257
|
-
|
|
258
|
-
system_message += f"""\n\n
|
|
259
|
-
Please deliver your response in the following JSON format:
|
|
260
|
-
```json
|
|
261
|
-
{example_json}
|
|
262
|
-
```
|
|
263
|
-
{description_comments}
|
|
264
|
-
"""
|
|
265
|
-
if len(union_docs) != 0:
|
|
266
|
-
system_message += f"""\n\n
|
|
267
|
-
NOTE - the above example included a union type. Here are some additional examples for that union type:
|
|
268
|
-
{chr(10).join(union_docs)}
|
|
269
|
-
"""
|
|
270
|
-
if len(previously_failed_error_messages) != 0:
|
|
271
|
-
system_message += f"""\n\n
|
|
272
|
-
Please take special care to follow the format exactly.
|
|
273
|
-
Keep in mind the following:
|
|
274
|
-
- Always use double quotes for strings
|
|
275
|
-
|
|
276
|
-
Here are some error traces from previous attempts:
|
|
277
|
-
{previously_failed_error_messages}
|
|
278
|
-
"""
|
|
279
|
-
return system_message, user_message
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
def inject_structured_output_instructions(
|
|
283
|
-
messages: list[dict[str, str]],
|
|
284
|
-
response_model: type[BaseModel] | None = None,
|
|
285
|
-
previously_failed_error_messages: list[str] = [],
|
|
286
|
-
) -> list[dict[str, str]]:
|
|
287
|
-
prev_system_message_content = messages[0]["content"]
|
|
288
|
-
prev_user_message_content = messages[1]["content"]
|
|
289
|
-
system_message, user_message = add_json_instructions_to_messages(
|
|
290
|
-
prev_system_message_content,
|
|
291
|
-
prev_user_message_content,
|
|
292
|
-
response_model,
|
|
293
|
-
previously_failed_error_messages,
|
|
294
|
-
)
|
|
295
|
-
messages[0]["content"] = system_message
|
|
296
|
-
messages[1]["content"] = user_message
|
|
297
|
-
return messages
|
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
import ast
|
|
2
|
-
import json
|
|
3
|
-
import logging
|
|
4
|
-
import re
|
|
5
|
-
|
|
6
|
-
from pydantic import BaseModel
|
|
7
|
-
|
|
8
|
-
from synth_ai.lm.vendors.core.openai_api import OpenAIStructuredOutputClient
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def pull_out_structured_output(response_raw: str, response_model: type[BaseModel]) -> BaseModel:
|
|
12
|
-
logger = logging.getLogger(__name__)
|
|
13
|
-
# logger.debug(f"Raw response received: {response_raw}")
|
|
14
|
-
|
|
15
|
-
assert isinstance(response_raw, str), f"Response raw is not a string: {type(response_raw)}"
|
|
16
|
-
|
|
17
|
-
# Use regex to extract JSON content within ```json ... ```
|
|
18
|
-
json_pattern = re.compile(r"```json\s*(\{.*\})\s*```", re.DOTALL)
|
|
19
|
-
match = json_pattern.search(response_raw)
|
|
20
|
-
if match:
|
|
21
|
-
response_prepared = match.group(1).strip()
|
|
22
|
-
else:
|
|
23
|
-
# Fallback to existing parsing if no code fencing is found
|
|
24
|
-
if "```" in response_raw:
|
|
25
|
-
response_prepared = response_raw.split("```")[1].strip()
|
|
26
|
-
else:
|
|
27
|
-
response_prepared = response_raw.strip()
|
|
28
|
-
|
|
29
|
-
# Replace "null" with '"None"' if needed (ensure this aligns with your data)
|
|
30
|
-
response_prepared = response_prepared.replace("null", '"None"')
|
|
31
|
-
|
|
32
|
-
logger.debug(f"Prepared response for JSON parsing: {response_prepared}")
|
|
33
|
-
|
|
34
|
-
try:
|
|
35
|
-
response = json.loads(response_prepared)
|
|
36
|
-
final = response_model(**response)
|
|
37
|
-
except json.JSONDecodeError:
|
|
38
|
-
# Attempt to parse using ast.literal_eval as a fallback
|
|
39
|
-
response_prepared = response_prepared.replace("\n", "").replace("\\n", "")
|
|
40
|
-
response_prepared = response_prepared.replace('\\"', '"')
|
|
41
|
-
try:
|
|
42
|
-
response = ast.literal_eval(response_prepared)
|
|
43
|
-
final = response_model(**response)
|
|
44
|
-
except Exception as inner_e:
|
|
45
|
-
raise ValueError(
|
|
46
|
-
f"Failed to parse response as {response_model}: {inner_e} - {response_prepared}"
|
|
47
|
-
) from inner_e
|
|
48
|
-
except Exception as e:
|
|
49
|
-
raise ValueError(
|
|
50
|
-
f"Failed to parse response as {response_model}: {e} - {response_prepared}"
|
|
51
|
-
) from e
|
|
52
|
-
assert isinstance(final, BaseModel), "Structured output must be a Pydantic model"
|
|
53
|
-
return final
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def fix_errant_stringified_json_sync(
|
|
57
|
-
response_raw: str,
|
|
58
|
-
response_model: type[BaseModel],
|
|
59
|
-
models: list[str] | None = None,
|
|
60
|
-
) -> BaseModel:
|
|
61
|
-
if models is None:
|
|
62
|
-
models = ["gpt-4o-mini", "gpt-4o"]
|
|
63
|
-
try:
|
|
64
|
-
return pull_out_structured_output(response_raw, response_model)
|
|
65
|
-
except ValueError as e:
|
|
66
|
-
# print("")
|
|
67
|
-
mini_client = OpenAIStructuredOutputClient()
|
|
68
|
-
messages = [
|
|
69
|
-
{
|
|
70
|
-
"role": "system",
|
|
71
|
-
"content": "An AI attempted to generate stringified json that could be extracted into the provided Pydantic model. This json cannot be extracted, and an error message is provided to elucidate why. Please review the information and return a corrected response. Do not materially change the content of the response, just formatting where necessary.",
|
|
72
|
-
},
|
|
73
|
-
{
|
|
74
|
-
"role": "user",
|
|
75
|
-
"content": f"# Errant Attempt\n{response_raw}\n# Response Model\n {response_model.model_json_schema()}\n# Error Message\n {str(e)}.",
|
|
76
|
-
},
|
|
77
|
-
]
|
|
78
|
-
for model in models:
|
|
79
|
-
if model == "gpt-4o":
|
|
80
|
-
print(
|
|
81
|
-
"Warning - using gpt-4o for structured output correction - this could add up over time (latency, cost)"
|
|
82
|
-
)
|
|
83
|
-
try:
|
|
84
|
-
fixed_response = mini_client._hit_api_sync(
|
|
85
|
-
model, messages=messages, lm_config={"temperature": 0.0}
|
|
86
|
-
)
|
|
87
|
-
return pull_out_structured_output(fixed_response, response_model)
|
|
88
|
-
except Exception as e:
|
|
89
|
-
pass
|
|
90
|
-
raise ValueError("Failed to fix response using any model") from None
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
async def fix_errant_stringified_json_async(
|
|
94
|
-
response_raw: str,
|
|
95
|
-
response_model: type[BaseModel],
|
|
96
|
-
models: list[str] | None = None,
|
|
97
|
-
) -> BaseModel:
|
|
98
|
-
if models is None:
|
|
99
|
-
models = ["gpt-4o-mini", "gpt-4o"]
|
|
100
|
-
try:
|
|
101
|
-
return pull_out_structured_output(response_raw, response_model)
|
|
102
|
-
except ValueError as e:
|
|
103
|
-
mini_client = OpenAIStructuredOutputClient()
|
|
104
|
-
messages = [
|
|
105
|
-
{
|
|
106
|
-
"role": "system",
|
|
107
|
-
"content": "An AI attempted to generate stringified json that could be extracted into the provided Pydantic model. This json cannot be extracted, and an error message is provided to elucidate why. Please review the information and return a corrected response. Do not materially change the content of the response, just formatting where necessary.",
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
"role": "user",
|
|
111
|
-
"content": f"# Errant Attempt\n{response_raw}\n# Response Model\n {response_model.model_json_schema()}\n# Error Message\n {str(e)}.",
|
|
112
|
-
},
|
|
113
|
-
]
|
|
114
|
-
for model in models:
|
|
115
|
-
if model == "gpt-4o":
|
|
116
|
-
print(
|
|
117
|
-
"Warning - using gpt-4o for structured output correction - this could add up over time (latency, cost)"
|
|
118
|
-
)
|
|
119
|
-
try:
|
|
120
|
-
fixed_response = await mini_client._hit_api_async(
|
|
121
|
-
model, messages=messages, lm_config={"temperature": 0.0}
|
|
122
|
-
)
|
|
123
|
-
return pull_out_structured_output(fixed_response, response_model)
|
|
124
|
-
except Exception as e:
|
|
125
|
-
pass
|
|
126
|
-
raise ValueError("Failed to fix response using any model") from None
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
async def fix_errant_forced_async(
|
|
130
|
-
messages: list[dict],
|
|
131
|
-
response_raw: str,
|
|
132
|
-
response_model: type[BaseModel],
|
|
133
|
-
model: str,
|
|
134
|
-
) -> BaseModel:
|
|
135
|
-
try:
|
|
136
|
-
return pull_out_structured_output(response_raw, response_model)
|
|
137
|
-
except ValueError as e:
|
|
138
|
-
client = OpenAIStructuredOutputClient()
|
|
139
|
-
messages = [
|
|
140
|
-
{
|
|
141
|
-
"role": "system",
|
|
142
|
-
"content": "An AI attempted to generate stringified json that could be extracted into the provided Pydantic model. This json cannot be extracted, and an error message is provided to elucidate why. Please review the information and return a corrected response. Do not materially change the content of the response, just formatting where necessary.",
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
"role": "user",
|
|
146
|
-
"content": f"<previous messages>\n<system_message>{messages[0]['content']}</system_message>\n<user_message>{messages[1]['content']}</user_message></previous messages> # Errant Attempt\n{response_raw}\n# Response Model\n {response_model.model_json_schema()}\n# Error Message\n {str(e)}.",
|
|
147
|
-
},
|
|
148
|
-
]
|
|
149
|
-
# print("Broken response:")
|
|
150
|
-
# print(response_raw)
|
|
151
|
-
fixed_response = await client._hit_api_async_structured_output(
|
|
152
|
-
model=model,
|
|
153
|
-
messages=messages,
|
|
154
|
-
response_model=response_model,
|
|
155
|
-
temperature=0.0,
|
|
156
|
-
)
|
|
157
|
-
# print("Fixed response:")
|
|
158
|
-
# print(fixed_response)
|
|
159
|
-
return fixed_response.structured_output
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
def fix_errant_forced_sync(
|
|
163
|
-
response_raw: str,
|
|
164
|
-
response_model: type[BaseModel],
|
|
165
|
-
model: str,
|
|
166
|
-
) -> BaseModel:
|
|
167
|
-
client = OpenAIStructuredOutputClient()
|
|
168
|
-
messages = [
|
|
169
|
-
{
|
|
170
|
-
"role": "system",
|
|
171
|
-
"content": "An AI attempted to generate a response that could be extracted into the provided Pydantic model. This response cannot be extracted. Please review the information and return a corrected response.",
|
|
172
|
-
},
|
|
173
|
-
{
|
|
174
|
-
"role": "user",
|
|
175
|
-
"content": f"# Errant Attempt\n{response_raw}\n# Response Model\n {response_model.model_json_schema()}",
|
|
176
|
-
},
|
|
177
|
-
]
|
|
178
|
-
# print("Broken response:")
|
|
179
|
-
# print(response_raw)
|
|
180
|
-
fixed_response = client._hit_api_sync_structured_output(
|
|
181
|
-
model=model, messages=messages, response_model=response_model, temperature=0.0
|
|
182
|
-
)
|
|
183
|
-
# print("Fixed response:")
|
|
184
|
-
# print(fixed_response)
|
|
185
|
-
return fixed_response.structured_output
|
synth_ai/lm/tools/__init__.py
DELETED
synth_ai/lm/tools/base.py
DELETED
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Base class for LM tools.
|
|
3
|
-
|
|
4
|
-
This module provides the base class for defining tools that can be used with language models.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
from pydantic import BaseModel
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class BaseTool(BaseModel):
|
|
13
|
-
"""
|
|
14
|
-
Base class for defining tools that can be used with language models.
|
|
15
|
-
|
|
16
|
-
Attributes:
|
|
17
|
-
name: The name of the tool
|
|
18
|
-
arguments: Pydantic model defining the tool's arguments
|
|
19
|
-
description: Human-readable description of what the tool does
|
|
20
|
-
strict: Whether to enforce strict schema validation (default True)
|
|
21
|
-
"""
|
|
22
|
-
|
|
23
|
-
name: str
|
|
24
|
-
arguments: type[BaseModel]
|
|
25
|
-
description: str = ""
|
|
26
|
-
strict: bool = True
|
|
27
|
-
|
|
28
|
-
def to_openai_tool(self) -> dict[str, Any]:
|
|
29
|
-
"""
|
|
30
|
-
Convert the tool to OpenAI's tool format.
|
|
31
|
-
|
|
32
|
-
Returns:
|
|
33
|
-
dict: Tool definition in OpenAI's expected format
|
|
34
|
-
|
|
35
|
-
Note:
|
|
36
|
-
- Ensures additionalProperties is False for strict validation
|
|
37
|
-
- Fixes array items that lack explicit types
|
|
38
|
-
- Handles nested schemas in anyOf constructs
|
|
39
|
-
"""
|
|
40
|
-
schema = self.arguments.model_json_schema()
|
|
41
|
-
schema["additionalProperties"] = False
|
|
42
|
-
|
|
43
|
-
if "properties" in schema:
|
|
44
|
-
for _prop_name, prop_schema in schema["properties"].items():
|
|
45
|
-
if prop_schema.get("type") == "array":
|
|
46
|
-
items_schema = prop_schema.get("items", {})
|
|
47
|
-
if not isinstance(items_schema, dict) or not items_schema.get("type"):
|
|
48
|
-
prop_schema["items"] = {"type": "string"}
|
|
49
|
-
|
|
50
|
-
elif "anyOf" in prop_schema:
|
|
51
|
-
for sub_schema in prop_schema["anyOf"]:
|
|
52
|
-
if isinstance(sub_schema, dict) and sub_schema.get("type") == "array":
|
|
53
|
-
items_schema = sub_schema.get("items", {})
|
|
54
|
-
if not isinstance(items_schema, dict) or not items_schema.get("type"):
|
|
55
|
-
sub_schema["items"] = {"type": "string"}
|
|
56
|
-
|
|
57
|
-
return {
|
|
58
|
-
"type": "function",
|
|
59
|
-
"function": {
|
|
60
|
-
"name": self.name,
|
|
61
|
-
"description": self.description,
|
|
62
|
-
"parameters": schema,
|
|
63
|
-
"strict": self.strict,
|
|
64
|
-
},
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
def to_anthropic_tool(self) -> dict[str, Any]:
|
|
68
|
-
"""
|
|
69
|
-
Convert the tool to Anthropic's tool format.
|
|
70
|
-
|
|
71
|
-
Returns:
|
|
72
|
-
dict: Tool definition in Anthropic's expected format
|
|
73
|
-
|
|
74
|
-
Note:
|
|
75
|
-
Anthropic uses a different format with input_schema instead of parameters.
|
|
76
|
-
"""
|
|
77
|
-
schema = self.arguments.model_json_schema()
|
|
78
|
-
schema["additionalProperties"] = False
|
|
79
|
-
|
|
80
|
-
return {
|
|
81
|
-
"name": self.name,
|
|
82
|
-
"description": self.description,
|
|
83
|
-
"input_schema": {
|
|
84
|
-
"type": "object",
|
|
85
|
-
"properties": schema["properties"],
|
|
86
|
-
"required": schema.get("required", []),
|
|
87
|
-
},
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
def to_mistral_tool(self) -> dict[str, Any]:
|
|
91
|
-
"""
|
|
92
|
-
Convert the tool to Mistral's tool format.
|
|
93
|
-
|
|
94
|
-
Returns:
|
|
95
|
-
dict: Tool definition in Mistral's expected format
|
|
96
|
-
|
|
97
|
-
Note:
|
|
98
|
-
Mistral requires explicit handling of array types and enum values.
|
|
99
|
-
"""
|
|
100
|
-
schema = self.arguments.model_json_schema()
|
|
101
|
-
properties = {}
|
|
102
|
-
for prop_name, prop in schema.get("properties", {}).items():
|
|
103
|
-
prop_type = prop["type"]
|
|
104
|
-
if prop_type == "array" and "items" in prop:
|
|
105
|
-
properties[prop_name] = {
|
|
106
|
-
"type": "array",
|
|
107
|
-
"items": prop["items"],
|
|
108
|
-
"description": prop.get("description", ""),
|
|
109
|
-
}
|
|
110
|
-
continue
|
|
111
|
-
|
|
112
|
-
properties[prop_name] = {
|
|
113
|
-
"type": prop_type,
|
|
114
|
-
"description": prop.get("description", ""),
|
|
115
|
-
}
|
|
116
|
-
if "enum" in prop:
|
|
117
|
-
properties[prop_name]["enum"] = prop["enum"]
|
|
118
|
-
|
|
119
|
-
parameters = {
|
|
120
|
-
"type": "object",
|
|
121
|
-
"properties": properties,
|
|
122
|
-
"required": schema.get("required", []),
|
|
123
|
-
"additionalProperties": False,
|
|
124
|
-
}
|
|
125
|
-
return {
|
|
126
|
-
"type": "function",
|
|
127
|
-
"function": {
|
|
128
|
-
"name": self.name,
|
|
129
|
-
"description": self.description,
|
|
130
|
-
"parameters": parameters,
|
|
131
|
-
},
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
def to_gemini_tool(self) -> dict[str, Any]:
|
|
135
|
-
"""
|
|
136
|
-
Convert the tool to Gemini's tool format.
|
|
137
|
-
|
|
138
|
-
Returns:
|
|
139
|
-
dict: Tool definition in Gemini's expected format
|
|
140
|
-
|
|
141
|
-
Note:
|
|
142
|
-
Gemini uses a simpler format without the nested "function" key.
|
|
143
|
-
"""
|
|
144
|
-
schema = self.arguments.model_json_schema()
|
|
145
|
-
# Convert Pydantic schema types to Gemini schema types
|
|
146
|
-
properties = {}
|
|
147
|
-
for name, prop in schema["properties"].items():
|
|
148
|
-
prop_type = prop.get("type", "string")
|
|
149
|
-
if prop_type == "array" and "items" in prop:
|
|
150
|
-
properties[name] = {
|
|
151
|
-
"type": "array",
|
|
152
|
-
"items": prop["items"],
|
|
153
|
-
"description": prop.get("description", ""),
|
|
154
|
-
}
|
|
155
|
-
continue
|
|
156
|
-
|
|
157
|
-
properties[name] = {
|
|
158
|
-
"type": prop_type,
|
|
159
|
-
"description": prop.get("description", ""),
|
|
160
|
-
}
|
|
161
|
-
if "enum" in prop:
|
|
162
|
-
properties[name]["enum"] = prop["enum"]
|
|
163
|
-
|
|
164
|
-
return {
|
|
165
|
-
"name": self.name,
|
|
166
|
-
"description": self.description,
|
|
167
|
-
"parameters": {
|
|
168
|
-
"type": "object",
|
|
169
|
-
"properties": properties,
|
|
170
|
-
"required": schema.get("required", []),
|
|
171
|
-
},
|
|
172
|
-
}
|