fix: multi-model routing — each adapter uses own dspy.LM instance

- DSPyLLMAdapter now accepts dspy.LM instead of model string, uses dspy.context(lm=...)
- DSPyJudgeAdapter, DSPyProposerAdapter, DSPySyntheticAdapter each accept and use own LM
- OptimizationConfig gains per-model api_base/api_key_env override fields
- cli/app.py creates separate dspy.LM per adapter with per-model overrides
- New unit tests verify each adapter isolates its LM from global config

Fixes Bug #1 (multi-model config not wired) and Bug #2 (DSPyLLMAdapter ignores model param).

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
FullStackDev
2026-03-29 12:31:48 +00:00
parent 837a44970f
commit f516ca4be6
8 changed files with 306 additions and 41 deletions

View File

@@ -19,6 +19,16 @@ class OptimizationConfig:
proposer_model: str = "openai/gpt-4o"
synth_model: str = "openai/gpt-4o"
# --- Per-model API overrides (optional, fall back to global api_base/api_key_env) ---
task_api_base: str | None = None
task_api_key_env: str | None = None
judge_api_base: str | None = None
judge_api_key_env: str | None = None
proposer_api_base: str | None = None
proposer_api_key_env: str | None = None
synth_api_base: str | None = None
synth_api_key_env: str | None = None
# --- Evolution parameters ---
max_iterations: int = 30
n_synthetic_inputs: int = 20