mirror of
https://gh-proxy.org/https://github.com/klinsmaya/CLIProxyAPI.git
synced 2026-11-09 01:46:48 +08:00
- Added `EnsureClaudeModelIDPrefix` and `ResolveClaudeModelIDPrefix` utilities for standardizing and decoding Claude model IDs. - Updated handling of `claude-fable-5-dd-<reversed>` model IDs for request routing and response formatting. - Incorporated logic to enforce disabled states for plugin virtual auths and their expanded children. - Refactored code for applying and persisting disabled state metadata in plugin multi-auth scenarios. - Implemented and extended unit tests to validate expected behavior.
64 lines
1.9 KiB
Go
64 lines
1.9 KiB
Go
package util
|
|
|
|
import "strings"
|
|
|
|
// IsClaudeThinkingModel checks if the model is a Claude thinking model
|
|
// that requires the interleaved-thinking beta header.
|
|
func IsClaudeThinkingModel(model string) bool {
|
|
lower := strings.ToLower(model)
|
|
return strings.Contains(lower, "claude") && strings.Contains(lower, "thinking")
|
|
}
|
|
|
|
const claudeDDModelPrefix = "claude-fable-5-dd-"
|
|
|
|
// EnsureClaudeModelIDPrefix rewrites model IDs for Anthropic /models listings.
|
|
// IDs that already start with "claude-" are returned unchanged; all other IDs
|
|
// become "claude-fable-5-dd-" plus the original ID with its characters reversed.
|
|
func EnsureClaudeModelIDPrefix(id string) string {
|
|
if id == "" {
|
|
return id
|
|
}
|
|
if strings.HasPrefix(id, "claude-") {
|
|
return id
|
|
}
|
|
return claudeDDModelPrefix + reverseModelID(id)
|
|
}
|
|
|
|
// ResolveClaudeModelIDPrefix reverses EnsureClaudeModelIDPrefix for request routing.
|
|
// IDs that start with "claude-fable-5-dd-" are decoded by stripping the prefix and reversing
|
|
// the remainder. Optional thinking suffixes in model(value) form are preserved.
|
|
func ResolveClaudeModelIDPrefix(id string) string {
|
|
if id == "" {
|
|
return id
|
|
}
|
|
base, suffix, hasSuffix := splitModelThinkingSuffix(id)
|
|
if !strings.HasPrefix(base, claudeDDModelPrefix) {
|
|
return id
|
|
}
|
|
encoded := base[len(claudeDDModelPrefix):]
|
|
if encoded == "" {
|
|
return id
|
|
}
|
|
resolved := reverseModelID(encoded)
|
|
if hasSuffix {
|
|
return resolved + "(" + suffix + ")"
|
|
}
|
|
return resolved
|
|
}
|
|
|
|
func splitModelThinkingSuffix(model string) (base, suffix string, hasSuffix bool) {
|
|
lastOpen := strings.LastIndex(model, "(")
|
|
if lastOpen == -1 || !strings.HasSuffix(model, ")") {
|
|
return model, "", false
|
|
}
|
|
return model[:lastOpen], model[lastOpen+1 : len(model)-1], true
|
|
}
|
|
|
|
func reverseModelID(id string) string {
|
|
runes := []rune(id)
|
|
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
|
|
runes[i], runes[j] = runes[j], runes[i]
|
|
}
|
|
return string(runes)
|
|
}
|