Skip to content

Commit 64fed31

Browse files
Pigbibiclaude
andcommitted
feat: add QSL_ prefix support for shared environment variables
Add QSL_ prefixed variants with backward-compatible fallback. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent f9e40c7 commit 64fed31

4 files changed

Lines changed: 19 additions & 8 deletions

File tree

.env.example

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,16 +20,22 @@ FIRSTRADE_RUNTIME_EXECUTION_WINDOW_TRADING_DAYS=
2020
ACCOUNT_PREFIX=FIRSTRADE
2121
ACCOUNT_REGION=US
2222
NOTIFY_LANG=en
23+
QSL_NOTIFY_LANG=
2324
TELEGRAM_TOKEN=
2425
GLOBAL_TELEGRAM_CHAT_ID=
26+
QSL_GLOBAL_TELEGRAM_CHAT_ID=
2527
FIRSTRADE_STRATEGY_PLUGIN_MOUNTS_JSON=
28+
QSL_STRATEGY_PLUGIN_MOUNTS_JSON=
2629
DCA_MODE=
30+
QSL_DCA_MODE=
2731
DCA_BASE_INVESTMENT_USD=
32+
QSL_DCA_BASE_INVESTMENT_USD=
2833
FIRSTRADE_MARKET_SIGNAL_HANDOFF_INDEX_URI=
2934
FIRSTRADE_MARKET_SIGNAL_REQUIRED=
3035
FIRSTRADE_MARKET_SIGNAL_FALLBACK_MODE=last_valid
3136
FIRSTRADE_MARKET_SIGNAL_MAX_STALE_DAYS=3
3237
EXECUTION_REPORT_GCS_URI=
38+
QSL_EXECUTION_REPORT_GCS_URI=
3339
IBIT_ZSCORE_EXIT_ENABLED=
3440
IBIT_ZSCORE_EXIT_MODE=
3541
IBIT_ZSCORE_EXIT_PARKING_SYMBOL=BOXX

.github/workflows/sync-cloud-run-env.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ jobs:
4141
ENABLE_GITHUB_CLOUD_RUN_DEPLOY: ${{ vars.ENABLE_GITHUB_CLOUD_RUN_DEPLOY }}
4242
ENABLE_GITHUB_ENV_SYNC: ${{ vars.ENABLE_GITHUB_ENV_SYNC }}
4343
ENABLE_MAIN_PUSH_CLOUD_RUN_AUTOMATION: ${{ vars.ENABLE_MAIN_PUSH_CLOUD_RUN_AUTOMATION }}
44+
QSL_ENABLE_CLOUD_RUN_AUTOMATION: ${{ vars.QSL_ENABLE_CLOUD_RUN_AUTOMATION }}
4445
CLOUD_RUN_REGION: ${{ vars.CLOUD_RUN_REGION }}
4546
CLOUD_RUN_SERVICE: ${{ vars.CLOUD_RUN_SERVICE }}
4647
CLOUD_SCHEDULER_LOCATION: ${{ vars.CLOUD_SCHEDULER_LOCATION }}
@@ -163,6 +164,8 @@ jobs:
163164
run: |
164165
set -euo pipefail
165166
167+
# QSL_ENABLE_CLOUD_RUN_AUTOMATION overrides ENABLE_MAIN_PUSH_CLOUD_RUN_AUTOMATION
168+
ENABLE_MAIN_PUSH_CLOUD_RUN_AUTOMATION="${QSL_ENABLE_CLOUD_RUN_AUTOMATION:-$ENABLE_MAIN_PUSH_CLOUD_RUN_AUTOMATION}"
166169
if [ "${GITHUB_EVENT_NAME:-}" = "push" ] && [ "${ENABLE_MAIN_PUSH_CLOUD_RUN_AUTOMATION:-}" != "true" ]; then
167170
echo "enabled=false" >> "$GITHUB_OUTPUT"
168171
echo "Skipping Cloud Run deploy on push because ENABLE_MAIN_PUSH_CLOUD_RUN_AUTOMATION is not true." >&2

main.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ def _get_telegram_token() -> str:
6969
def _telegram_notification_targets() -> tuple[tuple[str, str], ...]:
7070
targets: list[tuple[str, str]] = []
7171
main_token = _get_telegram_token()
72-
main_chat_id = os.getenv("GLOBAL_TELEGRAM_CHAT_ID")
72+
main_chat_id = os.getenv("QSL_GLOBAL_TELEGRAM_CHAT_ID") or os.getenv("GLOBAL_TELEGRAM_CHAT_ID")
7373
if main_token and main_chat_id:
7474
targets.append((main_token, main_chat_id))
7575

