self-evolve-framework 1.4.0 → 1.6.0

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.
Files changed (171) hide show
  1. package/package.json +1 -1
  2. package/template/rules/ponytail.mdc +98 -23
  3. package/template/skills/skillopt-sleep/SKILL.md +42 -0
  4. package/template/skills/skillopt-sleep/configs/_base_/default.yaml +103 -0
  5. package/template/skills/skillopt-sleep/configs/alfworld/default.yaml +29 -0
  6. package/template/skills/skillopt-sleep/configs/docvqa/default.yaml +28 -0
  7. package/template/skills/skillopt-sleep/configs/features/soft_gate.yaml +47 -0
  8. package/template/skills/skillopt-sleep/configs/livemathematicianbench/default.yaml +22 -0
  9. package/template/skills/skillopt-sleep/configs/officeqa/default.yaml +34 -0
  10. package/template/skills/skillopt-sleep/configs/searchqa/default.yaml +32 -0
  11. package/template/skills/skillopt-sleep/configs/spreadsheetbench/default.yaml +34 -0
  12. package/template/skills/skillopt-sleep/scripts/framework/skillopt/__init__.py +28 -0
  13. package/template/skills/skillopt-sleep/scripts/framework/skillopt/config.py +282 -0
  14. package/template/skills/skillopt-sleep/scripts/framework/skillopt/datasets/__init__.py +7 -0
  15. package/template/skills/skillopt-sleep/scripts/framework/skillopt/datasets/base.py +512 -0
  16. package/template/skills/skillopt-sleep/scripts/framework/skillopt/engine/__init__.py +9 -0
  17. package/template/skills/skillopt-sleep/scripts/framework/skillopt/engine/trainer.py +2379 -0
  18. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/__init__.py +1 -0
  19. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/_template/README.md +43 -0
  20. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/_template/config_template.yaml +55 -0
  21. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/_template/env_template.py +151 -0
  22. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/_template/loader_template.py +87 -0
  23. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/__init__.py +5 -0
  24. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/adapter.py +428 -0
  25. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/dataloader.py +123 -0
  26. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/analyst_error.md +55 -0
  27. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/analyst_success.md +33 -0
  28. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/rollout_no_history.md +8 -0
  29. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/rollout_with_history.md +9 -0
  30. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/prompts/rollout_with_memory.md +16 -0
  31. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/reflect.py +4 -0
  32. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/rollout.py +366 -0
  33. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/skills/initial.md +45 -0
  34. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/__init__.py +9 -0
  35. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/alfworld_envs.py +221 -0
  36. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/alfworld_projection.py +60 -0
  37. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/alfworld_prompts.py +8 -0
  38. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/config_tw.yaml +145 -0
  39. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/env_base.py +84 -0
  40. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/env_manager.py +139 -0
  41. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/alfworld/vendor/memory.py +87 -0
  42. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/base.py +329 -0
  43. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/__init__.py +1 -0
  44. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/adapter.py +90 -0
  45. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/dataloader.py +61 -0
  46. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/evaluator.py +113 -0
  47. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/prompts/analyst_error.md +35 -0
  48. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/prompts/analyst_success.md +24 -0
  49. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/prompts/rollout_system.md +12 -0
  50. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/rollout.py +391 -0
  51. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/docvqa/skills/initial.md +11 -0
  52. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/__init__.py +1 -0
  53. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/adapter.py +129 -0
  54. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/dataloader.py +308 -0
  55. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/evaluator.py +62 -0
  56. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/prompts/analyst_error.md +37 -0
  57. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/prompts/analyst_success.md +25 -0
  58. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/prompts/rollout_system.md +12 -0
  59. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/reflect.py +4 -0
  60. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/rollout.py +434 -0
  61. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/livemathematicianbench/skills/initial.md +16 -0
  62. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/__init__.py +1 -0
  63. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/adapter.py +112 -0
  64. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/dataloader.py +71 -0
  65. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/evaluator.py +46 -0
  66. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/prompts/analyst_error.md +37 -0
  67. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/prompts/analyst_success.md +25 -0
  68. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/prompts/rollout_system.md +15 -0
  69. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/rollout.py +799 -0
  70. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/skills/initial.md +15 -0
  71. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/officeqa/tool_runtime.py +552 -0
  72. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/__init__.py +1 -0
  73. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/adapter.py +96 -0
  74. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/dataloader.py +42 -0
  75. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/evaluator.py +100 -0
  76. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/prompts/analyst_error.md +46 -0
  77. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/prompts/analyst_success.md +32 -0
  78. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/prompts/rollout_system.md +13 -0
  79. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/reflect.py +4 -0
  80. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/rollout.py +494 -0
  81. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/searchqa/skills/initial.md +3 -0
  82. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/__init__.py +5 -0
  83. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/adapter.py +159 -0
  84. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/codegen_agent.py +731 -0
  85. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/dataloader.py +37 -0
  86. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/evaluator.py +158 -0
  87. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/executor.py +67 -0
  88. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/analyst_error.md +46 -0
  89. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/analyst_success.md +32 -0
  90. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/codegen_system.md +1 -0
  91. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/critical_rules.md +9 -0
  92. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/prompts/react_system.md +21 -0
  93. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/react_agent.py +395 -0
  94. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/reflect.py +4 -0
  95. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/rollout.py +979 -0
  96. package/template/skills/skillopt-sleep/scripts/framework/skillopt/envs/spreadsheetbench/skills/initial.md +56 -0
  97. package/template/skills/skillopt-sleep/scripts/framework/skillopt/evaluation/__init__.py +13 -0
  98. package/template/skills/skillopt-sleep/scripts/framework/skillopt/evaluation/gate.py +148 -0
  99. package/template/skills/skillopt-sleep/scripts/framework/skillopt/gradient/__init__.py +15 -0
  100. package/template/skills/skillopt-sleep/scripts/framework/skillopt/gradient/aggregate.py +253 -0
  101. package/template/skills/skillopt-sleep/scripts/framework/skillopt/gradient/reflect.py +635 -0
  102. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/__init__.py +514 -0
  103. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/azure_openai.py +915 -0
  104. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/backend_config.py +185 -0
  105. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/claude_backend.py +371 -0
  106. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/codex_backend.py +666 -0
  107. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/codex_harness.py +1057 -0
  108. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/common.py +229 -0
  109. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/minimax_backend.py +277 -0
  110. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/qwen_backend.py +456 -0
  111. package/template/skills/skillopt-sleep/scripts/framework/skillopt/model/router.py +236 -0
  112. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/__init__.py +15 -0
  113. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/appendix.py +156 -0
  114. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/clip.py +109 -0
  115. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/lr_autonomous.py +108 -0
  116. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/meta_skill.py +79 -0
  117. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/rewrite.py +59 -0
  118. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/scheduler.py +127 -0
  119. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/select.py +4 -0
  120. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/skill.py +201 -0
  121. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/skill_aware.py +206 -0
  122. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/slow_update.py +396 -0
  123. package/template/skills/skillopt-sleep/scripts/framework/skillopt/optimizer/update_modes.py +135 -0
  124. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/__init__.py +63 -0
  125. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_error.md +41 -0
  126. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_error_full_rewrite.md +32 -0
  127. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_error_rewrite.md +44 -0
  128. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_success.md +36 -0
  129. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_success_full_rewrite.md +30 -0
  130. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/analyst_success_rewrite.md +33 -0
  131. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/lr_autonomous.md +20 -0
  132. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_failure.md +30 -0
  133. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_failure_full_rewrite.md +28 -0
  134. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_failure_rewrite.md +26 -0
  135. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_final.md +33 -0
  136. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_final_full_rewrite.md +28 -0
  137. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_final_rewrite.md +25 -0
  138. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_success.md +28 -0
  139. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_success_full_rewrite.md +28 -0
  140. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/merge_success_rewrite.md +25 -0
  141. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/meta_skill.md +40 -0
  142. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/ranking.md +20 -0
  143. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/ranking_rewrite.md +15 -0
  144. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/rewrite_skill.md +25 -0
  145. package/template/skills/skillopt-sleep/scripts/framework/skillopt/prompts/slow_update.md +60 -0
  146. package/template/skills/skillopt-sleep/scripts/framework/skillopt/scheduler/__init__.py +8 -0
  147. package/template/skills/skillopt-sleep/scripts/framework/skillopt/types.py +306 -0
  148. package/template/skills/skillopt-sleep/scripts/framework/skillopt/utils/__init__.py +4 -0
  149. package/template/skills/skillopt-sleep/scripts/framework/skillopt/utils/json_utils.py +172 -0
  150. package/template/skills/skillopt-sleep/scripts/framework/skillopt/utils/scoring.py +28 -0
  151. package/template/skills/ponytail/SKILL.md +0 -133
  152. package/template/skills/ponytail/scripts/hooks/claude-codex-hooks.json +0 -44
  153. package/template/skills/ponytail/scripts/hooks/copilot-hooks.json +0 -21
  154. package/template/skills/ponytail/scripts/hooks/ponytail-activate.js +0 -91
  155. package/template/skills/ponytail/scripts/hooks/ponytail-config.js +0 -122
  156. package/template/skills/ponytail/scripts/hooks/ponytail-instructions.js +0 -94
  157. package/template/skills/ponytail/scripts/hooks/ponytail-mode-tracker.js +0 -55
  158. package/template/skills/ponytail/scripts/hooks/ponytail-runtime.js +0 -68
  159. package/template/skills/ponytail/scripts/hooks/ponytail-statusline.ps1 +0 -21
  160. package/template/skills/ponytail/scripts/hooks/ponytail-statusline.sh +0 -12
  161. package/template/skills/ponytail/scripts/hooks/ponytail-subagent.js +0 -22
  162. package/template/skills/ponytail/scripts/mcp/README.md +0 -46
  163. package/template/skills/ponytail/scripts/mcp/index.js +0 -48
  164. package/template/skills/ponytail/scripts/mcp/instructions.js +0 -26
  165. package/template/skills/ponytail/scripts/mcp/package.json +0 -13
  166. package/template/skills/ponytail/scripts/mcp/test/instructions.test.js +0 -22
  167. package/template/skills/ponytail-audit/SKILL.md +0 -41
  168. package/template/skills/ponytail-debt/SKILL.md +0 -44
  169. package/template/skills/ponytail-gain/SKILL.md +0 -50
  170. package/template/skills/ponytail-help/SKILL.md +0 -69
  171. package/template/skills/ponytail-review/SKILL.md +0 -57
