claude.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package model_setting
  2. import (
  3. "net/http"
  4. "strings"
  5. "github.com/QuantumNous/new-api/setting/config"
  6. )
  7. //var claudeHeadersSettings = map[string][]string{}
  8. //
  9. //var ClaudeThinkingAdapterEnabled = true
  10. //var ClaudeThinkingAdapterMaxTokens = 8192
  11. //var ClaudeThinkingAdapterBudgetTokensPercentage = 0.8
  12. // ClaudeSettings 定义Claude模型的配置
  13. type ClaudeSettings struct {
  14. HeadersSettings map[string]map[string][]string `json:"model_headers_settings"`
  15. DefaultMaxTokens map[string]int `json:"default_max_tokens"`
  16. ThinkingAdapterEnabled bool `json:"thinking_adapter_enabled"`
  17. ThinkingAdapterBudgetTokensPercentage float64 `json:"thinking_adapter_budget_tokens_percentage"`
  18. }
  19. // 默认配置
  20. var defaultClaudeSettings = ClaudeSettings{
  21. HeadersSettings: map[string]map[string][]string{},
  22. ThinkingAdapterEnabled: true,
  23. DefaultMaxTokens: map[string]int{
  24. "default": 8192,
  25. },
  26. ThinkingAdapterBudgetTokensPercentage: 0.8,
  27. }
  28. // 全局实例
  29. var claudeSettings = defaultClaudeSettings
  30. func init() {
  31. // 注册到全局配置管理器
  32. config.GlobalConfig.Register("claude", &claudeSettings)
  33. }
  34. // GetClaudeSettings 获取Claude配置
  35. func GetClaudeSettings() *ClaudeSettings {
  36. // check default max tokens must have default key
  37. if _, ok := claudeSettings.DefaultMaxTokens["default"]; !ok {
  38. claudeSettings.DefaultMaxTokens["default"] = 8192
  39. }
  40. return &claudeSettings
  41. }
  42. func (c *ClaudeSettings) WriteHeaders(originModel string, httpHeader *http.Header) {
  43. if headers, ok := c.HeadersSettings[originModel]; ok {
  44. for headerKey, headerValues := range headers {
  45. mergedValues := normalizeHeaderListValues(
  46. append(append([]string(nil), httpHeader.Values(headerKey)...), headerValues...),
  47. )
  48. if len(mergedValues) == 0 {
  49. continue
  50. }
  51. httpHeader.Set(headerKey, strings.Join(mergedValues, ","))
  52. }
  53. }
  54. }
  55. func normalizeHeaderListValues(values []string) []string {
  56. normalizedValues := make([]string, 0, len(values))
  57. seenValues := make(map[string]struct{}, len(values))
  58. for _, value := range values {
  59. for _, item := range strings.Split(value, ",") {
  60. normalizedItem := strings.TrimSpace(item)
  61. if normalizedItem == "" {
  62. continue
  63. }
  64. if _, exists := seenValues[normalizedItem]; exists {
  65. continue
  66. }
  67. seenValues[normalizedItem] = struct{}{}
  68. normalizedValues = append(normalizedValues, normalizedItem)
  69. }
  70. }
  71. return normalizedValues
  72. }
  73. func (c *ClaudeSettings) GetDefaultMaxTokens(model string) int {
  74. if maxTokens, ok := c.DefaultMaxTokens[model]; ok {
  75. return maxTokens
  76. }
  77. return c.DefaultMaxTokens["default"]
  78. }