Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

172 rindas
3.8KB

  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. {Value: "gpt-5.4-mini", Label: "gpt-5.4-mini"},
  40. {Value: "gpt-5.4-nano", Label: "gpt-5.4-nano"},
  41. },
  42. },
  43. {
  44. Value: LLMProviderAnthropic,
  45. Label: "Anthropic",
  46. Models: []LLMModelOption{
  47. {Value: "claude-sonnet-4-5", Label: "claude-sonnet-4-5"},
  48. {Value: "claude-opus-4-1", Label: "claude-opus-4-1"},
  49. },
  50. },
  51. {
  52. Value: LLMProviderGoogle,
  53. Label: "Google",
  54. Models: []LLMModelOption{
  55. {Value: "gemini-2.5-pro", Label: "gemini-2.5-pro"},
  56. {Value: "gemini-2.5-flash", Label: "gemini-2.5-flash"},
  57. },
  58. },
  59. {
  60. Value: LLMProviderXAI,
  61. Label: "xAI",
  62. Models: []LLMModelOption{
  63. {Value: "grok-4", Label: "grok-4"},
  64. {Value: "grok-3-mini", Label: "grok-3-mini"},
  65. },
  66. },
  67. {
  68. Value: LLMProviderOllama,
  69. Label: "Ollama",
  70. Models: []LLMModelOption{
  71. {Value: "llama3.2", Label: "llama3.2"},
  72. {Value: "qwen2.5", Label: "qwen2.5"},
  73. {Value: "mistral", Label: "mistral"},
  74. },
  75. },
  76. }
  77. }
  78. func LLMModelsByProvider(provider string) []LLMModelOption {
  79. normalized := NormalizeLLMProvider(provider)
  80. for _, option := range LLMProviderOptions() {
  81. if option.Value == normalized {
  82. out := make([]LLMModelOption, len(option.Models))
  83. copy(out, option.Models)
  84. return out
  85. }
  86. }
  87. return nil
  88. }
  89. func NormalizeLLMProvider(provider string) string {
  90. value := strings.ToLower(strings.TrimSpace(provider))
  91. for _, option := range LLMProviderOptions() {
  92. if option.Value == value {
  93. return value
  94. }
  95. }
  96. return DefaultLLMProvider()
  97. }
  98. func NormalizeLLMModel(provider, model string) string {
  99. models := LLMModelsByProvider(provider)
  100. if len(models) == 0 {
  101. return ""
  102. }
  103. value := strings.TrimSpace(model)
  104. for _, option := range models {
  105. if option.Value == value {
  106. return value
  107. }
  108. }
  109. return models[0].Value
  110. }
  111. func DefaultLLMTemperature() float64 {
  112. return defaultLLMTemperature
  113. }
  114. func NormalizeLLMTemperature(value float64) float64 {
  115. if math.IsNaN(value) || math.IsInf(value, 0) {
  116. return defaultLLMTemperature
  117. }
  118. if value < minLLMTemperature {
  119. value = minLLMTemperature
  120. }
  121. if value > maxLLMTemperature {
  122. value = maxLLMTemperature
  123. }
  124. return math.Round(value*100) / 100
  125. }
  126. func DefaultLLMMaxTokens() int {
  127. return defaultLLMMaxTokens
  128. }
  129. func NormalizeLLMMaxTokens(value int) int {
  130. if value <= 0 {
  131. return defaultLLMMaxTokens
  132. }
  133. if value < minLLMMaxTokens {
  134. return minLLMMaxTokens
  135. }
  136. if value > maxLLMMaxTokens {
  137. return maxLLMMaxTokens
  138. }
  139. return value
  140. }
  141. func LLMAPIKeyForProvider(provider string, settings AppSettings) string {
  142. switch NormalizeLLMProvider(provider) {
  143. case LLMProviderOpenAI:
  144. return strings.TrimSpace(settings.OpenAIAPIKeyEncrypted)
  145. case LLMProviderAnthropic:
  146. return strings.TrimSpace(settings.AnthropicAPIKeyEncrypted)
  147. case LLMProviderGoogle:
  148. return strings.TrimSpace(settings.GoogleAPIKeyEncrypted)
  149. case LLMProviderXAI:
  150. return strings.TrimSpace(settings.XAIAPIKeyEncrypted)
  151. case LLMProviderOllama:
  152. return strings.TrimSpace(settings.OllamaAPIKeyEncrypted)
  153. default:
  154. return ""
  155. }
  156. }