| 目录 | 是什么 | 跑在哪 | 对外地址 |
|---|---|---|---|
| web/ + 根级页面 | 静态站:看板、工作台、卫星专题、每日复盘 | Cloudflare Pages | oaf.world |
| web-backend/ | 智能投研 REST 服务(Python 四层) | 阿里云海外 ECS · Docker | api.oaf.world |
| agent/ | 卫星互联网产业决策 agent | 同一台 ECS · Docker | agent.oaf.world |
| cli/ | 零依赖 Node 命令行客户端 | 用户自己的机器 | npm invesresearch |
命令行不是第四个服务。 它只是上面两个公开只读接口的瘦客户端 —— 所以能做到零依赖、无需密钥,也没有任何私有东西经过它。
LLM 拿到的永远是已经算好的数字,它只被要求「讲述」,不被允许「计算」。 改数字这件事在架构上就做不到 —— 计算全部发生在工具层,LLM 编排层只往叙事字段写内容,不回写任何数值字段。
同理,产业事件的分类器是规则优先的:关键词命中加极性判断得出主线与 thesis 影响,LLM 只在规则拿不准时兜底。没有 LLM key 时整条管线照常跑,只是不做复核。
全程约 4 秒。其中第 5 步的数字是确定性的 —— 同样的输入、同样的假设,永远得到同样的估值。
网关对产业 agent 只放行只读 GET 白名单,写端点在门外就被挡掉,不进后端。
前端走 Cloudflare Pages,推主干即部署;页面对实时数据用本地缓存先渲染、后台再刷新。
新库为空就不换,保留原库并报错退出。这是一次生产事故的产物:当时磁盘写满,数据库页缓存让查询看起来一切正常(日志全绿、报告上千行),但数据根本没落盘,空库被换上了生产。现在重建完会重新打开文件核对行数,为空则拒绝换库。
| 不变量 | 落在哪 |
|---|---|
| 数字来自工具 | 计算全在工具层;给 LLM 的只有算好的结果;命令行的渲染层明令禁止任何算术 |
| LLM 只写叙事 | 编排层的输出只进叙事字段,不回写数值字段 |
| 缺数显式降级不编 | 取不到就留空;渲染成破折号,且真实的 0 不会被吞掉 |
| 凭证只在边界层 | 密钥落在部署环境变量;命令行有专门单测断言它从不发鉴权头 |
| 离线可测 | 依赖注入 + 假数据源,全部测试不联网 |
还有一条贯穿始终:强制免责声明 —— 所有模型产出的出口都带。