56 lines
2.0 KiB
Python
56 lines
2.0 KiB
Python
from __future__ import annotations
|
|
|
|
import os
|
|
from dataclasses import dataclass
|
|
from typing import Mapping
|
|
|
|
from backend.bootstrap.config import load_local_env, save_local_env
|
|
from backend.features.accounts.security import SecretVault
|
|
|
|
|
|
def environment_credentials(environment: Mapping[str, str]) -> dict[str, str]:
|
|
return {
|
|
"tushare_token": str(environment.get("TUSHARE_TOKEN") or "").strip(),
|
|
"ifind_refresh_token": str(environment.get("IFIND_REFRESH_TOKEN") or "").strip(),
|
|
"ifind_access_token": str(environment.get("IFIND_ACCESS_TOKEN") or "").strip(),
|
|
"platform_llm_primary_api_key": str(
|
|
environment.get("LLM_PRIMARY_API_KEY") or environment.get("LLM_API_KEY") or ""
|
|
).strip(),
|
|
"platform_llm_primary_base_url": str(
|
|
environment.get("LLM_PRIMARY_BASE_URL")
|
|
or environment.get("LLM_BASE_URL")
|
|
or "https://api.openai.com/v1"
|
|
).strip(),
|
|
"platform_llm_primary_model": str(
|
|
environment.get("LLM_PRIMARY_MODEL") or environment.get("LLM_MODEL") or ""
|
|
).strip(),
|
|
"platform_llm_fallback_api_key": str(
|
|
environment.get("LLM_FALLBACK_API_KEY") or ""
|
|
).strip(),
|
|
"platform_llm_fallback_base_url": str(
|
|
environment.get("LLM_FALLBACK_BASE_URL") or ""
|
|
).strip(),
|
|
"platform_llm_fallback_model": str(
|
|
environment.get("LLM_FALLBACK_MODEL") or ""
|
|
).strip(),
|
|
}
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class RuntimeSettings:
|
|
encryption_key: str
|
|
initial_credentials: dict[str, str]
|
|
|
|
|
|
def load_runtime_settings() -> RuntimeSettings:
|
|
load_local_env()
|
|
encryption_key = os.environ.get("APP_ENCRYPTION_KEY", "").strip()
|
|
if not encryption_key:
|
|
encryption_key = SecretVault.generate_key()
|
|
save_local_env({"APP_ENCRYPTION_KEY": encryption_key})
|
|
os.environ["APP_ENCRYPTION_KEY"] = encryption_key
|
|
return RuntimeSettings(
|
|
encryption_key=encryption_key,
|
|
initial_credentials=environment_credentials(os.environ),
|
|
)
|