73 lines
2.5 KiB
Python
73 lines
2.5 KiB
Python
import os
|
|
from dataclasses import dataclass
|
|
|
|
|
|
@dataclass
|
|
class Settings:
|
|
# Hotkeys (Windows format for `keyboard` lib)
|
|
shortcut_capture: str = "ctrl+shift+1"
|
|
shortcut_send: str = "ctrl+shift+2"
|
|
shortcut_action3: str = "ctrl+shift+3"
|
|
shortcut_reset: str = "ctrl+shift+4"
|
|
shortcut_quit: str = "ctrl+shift+5"
|
|
shortcut_toggle_mode: str = "ctrl+shift+6"
|
|
|
|
# OpenAI
|
|
model: str = "Google Gemini_2.5"
|
|
prompt: str = (
|
|
"You are a helpful assistant. Analyze the images and answer clearly."
|
|
)
|
|
retries: int = 3
|
|
request_timeout_s: int = 60
|
|
# Configurable API base and key. If left empty, env vars are used.
|
|
# Typical base: https://api.openai.com/v1
|
|
endpoint_base: str = "https://api.muzhen.org/v1"
|
|
api_key: str = "falconfang"
|
|
|
|
# Typing and clipboard behavior
|
|
type_interval_s: float = 0.015
|
|
|
|
# Data storage
|
|
app_dir: str = os.path.join(
|
|
os.environ.get("LOCALAPPDATA", os.path.expanduser("~/.local/share")),
|
|
"BgVisionAgent",
|
|
)
|
|
captures_dir_name: str = "captures"
|
|
response_file_name: str = "response.txt"
|
|
log_file_name: str = "agent.log"
|
|
suppress_hotkeys: bool = True
|
|
|
|
def __post_init__(self):
|
|
# Allow hotkey overrides via environment variables for easy customization
|
|
# Example: set BG_AGENT_SHORTCUT_SEND="ctrl+shift+enter"
|
|
env_map = {
|
|
"BG_AGENT_SHORTCUT_CAPTURE": "shortcut_capture",
|
|
"BG_AGENT_SHORTCUT_SEND": "shortcut_send",
|
|
"BG_AGENT_SHORTCUT_ACTION3": "shortcut_action3",
|
|
"BG_AGENT_SHORTCUT_RESET": "shortcut_reset",
|
|
"BG_AGENT_SHORTCUT_QUIT": "shortcut_quit",
|
|
"BG_AGENT_SHORTCUT_TOGGLE_MODE": "shortcut_toggle_mode",
|
|
}
|
|
for env, attr in env_map.items():
|
|
val = os.environ.get(env)
|
|
if val:
|
|
setattr(self, attr, val)
|
|
|
|
# Optional: allow disabling suppression via env
|
|
sup = os.environ.get("BG_AGENT_SUPPRESS_HOTKEYS")
|
|
if sup is not None:
|
|
v = str(sup).strip().lower()
|
|
self.suppress_hotkeys = v in {"1", "true", "yes", "on"}
|
|
|
|
|
|
def ensure_dirs(cfg: Settings) -> None:
|
|
os.makedirs(cfg.app_dir, exist_ok=True)
|
|
os.makedirs(os.path.join(cfg.app_dir, cfg.captures_dir_name), exist_ok=True)
|
|
|
|
|
|
def data_paths(cfg: Settings):
|
|
captures_dir = os.path.join(cfg.app_dir, cfg.captures_dir_name)
|
|
response_path = os.path.join(cfg.app_dir, cfg.response_file_name)
|
|
log_path = os.path.join(cfg.app_dir, cfg.log_file_name)
|
|
return captures_dir, response_path, log_path
|