@@ -27,25 +27,39 @@ type Check struct {
2727}
2828
2929type ConfigSummary struct {
30- Reader ReaderSummary `json:"reader"`
31- Search SearchSummary `json:"search"`
30+ Providers map [string ]ProviderSummary `json:"providers,omitempty"`
31+ Reader ReaderSummary `json:"reader"`
32+ Search SearchSummary `json:"search"`
33+ }
34+
35+ type ProviderSummary struct {
36+ Type string `json:"type"`
37+ Capabilities []string `json:"capabilities,omitempty"`
38+ AuthEnv string `json:"auth_env,omitempty"`
39+ AuthConfigured bool `json:"auth_configured,omitempty"`
40+ EnabledIfEnv string `json:"enabled_if_env,omitempty"`
41+ Enabled bool `json:"enabled"`
3242}
3343
3444type ReaderSummary struct {
35- CacheDir string `json:"cache_dir"`
36- CacheTTL int `json:"cache_ttl"`
37- DefaultTimeout int `json:"default_timeout"`
38- BrowserFallback bool `json:"browser_fallback"`
39- MarkitdownPath string `json:"markitdown_path"`
40- AgentBrowserPath string `json:"agent_browser_path"`
41- MinContentLength int `json:"min_content_length"`
45+ CacheDir string `json:"cache_dir"`
46+ CacheTTL int `json:"cache_ttl"`
47+ DefaultTimeout int `json:"default_timeout"`
48+ BrowserFallback bool `json:"browser_fallback"`
49+ MarkitdownPath string `json:"markitdown_path"`
50+ AgentBrowserPath string `json:"agent_browser_path"`
51+ MinContentLength int `json:"min_content_length"`
52+ DefaultProvider string `json:"default_provider"`
53+ DefaultProviderChain []string `json:"default_provider_chain"`
4254}
4355
4456type SearchSummary struct {
45- SearXNGURL string `json:"searxng_url"`
46- DefaultLimit int `json:"default_limit"`
47- DefaultLocale string `json:"default_locale"`
48- DefaultEngine string `json:"default_engine"`
57+ SearXNGURL string `json:"searxng_url"`
58+ DefaultLimit int `json:"default_limit"`
59+ DefaultLocale string `json:"default_locale"`
60+ DefaultEngine string `json:"default_engine"`
61+ DefaultProvider string `json:"default_provider"`
62+ DefaultProviderChain []string `json:"default_provider_chain"`
4963}
5064
5165type Report struct {
@@ -141,6 +155,7 @@ func (c checker) Run() Report {
141155 c .executableCheck ("agent-browser" , cfg .Reader .AgentBrowserPath , "optional browser fallback dependency" ),
142156 c .searxngCheck (cfg .Search .SearXNGURL ),
143157 }
158+ checks = append (checks , providerChecks (* cfg )... )
144159
145160 return Report {
146161 OK : allRequiredChecksOK (checks ),
@@ -216,24 +231,88 @@ func errorCheck(name string, message string, err error, details map[string]strin
216231
217232func summarizeConfig (cfg config.Config ) ConfigSummary {
218233 return ConfigSummary {
234+ Providers : summarizeProviders (cfg .Providers ),
219235 Reader : ReaderSummary {
220- CacheDir : cfg .Reader .CacheDir ,
221- CacheTTL : cfg .Reader .CacheTTL ,
222- DefaultTimeout : cfg .Reader .DefaultTimeout ,
223- BrowserFallback : cfg .Reader .BrowserFallback ,
224- MarkitdownPath : cfg .Reader .MarkitdownPath ,
225- AgentBrowserPath : cfg .Reader .AgentBrowserPath ,
226- MinContentLength : cfg .Reader .MinContentLength ,
236+ CacheDir : cfg .Reader .CacheDir ,
237+ CacheTTL : cfg .Reader .CacheTTL ,
238+ DefaultTimeout : cfg .Reader .DefaultTimeout ,
239+ BrowserFallback : cfg .Reader .BrowserFallback ,
240+ MarkitdownPath : cfg .Reader .MarkitdownPath ,
241+ AgentBrowserPath : cfg .Reader .AgentBrowserPath ,
242+ MinContentLength : cfg .Reader .MinContentLength ,
243+ DefaultProvider : cfg .Reader .DefaultProvider ,
244+ DefaultProviderChain : append ([]string (nil ), cfg .Reader .DefaultProviderChain ... ),
227245 },
228246 Search : SearchSummary {
229- SearXNGURL : cfg .Search .SearXNGURL ,
230- DefaultLimit : cfg .Search .DefaultLimit ,
231- DefaultLocale : cfg .Search .DefaultLocale ,
232- DefaultEngine : cfg .Search .DefaultEngine ,
247+ SearXNGURL : cfg .Search .SearXNGURL ,
248+ DefaultLimit : cfg .Search .DefaultLimit ,
249+ DefaultLocale : cfg .Search .DefaultLocale ,
250+ DefaultEngine : cfg .Search .DefaultEngine ,
251+ DefaultProvider : cfg .Search .DefaultProvider ,
252+ DefaultProviderChain : append ([]string (nil ), cfg .Search .DefaultProviderChain ... ),
233253 },
234254 }
235255}
236256
257+ func providerChecks (cfg config.Config ) []Check {
258+ checks := make ([]Check , 0 , len (cfg .Providers ))
259+ for id , provider := range cfg .Providers {
260+ details := map [string ]string {
261+ "type" : provider .Type ,
262+ "capabilities" : strings .Join (provider .Capabilities , "," ),
263+ }
264+ if provider .AuthEnv != "" {
265+ details ["auth_env" ] = provider .AuthEnv
266+ details ["auth_configured" ] = fmt .Sprintf ("%t" , os .Getenv (provider .AuthEnv ) != "" )
267+ }
268+ if provider .EnabledIfEnv != "" {
269+ details ["enabled_if_env" ] = provider .EnabledIfEnv
270+ details ["enabled" ] = fmt .Sprintf ("%t" , os .Getenv (provider .EnabledIfEnv ) != "" )
271+ } else {
272+ details ["enabled" ] = "true"
273+ }
274+ status := StatusOK
275+ message := "provider configured"
276+ if provider .EnabledIfEnv != "" && os .Getenv (provider .EnabledIfEnv ) == "" {
277+ status = StatusWarn
278+ message = "provider configured but activation env is missing"
279+ }
280+ checks = append (checks , Check {
281+ Name : "provider." + id ,
282+ Status : status ,
283+ Message : message ,
284+ Details : details ,
285+ })
286+ }
287+ return checks
288+ }
289+
290+ func summarizeProviders (providers map [string ]config.ProviderConfig ) map [string ]ProviderSummary {
291+ if len (providers ) == 0 {
292+ return nil
293+ }
294+ out := make (map [string ]ProviderSummary , len (providers ))
295+ for id , provider := range providers {
296+ enabled := true
297+ if provider .EnabledIfEnv != "" {
298+ enabled = os .Getenv (provider .EnabledIfEnv ) != ""
299+ }
300+ authConfigured := false
301+ if provider .AuthEnv != "" {
302+ authConfigured = os .Getenv (provider .AuthEnv ) != ""
303+ }
304+ out [id ] = ProviderSummary {
305+ Type : provider .Type ,
306+ Capabilities : append ([]string (nil ), provider .Capabilities ... ),
307+ AuthEnv : provider .AuthEnv ,
308+ AuthConfigured : authConfigured ,
309+ EnabledIfEnv : provider .EnabledIfEnv ,
310+ Enabled : enabled ,
311+ }
312+ }
313+ return out
314+ }
315+
237316func (r Report ) RenderJSON () string {
238317 data , err := json .MarshalIndent (r , "" , " " )
239318 if err != nil {
@@ -257,6 +336,14 @@ func (r Report) RenderText() string {
257336 sb .WriteString (fmt .Sprintf (" reader.cache_dir: %s\n " , r .Config .Reader .CacheDir ))
258337 sb .WriteString (fmt .Sprintf (" reader.browser_fallback: %t\n " , r .Config .Reader .BrowserFallback ))
259338 sb .WriteString (fmt .Sprintf (" search.default_engine: %s\n " , r .Config .Search .DefaultEngine ))
339+ sb .WriteString (fmt .Sprintf (" search.default_provider: %s\n " , r .Config .Search .DefaultProvider ))
260340 sb .WriteString (fmt .Sprintf (" search.searxng_url: %s\n " , r .Config .Search .SearXNGURL ))
341+ if len (r .Config .Providers ) > 0 {
342+ sb .WriteString ("Providers:\n " )
343+ for id , provider := range r .Config .Providers {
344+ sb .WriteString (fmt .Sprintf (" %s: type=%s enabled=%t auth_env=%s auth_configured=%t\n " ,
345+ id , provider .Type , provider .Enabled , provider .AuthEnv , provider .AuthConfigured ))
346+ }
347+ }
261348 return sb .String ()
262349}
0 commit comments