summaryrefslogtreecommitdiff
path: root/config/config.go
blob: bed24f65de364551718f4c1e3311967a3cb70808 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package config

import (
	"os"

	"github.com/BurntSushi/toml"
)

type Config struct {
	ChatAPI                       string `toml:"ChatAPI"`
	CompletionAPI                 string `toml:"CompletionAPI"`
	CurrentAPI                    string
	CurrentModel                  string `toml:"CurrentModel"`
	APIMap                        map[string]string
	FetchModelNameAPI             string `toml:"FetchModelNameAPI"`
	ShowSys                       bool   `toml:"ShowSys"`
	LogFile                       string `toml:"LogFile"`
	UserRole                      string `toml:"UserRole"`
	ToolRole                      string `toml:"ToolRole"`
	ToolUse                       bool   `toml:"ToolUse"`
	ThinkUse                      bool   `toml:"ThinkUse"`
	AssistantRole                 string `toml:"AssistantRole"`
	SysDir                        string `toml:"SysDir"`
	ChunkLimit                    uint32 `toml:"ChunkLimit"`
	AutoScrollEnabled             bool   `toml:"AutoScrollEnabled"`
	WriteNextMsgAs                string
	WriteNextMsgAsCompletionAgent string
	SkipLLMResp                   bool
	AutoCleanToolCallsFromCtx     bool   `toml:"AutoCleanToolCallsFromCtx"`
	DBPATH                        string `toml:"DBPATH"`
	FilePickerDir                 string `toml:"FilePickerDir"`
	FilePickerExts                string `toml:"FilePickerExts"`
	EnableMouse                   bool   `toml:"EnableMouse"`
	// embeddings
	RAGEnabled bool   `toml:"RAGEnabled"`
	EmbedURL   string `toml:"EmbedURL"`
	HFToken    string `toml:"HFToken"`
	RAGDir     string `toml:"RAGDir"`
	// rag settings
	RAGWorkers   uint32 `toml:"RAGWorkers"`
	RAGBatchSize int    `toml:"RAGBatchSize"`
	RAGWordLimit uint32 `toml:"RAGWordLimit"`
	// deepseek
	DeepSeekChatAPI       string `toml:"DeepSeekChatAPI"`
	DeepSeekCompletionAPI string `toml:"DeepSeekCompletionAPI"`
	DeepSeekToken         string `toml:"DeepSeekToken"`
	DeepSeekModel         string `toml:"DeepSeekModel"`
	ApiLinks              []string
	// openrouter
	OpenRouterChatAPI       string `toml:"OpenRouterChatAPI"`
	OpenRouterCompletionAPI string `toml:"OpenRouterCompletionAPI"`
	OpenRouterToken         string `toml:"OpenRouterToken"`
	OpenRouterModel         string `toml:"OpenRouterModel"`
	// TTS
	TTS_URL      string  `toml:"TTS_URL"`
	TTS_ENABLED  bool    `toml:"TTS_ENABLED"`
	TTS_SPEED    float32 `toml:"TTS_SPEED"`
	TTS_PROVIDER string  `toml:"TTS_PROVIDER"`
	TTS_LANGUAGE string  `toml:"TTS_LANGUAGE"`
	// STT
	STT_TYPE          string `toml:"STT_TYPE"` // WHISPER_SERVER, WHISPER_BINARY
	STT_URL           string `toml:"STT_URL"`
	STT_SR            int    `toml:"STT_SR"`
	STT_ENABLED       bool   `toml:"STT_ENABLED"`
	WhisperBinaryPath string `toml:"WhisperBinaryPath"`
	WhisperModelPath  string `toml:"WhisperModelPath"`
	STT_LANG          string `toml:"STT_LANG"`
	// character spefic contetx
	CharSpecificContextEnabled bool   `toml:"CharSpecificContextEnabled"`
	CharSpecificContextTag     string `toml:"CharSpecificContextTag"`
	AutoTurn                   bool   `toml:"AutoTurn"`
}

func LoadConfig(fn string) (*Config, error) {
	if fn == "" {
		fn = "config.toml"
	}
	config := &Config{}
	_, err := toml.DecodeFile(fn, &config)
	if err != nil {
		return nil, err
	}
	config.CurrentAPI = config.ChatAPI
	config.APIMap = map[string]string{
		config.ChatAPI:                 config.CompletionAPI,
		config.CompletionAPI:           config.DeepSeekChatAPI,
		config.DeepSeekChatAPI:         config.DeepSeekCompletionAPI,
		config.DeepSeekCompletionAPI:   config.OpenRouterCompletionAPI,
		config.OpenRouterCompletionAPI: config.OpenRouterChatAPI,
		config.OpenRouterChatAPI:       config.ChatAPI,
	}
	// check env if keys not in config
	if config.OpenRouterToken == "" {
		config.OpenRouterToken = os.Getenv("OPENROUTER_API_KEY")
	}
	if config.DeepSeekToken == "" {
		config.DeepSeekToken = os.Getenv("DEEPSEEK_API_KEY")
	}
	// Build ApiLinks slice with only non-empty API links
	// Only include DeepSeek APIs if DeepSeekToken is provided
	if config.DeepSeekToken != "" {
		if config.DeepSeekChatAPI != "" {
			config.ApiLinks = append(config.ApiLinks, config.DeepSeekChatAPI)
		}
		if config.DeepSeekCompletionAPI != "" {
			config.ApiLinks = append(config.ApiLinks, config.DeepSeekCompletionAPI)
		}
	}
	// Only include OpenRouter APIs if OpenRouterToken is provided
	if config.OpenRouterToken != "" {
		if config.OpenRouterChatAPI != "" {
			config.ApiLinks = append(config.ApiLinks, config.OpenRouterChatAPI)
		}
		if config.OpenRouterCompletionAPI != "" {
			config.ApiLinks = append(config.ApiLinks, config.OpenRouterCompletionAPI)
		}
	}
	// Always include basic APIs
	if config.ChatAPI != "" {
		config.ApiLinks = append(config.ApiLinks, config.ChatAPI)
	}
	if config.CompletionAPI != "" {
		config.ApiLinks = append(config.ApiLinks, config.CompletionAPI)
	}
	// if any value is empty fill with default
	return config, nil
}