Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

170 řádky
3.7KB

  1. package domain
  2. import (
  3. "math"
  4. "strings"
  5. )
  6. const (
  7. LLMProviderOpenAI = "openai"
  8. LLMProviderAnthropic = "anthropic"
  9. LLMProviderGoogle = "google"
  10. LLMProviderXAI = "xai"
  11. LLMProviderOllama = "ollama"
  12. defaultLLMTemperature = 0.2
  13. minLLMTemperature = 0.0
  14. maxLLMTemperature = 2.0
  15. defaultLLMMaxTokens = 1200
  16. minLLMMaxTokens = 64
  17. maxLLMMaxTokens = 8192
  18. )
  19. type LLMModelOption struct {
  20. Value string
  21. Label string
  22. }
  23. type LLMProviderOption struct {
  24. Value string
  25. Label string
  26. Models []LLMModelOption
  27. }
  28. func DefaultLLMProvider() string {
  29. return LLMProviderOpenAI
  30. }
  31. func LLMProviderOptions() []LLMProviderOption {
  32. return []LLMProviderOption{
  33. {
  34. Value: LLMProviderOpenAI,
  35. Label: "OpenAI",
  36. Models: []LLMModelOption{
  37. {Value: "gpt-5.2", Label: "gpt-5.2"},
  38. {Value: "gpt-5.4", Label: "gpt-5.4"},
  39. },
  40. },
  41. {
  42. Value: LLMProviderAnthropic,
  43. Label: "Anthropic",
  44. Models: []LLMModelOption{
  45. {Value: "claude-sonnet-4-5", Label: "claude-sonnet-4-5"},
  46. {Value: "claude-opus-4-1", Label: "claude-opus-4-1"},
  47. },
  48. },
  49. {
  50. Value: LLMProviderGoogle,
  51. Label: "Google",
  52. Models: []LLMModelOption{
  53. {Value: "gemini-2.5-pro", Label: "gemini-2.5-pro"},
  54. {Value: "gemini-2.5-flash", Label: "gemini-2.5-flash"},
  55. },
  56. },
  57. {
  58. Value: LLMProviderXAI,
  59. Label: "xAI",
  60. Models: []LLMModelOption{
  61. {Value: "grok-4", Label: "grok-4"},
  62. {Value: "grok-3-mini", Label: "grok-3-mini"},
  63. },
  64. },
  65. {
  66. Value: LLMProviderOllama,
  67. Label: "Ollama",
  68. Models: []LLMModelOption{
  69. {Value: "llama3.2", Label: "llama3.2"},
  70. {Value: "qwen2.5", Label: "qwen2.5"},
  71. {Value: "mistral", Label: "mistral"},
  72. },
  73. },
  74. }
  75. }
  76. func LLMModelsByProvider(provider string) []LLMModelOption {
  77. normalized := NormalizeLLMProvider(provider)
  78. for _, option := range LLMProviderOptions() {
  79. if option.Value == normalized {
  80. out := make([]LLMModelOption, len(option.Models))
  81. copy(out, option.Models)
  82. return out
  83. }
  84. }
  85. return nil
  86. }
  87. func NormalizeLLMProvider(provider string) string {
  88. value := strings.ToLower(strings.TrimSpace(provider))
  89. for _, option := range LLMProviderOptions() {
  90. if option.Value == value {
  91. return value
  92. }
  93. }
  94. return DefaultLLMProvider()
  95. }
  96. func NormalizeLLMModel(provider, model string) string {
  97. models := LLMModelsByProvider(provider)
  98. if len(models) == 0 {
  99. return ""
  100. }
  101. value := strings.TrimSpace(model)
  102. for _, option := range models {
  103. if option.Value == value {
  104. return value
  105. }
  106. }
  107. return models[0].Value
  108. }
  109. func DefaultLLMTemperature() float64 {
  110. return defaultLLMTemperature
  111. }
  112. func NormalizeLLMTemperature(value float64) float64 {
  113. if math.IsNaN(value) || math.IsInf(value, 0) {
  114. return defaultLLMTemperature
  115. }
  116. if value < minLLMTemperature {
  117. value = minLLMTemperature
  118. }
  119. if value > maxLLMTemperature {
  120. value = maxLLMTemperature
  121. }
  122. return math.Round(value*100) / 100
  123. }
  124. func DefaultLLMMaxTokens() int {
  125. return defaultLLMMaxTokens
  126. }
  127. func NormalizeLLMMaxTokens(value int) int {
  128. if value <= 0 {
  129. return defaultLLMMaxTokens
  130. }
  131. if value < minLLMMaxTokens {
  132. return minLLMMaxTokens
  133. }
  134. if value > maxLLMMaxTokens {
  135. return maxLLMMaxTokens
  136. }
  137. return value
  138. }
  139. func LLMAPIKeyForProvider(provider string, settings AppSettings) string {
  140. switch NormalizeLLMProvider(provider) {
  141. case LLMProviderOpenAI:
  142. return strings.TrimSpace(settings.OpenAIAPIKeyEncrypted)
  143. case LLMProviderAnthropic:
  144. return strings.TrimSpace(settings.AnthropicAPIKeyEncrypted)
  145. case LLMProviderGoogle:
  146. return strings.TrimSpace(settings.GoogleAPIKeyEncrypted)
  147. case LLMProviderXAI:
  148. return strings.TrimSpace(settings.XAIAPIKeyEncrypted)
  149. case LLMProviderOllama:
  150. return strings.TrimSpace(settings.OllamaAPIKeyEncrypted)
  151. default:
  152. return ""
  153. }
  154. }