-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfig.py
More file actions
106 lines (86 loc) · 3.19 KB
/
config.py
File metadata and controls
106 lines (86 loc) · 3.19 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
import os
from dataclasses import dataclass
from pathlib import Path
def _load_local_env() -> None:
"""Load .env once when present, without overriding existing environment vars."""
env_path = Path(__file__).resolve().parent / ".env"
if not env_path.exists():
return
for raw_line in env_path.read_text(encoding="utf-8").splitlines():
line = raw_line.strip()
if not line or line.startswith("#") or "=" not in line:
continue
key, value = line.split("=", 1)
key = key.strip()
value = value.strip().strip('"').strip("'")
if key and key not in os.environ:
os.environ[key] = value
_load_local_env()
def _env(name: str, default: str = "") -> str:
return os.getenv(name, default).strip()
def _first_non_empty(*values: str) -> str:
for value in values:
if value and str(value).strip():
return str(value).strip()
return ""
@dataclass(frozen=True)
class Settings:
# Slack
slack_bot_token: str
slack_app_token: str
slack_bot_id: str
slack_legacy_mention_prefix: str
# Search / LLM
serpapi_key: str
openai_api_key: str
openai_api_base: str
llm_model_name: str
llm_fallback_model_name: str
llm_vision_model_name: str
# Database
db_host: str
db_user: str
db_password: str
db_port: int
db_name: str
def load_settings() -> Settings:
llm_model_name = _env("LLM_MODEL_NAME", "qwen-plus-2025-07-28")
llm_fallback_model_name = _env("LLM_FALLBACK_MODEL_NAME", "qwen-turbo")
# 视觉模型支持单独配置;未配置时回退主模型。
llm_vision_model_name = _first_non_empty(
_env("LLM_VISION_MODEL_NAME"),
_env("VISION_MODEL_NAME"),
llm_model_name,
)
return Settings(
slack_bot_token=_env("SLACK_BOT_TOKEN"),
slack_app_token=_env("SLACK_APP_TOKEN"),
slack_bot_id=_first_non_empty(_env("SLACK_BOT_ID"), _env("BOT_ID"), "bot_id"),
slack_legacy_mention_prefix=_env("SLACK_LEGACY_MENTION_PREFIX", "@coresearchagent_kx"),
serpapi_key=_env("SERPAPI_KEY"),
openai_api_key=_first_non_empty(_env("OPENAI_API_KEY"), _env("OPENAI_KEY")),
openai_api_base=_env(
"OPENAI_API_BASE", "https://dashscope.aliyuncs.com/compatible-mode/v1"
),
llm_model_name=llm_model_name,
llm_fallback_model_name=llm_fallback_model_name,
llm_vision_model_name=llm_vision_model_name,
db_host=_env("DB_HOST", "localhost"),
db_user=_env("DB_USER", "root"),
db_password=_first_non_empty(_env("DB_PASSWORD"), _env("SQL_PASSWORD"), "root123456"),
db_port=int(_env("DB_PORT", "3306")),
db_name=_env("DB_NAME", "mysql"),
)
settings = load_settings()
def validate_required_settings() -> None:
missing = []
if not settings.slack_bot_token:
missing.append("SLACK_BOT_TOKEN")
if not settings.slack_app_token:
missing.append("SLACK_APP_TOKEN")
if not settings.openai_api_key:
missing.append("OPENAI_API_KEY")
if not settings.serpapi_key:
missing.append("SERPAPI_KEY")
if missing:
raise RuntimeError("Missing required settings: " + ", ".join(missing))