From 7e798a5d13dc861cd5e21ba56b30aeabb9083a59 Mon Sep 17 00:00:00 2001 From: viettranx Date: Sun, 12 Apr 2026 16:52:28 +0700 Subject: [PATCH] fix(providerresolve): add debug logging for background provider resolution - Log loaded system_configs (background.provider, agent.default_provider) - Log provider lookup attempts with source and error details - Warn when falling back to first registered provider - Surface config load errors instead of silently swallowing them Helps diagnose provider resolution failures in episodic/vault workers. --- .../providerresolve/background_provider.go | 30 +++++++++++++++---- 1 file changed, 25 insertions(+), 5 deletions(-) diff --git a/internal/providerresolve/background_provider.go b/internal/providerresolve/background_provider.go index ad8a54f0..60667810 100644 --- a/internal/providerresolve/background_provider.go +++ b/internal/providerresolve/background_provider.go @@ -2,6 +2,7 @@ package providerresolve import ( "context" + "log/slog" "github.com/google/uuid" "github.com/nextlevelbuilder/goclaw/internal/providers" @@ -25,40 +26,59 @@ func ResolveBackgroundProvider( var configs map[string]string if systemConfigs != nil { tctx := store.WithTenantID(ctx, tenantID) - configs, _ = systemConfigs.List(tctx) + var err error + configs, err = systemConfigs.List(tctx) + if err != nil { + slog.Warn("background: failed to load system_configs", "tenant", tenantID, "error", err) + } else { + slog.Debug("background: loaded system_configs", + "tenant", tenantID, + "background.provider", configs["background.provider"], + "agent.default_provider", configs["agent.default_provider"]) + } } // tryResolve attempts to get a provider by name - tryResolve := func(name, model string) (providers.Provider, string, bool) { + tryResolve := func(name, model, source string) (providers.Provider, string, bool) { if name == "" { return nil, "", false } p, err := registry.GetForTenant(tenantID, name) if err != nil || p == nil { + slog.Debug("background: provider not found", + "source", source, "name", name, "tenant", tenantID, "error", err) return nil, "", false } if model == "" { model = p.DefaultModel() } + slog.Debug("background: resolved provider", + "source", source, "name", name, "model", model, "tenant", tenantID) return p, model, true } // 1. Explicit background config - if p, m, ok := tryResolve(configs["background.provider"], configs["background.model"]); ok { + if p, m, ok := tryResolve(configs["background.provider"], configs["background.model"], "background.provider"); ok { return p, m } // 2. Agent default provider - if p, m, ok := tryResolve(configs["agent.default_provider"], configs["agent.default_model"]); ok { + if p, m, ok := tryResolve(configs["agent.default_provider"], configs["agent.default_model"], "agent.default_provider"); ok { return p, m } - // 3. First registered provider + // 3. First registered provider (fallback) names := registry.ListForTenant(tenantID) if len(names) == 0 { + slog.Warn("background: no providers available", "tenant", tenantID) return nil, "" } p, err := registry.GetForTenant(tenantID, names[0]) if err != nil { + slog.Warn("background: fallback provider failed", "tenant", tenantID, "name", names[0], "error", err) return nil, "" } + slog.Warn("background: using fallback provider (no explicit config)", + "tenant", tenantID, "provider", names[0], "available", names, + "background.provider", configs["background.provider"], + "agent.default_provider", configs["agent.default_provider"]) return p, p.DefaultModel() }