@@ -88,7 +88,7 @@ def _runtime_error_notification_message(exc: Exception) -> str:
8888
if len(error_text) > 1200:
8989
error_text = error_text[:1197] + "..."
9090
is_health_check = request.path == "/probe"
91-
if str(os.getenv("NOTIFY_LANG") or "").strip().lower().startswith("zh"):
91+
if str(os.getenv("QSL_NOTIFY_LANG") or os.getenv("NOTIFY_LANG") or "").strip().lower().startswith("zh"):
9292
return "\n".join(
9393
(
9494
"Firstrade 健康检查失败" if is_health_check else "Firstrade 策略运行失败",
@@ -260,7 +260,7 @@ def _strategy_result_http_status(result: dict[str, Any]) -> int:
260260
def _persist_runtime_report(report: dict[str, Any]) -> str | None:
261261
persisted = persist_runtime_report(
262262
report,
263-
cloud_prefix_uri=os.getenv("EXECUTION_REPORT_GCS_URI"),
263+
cloud_prefix_uri=os.getenv("QSL_EXECUTION_REPORT_GCS_URI") or os.getenv("EXECUTION_REPORT_GCS_URI"),
264264
project_id=get_project_id(),
265265
)
266266
if isinstance(persisted, str):

runtime_config_support.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,9 @@ def load_platform_runtime_settings(
185185
strategy_display_name=runtime_paths.strategy_display_name,
186186
strategy_domain=runtime_paths.strategy_domain,
187187
strategy_metadata=strategy_metadata,
188-
notify_lang=os.getenv("NOTIFY_LANG", "en"),
188+
notify_lang=os.getenv("QSL_NOTIFY_LANG") or os.getenv("NOTIFY_LANG", "en"),
189189
tg_token=_get_credential("firstrade-telegram-token", "TELEGRAM_TOKEN"),
190-
tg_chat_id=os.getenv("GLOBAL_TELEGRAM_CHAT_ID"),
190+
tg_chat_id=os.getenv("QSL_GLOBAL_TELEGRAM_CHAT_ID") or os.getenv("GLOBAL_TELEGRAM_CHAT_ID"),
191191
dry_run_only=dry_run_only,
192192
runtime_target_enabled=_runtime_target_enabled_env(),
193193
cash_only_execution=resolve_cash_only_execution_env(
@@ -287,6 +287,7 @@ def load_platform_runtime_settings(
287287
strategy_config_source=runtime_paths.strategy_config_source,
288288
strategy_plugin_mounts_json=(
289289
os.getenv("FIRSTRADE_STRATEGY_PLUGIN_MOUNTS_JSON")
290+
or os.getenv("QSL_STRATEGY_PLUGIN_MOUNTS_JSON")
290291
or os.getenv("STRATEGY_PLUGIN_MOUNTS_JSON")
291292
),
292293
strategy_plugin_alert_channels=resolve_split_env_list("STRATEGY_PLUGIN_ALERT_CHANNELS"),
@@ -327,7 +328,8 @@ def load_platform_runtime_settings(
327328
"STRATEGY_PLUGIN_ALERT_TELEGRAM_CHAT_IDS"
328329
),
329330
strategy_plugin_alert_telegram_bot_token=_first_non_empty(
330-
os.getenv("STRATEGY_PLUGIN_ALERT_TELEGRAM_BOT_TOKEN")
331+
os.getenv("QSL_STRATEGY_PLUGIN_ALERT_TELEGRAM_BOT_TOKEN")
332+
or os.getenv("STRATEGY_PLUGIN_ALERT_TELEGRAM_BOT_TOKEN")
331333
),
332334
strategy_plugin_alert_telegram_api_base_url=_first_non_empty(
333335
os.getenv("STRATEGY_PLUGIN_ALERT_TELEGRAM_API_BASE_URL")
@@ -346,7 +348,7 @@ def load_platform_runtime_settings(
346348

347349

348350
def _resolve_runtime_target(*, dry_run_only: bool) -> RuntimeTarget:
349-
if os.getenv("RUNTIME_TARGET_JSON"):
351+
if os.getenv("QSL_RUNTIME_TARGET_JSON") or os.getenv("RUNTIME_TARGET_JSON"):
350352
return resolve_runtime_target_from_env(
351353
env=os.environ,
352354
expected_platform_id=FIRSTRADE_PLATFORM,
@@ -436,7 +438,7 @@ def _resolve_market_signal_handoff_index_uri() -> str | None:
436438
if explicit:
437439
return explicit
438440
return _default_market_signal_handoff_index_uri_from_report_bucket(
439-
os.getenv("EXECUTION_REPORT_GCS_URI"),
441+
os.getenv("QSL_EXECUTION_REPORT_GCS_URI") or os.getenv("EXECUTION_REPORT_GCS_URI"),
440442
)
441443

442444

0 commit comments

Comments
 (0)