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,247 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Story & Achievement Progression Reward Components
|
|
3
|
-
|
|
4
|
-
Rewards for major milestones, story gates, and achievements.
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
from typing import Any, Dict, Set
|
|
8
|
-
|
|
9
|
-
from synth_ai.environments.environment.rewards.core import RewardComponent
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class GymBadgeEarnedReward(RewardComponent):
|
|
13
|
-
"""Reward for earning gym badges - +150 points per badge (cumulative)"""
|
|
14
|
-
|
|
15
|
-
def __init__(self):
|
|
16
|
-
self.previous_badge_count = 0
|
|
17
|
-
|
|
18
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
19
|
-
current_badges = state.get("badges", 0)
|
|
20
|
-
|
|
21
|
-
# Convert badge bitmask to count
|
|
22
|
-
badge_count = bin(current_badges).count("1")
|
|
23
|
-
|
|
24
|
-
if badge_count > self.previous_badge_count:
|
|
25
|
-
new_badges = badge_count - self.previous_badge_count
|
|
26
|
-
self.previous_badge_count = badge_count
|
|
27
|
-
return new_badges * 150.0
|
|
28
|
-
|
|
29
|
-
return 0.0
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
class HMAcquisitionReward(RewardComponent):
|
|
33
|
-
"""Reward for getting HMs - +75 points"""
|
|
34
|
-
|
|
35
|
-
def __init__(self):
|
|
36
|
-
self.hms_acquired: Set[int] = set()
|
|
37
|
-
# HM item IDs (would be loaded from game data)
|
|
38
|
-
self.hm_items = {200, 201, 202, 203, 204} # Example HM IDs
|
|
39
|
-
|
|
40
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
41
|
-
inventory = state.get("inventory", [])
|
|
42
|
-
total_reward = 0.0
|
|
43
|
-
|
|
44
|
-
for item in inventory:
|
|
45
|
-
item_id = item.get("item_id", 0)
|
|
46
|
-
if item_id in self.hm_items and item_id not in self.hms_acquired:
|
|
47
|
-
self.hms_acquired.add(item_id)
|
|
48
|
-
total_reward += 75.0
|
|
49
|
-
|
|
50
|
-
return total_reward
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
class EliteFourAccessReward(RewardComponent):
|
|
54
|
-
"""Reward for reaching Pokemon League - +300 points"""
|
|
55
|
-
|
|
56
|
-
def __init__(self):
|
|
57
|
-
self.elite_four_accessed = False
|
|
58
|
-
self.elite_four_map = 100 # Pokemon League entrance
|
|
59
|
-
|
|
60
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
61
|
-
if self.elite_four_accessed:
|
|
62
|
-
return 0.0
|
|
63
|
-
|
|
64
|
-
if state["map_id"] == self.elite_four_map:
|
|
65
|
-
self.elite_four_accessed = True
|
|
66
|
-
return 300.0
|
|
67
|
-
|
|
68
|
-
return 0.0
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
class HallOfFameEntryReward(RewardComponent):
|
|
72
|
-
"""Reward for becoming Champion - +1000 points"""
|
|
73
|
-
|
|
74
|
-
def __init__(self):
|
|
75
|
-
self.hall_of_fame_entered = False
|
|
76
|
-
self.hall_of_fame_map = 105 # Hall of Fame room
|
|
77
|
-
|
|
78
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
79
|
-
if self.hall_of_fame_entered:
|
|
80
|
-
return 0.0
|
|
81
|
-
|
|
82
|
-
if state["map_id"] == self.hall_of_fame_map:
|
|
83
|
-
self.hall_of_fame_entered = True
|
|
84
|
-
return 1000.0
|
|
85
|
-
|
|
86
|
-
return 0.0
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
class RivalBattleCompletionReward(RewardComponent):
|
|
90
|
-
"""Reward for each scripted rival encounter - +50 points"""
|
|
91
|
-
|
|
92
|
-
def __init__(self):
|
|
93
|
-
self.rival_battles_completed: Set[int] = set()
|
|
94
|
-
# Rival battle locations
|
|
95
|
-
self.rival_battle_maps = {3, 22, 25, 30} # Oak's lab, Route 22, etc.
|
|
96
|
-
|
|
97
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
98
|
-
prev_in_battle = action.get("prev_in_battle", False)
|
|
99
|
-
current_in_battle = state["in_battle"]
|
|
100
|
-
battle_outcome = state.get("battle_outcome", 0)
|
|
101
|
-
current_map = state["map_id"]
|
|
102
|
-
|
|
103
|
-
# Completed rival battle
|
|
104
|
-
if (
|
|
105
|
-
prev_in_battle
|
|
106
|
-
and not current_in_battle
|
|
107
|
-
and battle_outcome == 1
|
|
108
|
-
and current_map in self.rival_battle_maps
|
|
109
|
-
and current_map not in self.rival_battles_completed
|
|
110
|
-
):
|
|
111
|
-
self.rival_battles_completed.add(current_map)
|
|
112
|
-
return 50.0
|
|
113
|
-
|
|
114
|
-
return 0.0
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
class TeamRocketDefeatReward(RewardComponent):
|
|
118
|
-
"""Reward for each Team Rocket encounter - +40 points"""
|
|
119
|
-
|
|
120
|
-
def __init__(self):
|
|
121
|
-
self.rocket_encounters: Set[tuple] = set()
|
|
122
|
-
|
|
123
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
124
|
-
# This would need Team Rocket battle detection
|
|
125
|
-
# Placeholder implementation
|
|
126
|
-
prev_in_battle = action.get("prev_in_battle", False)
|
|
127
|
-
current_in_battle = state["in_battle"]
|
|
128
|
-
battle_outcome = state.get("battle_outcome", 0)
|
|
129
|
-
|
|
130
|
-
if prev_in_battle and not current_in_battle and battle_outcome == 1:
|
|
131
|
-
# Check if in Team Rocket location
|
|
132
|
-
rocket_maps = {50, 51, 52} # Example Team Rocket hideout maps
|
|
133
|
-
if state["map_id"] in rocket_maps:
|
|
134
|
-
encounter_key = (state["player_x"], state["player_y"], state["map_id"])
|
|
135
|
-
if encounter_key not in self.rocket_encounters:
|
|
136
|
-
self.rocket_encounters.add(encounter_key)
|
|
137
|
-
return 40.0
|
|
138
|
-
|
|
139
|
-
return 0.0
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
class LegendaryEncounterReward(RewardComponent):
|
|
143
|
-
"""Reward for encountering legendary Pokemon - +200 points"""
|
|
144
|
-
|
|
145
|
-
def __init__(self):
|
|
146
|
-
self.legendary_encounters: Set[int] = set()
|
|
147
|
-
self.legendary_maps = {60, 61, 62, 70} # Legendary Pokemon locations
|
|
148
|
-
|
|
149
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
150
|
-
current_map = state["map_id"]
|
|
151
|
-
|
|
152
|
-
if current_map in self.legendary_maps and current_map not in self.legendary_encounters:
|
|
153
|
-
# Check if battle started (legendary encounter)
|
|
154
|
-
prev_in_battle = action.get("prev_in_battle", False)
|
|
155
|
-
current_in_battle = state["in_battle"]
|
|
156
|
-
|
|
157
|
-
if not prev_in_battle and current_in_battle:
|
|
158
|
-
self.legendary_encounters.add(current_map)
|
|
159
|
-
return 200.0
|
|
160
|
-
|
|
161
|
-
return 0.0
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
class SilphCoCompletionReward(RewardComponent):
|
|
165
|
-
"""Reward for completing major story dungeons - +100 points"""
|
|
166
|
-
|
|
167
|
-
def __init__(self):
|
|
168
|
-
self.silph_co_completed = False
|
|
169
|
-
self.silph_co_maps = set(range(80, 90)) # Silph Co floors
|
|
170
|
-
|
|
171
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
172
|
-
if self.silph_co_completed:
|
|
173
|
-
return 0.0
|
|
174
|
-
|
|
175
|
-
# Check if exiting Silph Co after completion
|
|
176
|
-
prev_map = action.get("prev_map_id", -1)
|
|
177
|
-
current_map = state["map_id"]
|
|
178
|
-
|
|
179
|
-
if prev_map in self.silph_co_maps and current_map not in self.silph_co_maps:
|
|
180
|
-
# Assume completion if leaving Silph Co
|
|
181
|
-
self.silph_co_completed = True
|
|
182
|
-
return 100.0
|
|
183
|
-
|
|
184
|
-
return 0.0
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
class SafariZoneSuccessReward(RewardComponent):
|
|
188
|
-
"""Reward for successful Safari Zone runs - +30 points"""
|
|
189
|
-
|
|
190
|
-
def __init__(self):
|
|
191
|
-
self.safari_zone_runs = 0
|
|
192
|
-
self.safari_zone_maps = {90, 91, 92, 93} # Safari Zone areas
|
|
193
|
-
|
|
194
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
195
|
-
# Check if exiting Safari Zone with new Pokemon
|
|
196
|
-
prev_map = action.get("prev_map_id", -1)
|
|
197
|
-
current_map = state["map_id"]
|
|
198
|
-
|
|
199
|
-
if prev_map in self.safari_zone_maps and current_map not in self.safari_zone_maps:
|
|
200
|
-
# Check if Pokemon count increased
|
|
201
|
-
prev_party_count = len(action.get("prev_party", []))
|
|
202
|
-
current_party_count = len(state.get("party", []))
|
|
203
|
-
|
|
204
|
-
if current_party_count > prev_party_count:
|
|
205
|
-
return 30.0
|
|
206
|
-
|
|
207
|
-
return 0.0
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
class GameCornerPrizesReward(RewardComponent):
|
|
211
|
-
"""Reward for earning significant Game Corner prizes - +20 points"""
|
|
212
|
-
|
|
213
|
-
def __init__(self):
|
|
214
|
-
self.game_corner_prizes: Set[int] = set()
|
|
215
|
-
self.prize_items = {300, 301, 302} # Game Corner prize item IDs
|
|
216
|
-
|
|
217
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
218
|
-
inventory = state.get("inventory", [])
|
|
219
|
-
total_reward = 0.0
|
|
220
|
-
|
|
221
|
-
for item in inventory:
|
|
222
|
-
item_id = item.get("item_id", 0)
|
|
223
|
-
if item_id in self.prize_items and item_id not in self.game_corner_prizes:
|
|
224
|
-
self.game_corner_prizes.add(item_id)
|
|
225
|
-
total_reward += 20.0
|
|
226
|
-
|
|
227
|
-
return total_reward
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
class FossilRevivalReward(RewardComponent):
|
|
231
|
-
"""Reward for reviving fossils - +40 points"""
|
|
232
|
-
|
|
233
|
-
def __init__(self):
|
|
234
|
-
self.fossils_revived: Set[int] = set()
|
|
235
|
-
self.fossil_pokemon = {138, 140, 142} # Omanyte, Kabuto, Aerodactyl
|
|
236
|
-
|
|
237
|
-
async def score(self, state: Dict[str, Any], action: Dict[str, Any]) -> float:
|
|
238
|
-
party = state.get("party", [])
|
|
239
|
-
total_reward = 0.0
|
|
240
|
-
|
|
241
|
-
for pokemon in party:
|
|
242
|
-
species_id = pokemon.get("species_id", 0)
|
|
243
|
-
if species_id in self.fossil_pokemon and species_id not in self.fossils_revived:
|
|
244
|
-
self.fossils_revived.add(species_id)
|
|
245
|
-
total_reward += 40.0
|
|
246
|
-
|
|
247
|
-
return total_reward
|
|
@@ -1,368 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
Screen analysis functions for Pokemon Red to provide rich textual descriptions
|
|
3
|
-
of what's actually visible on the game screen.
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
import hashlib
|
|
7
|
-
from typing import Any, Dict, List, Tuple
|
|
8
|
-
|
|
9
|
-
import numpy as np
|
|
10
|
-
|
|
11
|
-
# Define some common Pokemon Red screen colors (RGB values)
|
|
12
|
-
POKEMON_RED_COLORS = {
|
|
13
|
-
(255, 255, 255): "WHITE", # White/light backgrounds
|
|
14
|
-
(192, 192, 192): "LIGHT_GRAY", # Light gray
|
|
15
|
-
(128, 128, 128): "GRAY", # Gray
|
|
16
|
-
(64, 64, 64): "DARK_GRAY", # Dark gray
|
|
17
|
-
(0, 0, 0): "BLACK", # Black/dark
|
|
18
|
-
(248, 248, 248): "OFF_WHITE", # Slightly off white
|
|
19
|
-
(200, 200, 200): "SILVER", # Silver-ish
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
def analyze_screen_buffer(screen_buffer: np.ndarray) -> Dict[str, Any]:
|
|
24
|
-
"""
|
|
25
|
-
Analyze the Pokemon Red screen buffer to extract meaningful information
|
|
26
|
-
about what's currently visible on screen.
|
|
27
|
-
|
|
28
|
-
Args:
|
|
29
|
-
screen_buffer: numpy array of shape (144, 160, 3) or (144, 160, 4) representing the screen
|
|
30
|
-
|
|
31
|
-
Returns:
|
|
32
|
-
Dictionary containing analysis of the screen content
|
|
33
|
-
"""
|
|
34
|
-
if screen_buffer is None:
|
|
35
|
-
return {"error": "No screen buffer provided"}
|
|
36
|
-
|
|
37
|
-
# Convert RGBA to RGB if needed
|
|
38
|
-
if screen_buffer.shape[2] == 4:
|
|
39
|
-
rgb_buffer = screen_buffer[:, :, :3]
|
|
40
|
-
else:
|
|
41
|
-
rgb_buffer = screen_buffer
|
|
42
|
-
|
|
43
|
-
analysis = {
|
|
44
|
-
"screen_hash": hashlib.md5(screen_buffer.tobytes()).hexdigest()[:8],
|
|
45
|
-
"screen_type": detect_screen_type(rgb_buffer),
|
|
46
|
-
"text_content": extract_text_content(rgb_buffer),
|
|
47
|
-
"entities": detect_entities(rgb_buffer),
|
|
48
|
-
"ui_elements": detect_ui_elements(rgb_buffer),
|
|
49
|
-
"color_analysis": analyze_colors(rgb_buffer),
|
|
50
|
-
"ascii_representation": create_ascii_representation(rgb_buffer),
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return analysis
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
def detect_screen_type(rgb_buffer: np.ndarray) -> str:
|
|
57
|
-
"""
|
|
58
|
-
Determine what type of screen is being displayed based on visual patterns.
|
|
59
|
-
"""
|
|
60
|
-
height, width = rgb_buffer.shape[:2]
|
|
61
|
-
|
|
62
|
-
# Check for common screen types based on color patterns and layout
|
|
63
|
-
|
|
64
|
-
# Check if mostly one color (like a menu background)
|
|
65
|
-
unique_colors = len(np.unique(rgb_buffer.reshape(-1, 3), axis=0))
|
|
66
|
-
|
|
67
|
-
if unique_colors < 8:
|
|
68
|
-
# Very few colors - could be simple UI but be more conservative about "MENU"
|
|
69
|
-
if is_text_box_screen(rgb_buffer):
|
|
70
|
-
return "TEXT_BOX"
|
|
71
|
-
else:
|
|
72
|
-
return "SIMPLE_UI" # Don't assume MENU, use neutral term
|
|
73
|
-
|
|
74
|
-
elif unique_colors > 50:
|
|
75
|
-
# Many colors - likely overworld or complex scene
|
|
76
|
-
return "OVERWORLD"
|
|
77
|
-
|
|
78
|
-
else:
|
|
79
|
-
# Medium complexity
|
|
80
|
-
if is_battle_screen(rgb_buffer):
|
|
81
|
-
return "BATTLE"
|
|
82
|
-
else:
|
|
83
|
-
return "GAME_SCREEN" # Use neutral term instead of assuming menu
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def is_menu_screen(rgb_buffer: np.ndarray) -> bool:
|
|
87
|
-
"""Check if this looks like a menu screen - made more conservative."""
|
|
88
|
-
# This function is now unused but keeping for potential future use
|
|
89
|
-
# The logic was too aggressive in detecting menus
|
|
90
|
-
height, width = rgb_buffer.shape[:2]
|
|
91
|
-
|
|
92
|
-
# Much more strict criteria for what constitutes a menu
|
|
93
|
-
# Look for very specific menu patterns like uniform background with text boxes
|
|
94
|
-
horizontal_consistency = 0
|
|
95
|
-
for row in range(height):
|
|
96
|
-
row_colors = rgb_buffer[row, :, :]
|
|
97
|
-
unique_in_row = len(np.unique(row_colors.reshape(-1, 3), axis=0))
|
|
98
|
-
if unique_in_row < 3: # Very consistent row color (stricter than before)
|
|
99
|
-
horizontal_consistency += 1
|
|
100
|
-
|
|
101
|
-
# Much higher threshold - only classify as menu if almost the entire screen is uniform
|
|
102
|
-
return horizontal_consistency > height * 0.8
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
def is_text_box_screen(rgb_buffer: np.ndarray) -> bool:
|
|
106
|
-
"""Check if this looks like a text box is displayed."""
|
|
107
|
-
# Look for typical text box patterns - usually bottom portion has different colors
|
|
108
|
-
height, width = rgb_buffer.shape[:2]
|
|
109
|
-
bottom_quarter = rgb_buffer[height * 3 // 4 :, :, :]
|
|
110
|
-
top_quarter = rgb_buffer[: height // 4, :, :]
|
|
111
|
-
|
|
112
|
-
bottom_colors = len(np.unique(bottom_quarter.reshape(-1, 3), axis=0))
|
|
113
|
-
top_colors = len(np.unique(top_quarter.reshape(-1, 3), axis=0))
|
|
114
|
-
|
|
115
|
-
return bottom_colors > top_colors * 1.5
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
def is_battle_screen(rgb_buffer: np.ndarray) -> bool:
|
|
119
|
-
"""Check if this looks like a battle screen."""
|
|
120
|
-
# Battle screens typically have more color variation
|
|
121
|
-
height, width = rgb_buffer.shape[:2]
|
|
122
|
-
unique_colors = len(np.unique(rgb_buffer.reshape(-1, 3), axis=0))
|
|
123
|
-
return unique_colors > 30
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def extract_text_content(rgb_buffer: np.ndarray) -> List[str]:
|
|
127
|
-
"""
|
|
128
|
-
Attempt to extract readable text from the screen.
|
|
129
|
-
This is simplified - real OCR would be more complex.
|
|
130
|
-
"""
|
|
131
|
-
# For now, just analyze patterns that might indicate text
|
|
132
|
-
text_lines = []
|
|
133
|
-
|
|
134
|
-
height, width = rgb_buffer.shape[:2]
|
|
135
|
-
|
|
136
|
-
# Look for text-like patterns in bottom area (common location for text boxes)
|
|
137
|
-
text_area = rgb_buffer[height * 2 // 3 :, :, :]
|
|
138
|
-
|
|
139
|
-
# Simple heuristic: if there are alternating light/dark patterns, might be text
|
|
140
|
-
for row_idx in range(text_area.shape[0]):
|
|
141
|
-
row = text_area[row_idx, :, :]
|
|
142
|
-
# Check for patterns that might indicate text
|
|
143
|
-
brightness = np.mean(row, axis=1)
|
|
144
|
-
changes = np.diff(brightness > np.mean(brightness))
|
|
145
|
-
if np.sum(changes) > width // 10: # Lots of brightness changes might be text
|
|
146
|
-
text_lines.append(f"Text detected at row {height * 2 // 3 + row_idx}")
|
|
147
|
-
|
|
148
|
-
return text_lines
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def detect_entities(rgb_buffer: np.ndarray) -> List[Dict[str, Any]]:
|
|
152
|
-
"""
|
|
153
|
-
Detect entities like player character, NPCs, objects on screen.
|
|
154
|
-
"""
|
|
155
|
-
entities = []
|
|
156
|
-
|
|
157
|
-
# This is a simplified approach - real entity detection would be more sophisticated
|
|
158
|
-
height, width = rgb_buffer.shape[:2]
|
|
159
|
-
|
|
160
|
-
# Look for small moving/distinct colored regions that might be characters
|
|
161
|
-
# Scan in a grid pattern
|
|
162
|
-
block_size = 16 # Pokemon Red typically uses 16x16 sprites
|
|
163
|
-
|
|
164
|
-
for y in range(0, height - block_size, block_size):
|
|
165
|
-
for x in range(0, width - block_size, block_size):
|
|
166
|
-
block = rgb_buffer[y : y + block_size, x : x + block_size, :]
|
|
167
|
-
|
|
168
|
-
# Check if this block has interesting characteristics
|
|
169
|
-
unique_colors_in_block = len(np.unique(block.reshape(-1, 3), axis=0))
|
|
170
|
-
|
|
171
|
-
if 3 <= unique_colors_in_block <= 8: # Sprite-like color count
|
|
172
|
-
avg_color = np.mean(block, axis=(0, 1))
|
|
173
|
-
entities.append(
|
|
174
|
-
{
|
|
175
|
-
"type": "SPRITE_LIKE",
|
|
176
|
-
"position": (x, y),
|
|
177
|
-
"avg_color": tuple(avg_color.astype(int)),
|
|
178
|
-
"color_count": unique_colors_in_block,
|
|
179
|
-
}
|
|
180
|
-
)
|
|
181
|
-
|
|
182
|
-
return entities
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
def detect_ui_elements(rgb_buffer: np.ndarray) -> Dict[str, Any]:
|
|
186
|
-
"""
|
|
187
|
-
Detect UI elements like borders, windows, buttons.
|
|
188
|
-
"""
|
|
189
|
-
height, width = rgb_buffer.shape[:2]
|
|
190
|
-
|
|
191
|
-
ui_elements = {"has_border": False, "windows": [], "button_like_areas": []}
|
|
192
|
-
|
|
193
|
-
# Check for borders (consistent colors around edges)
|
|
194
|
-
edges = [
|
|
195
|
-
rgb_buffer[0, :, :], # top edge
|
|
196
|
-
rgb_buffer[-1, :, :], # bottom edge
|
|
197
|
-
rgb_buffer[:, 0, :], # left edge
|
|
198
|
-
rgb_buffer[:, -1, :], # right edge
|
|
199
|
-
]
|
|
200
|
-
|
|
201
|
-
for edge in edges:
|
|
202
|
-
unique_colors = len(np.unique(edge.reshape(-1, 3), axis=0))
|
|
203
|
-
if unique_colors < 3: # Very consistent edge color
|
|
204
|
-
ui_elements["has_border"] = True
|
|
205
|
-
break
|
|
206
|
-
|
|
207
|
-
return ui_elements
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
def analyze_colors(rgb_buffer: np.ndarray) -> Dict[str, Any]:
|
|
211
|
-
"""
|
|
212
|
-
Analyze the color composition of the screen.
|
|
213
|
-
"""
|
|
214
|
-
unique_colors, counts = np.unique(rgb_buffer.reshape(-1, 3), axis=0, return_counts=True)
|
|
215
|
-
|
|
216
|
-
# Sort by frequency
|
|
217
|
-
sorted_indices = np.argsort(counts)[::-1]
|
|
218
|
-
top_colors = unique_colors[sorted_indices[:10]] # Top 10 colors
|
|
219
|
-
top_counts = counts[sorted_indices[:10]]
|
|
220
|
-
|
|
221
|
-
total_pixels = rgb_buffer.shape[0] * rgb_buffer.shape[1]
|
|
222
|
-
|
|
223
|
-
color_analysis = {
|
|
224
|
-
"total_unique_colors": len(unique_colors),
|
|
225
|
-
"dominant_colors": [],
|
|
226
|
-
"color_complexity": "HIGH"
|
|
227
|
-
if len(unique_colors) > 50
|
|
228
|
-
else "MEDIUM"
|
|
229
|
-
if len(unique_colors) > 20
|
|
230
|
-
else "LOW",
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
for i, (color, count) in enumerate(zip(top_colors, top_counts)):
|
|
234
|
-
percentage = (count / total_pixels) * 100
|
|
235
|
-
color_analysis["dominant_colors"].append(
|
|
236
|
-
{
|
|
237
|
-
"rgb": tuple(color),
|
|
238
|
-
"percentage": round(percentage, 1),
|
|
239
|
-
"name": get_color_name(tuple(color)),
|
|
240
|
-
}
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
return color_analysis
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
def get_color_name(rgb_tuple: Tuple[int, int, int]) -> str:
|
|
247
|
-
"""
|
|
248
|
-
Get a human-readable name for an RGB color.
|
|
249
|
-
"""
|
|
250
|
-
# Find closest match in our color dictionary
|
|
251
|
-
min_distance = float("inf")
|
|
252
|
-
closest_name = "UNKNOWN"
|
|
253
|
-
|
|
254
|
-
for known_rgb, name in POKEMON_RED_COLORS.items():
|
|
255
|
-
distance = sum((a - b) ** 2 for a, b in zip(rgb_tuple, known_rgb))
|
|
256
|
-
if distance < min_distance:
|
|
257
|
-
min_distance = distance
|
|
258
|
-
closest_name = name
|
|
259
|
-
|
|
260
|
-
# If no close match, generate a descriptive name
|
|
261
|
-
if min_distance > 10000: # Threshold for "close enough"
|
|
262
|
-
r, g, b = rgb_tuple
|
|
263
|
-
if r > 200 and g > 200 and b > 200:
|
|
264
|
-
return "LIGHT"
|
|
265
|
-
elif r < 50 and g < 50 and b < 50:
|
|
266
|
-
return "DARK"
|
|
267
|
-
else:
|
|
268
|
-
return "MEDIUM"
|
|
269
|
-
|
|
270
|
-
return closest_name
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
def create_ascii_representation(rgb_buffer: np.ndarray) -> str:
|
|
274
|
-
"""
|
|
275
|
-
Create a simplified ASCII representation of the screen.
|
|
276
|
-
"""
|
|
277
|
-
height, width = rgb_buffer.shape[:2]
|
|
278
|
-
|
|
279
|
-
# Downsample to a reasonable ASCII size (e.g., 40x20)
|
|
280
|
-
ascii_height = 20
|
|
281
|
-
ascii_width = 40
|
|
282
|
-
|
|
283
|
-
ascii_chars = []
|
|
284
|
-
|
|
285
|
-
for row in range(ascii_height):
|
|
286
|
-
ascii_row = ""
|
|
287
|
-
for col in range(ascii_width):
|
|
288
|
-
# Map to original coordinates
|
|
289
|
-
orig_row = int((row / ascii_height) * height)
|
|
290
|
-
orig_col = int((col / ascii_width) * width)
|
|
291
|
-
|
|
292
|
-
# Get average brightness of this region
|
|
293
|
-
region = rgb_buffer[
|
|
294
|
-
orig_row : orig_row + height // ascii_height,
|
|
295
|
-
orig_col : orig_col + width // ascii_width,
|
|
296
|
-
:,
|
|
297
|
-
]
|
|
298
|
-
|
|
299
|
-
brightness = np.mean(region)
|
|
300
|
-
|
|
301
|
-
# Convert brightness to ASCII character
|
|
302
|
-
if brightness > 200:
|
|
303
|
-
ascii_row += " " # Bright = space
|
|
304
|
-
elif brightness > 150:
|
|
305
|
-
ascii_row += "." # Medium-bright = dot
|
|
306
|
-
elif brightness > 100:
|
|
307
|
-
ascii_row += ":" # Medium = colon
|
|
308
|
-
elif brightness > 50:
|
|
309
|
-
ascii_row += "x" # Dark = x
|
|
310
|
-
else:
|
|
311
|
-
ascii_row += "#" # Very dark = hash
|
|
312
|
-
|
|
313
|
-
ascii_chars.append(ascii_row)
|
|
314
|
-
|
|
315
|
-
return "\n".join(ascii_chars)
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
def create_detailed_screen_description(screen_analysis: Dict[str, Any]) -> str:
|
|
319
|
-
"""
|
|
320
|
-
Create a detailed text description of what's on screen based on the analysis.
|
|
321
|
-
"""
|
|
322
|
-
description_lines = []
|
|
323
|
-
|
|
324
|
-
# Screen type and basic info
|
|
325
|
-
screen_type = screen_analysis.get("screen_type", "UNKNOWN")
|
|
326
|
-
description_lines.append(f"SCREEN TYPE: {screen_type}")
|
|
327
|
-
|
|
328
|
-
# Color analysis
|
|
329
|
-
color_info = screen_analysis.get("color_analysis", {})
|
|
330
|
-
complexity = color_info.get("color_complexity", "UNKNOWN")
|
|
331
|
-
description_lines.append(f"VISUAL COMPLEXITY: {complexity}")
|
|
332
|
-
|
|
333
|
-
# Dominant colors
|
|
334
|
-
if "dominant_colors" in color_info:
|
|
335
|
-
color_desc = "DOMINANT COLORS: "
|
|
336
|
-
top_3_colors = color_info["dominant_colors"][:3]
|
|
337
|
-
color_names = [f"{c['name']}({c['percentage']:.0f}%)" for c in top_3_colors]
|
|
338
|
-
color_desc += ", ".join(color_names)
|
|
339
|
-
description_lines.append(color_desc)
|
|
340
|
-
|
|
341
|
-
# Entities
|
|
342
|
-
entities = screen_analysis.get("entities", [])
|
|
343
|
-
if entities:
|
|
344
|
-
description_lines.append(f"DETECTED ENTITIES: {len(entities)} sprite-like objects")
|
|
345
|
-
# Describe a few entities
|
|
346
|
-
for i, entity in enumerate(entities[:3]):
|
|
347
|
-
pos = entity["position"]
|
|
348
|
-
description_lines.append(f" Entity {i + 1}: {entity['type']} at ({pos[0]}, {pos[1]})")
|
|
349
|
-
|
|
350
|
-
# Text content
|
|
351
|
-
text_content = screen_analysis.get("text_content", [])
|
|
352
|
-
if text_content:
|
|
353
|
-
description_lines.append("TEXT DETECTED:")
|
|
354
|
-
for text_line in text_content[:3]: # Show first 3 text detections
|
|
355
|
-
description_lines.append(f" {text_line}")
|
|
356
|
-
|
|
357
|
-
# UI elements
|
|
358
|
-
ui_elements = screen_analysis.get("ui_elements", {})
|
|
359
|
-
if ui_elements.get("has_border"):
|
|
360
|
-
description_lines.append("UI: Window/border detected")
|
|
361
|
-
|
|
362
|
-
# ASCII representation
|
|
363
|
-
ascii_repr = screen_analysis.get("ascii_representation", "")
|
|
364
|
-
if ascii_repr:
|
|
365
|
-
description_lines.append("\nASCII REPRESENTATION:")
|
|
366
|
-
description_lines.append(ascii_repr)
|
|
367
|
-
|
|
368
|
-
return "\n".join(description_lines)
|