package service import ( "net/url" "strings" ) func buildOpenAIEndpointURL(base string, endpoint string) string { normalized := strings.TrimRight(strings.TrimSpace(base), "/") endpoint = "/" + strings.TrimLeft(strings.TrimSpace(endpoint), "/") relative := strings.TrimPrefix(endpoint, "/v1") if strings.HasSuffix(normalized, endpoint) || strings.HasSuffix(normalized, relative) { return normalized } if openAIBaseURLHasVersionSuffix(normalized) { return normalized + relative } return normalized + endpoint } func openAIBaseURLHasVersionSuffix(raw string) bool { trimmed := strings.TrimSpace(raw) if trimmed == "" { return false } pathValue := "" if parsed, err := url.Parse(trimmed); err == nil && parsed.Scheme != "" && parsed.Host != "" { pathValue = parsed.Path } else if slash := strings.Index(trimmed, "/"); slash >= 0 { pathValue = trimmed[slash:] } pathValue = strings.TrimRight(pathValue, "/") if pathValue == "" { return false } lastSlash := strings.LastIndex(pathValue, "/") segment := pathValue if lastSlash >= 0 { segment = pathValue[lastSlash+1:] } return isOpenAIAPIVersionSegment(segment) } func isOpenAIAPIVersionSegment(segment string) bool { s := strings.ToLower(strings.TrimSpace(segment)) if len(s) < 2 || s[0] != 'v' || !isASCIIDigit(s[1]) { return false } i := 1 for i < len(s) && isASCIIDigit(s[i]) { i++ } if i == len(s) { return true } if s[i] == '.' { i++ if i == len(s) || !isASCIIDigit(s[i]) { return false } for i < len(s) && isASCIIDigit(s[i]) { i++ } return i == len(s) } suffix := s[i:] return strings.HasPrefix(suffix, "alpha") || strings.HasPrefix(suffix, "beta") || strings.HasPrefix(suffix, "preview") } func isASCIIDigit(b byte) bool { return b >= '0' && b <= '9' }