@@ -0,0 +1,282 @@
1
+ """ReflACT config loading engine — structured YAML with inheritance.
2
+
3
+ Supports two config formats:
4
+ 1. **Structured** (new): sections like ``model``, ``train``, ``gradient``,
5
+ ``optimizer``, ``evaluation``, ``env`` — with ``_base_`` inheritance.
6
+ 2. **Flat** (legacy): all keys at top level — fully backward compatible.
7
+
8
+ Usage::
9
+
10
+ from skillopt.config import load_config, flatten_config
11
+
12
+ cfg = load_config("configs/searchqa_default.yaml")
13
+ flat = flatten_config(cfg) # always returns flat dict for trainer
14
+ """
15
+ from __future__ import annotations
16
+
17
+ import copy
18
+ import os
19
+ from typing import Any
20
+
21
+ import yaml
22
+
23
+ # ── Section names that indicate a structured config ──────────────────────
24
+
25
+ _STRUCTURED_SECTIONS = frozenset({
26
+ "model", "train", "gradient", "optimizer", "evaluation", "env",
27
+ })
28
+
29
+ # ── Structured → flat key mapping ────────────────────────────────────────
30
+
31
+ _FLATTEN_MAP: dict[str, str] = {
32
+ "model.backend": "model_backend",
33
+ "model.optimizer": "optimizer_model",
34
+ "model.target": "target_model",
35
+ "model.optimizer_backend": "optimizer_backend",
36
+ "model.target_backend": "target_backend",
37
+ "model.reasoning_effort": "reasoning_effort",
38
+ "model.rewrite_reasoning_effort": "rewrite_reasoning_effort",
39
+ "model.rewrite_max_completion_tokens": "rewrite_max_completion_tokens",
40
+ "model.codex_exec_path": "codex_exec_path",
41
+ "model.codex_exec_sandbox": "codex_exec_sandbox",
42
+ "model.codex_exec_profile": "codex_exec_profile",
43
+ "model.codex_exec_full_auto": "codex_exec_full_auto",
44
+ "model.codex_exec_reasoning_effort": "codex_exec_reasoning_effort",
45
+ "model.codex_exec_use_sdk": "codex_exec_use_sdk",
46
+ "model.codex_exec_network_access": "codex_exec_network_access",
47
+ "model.codex_exec_web_search": "codex_exec_web_search",
48
+ "model.codex_exec_approval_policy": "codex_exec_approval_policy",
49
+ "model.claude_code_exec_path": "claude_code_exec_path",
50
+ "model.claude_code_exec_profile": "claude_code_exec_profile",
51
+ "model.claude_code_exec_use_sdk": "claude_code_exec_use_sdk",
52
+ "model.claude_code_exec_effort": "claude_code_exec_effort",
53
+ "model.claude_code_exec_max_thinking_tokens": "claude_code_exec_max_thinking_tokens",
54
+ "model.codex_trace_to_optimizer": "codex_trace_to_optimizer",
55
+ "model.azure_endpoint": "azure_endpoint",
56
+ "model.azure_api_version": "azure_api_version",
57
+ "model.azure_api_key": "azure_api_key",
58
+ "model.azure_openai_endpoint": "azure_openai_endpoint",
59
+ "model.azure_openai_api_version": "azure_openai_api_version",
60
+ "model.azure_openai_api_key": "azure_openai_api_key",
61
+ "model.azure_openai_auth_mode": "azure_openai_auth_mode",
62
+ "model.azure_openai_ad_scope": "azure_openai_ad_scope",
63
+ "model.azure_openai_managed_identity_client_id": "azure_openai_managed_identity_client_id",
64
+ "model.optimizer_azure_openai_endpoint": "optimizer_azure_openai_endpoint",
65
+ "model.optimizer_azure_openai_api_version": "optimizer_azure_openai_api_version",
66
+ "model.optimizer_azure_openai_api_key": "optimizer_azure_openai_api_key",
67
+ "model.optimizer_azure_openai_auth_mode": "optimizer_azure_openai_auth_mode",
68
+ "model.optimizer_azure_openai_ad_scope": "optimizer_azure_openai_ad_scope",
69
+ "model.optimizer_azure_openai_managed_identity_client_id": "optimizer_azure_openai_managed_identity_client_id",
70
+ "model.target_azure_openai_endpoint": "target_azure_openai_endpoint",
71
+ "model.target_azure_openai_api_version": "target_azure_openai_api_version",
72
+ "model.target_azure_openai_api_key": "target_azure_openai_api_key",
73
+ "model.target_azure_openai_auth_mode": "target_azure_openai_auth_mode",
74
+ "model.target_azure_openai_ad_scope": "target_azure_openai_ad_scope",
75
+ "model.target_azure_openai_managed_identity_client_id": "target_azure_openai_managed_identity_client_id",
76
+ "model.qwen_chat_base_url": "qwen_chat_base_url",
77
+ "model.qwen_chat_api_key": "qwen_chat_api_key",
78
+ "model.qwen_chat_temperature": "qwen_chat_temperature",
79
+ "model.qwen_chat_timeout_seconds": "qwen_chat_timeout_seconds",
80
+ "model.qwen_chat_max_tokens": "qwen_chat_max_tokens",
81
+ "model.qwen_chat_enable_thinking": "qwen_chat_enable_thinking",
82
+ "model.optimizer_qwen_chat_base_url": "optimizer_qwen_chat_base_url",
83
+ "model.optimizer_qwen_chat_api_key": "optimizer_qwen_chat_api_key",
84
+ "model.optimizer_qwen_chat_temperature": "optimizer_qwen_chat_temperature",
85
+ "model.optimizer_qwen_chat_timeout_seconds": "optimizer_qwen_chat_timeout_seconds",
86
+ "model.optimizer_qwen_chat_max_tokens": "optimizer_qwen_chat_max_tokens",
87
+ "model.optimizer_qwen_chat_enable_thinking": "optimizer_qwen_chat_enable_thinking",
88
+ "model.target_qwen_chat_base_url": "target_qwen_chat_base_url",
89
+ "model.target_qwen_chat_api_key": "target_qwen_chat_api_key",
90
+ "model.target_qwen_chat_temperature": "target_qwen_chat_temperature",
91
+ "model.target_qwen_chat_timeout_seconds": "target_qwen_chat_timeout_seconds",
92
+ "model.target_qwen_chat_max_tokens": "target_qwen_chat_max_tokens",
93
+ "model.target_qwen_chat_enable_thinking": "target_qwen_chat_enable_thinking",
94
+ "model.minimax_base_url": "minimax_base_url",
95
+ "model.minimax_api_key": "minimax_api_key",
96
+ "model.minimax_model": "minimax_model",
97
+ "model.minimax_temperature": "minimax_temperature",
98
+ "model.minimax_max_tokens": "minimax_max_tokens",
99
+ "model.minimax_enable_thinking": "minimax_enable_thinking",
100
+ "train.num_epochs": "num_epochs",
101
+ "train.train_size": "train_size",
102
+ "train.steps_per_epoch": "steps_per_epoch",
103
+ "train.batch_size": "batch_size",
104
+ "train.accumulation": "accumulation",
105
+ "train.seed": "seed",
106
+ "gradient.minibatch_size": "minibatch_size",
107
+ "gradient.merge_batch_size": "merge_batch_size",
108
+ "gradient.analyst_workers": "analyst_workers",
109
+ "gradient.failure_only": "failure_only",
110
+ "gradient.max_analyst_rounds": "max_analyst_rounds",
111
+ "optimizer.learning_rate": "edit_budget",
112
+ "optimizer.min_learning_rate": "min_edit_budget",
113
+ "optimizer.lr_scheduler": "lr_scheduler",
114
+ "optimizer.lr_control_mode": "lr_control_mode",
115
+ "optimizer.skill_update_mode": "skill_update_mode",
116
+ "optimizer.meta_learning_rate": "meta_edit_budget",
117
+ "optimizer.use_slow_update": "use_slow_update",
118
+ "optimizer.slow_update_samples": "slow_update_samples",
119
+ "optimizer.slow_update_gate_with_selection": "slow_update_gate_with_selection",
120
+ "optimizer.longitudinal_pair_policy": "longitudinal_pair_policy",
121
+ "optimizer.use_meta_skill": "use_meta_skill",
122
+ "optimizer.use_skill_aware_reflection": "use_skill_aware_reflection",
123
+ "optimizer.skill_aware_appendix_source": "skill_aware_appendix_source",
124
+ "optimizer.skill_aware_consolidate_threshold": "skill_aware_consolidate_threshold",
125
+ "evaluation.use_gate": "use_gate",
126
+ "evaluation.gate_metric": "gate_metric",
127
+ "evaluation.gate_mixed_weight": "gate_mixed_weight",
128
+ "evaluation.sel_env_num": "sel_env_num",
129
+ "evaluation.test_env_num": "test_env_num",
130
+ "evaluation.eval_test": "eval_test",
131
+ "env.name": "env",
132
+ "env.skill_init": "skill_init",
133
+ "env.out_root": "out_root",
134
+ }
135
+
136
+
137
+ # ── Deep merge ───────────────────────────────────────────────────────────
138
+
139
+ def _deep_merge(base: dict, override: dict) -> dict:
140
+ """Recursively merge *override* into *base* (returns new dict)."""
141
+ result = copy.deepcopy(base)
142
+ for key, val in override.items():
143
+ if key in result and isinstance(result[key], dict) and isinstance(val, dict):
144
+ result[key] = _deep_merge(result[key], val)
145
+ else:
146
+ result[key] = copy.deepcopy(val)
147
+ return result
148
+
149
+
150
+ # ── YAML loading with _base_ inheritance ─────────────────────────────────
151
+
152
+ def _load_yaml(path: str, _visited: set[str] | None = None) -> dict:
153
+ """Load a YAML file, resolving ``_base_`` inheritance recursively."""
154
+ abs_path = os.path.abspath(path)
155
+ if _visited is None:
156
+ _visited = set()
157
+ if abs_path in _visited:
158
+ raise ValueError(f"Circular _base_ inheritance: {abs_path}")
159
+ _visited.add(abs_path)
160
+
161
+ with open(abs_path) as f:
162
+ cfg = yaml.safe_load(f) or {}
163
+
164
+ base_ref = cfg.pop("_base_", None)
165
+ if base_ref:
166
+ base_path = os.path.join(os.path.dirname(abs_path), base_ref)
167
+ base_cfg = _load_yaml(base_path, _visited)
168
+ cfg = _deep_merge(base_cfg, cfg)
169
+
170
+ return cfg
171
+
172
+
173
+ # ── Format detection ─────────────────────────────────────────────────────
174
+
175
+ def is_structured(cfg: dict) -> bool:
176
+ """Return True if *cfg* uses the new structured section format."""
177
+ return any(
178
+ key in _STRUCTURED_SECTIONS and isinstance(cfg.get(key), dict)
179
+ for key in cfg
180
+ )
181
+
182
+
183
+ # ── Flatten ──────────────────────────────────────────────────────────────
184
+
185
+ def flatten_config(cfg: dict) -> dict:
186
+ """Convert a structured config to the flat dict expected by the trainer.
187
+
188
+ If *cfg* is already flat, returns a shallow copy unchanged.
189
+ """
190
+ if not is_structured(cfg):
191
+ return dict(cfg)
192
+
193
+ flat: dict[str, Any] = {}
194
+
195
+ # Apply the explicit mapping
196
+ for dotted, flat_key in _FLATTEN_MAP.items():
197
+ section, key = dotted.split(".", 1)
198
+ section_dict = cfg.get(section, {})
199
+ if isinstance(section_dict, dict) and key in section_dict:
200
+ flat[flat_key] = section_dict[key]
201
+
202
+ # Pass through env-specific keys not in the explicit mapping
203
+ env_section = cfg.get("env", {})
204
+ if isinstance(env_section, dict):
205
+ mapped_env_keys = {
206
+ k.split(".", 1)[1]
207
+ for k in _FLATTEN_MAP
208
+ if k.startswith("env.")
209
+ }
210
+ for key, val in env_section.items():
211
+ if key not in mapped_env_keys:
212
+ flat[key] = val
213
+
214
+ return flat
215
+
216
+
217
+ # ── Override application ─────────────────────────────────────────────────
218
+
219
+ def _cast_value(val_str: str) -> Any:
220
+ """Auto-cast a CLI string value to int / float / bool / str."""
221
+ if val_str.lower() in ("true", "yes"):
222
+ return True
223
+ if val_str.lower() in ("false", "no"):
224
+ return False
225
+ try:
226
+ return int(val_str)
227
+ except ValueError:
228
+ pass
229
+ try:
230
+ return float(val_str)
231
+ except ValueError:
232
+ pass
233
+ return val_str
234
+
235
+
236
+ def apply_overrides(cfg: dict, overrides: list[str]) -> None:
237
+ """Apply ``key=value`` overrides to a structured config (in place).
238
+
239
+ Supports both ``section.key=value`` (for structured configs) and
240
+ ``key=value`` (for flat configs or flat keys in env section).
241
+ """
242
+ for item in overrides:
243
+ if "=" not in item:
244
+ raise ValueError(f"Invalid override (expected key=value): {item!r}")
245
+ key, val_str = item.split("=", 1)
246
+ val = _cast_value(val_str)
247
+
248
+ if "." in key:
249
+ section, subkey = key.split(".", 1)
250
+ if section in cfg and isinstance(cfg[section], dict):
251
+ cfg[section][subkey] = val
252
+ else:
253
+ cfg.setdefault(section, {})[subkey] = val
254
+ else:
255
+ # Flat key — apply to top level (for legacy compat)
256
+ cfg[key] = val
257
+
258
+
259
+ # ── Public API ───────────────────────────────────────────────────────────
260
+
261
+ def load_config(
262
+ path: str,
263
+ overrides: list[str] | None = None,
264
+ ) -> dict:
265
+ """Load a config file with ``_base_`` inheritance and optional overrides.
266
+
267
+ Parameters
268
+ ----------
269
+ path : str
270
+ Path to the YAML config file.
271
+ overrides : list[str] | None
272
+ ``key=value`` strings from ``--cfg-options``.
273
+
274
+ Returns
275
+ -------
276
+ dict
277
+ The merged config (structured or flat depending on the YAML).
278
+ """
279
+ cfg = _load_yaml(path)
280
+ if overrides:
281
+ apply_overrides(cfg, overrides)
282
+ return cfg
@@ -0,0 +1,7 @@
1
+ """ReflACT Datasets -- task batch planning and data loading.
2
+
3
+ Analogous to the datasets and dataloaders in neural network training:
4
+ provides batch sampling, epoch planning, and data management for the
5
+ ReflACT training pipeline.
6
+ """
7
+ from skillopt.datasets.base import BaseDataLoader, BatchSpec, SplitDataLoader # noqa: F401