Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions .github/workflows/sync-cloud-run-env.yml
Original file line number Diff line number Diff line change
Expand Up @@ -52,9 +52,7 @@ jobs:
LONGBRIDGE_RESERVED_CASH_RATIO: ${{ vars.LONGBRIDGE_RESERVED_CASH_RATIO }}
LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD: ${{ vars.LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD }}
CRISIS_ALERT_GOOGLE_VOICE_TO: ${{ vars.CRISIS_ALERT_GOOGLE_VOICE_TO }}
CRISIS_ALERT_EMAIL_TO: ${{ vars.CRISIS_ALERT_EMAIL_TO }}
CRISIS_ALERT_SMTP_FROM: ${{ vars.CRISIS_ALERT_SMTP_FROM }}
CRISIS_ALERT_EMAIL_FROM: ${{ vars.CRISIS_ALERT_EMAIL_FROM }}
CRISIS_ALERT_SMTP_HOST: ${{ vars.CRISIS_ALERT_SMTP_HOST }}
CRISIS_ALERT_SMTP_PORT: ${{ vars.CRISIS_ALERT_SMTP_PORT }}
CRISIS_ALERT_SMTP_USERNAME: ${{ vars.CRISIS_ALERT_SMTP_USERNAME }}
Expand Down Expand Up @@ -385,24 +383,12 @@ jobs:
remove_env_vars+=("CRISIS_ALERT_GOOGLE_VOICE_TO")
fi

if [ -n "${CRISIS_ALERT_EMAIL_TO:-}" ]; then
env_pairs+=("CRISIS_ALERT_EMAIL_TO=${CRISIS_ALERT_EMAIL_TO}")
else
remove_env_vars+=("CRISIS_ALERT_EMAIL_TO")
fi

if [ -n "${CRISIS_ALERT_SMTP_FROM:-}" ]; then
env_pairs+=("CRISIS_ALERT_SMTP_FROM=${CRISIS_ALERT_SMTP_FROM}")
else
remove_env_vars+=("CRISIS_ALERT_SMTP_FROM")
fi

if [ -n "${CRISIS_ALERT_EMAIL_FROM:-}" ]; then
env_pairs+=("CRISIS_ALERT_EMAIL_FROM=${CRISIS_ALERT_EMAIL_FROM}")
else
remove_env_vars+=("CRISIS_ALERT_EMAIL_FROM")
fi

