web-backend · 生产化交接
在一堆各有缺陷的免费行情/财务源之上,搭一个稳定的统一数据服务:拿真实数据 → 跑确定性 DCF → LLM 只写叙事(不改数字)→ 经 REST 暴露。已部署上线,公网可访问。
生产环境运行中 · A/B/C 全线上线离线可测、依赖注入的 Python 投研服务。每层都能注入假实现(FakeProvider / StubLLMClient),故沙箱无网络、无密钥也能跑全部 350 测试。改代码务必守以下不变量:
source_notes 里说明,绝不填占位数字。# 每层依赖注入、离线可测 investresearch_data (M1) 数据层 Provider 抽象 · 市场路由 · 三态熔断 · 令牌桶限流 退避重试 · LRU/TTL 缓存 · 跨源校验 investresearch_tools (M2) 能力层 两阶段 DCF 引擎(Gordon 终值 + WACC×g 敏感性矩阵) MCP 工具 · 校验 investresearch_agent (M3) 编排层 节点状态机(supervisor → fundamentals → report) LLMClient 协议(真实/桩可换) investresearch_api REST FastAPI · 异常→HTTP 映射 · CORS · 可选 Bearer observability(/metrics · 限流 · 访问日志)
浏览器(oaf.world) ──HTTPS + CORS──▶ api.oaf.world
│ 阿里云海外 ECS(Alibaba Cloud Linux 3) · Docker
┌──────────────────────────────────┴─────────────────────────────┐
│ Caddy 容器 (80/443, 自动 Let's Encrypt 证书, 反向代理) │
│ └──▶ api 容器 (仅内网 expose 8000 · FastAPI/uvicorn) │
└──────────────────────────────────────────────────────────────────┘
api ──▶ 数据源(yfinance · edgartools · baostock)
api ──▶ LLM 网关(AsiaInfo AIGW ──▶ Claude Opus 4.8)公网只暴露 Caddy;api 只在 compose 内网。当前线上:开放 API(无 Bearer)+ CORS 收窄到 https://oaf.world + 每 IP 限流兜底。部署包在 deploy/(compose · Caddyfile · .env 不入库 · aliyun-ecs.md)。
| 能力 | 源 | 状态 |
|---|---|---|
| 美股报价 / 日线 | yfinance | ✓ live |
| 美股财报 (SEC) | edgartools 5.40.1 | ✓ live |
| A 股日线 | baostock | ✓ live |
| A 股财报 / 报价 | baostock(akshare/tushare 备源) | ✓ live (A5) |
| 港股 日线 / 报价 / 财报 | yfinance(.HK,如 0700.HK) | ✓ live · 腾讯验证 |
| 新闻 / 舆情(三市场) | A 股 Google News(中文)→ yahoo failover · 美股/港股 yfinance | ✓ live (M4) |
| LLM 叙事 | Opus 4.8 via AIGW | ✓ live |
⚠️ 海外 ECS 上 A 股财报/报价主源用 baostock:tushare 财务接口需 2000 积分、akshare 抓的境内站从海外 IP 不可达,唯 baostock 免费且海外可达。营收/净利/毛利/经营现金流/总股本可取(够 DCF),总资产/权益 baostock 只给比率故留空;字段口径见 baostock_provider.py。
⚠️ 港股(yfinance)已知口径注脚:报价为 HKD、财报为 RMB(公司以人民币披露),DCF 用 RMB 营收对比 HKD 现价约 8% 汇率偏差;财报固定取最近一期年报,period 标签与实际财年可能差一年。均为不阻塞的可选增强。
⚠️ edgartools 跨版本 API 漂移大:升级后先跑 deploy/aliyun-ecs.md 的 /research 冒烟;字段映射在 edgartools_provider.py::_default_loader。
都在 deploy/.env(不入库)。下表为线上关键项:
| 变量 | 作用 | 线上值 |
|---|---|---|
| IR_CORS_ORIGINS | 允许跨域来源 | https://oaf.world |
| IR_API_TOKEN | Bearer 保护(空=开放) | 空(开放 API) |
| IR_LLM_MODEL | litellm 模型名 | openai/wangsu/…opus-4-8 |
| IR_LLM_API_BASE | LLM 网关 base | aigw.asiainfo.com/v1 |
| IR_RATE_LIMIT_PER_MIN | 每 IP 通用限流/分 | 60 |
| IR_RESEARCH_LIMIT_PER_MIN | /research·/dcf 严限/分 | 10 |
| TUSHARE_TOKEN | A 股备源(可选 · 主源用 baostock) | 空 |
| LANGFUSE_PUBLIC_KEY | LLM 观测(可选 · 两 key 齐才开) | pk-lf-… |
| LANGFUSE_SECRET_KEY | Langfuse 私钥 | sk-lf-… |
| LANGFUSE_HOST | Langfuse 区域端点 | jp.cloud.langfuse.com |
客户端对 Opus 4.8 / Sonnet 5 / Fable 5 自动不传 temperature(这些模型拒绝采样参数)。直连 Anthropic 则用 ANTHROPIC_API_KEY + IR_LLM_MODEL=anthropic/claude-haiku-4-5,网关项留空。
# 更新代码重部署 git -C ~/InvesResearch pull origin main docker compose -f docker-compose.prod.yml up -d --build # 日志 / 健康 / 指标 / 冒烟 docker compose -f docker-compose.prod.yml logs -f api curl https://api.oaf.world/health curl -s https://api.oaf.world/metrics | grep -v '^#' # ir_http_requests_total 等 curl -s "https://api.oaf.world/quote?uid=US:AAPL"
caddy_data 命名卷 —— 重建别删卷。429 + Retry-After;/health·/metrics 豁免;IP 取 X-Forwarded-For 首段。/research·/dcf·/compare 已限 10/min/IP;想更省把 IR_LLM_MODEL 降到 Haiku 4.5。IR_METRICS_TOKEN 后 /metrics 要求 ?token=(否则 401);Prometheus 抓取用 params: {token: [...]}。留空则公开(向后兼容)。scripts/healthcheck.py 挂 cron 探 /health,状态翻转(挂/恢复)才推飞书(不刷屏)。仅需标准库;配 IR_ALERT_FEISHU_WEBHOOK 启用。* * * * * IR_HEALTH_URL=https://api.oaf.world/health IR_ALERT_FEISHU_WEBHOOK=… python3 ~/InvesResearch/web-backend/scripts/healthcheck.pyscripts/daily_digest.py 挂 cron 每日调一次,读 IR_DIGEST_UIDS → 复用 /compare(估值 + LLM 研判)→ 推飞书。后端仍无状态(清单来自配置、调度靠 cron、复用已部署服务,不加 DB/端点)。0 9 * * * IR_DIGEST_UIDS=SH:600519,HK:00700,US:NVDA IR_DIGEST_FEISHU_WEBHOOK=… python3 ~/InvesResearch/web-backend/scripts/daily_digest.py生产化门已清零 + v0.14.0 能力全部 live:三市场行情+财报+舆情+估值、观测三件套、产品黏性(自选/对比/日报)、运营加固(挂了告警·可托管)、公司名。v0.14.0 个股页真化:K 线(/bars)、顶部 KPI(现价/市值/PE/ROE)、舆情(真实新闻)、财务(利润表 + /financials/history 五年趋势)全换真数据。以下均为可选增强,非阻塞:
TUSHARE_TOKEN 自动 failover)。data_quality_flag。/metrics + 健康告警(healthcheck.py 状态翻转推飞书)+ /metrics token 访控 已就位;可再接 Prometheus/Grafana 做趋势看板。叙事 Opus 4.8 约 20s,可按标的缓存或降级 Haiku 控成本。