phase 2: matrix.downgrade reads WeakModels from config
migrate the strong-model auto-downgrade gate from a hardcoded weak list to cfg.Models.WeakModels. backward compatible: existing API preserved, callers that don't migrate keep using DefaultWeakModels. changes: - internal/matrix/downgrade.go: split IsWeakModel into rule-based base (`:free` suffix/infix) + literal-list lookup. New IsWeakModelInList(model, list) takes the config-supplied list. DowngradeInput grows a WeakModels field; nil falls back to DefaultWeakModels (preserves pre-phase-2 behavior). - internal/workflow/modes.go: add MatrixDowngradeWithWeakList(list) factory mirroring MatrixSearch's pattern. Plain MatrixDowngrade kept for backward compat. - cmd/matrixd/main.go: handlers struct holds weakModels populated from cfg.Models.WeakModels at startup; handleDowngrade threads it into every DowngradeInput. - cmd/observerd/main.go: registerBuiltinModes accepts weakModels and uses the factory variant. observerd reads cfg.Models.WeakModels in main(). end-to-end verified: downgrade + matrix + observer + workflow smokes all pass. Existing TestMaybeDowngrade_TruthTable + TestIsWeakModel unchanged (backward compat). Two new tests cover the config path: - TestIsWeakModelInList — covers rule + literal + empty + nil - TestMaybeDowngrade_WithConfigList — verifies cfg list overrides default Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
+7
-1
@@ -52,7 +52,7 @@ func main() {
|
||||
}
|
||||
|
||||
retriever := matrix.New(cfg.Matrixd.EmbeddURL, cfg.Matrixd.VectordURL)
|
||||
h := &handlers{r: retriever}
|
||||
h := &handlers{r: retriever, weakModels: cfg.Models.WeakModels}
|
||||
|
||||
if err := shared.Run("matrixd", cfg.Matrixd.Bind, h.register, cfg.Auth); err != nil {
|
||||
slog.Error("server", "err", err)
|
||||
@@ -62,6 +62,11 @@ func main() {
|
||||
|
||||
type handlers struct {
|
||||
r *matrix.Retriever
|
||||
// weakModels comes from cfg.Models.WeakModels at startup. Threaded
|
||||
// into every DowngradeInput so the gate uses the configured list
|
||||
// instead of matrix.DefaultWeakModels. nil/empty falls back to
|
||||
// the package default — matches pre-Phase 2 behavior.
|
||||
weakModels []string
|
||||
}
|
||||
|
||||
func (h *handlers) register(r chi.Router) {
|
||||
@@ -240,6 +245,7 @@ func (h *handlers) handleDowngrade(w http.ResponseWriter, r *http.Request) {
|
||||
// without env pollution.
|
||||
in.ForceFullOverride = *req.ForceFullOverride
|
||||
}
|
||||
in.WeakModels = h.weakModels
|
||||
writeJSON(w, http.StatusOK, matrix.MaybeDowngrade(in))
|
||||
}
|
||||
|
||||
|
||||
@@ -74,7 +74,7 @@ func main() {
|
||||
// to gateway's matrixd_url so a single-toml deploy works without
|
||||
// duplicating the address.
|
||||
matrixdURL := cfg.Gateway.MatrixdURL
|
||||
registerBuiltinModes(runner, matrixdURL)
|
||||
registerBuiltinModes(runner, matrixdURL, cfg.Models.WeakModels)
|
||||
|
||||
h := &handlers{store: store, runner: runner}
|
||||
if err := shared.Run("observerd", cfg.Observerd.Bind, h.register, cfg.Auth); err != nil {
|
||||
@@ -204,7 +204,7 @@ func summarizeOutput(output map[string]any) string {
|
||||
// - playbook.record (HTTP to matrixd)
|
||||
// - playbook.lookup (HTTP to matrixd)
|
||||
// - llm.chat (HTTP to gateway /v1/chat)
|
||||
func registerBuiltinModes(r *workflow.Runner, matrixdURL string) {
|
||||
func registerBuiltinModes(r *workflow.Runner, matrixdURL string, weakModels []string) {
|
||||
// Fixture modes for runner mechanics smokes.
|
||||
r.RegisterMode("fixture.echo", func(_ workflow.Context, input map[string]any) (map[string]any, error) {
|
||||
out := make(map[string]any, len(input))
|
||||
@@ -220,7 +220,10 @@ func registerBuiltinModes(r *workflow.Runner, matrixdURL string) {
|
||||
|
||||
// Real modes — pure-function wrappers (no I/O).
|
||||
r.RegisterMode("matrix.relevance", workflow.MatrixRelevance)
|
||||
r.RegisterMode("matrix.downgrade", workflow.MatrixDowngrade)
|
||||
// matrix.downgrade reads weakModels from config — Phase 2.
|
||||
// nil/empty falls back to matrix.DefaultWeakModels per the
|
||||
// MatrixDowngradeWithWeakList factory contract.
|
||||
r.RegisterMode("matrix.downgrade", workflow.MatrixDowngradeWithWeakList(weakModels))
|
||||
r.RegisterMode("distillation.score", workflow.DistillationScore)
|
||||
r.RegisterMode("drift.scorer", workflow.DriftScorer)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user