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
128
129
130
|
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"`
StripThinkingFromAPI bool `toml:"StripThinkingFromAPI"`
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"`
CodingDir string `toml:"CodingDir"`
ImagePreview bool `toml:"ImagePreview"`
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
}
|