拆分 scan_terminal_service:AI 配置常量移至 scan_ai_config.py
提取 ~140 行配置+env helpers 到新模块。scan_terminal_service 1534→1474 行。
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
"""Scan terminal and AI configuration constants.
|
||||
|
||||
Extracted from scan_terminal_service.py to keep the module leaner.
|
||||
Re-exported from the original module for backward compatibility.
|
||||
"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import os
|
||||
import threading
|
||||
from typing import Any, Dict, Optional
|
||||
|
||||
|
||||
_SCAN_CITY_AI_CACHE_LOCK = threading.Lock()
|
||||
_SCAN_CITY_AI_CACHE: Dict[str, Dict[str, Any]] = {}
|
||||
|
||||
|
||||
def _env_int(
|
||||
name: str,
|
||||
default: int,
|
||||
*,
|
||||
min_value: int,
|
||||
max_value: Optional[int] = None,
|
||||
) -> int:
|
||||
try:
|
||||
value = int(os.getenv(name, str(default)))
|
||||
except Exception:
|
||||
value = int(default)
|
||||
value = max(int(min_value), value)
|
||||
if max_value is not None:
|
||||
value = min(int(max_value), value)
|
||||
return value
|
||||
|
||||
|
||||
SCAN_TERMINAL_PAYLOAD_TTL_SEC = max(
|
||||
10,
|
||||
int(os.getenv("POLYWEATHER_SCAN_TERMINAL_PAYLOAD_TTL_SEC", "120")),
|
||||
)
|
||||
SCAN_TERMINAL_BUILD_TIMEOUT_SEC = max(
|
||||
8,
|
||||
int(os.getenv("POLYWEATHER_SCAN_TERMINAL_BUILD_TIMEOUT_SEC", "120")),
|
||||
)
|
||||
SCAN_TERMINAL_MAX_WORKERS = _env_int(
|
||||
"POLYWEATHER_SCAN_TERMINAL_MAX_WORKERS",
|
||||
6,
|
||||
min_value=1,
|
||||
max_value=8,
|
||||
)
|
||||
DEFAULT_SCAN_AI_MODEL = "mimo-v2.5-pro"
|
||||
DEFAULT_SCAN_AI_BASE_URL = "https://token-plan-cn.xiaomimimo.com/v1"
|
||||
SCAN_AI_API_KEY_ENV_HINT = (
|
||||
"POLYWEATHER_SCAN_AI_API_KEY "
|
||||
"(or POLYWEATHER_MIMO_API_KEY / POLYWEATHER_DEEPSEEK_API_KEY)"
|
||||
)
|
||||
|
||||
|
||||
def _env_str(*names: str, default: str = "") -> str:
|
||||
for name in names:
|
||||
value = str(os.getenv(name) or "").strip()
|
||||
if value:
|
||||
return value
|
||||
return str(default).strip()
|
||||
|
||||
|
||||
def _scan_ai_api_key() -> str:
|
||||
return _env_str(
|
||||
"POLYWEATHER_SCAN_AI_API_KEY",
|
||||
"POLYWEATHER_MIMO_API_KEY",
|
||||
"POLYWEATHER_DEEPSEEK_API_KEY",
|
||||
)
|
||||
|
||||
|
||||
def _infer_scan_ai_provider(base_url: str, model: str) -> str:
|
||||
text = f"{base_url} {model}".lower()
|
||||
if "xiaomimimo" in text or "mimo" in text:
|
||||
return "mimo"
|
||||
if "deepseek" in text:
|
||||
return "deepseek"
|
||||
return "openai-compatible"
|
||||
|
||||
|
||||
def _scan_ai_provider_label(provider: str) -> str:
|
||||
normalized = provider.strip().lower()
|
||||
if normalized == "mimo":
|
||||
return "MiMo"
|
||||
if normalized == "deepseek":
|
||||
return "DeepSeek"
|
||||
return "AI provider"
|
||||
|
||||
|
||||
SCAN_AI_MODEL = _env_str("POLYWEATHER_SCAN_AI_MODEL", default=DEFAULT_SCAN_AI_MODEL)
|
||||
SCAN_CITY_AI_MODEL = _env_str(
|
||||
"POLYWEATHER_SCAN_CITY_AI_MODEL",
|
||||
"POLYWEATHER_SCAN_AI_MODEL",
|
||||
default=SCAN_AI_MODEL or DEFAULT_SCAN_AI_MODEL,
|
||||
)
|
||||
SCAN_AI_BASE_URL = _env_str(
|
||||
"POLYWEATHER_SCAN_AI_BASE_URL",
|
||||
"POLYWEATHER_MIMO_BASE_URL",
|
||||
"POLYWEATHER_DEEPSEEK_BASE_URL",
|
||||
default=DEFAULT_SCAN_AI_BASE_URL,
|
||||
).rstrip("/")
|
||||
SCAN_AI_PROVIDER = _env_str(
|
||||
"POLYWEATHER_SCAN_AI_PROVIDER",
|
||||
default=_infer_scan_ai_provider(SCAN_AI_BASE_URL, SCAN_CITY_AI_MODEL),
|
||||
)
|
||||
SCAN_AI_PROVIDER_LABEL = _env_str(
|
||||
"POLYWEATHER_SCAN_AI_PROVIDER_LABEL",
|
||||
default=_scan_ai_provider_label(SCAN_AI_PROVIDER),
|
||||
)
|
||||
SCAN_AI_ENABLED = str(
|
||||
os.getenv("POLYWEATHER_SCAN_AI_ENABLED") or "false"
|
||||
).strip().lower() in {"1", "true", "yes", "on"}
|
||||
SCAN_AI_TIMEOUT_SEC = _env_int(
|
||||
"POLYWEATHER_SCAN_AI_TIMEOUT_SEC",
|
||||
40,
|
||||
min_value=10,
|
||||
max_value=120,
|
||||
)
|
||||
SCAN_CITY_AI_TIMEOUT_SEC = _env_int(
|
||||
"POLYWEATHER_SCAN_CITY_AI_TIMEOUT_SEC",
|
||||
30,
|
||||
min_value=10,
|
||||
max_value=120,
|
||||
)
|
||||
SCAN_CITY_AI_RETRY_ON_STREAM_PARSE_ERROR = str(
|
||||
os.getenv("POLYWEATHER_SCAN_CITY_AI_RETRY_ON_STREAM_PARSE_ERROR") or "false"
|
||||
).strip().lower() in {"1", "true", "yes", "on"}
|
||||
SCAN_AI_CACHE_TTL_SEC = max(
|
||||
30,
|
||||
int(os.getenv("POLYWEATHER_SCAN_AI_CACHE_TTL_SEC", "3600")),
|
||||
)
|
||||
SCAN_AI_MAX_ROWS = _env_int("POLYWEATHER_SCAN_AI_MAX_ROWS", 40, min_value=1)
|
||||
SCAN_AI_MAX_TOKENS = _env_int(
|
||||
"POLYWEATHER_SCAN_AI_MAX_TOKENS",
|
||||
3200,
|
||||
min_value=600,
|
||||
max_value=64000,
|
||||
)
|
||||
SCAN_CITY_AI_MAX_TOKENS = _env_int(
|
||||
"POLYWEATHER_SCAN_CITY_AI_MAX_TOKENS",
|
||||
800,
|
||||
min_value=400,
|
||||
max_value=64000,
|
||||
)
|
||||
SCAN_CITY_AI_STREAM_MAX_TOKENS = _env_int(
|
||||
"POLYWEATHER_SCAN_CITY_AI_STREAM_MAX_TOKENS",
|
||||
min(SCAN_CITY_AI_MAX_TOKENS, 800),
|
||||
min_value=400,
|
||||
max_value=64000,
|
||||
)
|
||||
Reference in New Issue
Block a user