if [ -n "${CRISIS_ALERT_SMTP_HOST:-}" ]; then
env_pairs+=("CRISIS_ALERT_SMTP_HOST=${CRISIS_ALERT_SMTP_HOST}")
else
Expand Down
12 changes: 4 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -71,9 +71,7 @@ Telegram notifications include structured execution and heartbeat messages, with
| `LONGBRIDGE_DEBUG_POSITION_SNAPSHOT` | No | Set to `true` to log raw LongBridge position quantity and available quantity for troubleshooting. |
| `LONGBRIDGE_STRATEGY_PLUGIN_MOUNTS_JSON` | No | Optional LongBridge-side strategy plugin mount JSON. The plugin artifact controls mode; platform config must not set `mode`. |
| `CRISIS_ALERT_GOOGLE_VOICE_TO` | No | Comma/semicolon/newline-separated Google Voice SMS gateway recipients, usually ending in `@txt.voice.google.com`. |
| `CRISIS_ALERT_EMAIL_TO` | No | Optional ordinary email recipients that receive the same escalated alert; also accepted as a legacy recipient list. |
| `CRISIS_ALERT_SMTP_FROM` | No | SMTP sender address for Google Voice alerts. Falls back to `CRISIS_ALERT_EMAIL_FROM`. |
| `CRISIS_ALERT_EMAIL_FROM` | No | Legacy SMTP sender alias; prefer `CRISIS_ALERT_SMTP_FROM`. |
| `CRISIS_ALERT_SMTP_FROM` | No | SMTP sender address for Google Voice alerts. |
| `CRISIS_ALERT_SMTP_HOST` | No | SMTP host for Google Voice alerts. |
| `CRISIS_ALERT_SMTP_PORT` | No | SMTP port; defaults to `587`. |
| `CRISIS_ALERT_SMTP_USERNAME` | No | Optional SMTP username. |
Expand Down Expand Up @@ -131,7 +129,7 @@ Recommended setup:
- `TELEGRAM_TOKEN_SECRET_NAME` (recommended: `longbridge-telegram-token`)
- `NOTIFY_LANG`
- `GLOBAL_TELEGRAM_CHAT_ID`
- Optional crisis Google Voice alerts: `CRISIS_ALERT_GOOGLE_VOICE_TO`, `CRISIS_ALERT_EMAIL_TO`, `CRISIS_ALERT_SMTP_FROM`, `CRISIS_ALERT_EMAIL_FROM`, `CRISIS_ALERT_SMTP_HOST`, `CRISIS_ALERT_SMTP_PORT`, `CRISIS_ALERT_SMTP_USERNAME`, `CRISIS_ALERT_SMTP_PASSWORD_SECRET_NAME`, `CRISIS_ALERT_SMTP_STARTTLS`, `CRISIS_ALERT_SMTP_SSL`
- Optional crisis Google Voice alerts: `CRISIS_ALERT_GOOGLE_VOICE_TO`, `CRISIS_ALERT_SMTP_FROM`, `CRISIS_ALERT_SMTP_HOST`, `CRISIS_ALERT_SMTP_PORT`, `CRISIS_ALERT_SMTP_USERNAME`, `CRISIS_ALERT_SMTP_PASSWORD_SECRET_NAME`, `CRISIS_ALERT_SMTP_STARTTLS`, `CRISIS_ALERT_SMTP_SSL`
- **Repository Secrets (shared):**
- Optional fallback only: `TELEGRAM_TOKEN`
- Optional fallback only: `CRISIS_ALERT_SMTP_PASSWORD`
Expand Down Expand Up @@ -246,9 +244,7 @@ Telegram 通知包含结构化的调仓和心跳消息,支持中英文切换
| `LONGBRIDGE_DEBUG_POSITION_SNAPSHOT` | 否 | 设为 `true` 时输出 LongBridge 原始持仓数量和可卖数量,便于排查。 |
| `LONGBRIDGE_STRATEGY_PLUGIN_MOUNTS_JSON` | 否 | 可选的 LongBridge 侧策略插件挂载 JSON。插件 artifact 自带模式;平台配置不要设置 `mode`。 |
| `CRISIS_ALERT_GOOGLE_VOICE_TO` | 否 | Google Voice 短信网关收件人,通常以 `@txt.voice.google.com` 结尾,支持逗号、分号或换行分隔。 |
| `CRISIS_ALERT_EMAIL_TO` | 否 | 可选普通邮件收件人,会收到同一份升级告警;也作为旧版收件人配置兼容。 |
| `CRISIS_ALERT_SMTP_FROM` | 否 | Google Voice 告警的 SMTP 发件人;未设置时回退到 `CRISIS_ALERT_EMAIL_FROM`。 |
| `CRISIS_ALERT_EMAIL_FROM` | 否 | 旧版 SMTP 发件人别名;优先使用 `CRISIS_ALERT_SMTP_FROM`。 |
| `CRISIS_ALERT_SMTP_FROM` | 否 | Google Voice 告警的 SMTP 发件人。 |
| `CRISIS_ALERT_SMTP_HOST` | 否 | Google Voice 告警 SMTP host。 |
| `CRISIS_ALERT_SMTP_PORT` | 否 | SMTP 端口,默认 `587`。 |
| `CRISIS_ALERT_SMTP_USERNAME` | 否 | 可选 SMTP 用户名。 |
Expand Down Expand Up @@ -306,7 +302,7 @@ Secret Manager 中需存在 `LONGPORT_SECRET_NAME` 指定的密钥(默认: `lo
- `TELEGRAM_TOKEN_SECRET_NAME`(建议:`longbridge-telegram-token`)
- `NOTIFY_LANG`
- `GLOBAL_TELEGRAM_CHAT_ID`
- 可选危机插件 Google Voice 告警:`CRISIS_ALERT_GOOGLE_VOICE_TO`、`CRISIS_ALERT_EMAIL_TO`、`CRISIS_ALERT_SMTP_FROM`、`CRISIS_ALERT_EMAIL_FROM`、`CRISIS_ALERT_SMTP_HOST`、`CRISIS_ALERT_SMTP_PORT`、`CRISIS_ALERT_SMTP_USERNAME`、`CRISIS_ALERT_SMTP_PASSWORD_SECRET_NAME`、`CRISIS_ALERT_SMTP_STARTTLS`、`CRISIS_ALERT_SMTP_SSL`
- 可选危机插件 Google Voice 告警:`CRISIS_ALERT_GOOGLE_VOICE_TO`、`CRISIS_ALERT_SMTP_FROM`、`CRISIS_ALERT_SMTP_HOST`、`CRISIS_ALERT_SMTP_PORT`、`CRISIS_ALERT_SMTP_USERNAME`、`CRISIS_ALERT_SMTP_PASSWORD_SECRET_NAME`、`CRISIS_ALERT_SMTP_STARTTLS`、`CRISIS_ALERT_SMTP_SSL`
- **仓库级 Secrets(共享):**
- 仅保留为 fallback:`TELEGRAM_TOKEN`
- 仅保留为 fallback:`CRISIS_ALERT_SMTP_PASSWORD`
Expand Down
4 changes: 2 additions & 2 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
flask
gunicorn
quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@8ed13d9122f52c35425b0802d22467bb6664dcd3
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@e89ea43181f687d3454636b4b2d99ab7771546f4
quant-platform-kit @ git+https://github.com/QuantStrategyLab/QuantPlatformKit.git@8e87e70d49487bc6d96587d5f9e9850727e9817b
us-equity-strategies @ git+https://github.com/QuantStrategyLab/UsEquityStrategies.git@fe9cc27b608ab18592b338519a5b0826f73e9a80
pandas
requests
pytz
Expand Down
9 changes: 1 addition & 8 deletions runtime_config_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ class PlatformRuntimeSettings:
strategy_plugin_mounts_json: str | None = None
crisis_alert_google_voice_to: tuple[str, ...] = ()
crisis_alert_smtp_from: str | None = None
crisis_alert_email_to: tuple[str, ...] = ()
crisis_alert_email_from: str | None = None
crisis_alert_smtp_host: str | None = None
crisis_alert_smtp_port: int = 587
crisis_alert_smtp_username: str | None = None
Expand Down Expand Up @@ -161,12 +159,7 @@ def load_platform_runtime_settings(
or os.getenv("STRATEGY_PLUGIN_MOUNTS_JSON")
),
crisis_alert_google_voice_to=_split_env_list(os.getenv("CRISIS_ALERT_GOOGLE_VOICE_TO")),
crisis_alert_smtp_from=_first_non_empty(
os.getenv("CRISIS_ALERT_SMTP_FROM"),
os.getenv("CRISIS_ALERT_EMAIL_FROM"),
),
crisis_alert_email_to=_split_env_list(os.getenv("CRISIS_ALERT_EMAIL_TO")),
crisis_alert_email_from=_first_non_empty(os.getenv("CRISIS_ALERT_EMAIL_FROM")),
crisis_alert_smtp_from=_first_non_empty(os.getenv("CRISIS_ALERT_SMTP_FROM")),
crisis_alert_smtp_host=_first_non_empty(os.getenv("CRISIS_ALERT_SMTP_HOST")),
crisis_alert_smtp_port=_resolve_positive_int_env("CRISIS_ALERT_SMTP_PORT", default=587),
crisis_alert_smtp_username=_first_non_empty(os.getenv("CRISIS_ALERT_SMTP_USERNAME")),
Expand Down
2 changes: 0 additions & 2 deletions tests/test_request_handling.py
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,6 @@ def run(self, *args, **kwargs):
tg_token=None,
tg_chat_id="shared-chat-id",
dry_run_only=False,
crisis_alert_email_to=(),
crisis_alert_email_from=None,
crisis_alert_smtp_host=None,
crisis_alert_smtp_port=587,
crisis_alert_smtp_username=None,
Expand Down
6 changes: 0 additions & 6 deletions tests/test_runtime_config_support.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,8 +121,6 @@ def test_load_platform_runtime_settings_uses_defaults_with_explicit_strategy_pro
self.assertIsNone(settings.strategy_plugin_mounts_json)
self.assertEqual(settings.crisis_alert_google_voice_to, ())
self.assertIsNone(settings.crisis_alert_smtp_from)
self.assertEqual(settings.crisis_alert_email_to, ())
self.assertIsNone(settings.crisis_alert_email_from)
self.assertIsNone(settings.crisis_alert_smtp_host)
self.assertEqual(settings.crisis_alert_smtp_port, 587)
self.assertIsNone(settings.crisis_alert_smtp_username)
Expand Down Expand Up @@ -282,9 +280,7 @@ def test_crisis_alert_google_voice_config_is_loaded_from_env(self):
{
"RUNTIME_TARGET_JSON": runtime_target_json(SAMPLE_STRATEGY_PROFILE),
"CRISIS_ALERT_GOOGLE_VOICE_TO": "gateway@txt.voice.google.com",
"CRISIS_ALERT_EMAIL_TO": "risk@example.com;ops@example.com,risk@example.com",
"CRISIS_ALERT_SMTP_FROM": "smtp-from@example.com",
"CRISIS_ALERT_EMAIL_FROM": "bot@example.com",
"CRISIS_ALERT_SMTP_HOST": "smtp.example.com",
"CRISIS_ALERT_SMTP_PORT": "465",
"CRISIS_ALERT_SMTP_USERNAME": "bot",
Expand All @@ -298,8 +294,6 @@ def test_crisis_alert_google_voice_config_is_loaded_from_env(self):

self.assertEqual(settings.crisis_alert_google_voice_to, ("gateway@txt.voice.google.com",))
self.assertEqual(settings.crisis_alert_smtp_from, "smtp-from@example.com")
self.assertEqual(settings.crisis_alert_email_to, ("risk@example.com", "ops@example.com"))
self.assertEqual(settings.crisis_alert_email_from, "bot@example.com")
self.assertEqual(settings.crisis_alert_smtp_host, "smtp.example.com")
self.assertEqual(settings.crisis_alert_smtp_port, 465)
self.assertEqual(settings.crisis_alert_smtp_username, "bot")
Expand Down
6 changes: 0 additions & 6 deletions tests/test_sync_cloud_run_env_workflow.sh
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,7 @@ grep -Fq 'LONGBRIDGE_MIN_RESERVED_CASH_USD: ${{ vars.LONGBRIDGE_MIN_RESERVED_CAS
grep -Fq 'LONGBRIDGE_RESERVED_CASH_RATIO: ${{ vars.LONGBRIDGE_RESERVED_CASH_RATIO }}' "$workflow_file"
grep -Fq 'LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD: ${{ vars.LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD }}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_GOOGLE_VOICE_TO: ${{ vars.CRISIS_ALERT_GOOGLE_VOICE_TO }}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_EMAIL_TO: ${{ vars.CRISIS_ALERT_EMAIL_TO }}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_FROM: ${{ vars.CRISIS_ALERT_SMTP_FROM }}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_EMAIL_FROM: ${{ vars.CRISIS_ALERT_EMAIL_FROM }}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_HOST: ${{ vars.CRISIS_ALERT_SMTP_HOST }}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_PORT: ${{ vars.CRISIS_ALERT_SMTP_PORT }}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_USERNAME: ${{ vars.CRISIS_ALERT_SMTP_USERNAME }}' "$workflow_file"
Expand Down Expand Up @@ -101,19 +99,15 @@ grep -Fq 'remove_env_vars+=("LONGBRIDGE_MIN_RESERVED_CASH_USD")' "$workflow_file
grep -Fq 'remove_env_vars+=("LONGBRIDGE_RESERVED_CASH_RATIO")' "$workflow_file"
grep -Fq 'remove_env_vars+=("LONGBRIDGE_SAFE_HAVEN_CASH_SUBSTITUTE_THRESHOLD_USD")' "$workflow_file"
grep -Fq 'CRISIS_ALERT_GOOGLE_VOICE_TO=${CRISIS_ALERT_GOOGLE_VOICE_TO}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_EMAIL_TO=${CRISIS_ALERT_EMAIL_TO}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_FROM=${CRISIS_ALERT_SMTP_FROM}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_EMAIL_FROM=${CRISIS_ALERT_EMAIL_FROM}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_HOST=${CRISIS_ALERT_SMTP_HOST}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_PORT=${CRISIS_ALERT_SMTP_PORT}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_USERNAME=${CRISIS_ALERT_SMTP_USERNAME}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_PASSWORD=${CRISIS_ALERT_SMTP_PASSWORD}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_STARTTLS=${CRISIS_ALERT_SMTP_STARTTLS}' "$workflow_file"
grep -Fq 'CRISIS_ALERT_SMTP_SSL=${CRISIS_ALERT_SMTP_SSL}' "$workflow_file"
grep -Fq 'remove_env_vars+=("CRISIS_ALERT_GOOGLE_VOICE_TO")' "$workflow_file"
grep -Fq 'remove_env_vars+=("CRISIS_ALERT_EMAIL_TO")' "$workflow_file"
grep -Fq 'remove_env_vars+=("CRISIS_ALERT_SMTP_FROM")' "$workflow_file"
grep -Fq 'remove_env_vars+=("CRISIS_ALERT_EMAIL_FROM")' "$workflow_file"
grep -Fq 'remove_env_vars+=("CRISIS_ALERT_SMTP_HOST")' "$workflow_file"
grep -Fq 'remove_env_vars+=("CRISIS_ALERT_SMTP_PORT")' "$workflow_file"
grep -Fq 'remove_env_vars+=("CRISIS_ALERT_SMTP_USERNAME")' "$workflow_file"
Expand Down