-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.py
More file actions
139 lines (115 loc) · 4.64 KB
/
config.py
File metadata and controls
139 lines (115 loc) · 4.64 KB
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
131
132
133
134
135
136
137
138
139
import os
import json
from dotenv import load_dotenv, set_key
PROVIDER_MODELS = {
"gemini": [
"gemini-3-pro-preview", "gemini-3-flash-preview",
"gemini-2.5-pro", "gemini-2.5-flash",
"gemini-2.5-flash-lite"
],
"openai": [
"gpt-5.2-2025-12-11", "gpt-5-mini-2025-08-07", "gpt-5-nano-2025-08-07",
"gpt-5.2-pro-2025-12-11"
],
"ollama": ["llama3", "mistral", "gemma", "codellama", "qwen2.5-coder", "deepseek-coder"]
}
class ConfigManager:
def __init__(self):
load_dotenv()
self.env_file = ".env"
self.settings_file = "settings.json"
# Load Env Vars
self.api_key = os.getenv("GEMINI_API_KEY") or os.getenv("API_KEY")
self.model_name = os.getenv("MODEL_NAME", "gemini-2.0-flash")
# Load Settings JSON
self.settings = self._load_settings()
def _load_settings(self):
if not os.path.exists(self.settings_file):
defaults = {
"recent_repos": [],
"provider": "gemini",
"system_prompt": None,
"window_geometry": {"width": 600, "height": 500},
"theme": "Dark"
}
try:
with open(self.settings_file, 'w') as f:
json.dump(defaults, f, indent=4)
except Exception as e:
print(f"Error creating default settings file: {e}")
return defaults
try:
with open(self.settings_file, 'r') as f:
data = json.load(f)
# Ensure keys exist
if "recent_repos" not in data: data["recent_repos"] = []
if "provider" not in data: data["provider"] = "gemini"
if "system_prompt" not in data: data["system_prompt"] = None
if "window_geometry" not in data: data["window_geometry"] = {"width": 600, "height": 500}
if "theme" not in data: data["theme"] = "Dark"
return data
except:
return {
"recent_repos": [],
"provider": "gemini",
"system_prompt": None,
"window_geometry": {"width": 600, "height": 500},
"theme": "Dark"
}
def save_settings(self):
try:
with open(self.settings_file, 'w') as f:
json.dump(self.settings, f, indent=4)
except Exception as e:
print(f"Error saving settings: {e}")
def validate(self):
if self.get_provider() == "gemini":
if not self.api_key:
return False, "GEMINI_API_KEY not found in environment variables."
# Ollama might not need a key, or uses 'ollama' as key
return True, "Configuration valid."
def update_credentials(self, api_key, model_name):
self.api_key = api_key
self.model_name = model_name
# Persist to .env
if not os.path.exists(self.env_file):
open(self.env_file, 'w').close()
set_key(self.env_file, "GEMINI_API_KEY", api_key)
set_key(self.env_file, "MODEL_NAME", model_name)
load_dotenv(override=True)
def get_provider(self):
return self.settings.get("provider", "gemini")
def set_provider(self, provider):
self.settings["provider"] = provider
self.save_settings()
def get_api_base_url(self):
provider = self.get_provider()
if provider == "ollama":
return "http://localhost:11434/v1"
return "https://generativelanguage.googleapis.com/v1beta/openai/"
def get_recent_repos(self):
return self.settings.get("recent_repos", [])
def add_recent_repo(self, path):
repos = self.get_recent_repos()
if path in repos:
repos.remove(path)
repos.insert(0, path)
self.settings["recent_repos"] = repos[:10]
self.save_settings()
def get_system_prompt(self):
return self.settings.get("system_prompt")
def set_system_prompt(self, prompt):
self.settings["system_prompt"] = prompt
self.save_settings()
def get_window_geometry(self):
return self.settings.get("window_geometry", {"width": 600, "height": 500})
def set_window_geometry(self, width, height):
self.settings["window_geometry"] = {"width": width, "height": height}
self.save_settings()
def get_theme(self):
return self.settings.get("theme", "Dark")
def set_theme(self, theme):
self.settings["theme"] = theme
self.save_settings()
def get_supported_models(self, provider):
return PROVIDER_MODELS.get(provider, [])