synth-ai 0.2.9.dev11__py3-none-any.whl → 0.4.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synth-ai might be problematic. Click here for more details.
- synth_ai/__init__.py +44 -45
- synth_ai/__main__.py +30 -3
- synth_ai/cli/__init__.py +104 -78
- 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/baseline/__init__.py +12 -0
- synth_ai/cli/commands/baseline/core.py +636 -0
- synth_ai/cli/commands/baseline/list.py +94 -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 +19 -0
- synth_ai/cli/commands/eval/core.py +1113 -0
- synth_ai/cli/commands/eval/errors.py +81 -0
- synth_ai/cli/commands/eval/validation.py +133 -0
- synth_ai/cli/commands/filter/__init__.py +12 -0
- synth_ai/cli/commands/filter/core.py +424 -0
- synth_ai/cli/commands/filter/errors.py +55 -0
- synth_ai/cli/commands/filter/validation.py +77 -0
- synth_ai/cli/commands/help/__init__.py +185 -0
- synth_ai/cli/commands/help/core.py +72 -0
- synth_ai/cli/commands/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 +1438 -0
- synth_ai/cli/commands/status/__init__.py +66 -0
- synth_ai/cli/commands/status/client.py +192 -0
- synth_ai/cli/commands/status/config.py +92 -0
- synth_ai/cli/commands/status/errors.py +20 -0
- synth_ai/cli/commands/status/formatters.py +164 -0
- synth_ai/cli/commands/status/subcommands/__init__.py +9 -0
- synth_ai/cli/commands/status/subcommands/files.py +79 -0
- synth_ai/cli/commands/status/subcommands/jobs.py +334 -0
- synth_ai/cli/commands/status/subcommands/models.py +79 -0
- synth_ai/cli/commands/status/subcommands/pricing.py +23 -0
- synth_ai/cli/commands/status/subcommands/runs.py +81 -0
- synth_ai/cli/commands/status/subcommands/session.py +182 -0
- synth_ai/cli/commands/status/subcommands/summary.py +47 -0
- synth_ai/cli/commands/status/subcommands/usage.py +203 -0
- synth_ai/cli/commands/status/utils.py +114 -0
- synth_ai/cli/commands/train/__init__.py +53 -0
- synth_ai/cli/commands/train/core.py +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/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/core.py +440 -0
- synth_ai/cli/demo_apps/demo_task_apps/crafter/__init__.py +1 -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/modal_task_app.py +742 -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 +76 -0
- synth_ai/cli/demo_apps/math/deploy_modal.py +54 -0
- synth_ai/cli/demo_apps/math/modal_task_app.py +702 -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 +933 -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/infra/balance.py +216 -0
- 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 +643 -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 +30 -103
- synth_ai/cli/task_apps/__init__.py +26 -0
- synth_ai/cli/task_apps/commands.py +3153 -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/training/watch.py +506 -0
- synth_ai/cli/turso.py +34 -55
- synth_ai/cli/usage.py +159 -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/utils/recent.py +133 -0
- synth_ai/cli/utils/traces.py +164 -0
- 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 +220 -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/core/tracing_v3/__init__.py +99 -0
- synth_ai/core/tracing_v3/config.py +229 -0
- synth_ai/core/tracing_v3/constants.py +21 -0
- synth_ai/core/tracing_v3/db_config.py +182 -0
- synth_ai/core/tracing_v3/decorators.py +401 -0
- synth_ai/core/tracing_v3/examples/basic_usage.py +194 -0
- synth_ai/core/tracing_v3/llm_call_record_helpers.py +437 -0
- synth_ai/core/tracing_v3/migration_helper.py +119 -0
- synth_ai/core/tracing_v3/replica_sync.py +262 -0
- synth_ai/core/tracing_v3/serialization.py +130 -0
- synth_ai/core/tracing_v3/session_tracer.py +542 -0
- synth_ai/core/tracing_v3/storage/base.py +211 -0
- synth_ai/core/tracing_v3/storage/config.py +109 -0
- synth_ai/core/tracing_v3/storage/factory.py +39 -0
- synth_ai/core/tracing_v3/storage/utils.py +206 -0
- 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/core/tracing_v3/turso/models.py +470 -0
- synth_ai/core/tracing_v3/turso/native_manager.py +1385 -0
- synth_ai/core/tracing_v3/utils.py +108 -0
- 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 +110 -0
- synth_ai/data/enums.py +141 -0
- synth_ai/data/rewards.py +152 -0
- synth_ai/data/specs.py +36 -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/sdk/__init__.py +119 -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 +86 -0
- synth_ai/sdk/api/research_agent/cli.py +428 -0
- synth_ai/sdk/api/research_agent/config.py +357 -0
- synth_ai/sdk/api/research_agent/job.py +717 -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 +2188 -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 +188 -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/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 +470 -0
- synth_ai/sdk/api/train/rl.py +442 -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 +331 -0
- synth_ai/sdk/api/train/utils.py +279 -0
- synth_ai/sdk/api/train/validators.py +2424 -0
- synth_ai/sdk/baseline/__init__.py +25 -0
- synth_ai/sdk/baseline/config.py +209 -0
- synth_ai/sdk/baseline/discovery.py +216 -0
- synth_ai/sdk/baseline/execution.py +154 -0
- synth_ai/sdk/graphs/__init__.py +15 -0
- synth_ai/sdk/graphs/completions.py +570 -0
- synth_ai/sdk/inference/__init__.py +6 -0
- 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 +15 -0
- synth_ai/sdk/judging/base.py +24 -0
- synth_ai/sdk/judging/client.py +191 -0
- synth_ai/sdk/judging/schemas.py +222 -0
- synth_ai/sdk/judging/types.py +42 -0
- synth_ai/sdk/learning/__init__.py +69 -0
- synth_ai/sdk/learning/client.py +240 -0
- synth_ai/sdk/learning/ft_client.py +7 -0
- synth_ai/sdk/learning/health.py +49 -0
- synth_ai/sdk/learning/jobs.py +202 -0
- 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 +185 -0
- synth_ai/sdk/learning/rl/client.py +268 -0
- synth_ai/sdk/learning/rl/contracts.py +27 -0
- synth_ai/sdk/learning/rl/env_keys.py +166 -0
- synth_ai/sdk/learning/rl/secrets.py +13 -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/validators.py +52 -0
- synth_ai/sdk/research_agent/__init__.py +34 -0
- synth_ai/sdk/research_agent/container_builder.py +328 -0
- synth_ai/sdk/research_agent/container_spec.py +198 -0
- synth_ai/sdk/research_agent/defaults.py +34 -0
- synth_ai/sdk/research_agent/results_collector.py +69 -0
- synth_ai/sdk/specs/__init__.py +46 -0
- synth_ai/sdk/specs/dataclasses.py +149 -0
- synth_ai/sdk/specs/loader.py +144 -0
- synth_ai/sdk/specs/serializer.py +199 -0
- synth_ai/sdk/specs/validation.py +250 -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 +704 -0
- synth_ai/sdk/streaming/types.py +112 -0
- synth_ai/sdk/task/__init__.py +151 -0
- synth_ai/sdk/task/apps/__init__.py +133 -0
- synth_ai/sdk/task/config.py +261 -0
- synth_ai/sdk/task/contracts.py +298 -0
- synth_ai/sdk/task/datasets.py +108 -0
- synth_ai/sdk/task/in_process.py +1190 -0
- synth_ai/sdk/task/in_process_runner.py +309 -0
- synth_ai/sdk/task/inference_api.py +299 -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/server.py +580 -0
- synth_ai/sdk/task/trace_correlation_helpers.py +506 -0
- synth_ai/sdk/task/tracing_utils.py +95 -0
- synth_ai/sdk/task/validators.py +456 -0
- synth_ai/sdk/tracing/__init__.py +39 -0
- synth_ai/sdk/training/__init__.py +102 -0
- synth_ai/sdk/usage/__init__.py +37 -0
- synth_ai/sdk/usage/client.py +171 -0
- synth_ai/sdk/usage/models.py +261 -0
- synth_ai/utils/__init__.py +213 -0
- synth_ai-0.4.1.dist-info/METADATA +195 -0
- synth_ai-0.4.1.dist-info/RECORD +379 -0
- synth_ai-0.4.1.dist-info/entry_points.txt +2 -0
- synth_ai-0.4.1.dist-info/top_level.txt +1 -0
- examples/__init__.py +0 -16
- examples/analyze_semantic_words.sh +0 -17
- examples/crafter_debug_render.py +0 -186
- examples/qwen_coder/README.md +0 -102
- examples/qwen_coder/_shared.py +0 -113
- examples/qwen_coder/configs/coder_lora_30b.toml +0 -61
- examples/qwen_coder/configs/coder_lora_4b.toml +0 -57
- examples/qwen_coder/configs/coder_lora_small.toml +0 -58
- examples/qwen_coder/generate_dataset.py +0 -98
- examples/qwen_coder/infer_ft_smoke.py +0 -64
- examples/qwen_coder/infer_prod_proxy.py +0 -73
- examples/qwen_coder/infer_via_synth.py +0 -87
- examples/qwen_coder/scripts/infer_coder.sh +0 -18
- examples/qwen_coder/scripts/train_coder_30b.sh +0 -21
- examples/qwen_coder/sft_full_17b.py +0 -103
- examples/qwen_coder/sft_lora_30b.py +0 -110
- examples/qwen_coder/subset_jsonl.py +0 -38
- examples/qwen_coder/validate_jsonl.py +0 -59
- examples/rl/README.md +0 -169
- examples/rl/configs/eval_base_qwen.toml +0 -15
- examples/rl/configs/eval_rl_qwen.toml +0 -11
- examples/rl/configs/rl_from_base_qwen.toml +0 -35
- examples/rl/configs/rl_from_base_qwen17.toml +0 -74
- examples/rl/configs/rl_from_ft_qwen.toml +0 -35
- examples/rl/download_dataset.py +0 -80
- examples/rl/run_eval.py +0 -436
- examples/rl/run_rl_and_save.py +0 -111
- examples/rl/task_app/README.md +0 -22
- examples/rl/task_app/math_single_step.py +0 -991
- examples/rl/task_app/math_task_app.py +0 -115
- examples/run_crafter_demo.sh +0 -10
- examples/sft/README.md +0 -139
- examples/sft/configs/crafter_fft_qwen0p6b.toml +0 -44
- examples/sft/configs/crafter_lora_qwen0p6b.toml +0 -45
- examples/sft/evaluate.py +0 -117
- examples/sft/export_dataset.py +0 -117
- examples/sft/generate_traces.py +0 -162
- examples/swe/__init__.py +0 -12
- examples/swe/task_app/README.md +0 -105
- examples/swe/task_app/__init__.py +0 -2
- examples/swe/task_app/grpo_swe_mini.py +0 -571
- examples/swe/task_app/grpo_swe_mini_task_app.py +0 -136
- examples/swe/task_app/hosted/README.md +0 -173
- examples/swe/task_app/hosted/__init__.py +0 -5
- examples/swe/task_app/hosted/branching.py +0 -143
- examples/swe/task_app/hosted/environment_routes.py +0 -1289
- examples/swe/task_app/hosted/envs/__init__.py +0 -1
- examples/swe/task_app/hosted/envs/crafter/__init__.py +0 -6
- examples/swe/task_app/hosted/envs/crafter/app.py +0 -1
- examples/swe/task_app/hosted/envs/crafter/environment.py +0 -522
- examples/swe/task_app/hosted/envs/crafter/policy.py +0 -478
- examples/swe/task_app/hosted/envs/crafter/react_agent.py +0 -108
- examples/swe/task_app/hosted/envs/crafter/shared.py +0 -305
- examples/swe/task_app/hosted/envs/crafter/tools.py +0 -47
- examples/swe/task_app/hosted/envs/mini_swe/__init__.py +0 -8
- examples/swe/task_app/hosted/envs/mini_swe/environment.py +0 -1164
- examples/swe/task_app/hosted/envs/mini_swe/policy.py +0 -355
- examples/swe/task_app/hosted/envs/mini_swe/shared.py +0 -83
- examples/swe/task_app/hosted/envs/mini_swe/tools.py +0 -96
- examples/swe/task_app/hosted/hosted_app.py +0 -204
- examples/swe/task_app/hosted/inference/__init__.py +0 -5
- examples/swe/task_app/hosted/inference/openai_client.py +0 -618
- examples/swe/task_app/hosted/main.py +0 -100
- examples/swe/task_app/hosted/policy_routes.py +0 -1079
- examples/swe/task_app/hosted/registry.py +0 -195
- examples/swe/task_app/hosted/rollout.py +0 -1869
- examples/swe/task_app/hosted/storage/__init__.py +0 -5
- examples/swe/task_app/hosted/storage/volume.py +0 -211
- examples/swe/task_app/hosted/test_agents.py +0 -161
- examples/swe/task_app/hosted/test_service.py +0 -137
- examples/swe/task_app/hosted/utils.py +0 -62
- examples/vlm/README.md +0 -68
- examples/vlm/configs/crafter_vlm_gpt4o.toml +0 -44
- examples/vlm/crafter_image_only_agent.py +0 -207
- examples/vlm/crafter_openai_vlm_agent.py +0 -277
- examples/vlm/filter_image_rows.py +0 -63
- examples/vlm/run_crafter_vlm_benchmark.py +0 -316
- examples/warming_up_to_rl/analyze_trace_db.py +0 -422
- examples/warming_up_to_rl/configs/crafter_fft.toml +0 -48
- examples/warming_up_to_rl/configs/crafter_fft_4b.toml +0 -54
- examples/warming_up_to_rl/configs/eval_fft_qwen4b.toml +0 -20
- examples/warming_up_to_rl/configs/eval_groq_qwen32b.toml +0 -13
- examples/warming_up_to_rl/configs/eval_modal_qwen4b.toml +0 -23
- examples/warming_up_to_rl/configs/rl_from_base_qwen4b.toml +0 -83
- examples/warming_up_to_rl/configs/rl_from_ft.toml +0 -56
- examples/warming_up_to_rl/export_trace_sft.py +0 -723
- examples/warming_up_to_rl/groq_test.py +0 -95
- examples/warming_up_to_rl/manage_secrets.py +0 -131
- examples/warming_up_to_rl/readme.md +0 -179
- examples/warming_up_to_rl/run_eval.py +0 -510
- examples/warming_up_to_rl/run_fft_and_save.py +0 -380
- examples/warming_up_to_rl/run_local_rollout.py +0 -237
- examples/warming_up_to_rl/run_local_rollout_modal.py +0 -246
- examples/warming_up_to_rl/run_local_rollout_parallel.py +0 -403
- examples/warming_up_to_rl/run_local_rollout_traced.py +0 -475
- examples/warming_up_to_rl/run_rl_and_save.py +0 -124
- examples/warming_up_to_rl/run_rollout_remote.py +0 -154
- examples/warming_up_to_rl/task_app/README.md +0 -42
- examples/warming_up_to_rl/task_app/grpo_crafter.py +0 -700
- examples/warming_up_to_rl/task_app/grpo_crafter_task_app.py +0 -146
- examples/warming_up_to_rl/task_app/synth_envs_hosted/README.md +0 -173
- examples/warming_up_to_rl/task_app/synth_envs_hosted/__init__.py +0 -5
- examples/warming_up_to_rl/task_app/synth_envs_hosted/branching.py +0 -143
- examples/warming_up_to_rl/task_app/synth_envs_hosted/environment_routes.py +0 -1226
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/__init__.py +0 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/__init__.py +0 -6
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/app.py +0 -1
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/environment.py +0 -522
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/policy.py +0 -478
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/react_agent.py +0 -108
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/shared.py +0 -305
- examples/warming_up_to_rl/task_app/synth_envs_hosted/envs/crafter/tools.py +0 -47
- examples/warming_up_to_rl/task_app/synth_envs_hosted/hosted_app.py +0 -204
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/__init__.py +0 -5
- examples/warming_up_to_rl/task_app/synth_envs_hosted/inference/openai_client.py +0 -618
- examples/warming_up_to_rl/task_app/synth_envs_hosted/main.py +0 -100
- examples/warming_up_to_rl/task_app/synth_envs_hosted/policy_routes.py +0 -1083
- examples/warming_up_to_rl/task_app/synth_envs_hosted/registry.py +0 -195
- examples/warming_up_to_rl/task_app/synth_envs_hosted/rollout.py +0 -1869
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/__init__.py +0 -5
- examples/warming_up_to_rl/task_app/synth_envs_hosted/storage/volume.py +0 -211
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_agents.py +0 -161
- examples/warming_up_to_rl/task_app/synth_envs_hosted/test_service.py +0 -137
- examples/warming_up_to_rl/task_app/synth_envs_hosted/utils.py +0 -62
- synth/__init__.py +0 -14
- synth_ai/api/models/supported.py +0 -376
- synth_ai/api/train/__init__.py +0 -5
- synth_ai/api/train/builders.py +0 -296
- synth_ai/api/train/cli.py +0 -606
- synth_ai/api/train/config_finder.py +0 -228
- synth_ai/api/train/env_resolver.py +0 -347
- synth_ai/api/train/pollers.py +0 -75
- synth_ai/api/train/supported_algos.py +0 -139
- synth_ai/api/train/task_app.py +0 -195
- synth_ai/api/train/utils.py +0 -217
- synth_ai/cli/_modal_wrapper.py +0 -28
- synth_ai/cli/_typer_patch.py +0 -49
- synth_ai/cli/balance.py +0 -203
- synth_ai/cli/calc.py +0 -69
- synth_ai/cli/demo.py +0 -159
- synth_ai/cli/legacy_root_backup.py +0 -470
- synth_ai/cli/man.py +0 -106
- synth_ai/cli/recent.py +0 -127
- synth_ai/cli/rl_demo.py +0 -274
- synth_ai/cli/status.py +0 -133
- synth_ai/cli/task_apps.py +0 -2782
- synth_ai/cli/traces.py +0 -163
- synth_ai/cli/watch.py +0 -505
- synth_ai/config/base_url.py +0 -107
- synth_ai/core/experiment.py +0 -13
- synth_ai/core/system.py +0 -15
- synth_ai/demo_registry.py +0 -295
- synth_ai/demos/core/__init__.py +0 -1
- synth_ai/demos/core/cli.py +0 -1756
- synth_ai/demos/demo_task_apps/core.py +0 -440
- synth_ai/demos/demo_task_apps/crafter/grpo_crafter_task_app.py +0 -172
- 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 -739
- synth_ai/demos/demo_task_apps/math/task_app_entry.py +0 -37
- 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 -302
- 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/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/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 -479
- 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/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 -363
- synth_ai/environments/service/app.py +0 -97
- synth_ai/environments/service/core_routes.py +0 -1021
- 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 -81
- synth_ai/environments/tasks/filters.py +0 -40
- synth_ai/environments/tasks/utils.py +0 -90
- synth_ai/environments/v0_observability/history.py +0 -3
- synth_ai/environments/v0_observability/log.py +0 -2
- synth_ai/evals/base.py +0 -13
- synth_ai/handshake.py +0 -109
- synth_ai/http.py +0 -26
- synth_ai/http_client.py +0 -136
- synth_ai/inference/__init__.py +0 -5
- synth_ai/inference/client.py +0 -34
- synth_ai/jobs/client.py +0 -271
- synth_ai/learning/__init__.py +0 -59
- synth_ai/learning/client.py +0 -241
- synth_ai/learning/ft_client.py +0 -7
- synth_ai/learning/health.py +0 -49
- synth_ai/learning/jobs.py +0 -201
- synth_ai/learning/rl/client.py +0 -267
- synth_ai/learning/rl/contracts.py +0 -27
- synth_ai/learning/rl/env_keys.py +0 -166
- synth_ai/learning/rl/secrets.py +0 -13
- synth_ai/learning/sft/client.py +0 -68
- synth_ai/learning/sft/config.py +0 -270
- synth_ai/learning/sft/data.py +0 -295
- synth_ai/learning/validators.py +0 -49
- synth_ai/lm/__init__.py +0 -25
- synth_ai/main.py +0 -6
- synth_ai/task/__init__.py +0 -102
- synth_ai/task/apps/__init__.py +0 -128
- synth_ai/task/contracts.py +0 -137
- synth_ai/task/datasets.py +0 -108
- synth_ai/task/proxy.py +0 -259
- synth_ai/task/server.py +0 -424
- synth_ai/task/tracing_utils.py +0 -84
- synth_ai/task/validators.py +0 -11
- synth_ai/tracing_v3/__init__.py +0 -97
- synth_ai/tracing_v3/config.py +0 -84
- synth_ai/tracing_v3/db_config.py +0 -194
- synth_ai/tracing_v3/decorators.py +0 -369
- synth_ai/tracing_v3/examples/basic_usage.py +0 -189
- synth_ai/tracing_v3/llm_call_record_helpers.py +0 -337
- synth_ai/tracing_v3/migration_helper.py +0 -120
- synth_ai/tracing_v3/replica_sync.py +0 -258
- synth_ai/tracing_v3/session_tracer.py +0 -530
- synth_ai/tracing_v3/storage/base.py +0 -210
- synth_ai/tracing_v3/storage/config.py +0 -75
- synth_ai/tracing_v3/storage/factory.py +0 -39
- synth_ai/tracing_v3/storage/utils.py +0 -204
- synth_ai/tracing_v3/turso/daemon.py +0 -149
- synth_ai/tracing_v3/turso/models.py +0 -469
- synth_ai/tracing_v3/turso/native_manager.py +0 -1173
- synth_ai/tracing_v3/utils.py +0 -108
- synth_ai/v0/api/__init__.py +0 -8
- synth_ai/v0/api/models/__init__.py +0 -8
- synth_ai/v0/api/models/supported.py +0 -8
- synth_ai/v0/config/__init__.py +0 -15
- synth_ai/v0/config/base_url.py +0 -12
- synth_ai/v0/lm/__init__.py +0 -51
- synth_ai/v0/lm/caching/constants.py +0 -6
- synth_ai/v0/lm/caching/dbs.py +0 -0
- synth_ai/v0/lm/caching/ephemeral.py +0 -100
- synth_ai/v0/lm/caching/handler.py +0 -137
- synth_ai/v0/lm/caching/initialize.py +0 -11
- synth_ai/v0/lm/caching/persistent.py +0 -114
- synth_ai/v0/lm/config.py +0 -115
- synth_ai/v0/lm/constants.py +0 -32
- synth_ai/v0/lm/core/__init__.py +0 -8
- synth_ai/v0/lm/core/all.py +0 -73
- synth_ai/v0/lm/core/exceptions.py +0 -5
- synth_ai/v0/lm/core/main.py +0 -331
- synth_ai/v0/lm/core/main_v3.py +0 -594
- synth_ai/v0/lm/core/synth_models.py +0 -35
- synth_ai/v0/lm/core/vendor_clients.py +0 -190
- synth_ai/v0/lm/cost/__init__.py +0 -0
- synth_ai/v0/lm/cost/monitor.py +0 -1
- synth_ai/v0/lm/cost/statefulness.py +0 -1
- synth_ai/v0/lm/injection.py +0 -80
- synth_ai/v0/lm/overrides.py +0 -206
- synth_ai/v0/lm/provider_support/__init__.py +0 -8
- synth_ai/v0/lm/provider_support/anthropic.py +0 -972
- synth_ai/v0/lm/provider_support/openai.py +0 -1139
- synth_ai/v0/lm/provider_support/suppress_logging.py +0 -31
- synth_ai/v0/lm/structured_outputs/__init__.py +0 -0
- synth_ai/v0/lm/structured_outputs/handler.py +0 -440
- synth_ai/v0/lm/structured_outputs/inject.py +0 -297
- synth_ai/v0/lm/structured_outputs/rehabilitate.py +0 -185
- synth_ai/v0/lm/tools/__init__.py +0 -3
- synth_ai/v0/lm/tools/base.py +0 -172
- synth_ai/v0/lm/unified_interface.py +0 -202
- synth_ai/v0/lm/vendors/__init__.py +0 -0
- synth_ai/v0/lm/vendors/base.py +0 -81
- synth_ai/v0/lm/vendors/core/__init__.py +0 -0
- synth_ai/v0/lm/vendors/core/anthropic_api.py +0 -387
- synth_ai/v0/lm/vendors/core/gemini_api.py +0 -292
- synth_ai/v0/lm/vendors/core/mistral_api.py +0 -322
- synth_ai/v0/lm/vendors/core/openai_api.py +0 -227
- synth_ai/v0/lm/vendors/core/synth_dev_api.py +0 -0
- synth_ai/v0/lm/vendors/local/__init__.py +0 -0
- synth_ai/v0/lm/vendors/local/ollama.py +0 -0
- synth_ai/v0/lm/vendors/openai_standard.py +0 -782
- synth_ai/v0/lm/vendors/openai_standard_responses.py +0 -259
- synth_ai/v0/lm/vendors/retries.py +0 -22
- synth_ai/v0/lm/vendors/supported/__init__.py +0 -0
- synth_ai/v0/lm/vendors/supported/custom_endpoint.py +0 -415
- synth_ai/v0/lm/vendors/supported/deepseek.py +0 -69
- synth_ai/v0/lm/vendors/supported/grok.py +0 -75
- synth_ai/v0/lm/vendors/supported/groq.py +0 -16
- synth_ai/v0/lm/vendors/supported/ollama.py +0 -15
- synth_ai/v0/lm/vendors/supported/openrouter.py +0 -74
- synth_ai/v0/lm/vendors/supported/together.py +0 -11
- synth_ai/v0/lm/vendors/synth_client.py +0 -835
- synth_ai/v0/lm/warmup.py +0 -186
- 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 -409
- 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/v0/tracing_v3/__init__.py +0 -10
- synth_ai/v0/tracing_v3/abstractions.py +0 -3
- synth_ai/v0/tracing_v3/decorators.py +0 -3
- synth_ai/v0/tracing_v3/llm_call_record_helpers.py +0 -3
- synth_ai/v0/tracing_v3/session_tracer.py +0 -3
- synth_ai-0.2.9.dev11.dist-info/METADATA +0 -191
- synth_ai-0.2.9.dev11.dist-info/RECORD +0 -571
- synth_ai-0.2.9.dev11.dist-info/entry_points.txt +0 -3
- synth_ai-0.2.9.dev11.dist-info/top_level.txt +0 -3
- /synth_ai/{demos/demo_task_apps → cli/demo_apps}/crafter/__init__.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/__init__.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/crafter_fft_4b.toml +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/crafter/configs/rl_from_base_qwen4b.toml +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/__init__.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/_common.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/app.py +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/config.toml +0 -0
- /synth_ai/{demos → cli/demo_apps}/demo_task_apps/math/deploy_modal.py +0 -0
- /synth_ai/{v0/lm/caching → core/apps}/__init__.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/abstractions.py +0 -0
- /synth_ai/{tracing_v3 → core/tracing_v3}/hooks.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}/algorithms.py +0 -0
- /synth_ai/{learning → sdk/learning}/config.py +0 -0
- /synth_ai/{learning → sdk/learning}/constants.py +0 -0
- /synth_ai/{learning → sdk/learning}/core.py +0 -0
- /synth_ai/{learning → sdk/learning}/gateway.py +0 -0
- /synth_ai/{learning → sdk/learning}/rl/__init__.py +0 -0
- /synth_ai/{learning → sdk/learning}/rl/config.py +0 -0
- /synth_ai/{learning → sdk/learning}/rl_client.py +0 -0
- /synth_ai/{learning → sdk/learning}/sft/__init__.py +0 -0
- /synth_ai/{learning → sdk/learning}/sse.py +0 -0
- /synth_ai/{task → sdk/task}/auth.py +0 -0
- /synth_ai/{task → sdk/task}/client.py +0 -0
- /synth_ai/{task → sdk/task}/errors.py +0 -0
- /synth_ai/{task → sdk/task}/health.py +0 -0
- /synth_ai/{task → sdk/task}/json.py +0 -0
- /synth_ai/{task → sdk/task}/rubrics.py +0 -0
- /synth_ai/{task → sdk/task}/vendors.py +0 -0
- {synth_ai-0.2.9.dev11.dist-info → synth_ai-0.4.1.dist-info}/WHEEL +0 -0
- {synth_ai-0.2.9.dev11.dist-info → synth_ai-0.4.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
"""Async-aware decorators for tracing v3.
|
|
2
|
+
|
|
3
|
+
This module provides decorators and context management utilities for the tracing
|
|
4
|
+
system. The key innovation is the use of asyncio's ContextVar for propagating
|
|
5
|
+
tracing context across async boundaries without explicit parameter passing.
|
|
6
|
+
|
|
7
|
+
Context Variables:
|
|
8
|
+
-----------------
|
|
9
|
+
We use ContextVar instead of threading.local because:
|
|
10
|
+
1. ContextVars work correctly with asyncio tasks and coroutines
|
|
11
|
+
2. They automatically propagate across async boundaries
|
|
12
|
+
3. They're isolated between concurrent tasks
|
|
13
|
+
4. They work with sync code too (unlike pure async solutions)
|
|
14
|
+
|
|
15
|
+
Key Decorators:
|
|
16
|
+
--------------
|
|
17
|
+
- @with_session: Ensures a session is active before function execution
|
|
18
|
+
- @trace_llm_call: Automatically traces LLM API calls with metrics
|
|
19
|
+
- @trace_method: Generic method tracing for any class method
|
|
20
|
+
|
|
21
|
+
The decorators support both sync and async functions where appropriate,
|
|
22
|
+
though async is preferred for consistency with the rest of the system.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import asyncio
|
|
28
|
+
import contextvars
|
|
29
|
+
import functools
|
|
30
|
+
import time
|
|
31
|
+
from collections.abc import Awaitable, Callable, Mapping
|
|
32
|
+
from contextvars import Token
|
|
33
|
+
from typing import Any, TypeVar, cast, overload
|
|
34
|
+
|
|
35
|
+
from .abstractions import LMCAISEvent, TimeRecord
|
|
36
|
+
from .utils import calculate_cost, detect_provider
|
|
37
|
+
|
|
38
|
+
# Context variables for session and turn tracking
|
|
39
|
+
# These variables automatically propagate across async call boundaries,
|
|
40
|
+
# allowing deeply nested code to access tracing context without explicit passing
|
|
41
|
+
_session_id_ctx: contextvars.ContextVar[str | None] = contextvars.ContextVar(
|
|
42
|
+
"session_id"
|
|
43
|
+
)
|
|
44
|
+
_turn_number_ctx: contextvars.ContextVar[int | None] = contextvars.ContextVar(
|
|
45
|
+
"turn_number"
|
|
46
|
+
)
|
|
47
|
+
_session_tracer_ctx: contextvars.ContextVar[Any | None] = contextvars.ContextVar(
|
|
48
|
+
"session_tracer"
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def set_session_id(session_id: str | None) -> None:
|
|
53
|
+
"""Set the current session ID in context.
|
|
54
|
+
|
|
55
|
+
This ID will be available to all async tasks spawned from the current context.
|
|
56
|
+
Setting to None clears the session context.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
session_id: The session ID to set, or None to clear
|
|
60
|
+
"""
|
|
61
|
+
_session_id_ctx.set(session_id)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def get_session_id() -> str | None:
|
|
65
|
+
"""Get the current session ID from context.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
The current session ID if one is set, None otherwise
|
|
69
|
+
"""
|
|
70
|
+
return _session_id_ctx.get()
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def set_turn_number(turn: int | None) -> None:
|
|
74
|
+
"""Set the current turn number in context."""
|
|
75
|
+
_turn_number_ctx.set(turn)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def get_turn_number() -> int | None:
|
|
79
|
+
"""Get the current turn number from context."""
|
|
80
|
+
return _turn_number_ctx.get()
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def set_session_tracer(tracer: Any) -> None:
|
|
84
|
+
"""Set the current session tracer in context."""
|
|
85
|
+
_session_tracer_ctx.set(tracer)
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def get_session_tracer() -> Any:
|
|
89
|
+
"""Get the current session tracer from context."""
|
|
90
|
+
return _session_tracer_ctx.get()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
T = TypeVar("T")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
@overload
|
|
97
|
+
def with_session(require: bool = True) -> Callable[[Callable[..., Awaitable[T]]], Callable[..., Awaitable[T]]]:
|
|
98
|
+
...
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
@overload
|
|
102
|
+
def with_session(require: bool = True) -> Callable[[Callable[..., T]], Callable[..., T]]:
|
|
103
|
+
...
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def with_session(require: bool = True):
|
|
107
|
+
"""Decorator that ensures a session is active.
|
|
108
|
+
|
|
109
|
+
This decorator checks if a session is active before allowing the decorated
|
|
110
|
+
function to execute. It supports both sync and async functions.
|
|
111
|
+
|
|
112
|
+
Args:
|
|
113
|
+
require: If True, raises RuntimeError when no session is active.
|
|
114
|
+
If False, allows execution without a session (useful for
|
|
115
|
+
optional tracing).
|
|
116
|
+
|
|
117
|
+
Example:
|
|
118
|
+
```python
|
|
119
|
+
@with_session()
|
|
120
|
+
async def process_message(content: str):
|
|
121
|
+
# This will only run if a session is active
|
|
122
|
+
tracer = get_session_tracer()
|
|
123
|
+
await tracer.record_message(content, "user")
|
|
124
|
+
```
|
|
125
|
+
"""
|
|
126
|
+
|
|
127
|
+
def decorator(fn: Callable[..., Awaitable[T]] | Callable[..., T]) -> Callable[..., Awaitable[T]] | Callable[..., T]:
|
|
128
|
+
if asyncio.iscoroutinefunction(fn):
|
|
129
|
+
|
|
130
|
+
@functools.wraps(fn)
|
|
131
|
+
async def async_wrapper(*args: Any, **kwargs: Any) -> T:
|
|
132
|
+
session_id = get_session_id()
|
|
133
|
+
if require and session_id is None:
|
|
134
|
+
raise RuntimeError(
|
|
135
|
+
f"No active session for {getattr(fn, '__name__', 'unknown')}"
|
|
136
|
+
)
|
|
137
|
+
async_fn = cast(Callable[..., Awaitable[T]], fn)
|
|
138
|
+
return await async_fn(*args, **kwargs)
|
|
139
|
+
|
|
140
|
+
return async_wrapper
|
|
141
|
+
else:
|
|
142
|
+
|
|
143
|
+
@functools.wraps(fn)
|
|
144
|
+
def sync_wrapper(*args: Any, **kwargs: Any) -> T:
|
|
145
|
+
session_id = get_session_id()
|
|
146
|
+
if require and session_id is None:
|
|
147
|
+
raise RuntimeError(
|
|
148
|
+
f"No active session for {getattr(fn, '__name__', 'unknown')}"
|
|
149
|
+
)
|
|
150
|
+
sync_fn = cast(Callable[..., T], fn)
|
|
151
|
+
return sync_fn(*args, **kwargs)
|
|
152
|
+
|
|
153
|
+
return sync_wrapper
|
|
154
|
+
|
|
155
|
+
return decorator
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
def trace_llm_call(
|
|
159
|
+
model_name: str | None = None,
|
|
160
|
+
system_id: str = "llm",
|
|
161
|
+
extract_tokens: bool = True,
|
|
162
|
+
extract_cost: bool = True,
|
|
163
|
+
):
|
|
164
|
+
"""Decorator to trace LLM API calls.
|
|
165
|
+
|
|
166
|
+
Automatically records LLM API calls as LMCAISEvent instances. Extracts token
|
|
167
|
+
counts, calculates costs, and measures latency. Only works with async functions.
|
|
168
|
+
|
|
169
|
+
Args:
|
|
170
|
+
model_name: Model name to record (can be overridden by actual response)
|
|
171
|
+
system_id: System identifier for the event (default: "llm")
|
|
172
|
+
extract_tokens: Whether to extract token counts from response
|
|
173
|
+
extract_cost: Whether to calculate USD cost from token counts
|
|
174
|
+
|
|
175
|
+
Expected Response Format:
|
|
176
|
+
The decorated function should return a dict with:
|
|
177
|
+
- 'usage': dict with 'prompt_tokens', 'completion_tokens', 'total_tokens'
|
|
178
|
+
- 'model': actual model name (optional, falls back to model_name param)
|
|
179
|
+
|
|
180
|
+
Example:
|
|
181
|
+
```python
|
|
182
|
+
@trace_llm_call(model_name="gpt-4")
|
|
183
|
+
async def call_openai(prompt: str) -> dict:
|
|
184
|
+
response = await openai_client.completions.create(
|
|
185
|
+
model="gpt-4",
|
|
186
|
+
messages=[{"role": "user", "content": prompt}]
|
|
187
|
+
)
|
|
188
|
+
return response.model_dump()
|
|
189
|
+
```
|
|
190
|
+
"""
|
|
191
|
+
|
|
192
|
+
def decorator(fn: Callable[..., Awaitable[T]]) -> Callable[..., Awaitable[T]]:
|
|
193
|
+
if asyncio.iscoroutinefunction(fn):
|
|
194
|
+
async_fn: Callable[..., Awaitable[T]] = fn
|
|
195
|
+
|
|
196
|
+
@functools.wraps(fn)
|
|
197
|
+
async def async_wrapper(*args: Any, **kwargs: Any) -> T:
|
|
198
|
+
tracer = get_session_tracer()
|
|
199
|
+
if not tracer:
|
|
200
|
+
return await async_fn(*args, **kwargs)
|
|
201
|
+
|
|
202
|
+
start_time = time.time()
|
|
203
|
+
system_state_before = kwargs.get("state_before", {})
|
|
204
|
+
|
|
205
|
+
try:
|
|
206
|
+
result = await async_fn(*args, **kwargs)
|
|
207
|
+
|
|
208
|
+
# Extract metrics from result - this assumes the result follows
|
|
209
|
+
# common LLM API response formats (OpenAI, Anthropic, etc.)
|
|
210
|
+
input_tokens = output_tokens = total_tokens = None
|
|
211
|
+
actual_model = model_name
|
|
212
|
+
if extract_tokens and isinstance(result, Mapping):
|
|
213
|
+
result_mapping = cast(Mapping[str, Any], result)
|
|
214
|
+
usage = result_mapping.get("usage")
|
|
215
|
+
if isinstance(usage, Mapping):
|
|
216
|
+
input_tokens = usage.get("prompt_tokens")
|
|
217
|
+
output_tokens = usage.get("completion_tokens")
|
|
218
|
+
total_tokens = usage.get("total_tokens")
|
|
219
|
+
value = result_mapping.get("model")
|
|
220
|
+
if isinstance(value, str):
|
|
221
|
+
actual_model = value
|
|
222
|
+
|
|
223
|
+
latency_ms = int((time.time() - start_time) * 1000)
|
|
224
|
+
|
|
225
|
+
# Create event with all extracted metrics
|
|
226
|
+
event = LMCAISEvent(
|
|
227
|
+
system_instance_id=system_id,
|
|
228
|
+
time_record=TimeRecord(event_time=time.time()),
|
|
229
|
+
model_name=actual_model or "unknown",
|
|
230
|
+
provider=detect_provider(actual_model),
|
|
231
|
+
input_tokens=input_tokens,
|
|
232
|
+
output_tokens=output_tokens,
|
|
233
|
+
total_tokens=total_tokens,
|
|
234
|
+
cost_usd=calculate_cost(
|
|
235
|
+
actual_model or "unknown", input_tokens or 0, output_tokens or 0
|
|
236
|
+
)
|
|
237
|
+
if extract_cost
|
|
238
|
+
else None,
|
|
239
|
+
latency_ms=latency_ms,
|
|
240
|
+
system_state_before=system_state_before,
|
|
241
|
+
system_state_after=kwargs.get("state_after", {}),
|
|
242
|
+
metadata={
|
|
243
|
+
"function": getattr(fn, "__name__", "unknown"),
|
|
244
|
+
"step_id": kwargs.get("step_id"),
|
|
245
|
+
},
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
await tracer.record_event(event)
|
|
249
|
+
return result
|
|
250
|
+
|
|
251
|
+
except Exception as e:
|
|
252
|
+
# Record error event - we still want to track failed LLM calls
|
|
253
|
+
# for debugging and cost analysis
|
|
254
|
+
if tracer:
|
|
255
|
+
event = LMCAISEvent(
|
|
256
|
+
system_instance_id=system_id,
|
|
257
|
+
time_record=TimeRecord(event_time=time.time()),
|
|
258
|
+
model_name=model_name or "unknown",
|
|
259
|
+
provider=detect_provider(model_name),
|
|
260
|
+
latency_ms=int((time.time() - start_time) * 1000),
|
|
261
|
+
metadata={
|
|
262
|
+
"function": getattr(fn, "__name__", "unknown"),
|
|
263
|
+
"error": str(e),
|
|
264
|
+
"error_type": type(e).__name__,
|
|
265
|
+
},
|
|
266
|
+
)
|
|
267
|
+
await tracer.record_event(event)
|
|
268
|
+
raise
|
|
269
|
+
|
|
270
|
+
return async_wrapper
|
|
271
|
+
else:
|
|
272
|
+
raise ValueError("trace_llm_call only supports async functions")
|
|
273
|
+
|
|
274
|
+
return decorator
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
def trace_method(event_type: str = "runtime", system_id: str | None = None):
|
|
278
|
+
"""Generic method tracing decorator.
|
|
279
|
+
|
|
280
|
+
Traces any method call by recording it as a RuntimeEvent. Supports both
|
|
281
|
+
sync and async methods, though async is preferred.
|
|
282
|
+
|
|
283
|
+
Args:
|
|
284
|
+
event_type: Type of event to create (default: "runtime")
|
|
285
|
+
system_id: System identifier (defaults to class name)
|
|
286
|
+
|
|
287
|
+
Example:
|
|
288
|
+
```python
|
|
289
|
+
class Agent:
|
|
290
|
+
@trace_method(system_id="my_agent")
|
|
291
|
+
async def take_action(self, observation):
|
|
292
|
+
# Method execution is automatically traced
|
|
293
|
+
return self.policy(observation)
|
|
294
|
+
```
|
|
295
|
+
"""
|
|
296
|
+
|
|
297
|
+
def decorator(
|
|
298
|
+
fn: Callable[..., Awaitable[T]] | Callable[..., T]
|
|
299
|
+
) -> Callable[..., Awaitable[T]] | Callable[..., T]:
|
|
300
|
+
if asyncio.iscoroutinefunction(fn):
|
|
301
|
+
async_fn = cast(Callable[..., Awaitable[T]], fn)
|
|
302
|
+
|
|
303
|
+
@functools.wraps(fn)
|
|
304
|
+
async def async_wrapper(*args: Any, **kwargs: Any) -> T:
|
|
305
|
+
tracer = get_session_tracer()
|
|
306
|
+
if not tracer:
|
|
307
|
+
return await async_fn(*args, **kwargs)
|
|
308
|
+
|
|
309
|
+
from .abstractions import RuntimeEvent
|
|
310
|
+
|
|
311
|
+
# Use class name as system_id if not provided
|
|
312
|
+
self_obj = args[0] if args else None
|
|
313
|
+
inferred_system_id = (
|
|
314
|
+
self_obj.__class__.__name__ if self_obj is not None else "unknown"
|
|
315
|
+
)
|
|
316
|
+
actual_system_id = system_id or inferred_system_id
|
|
317
|
+
|
|
318
|
+
event = RuntimeEvent(
|
|
319
|
+
system_instance_id=actual_system_id,
|
|
320
|
+
time_record=TimeRecord(event_time=time.time()),
|
|
321
|
+
actions=[], # Can be overridden in metadata
|
|
322
|
+
metadata={
|
|
323
|
+
"method": getattr(fn, "__name__", "unknown"),
|
|
324
|
+
"args": str(args)[:100], # Truncate for safety
|
|
325
|
+
"step_id": kwargs.get("step_id"),
|
|
326
|
+
},
|
|
327
|
+
)
|
|
328
|
+
|
|
329
|
+
await tracer.record_event(event)
|
|
330
|
+
return await async_fn(*args, **kwargs)
|
|
331
|
+
|
|
332
|
+
return async_wrapper
|
|
333
|
+
else:
|
|
334
|
+
|
|
335
|
+
@functools.wraps(fn)
|
|
336
|
+
def sync_wrapper(*args: Any, **kwargs: Any) -> T:
|
|
337
|
+
# For sync methods, we can't easily trace without blocking
|
|
338
|
+
# the event loop. This is a limitation of the async-first design.
|
|
339
|
+
# Consider converting to async or using a different approach
|
|
340
|
+
sync_fn = cast(Callable[..., T], fn)
|
|
341
|
+
return sync_fn(*args, **kwargs)
|
|
342
|
+
|
|
343
|
+
return sync_wrapper
|
|
344
|
+
|
|
345
|
+
return decorator
|
|
346
|
+
|
|
347
|
+
|
|
348
|
+
class SessionContext:
|
|
349
|
+
"""Context manager for session tracking.
|
|
350
|
+
|
|
351
|
+
Provides a way to temporarily set session context, useful for testing
|
|
352
|
+
or when you need to manually manage context outside of SessionTracer.
|
|
353
|
+
|
|
354
|
+
This context manager properly handles both sync and async contexts,
|
|
355
|
+
and ensures the previous context is restored on exit.
|
|
356
|
+
|
|
357
|
+
Example:
|
|
358
|
+
```python
|
|
359
|
+
# Sync usage
|
|
360
|
+
with SessionContext("test_session_123", tracer):
|
|
361
|
+
# Code here sees the test session
|
|
362
|
+
process_data()
|
|
363
|
+
|
|
364
|
+
# Async usage
|
|
365
|
+
async with SessionContext("test_session_123", tracer):
|
|
366
|
+
# Async code here sees the test session
|
|
367
|
+
await process_data_async()
|
|
368
|
+
```
|
|
369
|
+
"""
|
|
370
|
+
|
|
371
|
+
def __init__(self, session_id: str, tracer: Any | None = None):
|
|
372
|
+
self.session_id = session_id
|
|
373
|
+
self.tracer = tracer
|
|
374
|
+
self._token: Token[str | None] | None = None
|
|
375
|
+
self._tracer_token: Token[Any] | None = None
|
|
376
|
+
|
|
377
|
+
def __enter__(self):
|
|
378
|
+
# Store tokens to restore previous context on exit
|
|
379
|
+
self._token = _session_id_ctx.set(self.session_id)
|
|
380
|
+
if self.tracer:
|
|
381
|
+
self._tracer_token = _session_tracer_ctx.set(self.tracer)
|
|
382
|
+
return self
|
|
383
|
+
|
|
384
|
+
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
385
|
+
# Restore previous context - this is crucial for proper isolation
|
|
386
|
+
if self._token is not None:
|
|
387
|
+
_session_id_ctx.reset(self._token)
|
|
388
|
+
if self._tracer_token is not None:
|
|
389
|
+
_session_tracer_ctx.reset(self._tracer_token)
|
|
390
|
+
|
|
391
|
+
async def __aenter__(self):
|
|
392
|
+
self._token = _session_id_ctx.set(self.session_id)
|
|
393
|
+
if self.tracer:
|
|
394
|
+
self._tracer_token = _session_tracer_ctx.set(self.tracer)
|
|
395
|
+
return self
|
|
396
|
+
|
|
397
|
+
async def __aexit__(self, exc_type, exc_val, exc_tb):
|
|
398
|
+
if self._token is not None:
|
|
399
|
+
_session_id_ctx.reset(self._token)
|
|
400
|
+
if self._tracer_token is not None:
|
|
401
|
+
_session_tracer_ctx.reset(self._tracer_token)
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
"""Basic usage example for tracing v3."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import time
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from .. import SessionTracer
|
|
8
|
+
from ..abstractions import EnvironmentEvent, LMCAISEvent, RuntimeEvent, TimeRecord
|
|
9
|
+
from ..turso.daemon import SqldDaemon
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
async def simulate_llm_call(model: str, prompt: str) -> dict[str, Any]:
|
|
13
|
+
"""Simulate an LLM API call."""
|
|
14
|
+
await asyncio.sleep(0.1) # Simulate network latency
|
|
15
|
+
|
|
16
|
+
# Simulate response
|
|
17
|
+
tokens = len(prompt.split()) * 3
|
|
18
|
+
return {
|
|
19
|
+
"model": model,
|
|
20
|
+
"response": f"Response to: {prompt[:50]}...",
|
|
21
|
+
"usage": {
|
|
22
|
+
"prompt_tokens": len(prompt.split()) * 2,
|
|
23
|
+
"completion_tokens": tokens,
|
|
24
|
+
"total_tokens": len(prompt.split()) * 2 + tokens,
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
async def main():
|
|
30
|
+
"""Demonstrate basic tracing v3 usage."""
|
|
31
|
+
print("Starting tracing v3 example...")
|
|
32
|
+
|
|
33
|
+
# Option 1: Start sqld daemon programmatically
|
|
34
|
+
with SqldDaemon():
|
|
35
|
+
print("✓ Started sqld daemon")
|
|
36
|
+
|
|
37
|
+
# Wait for daemon to be ready
|
|
38
|
+
await asyncio.sleep(1)
|
|
39
|
+
|
|
40
|
+
# Create tracer
|
|
41
|
+
tracer = SessionTracer()
|
|
42
|
+
await tracer.initialize()
|
|
43
|
+
print("✓ Initialized tracer")
|
|
44
|
+
|
|
45
|
+
# Example 1: Basic session with events
|
|
46
|
+
print("\n--- Example 1: Basic Session ---")
|
|
47
|
+
async with tracer.session(metadata={"example": "basic"}) as session_id:
|
|
48
|
+
print(f"Started session: {session_id}")
|
|
49
|
+
|
|
50
|
+
# Timestep 1: LLM interaction
|
|
51
|
+
async with tracer.timestep("llm_step", turn_number=1):
|
|
52
|
+
# Simulate LLM call
|
|
53
|
+
result = await simulate_llm_call("gpt-4", "What is the capital of France?")
|
|
54
|
+
|
|
55
|
+
# Record LLM event
|
|
56
|
+
event = LMCAISEvent(
|
|
57
|
+
system_instance_id="llm_system",
|
|
58
|
+
time_record=TimeRecord(event_time=time.time()),
|
|
59
|
+
model_name=result["model"],
|
|
60
|
+
input_tokens=result["usage"]["prompt_tokens"],
|
|
61
|
+
output_tokens=result["usage"]["completion_tokens"],
|
|
62
|
+
total_tokens=result["usage"]["total_tokens"],
|
|
63
|
+
cost_usd=0.003, # $0.003
|
|
64
|
+
latency_ms=100,
|
|
65
|
+
metadata={"prompt": "What is the capital of France?"},
|
|
66
|
+
)
|
|
67
|
+
await tracer.record_event(event)
|
|
68
|
+
|
|
69
|
+
# Record messages
|
|
70
|
+
await tracer.record_message(
|
|
71
|
+
content="What is the capital of France?", message_type="user"
|
|
72
|
+
)
|
|
73
|
+
await tracer.record_message(content=result["response"], message_type="assistant")
|
|
74
|
+
print("✓ Recorded LLM interaction")
|
|
75
|
+
|
|
76
|
+
# Timestep 2: Environment interaction
|
|
77
|
+
async with tracer.timestep("env_step", turn_number=2):
|
|
78
|
+
# Record environment event
|
|
79
|
+
env_event = EnvironmentEvent(
|
|
80
|
+
system_instance_id="environment",
|
|
81
|
+
time_record=TimeRecord(event_time=time.time()),
|
|
82
|
+
reward=0.8,
|
|
83
|
+
terminated=False,
|
|
84
|
+
system_state_before={"position": [0, 0]},
|
|
85
|
+
system_state_after={"position": [1, 0]},
|
|
86
|
+
)
|
|
87
|
+
await tracer.record_event(env_event)
|
|
88
|
+
print("✓ Recorded environment event")
|
|
89
|
+
|
|
90
|
+
# Timestep 3: Runtime action
|
|
91
|
+
async with tracer.timestep("runtime_step", turn_number=3):
|
|
92
|
+
# Record runtime event
|
|
93
|
+
runtime_event = RuntimeEvent(
|
|
94
|
+
system_instance_id="agent",
|
|
95
|
+
time_record=TimeRecord(event_time=time.time()),
|
|
96
|
+
actions=[1, 0, 0, 1], # Example action vector
|
|
97
|
+
metadata={"action_type": "move_right"},
|
|
98
|
+
)
|
|
99
|
+
await tracer.record_event(runtime_event)
|
|
100
|
+
print("✓ Recorded runtime event")
|
|
101
|
+
|
|
102
|
+
print(f"✓ Session {session_id} saved\n")
|
|
103
|
+
|
|
104
|
+
# Example 2: Concurrent sessions
|
|
105
|
+
print("--- Example 2: Concurrent Sessions ---")
|
|
106
|
+
|
|
107
|
+
async def run_concurrent_session(session_num: int):
|
|
108
|
+
"""Run a session concurrently."""
|
|
109
|
+
async with tracer.session(
|
|
110
|
+
metadata={"example": "concurrent", "session_num": session_num}
|
|
111
|
+
) as sid:
|
|
112
|
+
for i in range(3):
|
|
113
|
+
async with tracer.timestep(f"step_{i}", turn_number=i):
|
|
114
|
+
# Simulate some work
|
|
115
|
+
await asyncio.sleep(0.05)
|
|
116
|
+
|
|
117
|
+
# Record event
|
|
118
|
+
event = RuntimeEvent(
|
|
119
|
+
system_instance_id=f"worker_{session_num}",
|
|
120
|
+
time_record=TimeRecord(event_time=time.time()),
|
|
121
|
+
actions=[i],
|
|
122
|
+
metadata={"iteration": i},
|
|
123
|
+
)
|
|
124
|
+
await tracer.record_event(event)
|
|
125
|
+
|
|
126
|
+
return sid
|
|
127
|
+
|
|
128
|
+
# Run 5 concurrent sessions
|
|
129
|
+
tasks = [run_concurrent_session(i) for i in range(5)]
|
|
130
|
+
session_ids = await asyncio.gather(*tasks)
|
|
131
|
+
print(f"✓ Completed {len(session_ids)} concurrent sessions")
|
|
132
|
+
|
|
133
|
+
# Example 3: Query stored data
|
|
134
|
+
print("\n--- Example 3: Querying Data ---")
|
|
135
|
+
|
|
136
|
+
# Get model usage statistics
|
|
137
|
+
if tracer.db is None:
|
|
138
|
+
raise RuntimeError("Tracer database backend is not initialized")
|
|
139
|
+
|
|
140
|
+
model_usage = await tracer.db.get_model_usage()
|
|
141
|
+
print("\nModel Usage:")
|
|
142
|
+
print(model_usage)
|
|
143
|
+
|
|
144
|
+
# Query recent sessions
|
|
145
|
+
recent_sessions = await tracer.get_session_history(limit=5)
|
|
146
|
+
print(f"\nRecent Sessions: {len(recent_sessions)} found")
|
|
147
|
+
for session in recent_sessions:
|
|
148
|
+
print(
|
|
149
|
+
f" - {session['session_id']}: "
|
|
150
|
+
f"{session['num_events']} events, "
|
|
151
|
+
f"{session['num_messages']} messages"
|
|
152
|
+
)
|
|
153
|
+
|
|
154
|
+
# Get specific session details
|
|
155
|
+
if recent_sessions:
|
|
156
|
+
session_detail = await tracer.db.get_session_trace(recent_sessions[0]["session_id"])
|
|
157
|
+
if session_detail:
|
|
158
|
+
print(f"\nSession Detail for {session_detail['session_id']}:")
|
|
159
|
+
print(f" Created: {session_detail['created_at']}")
|
|
160
|
+
print(f" Timesteps: {len(session_detail['timesteps'])}")
|
|
161
|
+
|
|
162
|
+
# Example 4: Using hooks
|
|
163
|
+
print("\n--- Example 4: Hooks ---")
|
|
164
|
+
|
|
165
|
+
# Add a custom hook
|
|
166
|
+
call_count = {"count": 0}
|
|
167
|
+
|
|
168
|
+
async def count_events(event, **kwargs):
|
|
169
|
+
call_count["count"] += 1
|
|
170
|
+
print(f" Hook: Event #{call_count['count']} recorded")
|
|
171
|
+
|
|
172
|
+
tracer.hooks.register("event_recorded", count_events, name="event_counter")
|
|
173
|
+
|
|
174
|
+
async with (
|
|
175
|
+
tracer.session(metadata={"example": "hooks"}) as session_id,
|
|
176
|
+
tracer.timestep("hook_test"),
|
|
177
|
+
):
|
|
178
|
+
for i in range(3):
|
|
179
|
+
event = RuntimeEvent(
|
|
180
|
+
system_instance_id="hook_test",
|
|
181
|
+
time_record=TimeRecord(event_time=time.time()),
|
|
182
|
+
actions=[i],
|
|
183
|
+
)
|
|
184
|
+
await tracer.record_event(event)
|
|
185
|
+
|
|
186
|
+
print(f"✓ Hook called {call_count['count']} times")
|
|
187
|
+
|
|
188
|
+
# Cleanup
|
|
189
|
+
await tracer.close()
|
|
190
|
+
print("\n✓ Example completed successfully!")
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
if __name__ == "__main__":
|
|
194
|
+
asyncio.run(main())
|