2026-08-09 22:47:43 +02:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-08-16 16:57:36 +02:00
|
|
|
|
|
|
|
|
// 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
|
|
|
|
|
}
|