package processing import "strings" // Analytics provider mode labels (must match aiprovider.AnalyticsMode contract). const ( AIProviderInternal = "internal" AIProviderCustom = "custom" AIProviderUnknown = "unknown" ) // ProviderLabeler optionally reports the analytics mode for a Completer. type ProviderLabeler interface { ProviderModeLabel() string } // CompleterProviderMode returns the analytics label for a Completer. func CompleterProviderMode(c Completer) string { if c == nil { return AIProviderUnknown } if p, ok := c.(ProviderLabeler); ok { return normalizeProviderMode(p.ProviderModeLabel()) } // Historical env-backed OpenAI clients without an explicit label. return AIProviderInternal } // EngineProviderMode returns Engine.ProviderMode when set, else CompleterProviderMode. func (e *Engine) EngineProviderMode() string { if e == nil { return AIProviderUnknown } if label := strings.TrimSpace(e.ProviderMode); label != "" { return normalizeProviderMode(label) } return CompleterProviderMode(e.Completer) } func normalizeProviderMode(label string) string { m := strings.ToLower(strings.TrimSpace(label)) switch { case m == "" || m == AIProviderUnknown: return AIProviderUnknown case m == AIProviderInternal: return AIProviderInternal case m == AIProviderCustom: return AIProviderCustom case strings.HasPrefix(m, "popular:"): name := strings.TrimSpace(strings.TrimPrefix(m, "popular:")) if name == "" { name = "unknown" } return "popular:" + name default: return AIProviderUnknown } } // isUnknownProviderMode reports empty or the sentinel "unknown" analytics label. func isUnknownProviderMode(label string) bool { m := strings.ToLower(strings.TrimSpace(label)) return m == "" || m == AIProviderUnknown } // preferKnownProviderMode returns the first non-unknown label, else unknown. func preferKnownProviderMode(candidates ...string) string { for _, c := range candidates { if !isUnknownProviderMode(c) { return normalizeProviderMode(c) } } return AIProviderUnknown } func lastResultAIProviderMode(r *StepResult) string { if r == nil { return "" } return r.AIProviderMode }